From 1483533744f41cd5cd41afe0643ddca37cf95fe9 Mon Sep 17 00:00:00 2001 From: Kian Peymani Date: Thu, 18 Jul 2019 11:28:55 +0200 Subject: [PATCH 001/151] Update hex-literal dependency version. (#3141) * Update hex-literal dep version. * Update lock file. --- Cargo.lock | 38 ++------------------------------------ core/client/Cargo.toml | 2 +- srml/babe/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fcd6982e0..4a985f432f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1176,15 +1176,6 @@ name = "hex" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "hex-literal" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "hex-literal" version = "0.2.0" @@ -1194,14 +1185,6 @@ dependencies = [ "proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "hex-literal-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "hex-literal-impl" version = "0.2.0" @@ -2832,14 +2815,6 @@ dependencies = [ "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "proc-macro-hack" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "proc-macro-hack" version = "0.5.8" @@ -2850,11 +2825,6 @@ dependencies = [ "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "proc-macro-hack-impl" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "proc-macro2" version = "0.4.30" @@ -3690,7 +3660,7 @@ dependencies = [ name = "srml-babe" version = "2.0.0" dependencies = [ - "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4235,7 +4205,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6046,9 +6016,7 @@ dependencies = [ "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" "checksum hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3da68162fdd2147e66682e78e729bd77f93b4c99656db058c5782d8c6b6225a" -"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06095d08c7c05760f11a071b3e1d4c5b723761c01bd8d7201c30a9536668a612" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" @@ -6184,9 +6152,7 @@ dependencies = [ "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" "checksum primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "366ef730e56c11fd21ab3e518866cf7feb0fdf7f7c16ddc68485579e9d802787" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" "checksum proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "982a35d1194084ba319d65c4a68d24ca28f5fdb5b8bc20899e4eef8641ea5178" -"checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" "checksum protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f00e4a3cb64ecfeac2c0a73c74c68ae3439d7a6bead3870be56ad5dd2620a6f" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 29951b5c48..f140b2f343 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -9,7 +9,7 @@ derive_more = { version = "0.14.0", optional = true } fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } parking_lot = { version = "0.8.0", optional = true } -hex = { package = "hex-literal", version = "0.1", optional = true } +hex = { package = "hex-literal", version = "0.2", optional = true } futures-preview = { version = "0.3.0-alpha.17", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } executor = { package = "substrate-executor", path = "../executor", optional = true } diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index afa46370cd..e8dc183b54 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.4" +hex-literal = "0.2" parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } serde = { version = "1.0.93", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } -- GitLab From cef0c5347842f20c676e7ef10b4b2e2f6f687a4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 18 Jul 2019 15:55:14 +0100 Subject: [PATCH 002/151] client: fix decode block number as u32 (#3130) * client: fix panic on decode block number as u32 * client: add test for number_index_key * client: add another test at client level * client: address review grumbles --- core/client/db/src/lib.rs | 18 +++++----- core/client/db/src/light.rs | 28 +++++++-------- core/client/db/src/utils.rs | 70 +++++++++++++++++++++++++------------ core/client/src/client.rs | 10 ++++++ 4 files changed, 81 insertions(+), 45 deletions(-) diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index eebd69d88d..e73d3df62c 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -883,7 +883,7 @@ impl> Backend { transaction, columns::KEY_LOOKUP, r.number - ); + )?; } // canonicalize: set the number lookup to map to this block's hash. @@ -894,18 +894,18 @@ impl> Backend { columns::KEY_LOOKUP, e.number, e.hash - ); + )?; } } - let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1); + let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1)?; transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key); utils::insert_number_to_key_mapping( transaction, columns::KEY_LOOKUP, best_to.0, best_to.1, - ); + )?; Ok((enacted, retracted)) } @@ -946,7 +946,7 @@ impl> Backend { if let Some(justification) = justification { transaction.put( columns::JUSTIFICATION, - &utils::number_and_hash_to_lookup_key(number, hash), + &utils::number_and_hash_to_lookup_key(number, hash)?, &justification.encode(), ); } @@ -1021,7 +1021,7 @@ impl> Backend { let number = pending_block.header.number().clone(); // blocks are keyed by number + hash. - let lookup_key = utils::number_and_hash_to_lookup_key(number, hash); + let lookup_key = utils::number_and_hash_to_lookup_key(number, hash)?; let (enacted, retracted) = if pending_block.leaf_state.is_best() { self.set_head_with_transaction(&mut transaction, parent_hash, (number, hash))? @@ -1034,7 +1034,7 @@ impl> Backend { columns::KEY_LOOKUP, number, hash, - ); + )?; transaction.put(columns::HEADER, &lookup_key, &pending_block.header.encode()); if let Some(body) = pending_block.body { @@ -1177,7 +1177,7 @@ impl> Backend { if self.storage.state_db.best_canonical().map(|c| f_num.saturated_into::() > c).unwrap_or(true) { let parent_hash = f_header.parent_hash().clone(); - let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone()); + let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone())?; transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); let commit = self.storage.state_db.canonicalize_block(&f_hash) @@ -1344,7 +1344,7 @@ impl client::backend::Backend for Backend whe let hash = self.blockchain.hash(best)?.ok_or_else( || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; - let key = utils::number_and_hash_to_lookup_key(best.clone(), &hash); + let key = utils::number_and_hash_to_lookup_key(best.clone(), &hash)?; transaction.put(columns::META, meta_keys::BEST_BLOCK, &key); transaction.delete(columns::KEY_LOOKUP, removed.hash().as_ref()); children::remove_children(&mut transaction, columns::META, meta_keys::CHILDREN_PREFIX, hash); diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 7d2f1e62d3..95f50ab6f6 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -211,7 +211,7 @@ impl LightStorage { /// should be the parent of `best_to`. In the case where we set an existing block /// to be best, `route_to` should equal to `best_to`. fn set_head_with_transaction(&self, transaction: &mut DBTransaction, route_to: Block::Hash, best_to: (NumberFor, Block::Hash)) -> Result<(), client::error::Error> { - let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1); + let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1)?; // handle reorg. let meta = self.meta.read(); @@ -234,7 +234,7 @@ impl LightStorage { transaction, columns::KEY_LOOKUP, retracted.number - ); + )?; } for enacted in tree_route.enacted() { @@ -243,7 +243,7 @@ impl LightStorage { columns::KEY_LOOKUP, enacted.number, enacted.hash - ); + )?; } } @@ -253,7 +253,7 @@ impl LightStorage { columns::KEY_LOOKUP, best_to.0, best_to.1, - ); + )?; Ok(()) } @@ -274,7 +274,7 @@ impl LightStorage { ).into()) } - let lookup_key = utils::number_and_hash_to_lookup_key(header.number().clone(), hash); + let lookup_key = utils::number_and_hash_to_lookup_key(header.number().clone(), hash)?; transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); // build new CHT(s) if required @@ -293,7 +293,7 @@ impl LightStorage { )?; transaction.put( columns::CHT, - &cht_key(HEADER_CHT_PREFIX, new_cht_start), + &cht_key(HEADER_CHT_PREFIX, new_cht_start)?, new_header_cht_root.as_ref() ); @@ -311,7 +311,7 @@ impl LightStorage { )?; transaction.put( columns::CHT, - &cht_key(CHANGES_TRIE_CHT_PREFIX, new_cht_start), + &cht_key(CHANGES_TRIE_CHT_PREFIX, new_cht_start)?, new_changes_trie_cht_root.as_ref() ); } @@ -331,7 +331,7 @@ impl LightStorage { columns::KEY_LOOKUP, prune_block, hash - ); + )?; transaction.delete(columns::HEADER, &lookup_key); } prune_block += One::one(); @@ -358,7 +358,7 @@ impl LightStorage { let cht_number = cht::block_to_cht_number(cht_size, block).ok_or_else(no_cht_for_block)?; let cht_start = cht::start_number(cht_size, cht_number); - self.db.get(columns::CHT, &cht_key(cht_type, cht_start)).map_err(db_err)? + self.db.get(columns::CHT, &cht_key(cht_type, cht_start)?).map_err(db_err)? .ok_or_else(no_cht_for_block) .and_then(|hash| Block::Hash::decode(&mut &*hash).ok_or_else(no_cht_for_block)) } @@ -414,7 +414,7 @@ impl LightBlockchainStorage for LightStorage } // blocks are keyed by number + hash. - let lookup_key = utils::number_and_hash_to_lookup_key(number, &hash); + let lookup_key = utils::number_and_hash_to_lookup_key(number, &hash)?; if leaf_state.is_best() { self.set_head_with_transaction(&mut transaction, parent_hash, (number, hash))?; @@ -425,7 +425,7 @@ impl LightBlockchainStorage for LightStorage columns::KEY_LOOKUP, number, hash, - ); + )?; transaction.put(columns::HEADER, &lookup_key, &header.encode()); let is_genesis = number.is_zero(); @@ -562,10 +562,10 @@ impl LightBlockchainStorage for LightStorage } /// Build the key for inserting header-CHT at given block. -fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { +fn cht_key>(cht_type: u8, block: N) -> ClientResult<[u8; 5]> { let mut key = [cht_type; 5]; - key[1..].copy_from_slice(&utils::number_index_key(block)); - key + key[1..].copy_from_slice(&utils::number_index_key(block)?); + Ok(key) } #[cfg(test)] diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index 39862dba85..e0e36c6dbc 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -31,8 +31,8 @@ use parity_codec::Decode; use trie::DBValue; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, - UniqueSaturatedInto, CheckedConversion + Block as BlockT, Header as HeaderT, Zero, + UniqueSaturatedFrom, UniqueSaturatedInto, }; #[cfg(feature = "kvdb-rocksdb")] use crate::DatabaseSettings; @@ -84,25 +84,31 @@ pub type NumberIndexKey = [u8; 4]; /// /// In the current database schema, this kind of key is only used for /// lookups into an index, NOT for storing header data or others. -pub fn number_index_key>(n: N) -> NumberIndexKey { - let n = n.checked_into::().unwrap(); - [ +pub fn number_index_key>(n: N) -> client::error::Result { + let n = n.try_into().map_err(|_| + client::error::Error::Backend("Block number cannot be converted to u32".into()) + )?; + + Ok([ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, ((n >> 8) & 0xff) as u8, (n & 0xff) as u8 - ] + ]) } /// Convert number and hash into long lookup key for blocks that are /// not in the canonical chain. -pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where +pub fn number_and_hash_to_lookup_key( + number: N, + hash: H, +) -> client::error::Result> where N: TryInto, - H: AsRef<[u8]> + H: AsRef<[u8]>, { - let mut lookup_key = number_index_key(number).to_vec(); + let mut lookup_key = number_index_key(number)?.to_vec(); lookup_key.extend_from_slice(hash.as_ref()); - lookup_key + Ok(lookup_key) } /// Convert block lookup key into block number. @@ -124,8 +130,9 @@ pub fn remove_number_to_key_mapping>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, -) { - transaction.delete(key_lookup_col, number_index_key(number).as_ref()) +) -> client::error::Result<()> { + transaction.delete(key_lookup_col, number_index_key(number)?.as_ref()); + Ok(()) } /// Remove key mappings. @@ -134,9 +141,10 @@ pub fn remove_key_mappings, H: AsRef<[u8]>>( key_lookup_col: Option, number: N, hash: H, -) { - remove_number_to_key_mapping(transaction, key_lookup_col, number); +) -> client::error::Result<()> { + remove_number_to_key_mapping(transaction, key_lookup_col, number)?; transaction.delete(key_lookup_col, hash.as_ref()); + Ok(()) } /// Place a number mapping into the database. This maps number to current perceived @@ -146,12 +154,13 @@ pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( key_lookup_col: Option, number: N, hash: H, -) { +) -> client::error::Result<()> { transaction.put_vec( key_lookup_col, - number_index_key(number.clone()).as_ref(), - number_and_hash_to_lookup_key(number, hash), - ) + number_index_key(number.clone())?.as_ref(), + number_and_hash_to_lookup_key(number, hash)?, + ); + Ok(()) } /// Insert a hash to key mapping in the database. @@ -160,12 +169,13 @@ pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( key_lookup_col: Option, number: N, hash: H, -) { +) -> client::error::Result<()> { transaction.put_vec( key_lookup_col, hash.clone().as_ref(), - number_and_hash_to_lookup_key(number, hash), - ) + number_and_hash_to_lookup_key(number, hash)?, + ); + Ok(()) } /// Convert block id to block lookup key. @@ -182,7 +192,7 @@ pub fn block_id_to_lookup_key( let res = match id { BlockId::Number(n) => db.get( key_lookup_col, - number_index_key(n).as_ref(), + number_index_key(n)?.as_ref(), ), BlockId::Hash(h) => db.get(key_lookup_col, h.as_ref()), }; @@ -318,3 +328,19 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: genesis_hash, }) } + +#[cfg(test)] +mod tests { + use super::*; + use runtime_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; + type Block = RawBlock>; + + #[test] + fn number_index_key_doesnt_panic() { + let id = BlockId::::Number(72340207214430721); + match id { + BlockId::Number(n) => number_index_key(n).expect_err("number should overflow u32"), + _ => unreachable!(), + }; + } +} diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 5122cbac03..9241d8fb0a 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -2633,4 +2633,14 @@ pub(crate) mod tests { b3.hash(), ); } + + #[test] + fn get_header_by_block_number_doesnt_panic() { + let client = test_client::new(); + + // backend uses u32 for block numbers, make sure we don't panic when + // trying to convert + let id = BlockId::::Number(72340207214430721); + client.header(&id).expect_err("invalid block number overflows u32"); + } } -- GitLab From fe7f6aff197cd68e102539a42df1134d600b4584 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 19 Jul 2019 00:52:19 +0200 Subject: [PATCH 003/151] Switch the network timers to new futures (#3117) --- Cargo.lock | 2 +- core/network/Cargo.toml | 2 +- core/network/src/custom_proto/behaviour.rs | 73 ++++++++++++---------- core/network/src/custom_proto/handler.rs | 24 +++---- core/network/src/debug_info.rs | 7 ++- core/network/src/discovery.rs | 13 ++-- core/network/src/protocol.rs | 9 +-- core/network/src/test/sync.rs | 7 ++- 8 files changed, 71 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a985f432f..93cb8a6f23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4519,6 +4519,7 @@ dependencies = [ "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4546,7 +4547,6 @@ dependencies = [ "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 8b34317470..a94a3a01ba 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -16,6 +16,7 @@ bitflags = "1.0" fnv = "1.0" futures = "0.1.17" futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures-timer = "0.2.1" linked-hash-map = "0.5" linked_hash_set = "0.1.3" lru-cache = "0.1.1" @@ -35,7 +36,6 @@ slog = { version = "^2", features = ["nested-values"] } slog_derive = "0.1.1" smallvec = "0.6" tokio-io = "0.1" -tokio-timer = "0.2.11" tokio = { version = "0.1.11", optional = true } unsigned-varint = { version = "0.2.1", features = ["codec"] } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs index f6510c1a39..e54f5910e3 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -19,7 +19,7 @@ use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOu use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use fnv::FnvHashMap; use futures::prelude::*; -use futures03::{StreamExt as _, TryStreamExt as _}; +use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt as _}; use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::core::{Multiaddr, PeerId}; use log::{debug, error, trace, warn}; @@ -27,7 +27,6 @@ use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; use std::time::{Duration, Instant}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::clock::Clock; /// Network behaviour that handles opening substreams for custom protocols with other nodes. /// @@ -82,9 +81,6 @@ pub struct CustomProto { /// Marker to pin the generics. marker: PhantomData, - - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, } /// State of a peer we're connected to. @@ -105,7 +101,9 @@ enum PeerState { /// The peerset requested that we connect to this peer. We are not connected to this node. PendingRequest { /// When to actually start dialing. - timer: tokio_timer::Delay, + timer: Compat, + /// When the `timer` will trigger. + timer_deadline: Instant, }, /// The peerset requested that we connect to this peer. We are currently dialing this peer. @@ -135,7 +133,9 @@ enum PeerState { /// state mismatch. open: bool, /// When to enable this remote. - timer: tokio_timer::Delay, + timer: Compat, + /// When the `timer` will trigger. + timer_deadline: Instant, }, /// We are connected to this peer and the peerset has accepted it. The handler is in the @@ -240,7 +240,6 @@ impl CustomProto { next_incoming_index: peerset::IncomingIndex(0), events: SmallVec::new(), marker: PhantomData, - clock: Clock::new(), } } @@ -277,13 +276,13 @@ impl CustomProto { st @ PeerState::Banned { .. } => *entry.into_mut() = st, // DisabledPendingEnable => Disabled. - PeerState::DisabledPendingEnable { open, connected_point, timer } => { + PeerState::DisabledPendingEnable { open, connected_point, timer_deadline, .. } => { debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); let banned_until = Some(if let Some(ban) = ban { - cmp::max(timer.deadline(), self.clock.now() + ban) + cmp::max(timer_deadline, Instant::now() + ban) } else { - timer.deadline() + timer_deadline }); *entry.into_mut() = PeerState::Disabled { open, connected_point, banned_until } }, @@ -297,8 +296,7 @@ impl CustomProto { peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - let clock = &self.clock; - let banned_until = ban.map(|dur| clock.now() + dur); + let banned_until = ban.map(|dur| Instant::now() + dur); *entry.into_mut() = PeerState::Disabled { open, connected_point, banned_until } }, @@ -319,8 +317,7 @@ impl CustomProto { peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - let clock = &self.clock; - let banned_until = ban.map(|dur| clock.now() + dur); + let banned_until = ban.map(|dur| Instant::now() + dur); *entry.into_mut() = PeerState::Disabled { open: false, connected_point, banned_until } }, @@ -385,11 +382,12 @@ impl CustomProto { }; match mem::replace(occ_entry.get_mut(), PeerState::Poisoned) { - PeerState::Banned { ref until } if *until > self.clock.now() => { + PeerState::Banned { ref until } if *until > Instant::now() => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ until {:?}", occ_entry.key(), until); *occ_entry.into_mut() = PeerState::PendingRequest { - timer: tokio_timer::Delay::new(until.clone()), + timer: futures_timer::Delay::new_at(until.clone()).compat(), + timer_deadline: until.clone(), }; }, @@ -401,13 +399,14 @@ impl CustomProto { }, PeerState::Disabled { open, ref connected_point, banned_until: Some(ref banned) } - if *banned > self.clock.now() => { + if *banned > Instant::now() => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Has idle connection through \ {:?} but node is banned until {:?}", occ_entry.key(), connected_point, banned); *occ_entry.into_mut() = PeerState::DisabledPendingEnable { connected_point: connected_point.clone(), open, - timer: tokio_timer::Delay::new(banned.clone()), + timer: futures_timer::Delay::new_at(banned.clone()).compat(), + timer_deadline: banned.clone(), }; }, @@ -477,13 +476,13 @@ impl CustomProto { *entry.into_mut() = st; }, - PeerState::DisabledPendingEnable { open, connected_point, timer } => { + PeerState::DisabledPendingEnable { open, connected_point, timer_deadline, .. } => { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Interrupting pending \ enable", entry.key()); *entry.into_mut() = PeerState::Disabled { open, connected_point, - banned_until: Some(timer.deadline()), + banned_until: Some(timer_deadline), }; }, @@ -508,9 +507,9 @@ impl CustomProto { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Was not yet connected", entry.key()); entry.remove(); }, - PeerState::PendingRequest { timer } => { + PeerState::PendingRequest { timer_deadline, .. } => { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Was not yet connected", entry.key()); - *entry.into_mut() = PeerState::Banned { until: timer.deadline() } + *entry.into_mut() = PeerState::Banned { until: timer_deadline } }, PeerState::Poisoned => @@ -721,12 +720,12 @@ where } } - Some(PeerState::DisabledPendingEnable { open, timer, .. }) => { + Some(PeerState::DisabledPendingEnable { open, timer_deadline, .. }) => { debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?}): Was disabled \ (through {:?}) but pending enable", peer_id, endpoint); debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); - self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer.deadline() }); + self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer_deadline }); if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { @@ -790,7 +789,7 @@ where PeerState::Requested | PeerState::PendingRequest { .. } => { debug!(target: "sub-libp2p", "Libp2p => Dial failure for {:?}", peer_id); *entry.into_mut() = PeerState::Banned { - until: self.clock.now() + Duration::from_secs(5) + until: Instant::now() + Duration::from_secs(5) }; debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()) @@ -860,9 +859,14 @@ where debug_assert!(open); *entry.into_mut() = PeerState::Disabled { open: false, connected_point, banned_until }; }, - PeerState::DisabledPendingEnable { open, connected_point, timer } => { + PeerState::DisabledPendingEnable { open, connected_point, timer, timer_deadline } => { debug_assert!(open); - *entry.into_mut() = PeerState::DisabledPendingEnable { open: false, connected_point, timer }; + *entry.into_mut() = PeerState::DisabledPendingEnable { + open: false, + connected_point, + timer, + timer_deadline + }; }, _ => error!(target: "sub-libp2p", "State mismatch in the custom protos handler"), } @@ -973,9 +977,9 @@ where for (peer_id, peer_state) in self.peers.iter_mut() { match mem::replace(peer_state, PeerState::Poisoned) { - PeerState::PendingRequest { mut timer } => { + PeerState::PendingRequest { mut timer, timer_deadline } => { if let Ok(Async::NotReady) = timer.poll() { - *peer_state = PeerState::PendingRequest { timer }; + *peer_state = PeerState::PendingRequest { timer, timer_deadline }; continue; } @@ -984,9 +988,14 @@ where *peer_state = PeerState::Requested; } - PeerState::DisabledPendingEnable { mut timer, connected_point, open } => { + PeerState::DisabledPendingEnable { mut timer, connected_point, open, timer_deadline } => { if let Ok(Async::NotReady) = timer.poll() { - *peer_state = PeerState::DisabledPendingEnable { timer, connected_point, open }; + *peer_state = PeerState::DisabledPendingEnable { + timer, + connected_point, + open, + timer_deadline + }; continue; } diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs index 0ec60e79cd..e4832b64b6 100644 --- a/core/network/src/custom_proto/handler.rs +++ b/core/network/src/custom_proto/handler.rs @@ -17,6 +17,8 @@ use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSubstream}; use futures::prelude::*; +use futures03::{compat::Compat, TryFutureExt as _}; +use futures_timer::Delay; use libp2p::core::{ ConnectedPoint, PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, protocols_handler::IntoProtocolsHandler, @@ -29,7 +31,6 @@ use log::{debug, error}; use smallvec::{smallvec, SmallVec}; use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::{Delay, clock::Clock}; /// Implements the `IntoProtocolsHandler` trait of libp2p. /// @@ -119,17 +120,15 @@ where } fn into_handler(self, remote_peer_id: &PeerId, connected_point: &ConnectedPoint) -> Self::Handler { - let clock = Clock::new(); CustomProtoHandler { protocol: self.protocol, endpoint: connected_point.to_endpoint(), remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), - init_deadline: Delay::new(clock.now() + Duration::from_secs(5)) + init_deadline: Delay::new(Duration::from_secs(5)).compat() }, events_queue: SmallVec::new(), - clock, } } } @@ -155,9 +154,6 @@ pub struct CustomProtoHandler { /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, - - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, } /// State of the handler. @@ -167,14 +163,14 @@ enum ProtocolState { /// List of substreams opened by the remote but that haven't been processed yet. substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, /// Deadline after which the initialization is abnormally long. - init_deadline: Delay, + init_deadline: Compat, }, /// Handler is opening a substream in order to activate itself. /// If we are in this state, we haven't sent any `CustomProtocolOpen` yet. Opening { /// Deadline after which the opening is abnormally long. - deadline: Delay, + deadline: Compat, }, /// Normal operating mode. Contains the substreams that are open. @@ -286,7 +282,7 @@ where }); } ProtocolState::Opening { - deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) + deadline: Delay::new(Duration::from_secs(60)).compat() } } else { @@ -356,7 +352,7 @@ where ProtocolState::Init { substreams, mut init_deadline } => { match init_deadline.poll() { Ok(Async::Ready(())) => { - init_deadline.reset(self.clock.now() + Duration::from_secs(60)); + init_deadline = Delay::new(Duration::from_secs(60)).compat(); error!(target: "sub-libp2p", "Handler initialization process is too long \ with {:?}", self.remote_peer_id) }, @@ -371,7 +367,7 @@ where ProtocolState::Opening { mut deadline } => { match deadline.poll() { Ok(Async::Ready(())) => { - deadline.reset(self.clock.now() + Duration::from_secs(60)); + deadline = Delay::new(Duration::from_secs(60)).compat(); let event = CustomProtoHandlerOut::ProtocolError { is_severe: true, error: "Timeout when opening protocol".to_string().into(), @@ -385,7 +381,7 @@ where }, Err(_) => { error!(target: "sub-libp2p", "Tokio timer has errored"); - deadline.reset(self.clock.now() + Duration::from_secs(60)); + deadline = Delay::new(Duration::from_secs(60)).compat(); self.state = ProtocolState::Opening { deadline }; None }, @@ -454,7 +450,7 @@ where // after all the substreams are closed. if reenable && shutdown.is_empty() { self.state = ProtocolState::Opening { - deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) + deadline: Delay::new(Duration::from_secs(60)).compat() }; Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), diff --git a/core/network/src/debug_info.rs b/core/network/src/debug_info.rs index f8e688acba..2ab93b04b0 100644 --- a/core/network/src/debug_info.rs +++ b/core/network/src/debug_info.rs @@ -16,6 +16,7 @@ use fnv::FnvHashMap; use futures::prelude::*; +use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::Multiaddr; use libp2p::core::{either::EitherOutput, PeerId, PublicKey}; use libp2p::core::protocols_handler::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; @@ -27,7 +28,7 @@ use log::{debug, trace, error}; use std::collections::hash_map::Entry; use std::time::{Duration, Instant}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::Interval; +use futures_timer::Interval; /// Time after we disconnect from a node before we purge its information from the cache. const CACHE_EXPIRE: Duration = Duration::from_secs(10 * 60); @@ -44,7 +45,7 @@ pub struct DebugInfoBehaviour { /// Information that we know about all nodes. nodes_info: FnvHashMap, /// Interval at which we perform garbage collection in `nodes_info`. - garbage_collect: Interval, + garbage_collect: Box + Send>, } /// Information about a node we're connected to. @@ -76,7 +77,7 @@ impl DebugInfoBehaviour { ping: Ping::new(PingConfig::new()), identify, nodes_info: FnvHashMap::default(), - garbage_collect: Interval::new_interval(GARBAGE_COLLECT_INTERVAL), + garbage_collect: Box::new(Interval::new(GARBAGE_COLLECT_INTERVAL).map(|()| Ok(())).compat()), } } diff --git a/core/network/src/discovery.rs b/core/network/src/discovery.rs index 1a377ba872..87aa966e10 100644 --- a/core/network/src/discovery.rs +++ b/core/network/src/discovery.rs @@ -46,6 +46,8 @@ //! use futures::prelude::*; +use futures_timer::Delay; +use futures03::{compat::Compat, TryFutureExt as _}; use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::core::swarm::PollParameters; @@ -59,7 +61,6 @@ use libp2p::multiaddr::Protocol; use log::{debug, info, trace, warn}; use std::{cmp, collections::VecDeque, num::NonZeroU8, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::{Delay, clock::Clock}; /// Implementation of `NetworkBehaviour` that discovers the nodes on the network. pub struct DiscoveryBehaviour { @@ -72,13 +73,11 @@ pub struct DiscoveryBehaviour { #[cfg(not(target_os = "unknown"))] mdns: Toggle>>, /// Stream that fires when we need to perform the next random Kademlia query. - next_kad_random_query: Delay, + next_kad_random_query: Compat, /// After `next_kad_random_query` triggers, the next one triggers after this duration. duration_to_next_kad: Duration, /// Discovered nodes to return. discoveries: VecDeque, - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, /// Identity of our local node. local_peer_id: PeerId, /// Number of nodes we're currently connected to. @@ -104,14 +103,12 @@ impl DiscoveryBehaviour { kademlia.add_address(peer_id, addr.clone()); } - let clock = Clock::new(); DiscoveryBehaviour { user_defined, kademlia, - next_kad_random_query: Delay::new(clock.now()), + next_kad_random_query: Delay::new(Duration::new(0, 0)).compat(), duration_to_next_kad: Duration::from_secs(1), discoveries: VecDeque::new(), - clock, local_peer_id: local_public_key.into_peer_id(), num_connections: 0, #[cfg(not(target_os = "unknown"))] @@ -276,7 +273,7 @@ where self.kademlia.find_node(random_peer_id); // Reset the `Delay` to the next random. - self.next_kad_random_query.reset(self.clock.now() + self.duration_to_next_kad); + self.next_kad_random_query = Delay::new(self.duration_to_next_kad).compat(); self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, Duration::from_secs(60)); }, diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 50b6ad2741..97b6c7ac28 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -17,6 +17,7 @@ use crate::{DiscoveryNetBehaviour, config::ProtocolId}; use crate::custom_proto::{CustomProto, CustomProtoOut}; use futures::prelude::*; +use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::{Multiaddr, PeerId}; use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; @@ -91,9 +92,9 @@ const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12); // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { /// Interval at which we call `tick`. - tick_timeout: tokio_timer::Interval, + tick_timeout: Box + Send>, /// Interval at which we call `propagate_extrinsics`. - propagate_timeout: tokio_timer::Interval, + propagate_timeout: Box + Send>, config: ProtocolConfig, /// Handler for on-demand requests. on_demand_core: OnDemandCore, @@ -365,8 +366,8 @@ impl, H: ExHashT> Protocol { let behaviour = CustomProto::new(protocol_id, versions, peerset); let protocol = Protocol { - tick_timeout: tokio_timer::Interval::new_interval(TICK_TIMEOUT), - propagate_timeout: tokio_timer::Interval::new_interval(PROPAGATE_TIMEOUT), + tick_timeout: Box::new(futures_timer::Interval::new(TICK_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), + propagate_timeout: Box::new(futures_timer::Interval::new(PROPAGATE_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), config: config, context_data: ContextData { peers: HashMap::new(), diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index a7603f7551..f3a8f0c8ea 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -17,7 +17,8 @@ use client::{backend::Backend, blockchain::HeaderBackend}; use crate::config::Roles; use consensus::BlockOrigin; -use std::{time::Duration, time::Instant}; +use futures03::TryFutureExt as _; +use std::time::Duration; use tokio::runtime::current_thread; use super::*; @@ -398,7 +399,7 @@ fn blocks_are_not_announced_by_light_nodes() { net.peers.remove(0); // Poll for a few seconds and make sure 1 and 2 (now 0 and 1) don't sync together. - let mut delay = tokio_timer::Delay::new(Instant::now() + Duration::from_secs(5)); + let mut delay = futures_timer::Delay::new(Duration::from_secs(5)).compat(); runtime.block_on(futures::future::poll_fn::<(), (), _>(|| { net.poll(); delay.poll().map_err(|_| ()) @@ -486,7 +487,7 @@ fn can_not_sync_from_light_peer() { net.peers.remove(0); // ensure that the #2 (now #1) fails to sync block #1 even after 5 seconds - let mut test_finished = tokio_timer::Delay::new(Instant::now() + Duration::from_secs(5)); + let mut test_finished = futures_timer::Delay::new(Duration::from_secs(5)).compat(); runtime.block_on(futures::future::poll_fn::<(), (), _>(|| -> Result<_, ()> { net.poll(); test_finished.poll().map_err(|_| ()) -- GitLab From 77d0cb24385f2241b72d993b11d4c19478e38ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 19 Jul 2019 10:30:59 +0100 Subject: [PATCH 004/151] srml: grandpa: Pause/resume current authority set (#3068) * grandpa: add pause/resume signals to runtime module * grandpa: add tests for srml pause/resume transitions * node: bump spec_version * Apply suggestions from code review * Update core/finality-grandpa/primitives/src/lib.rs * Update core/finality-grandpa/primitives/src/lib.rs --- core/finality-grandpa/primitives/src/lib.rs | 28 ++++- node/runtime/src/lib.rs | 2 +- srml/grandpa/src/lib.rs | 112 +++++++++++++++++++- srml/grandpa/src/tests.rs | 80 ++++++++++++++ 4 files changed, 218 insertions(+), 4 deletions(-) diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index f3721d5dcc..7752782025 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -93,6 +93,14 @@ pub enum ConsensusLog { /// Note that the authority with given index is disabled until the next change. #[codec(index = "3")] OnDisabled(AuthorityIndex), + /// A signal to pause the current authority set after the given delay. + /// After finalizing the block at _delay_ the authorities should stop voting. + #[codec(index = "4")] + Pause(N), + /// A signal to resume the current authority set after the given delay. + /// After authoring the block at _delay_ the authorities should resume voting. + #[codec(index = "5")] + Resume(N), } impl ConsensusLog { @@ -100,7 +108,7 @@ impl ConsensusLog { pub fn try_into_change(self) -> Option> { match self { ConsensusLog::ScheduledChange(change) => Some(change), - ConsensusLog::ForcedChange(_, _) | ConsensusLog::OnDisabled(_) => None, + _ => None, } } @@ -108,7 +116,23 @@ impl ConsensusLog { pub fn try_into_forced_change(self) -> Option<(N, ScheduledChange)> { match self { ConsensusLog::ForcedChange(median, change) => Some((median, change)), - ConsensusLog::ScheduledChange(_) | ConsensusLog::OnDisabled(_) => None, + _ => None, + } + } + + /// Try to cast the log entry as a contained pause signal. + pub fn try_into_pause(self) -> Option { + match self { + ConsensusLog::Pause(delay) => Some(delay), + _ => None, + } + } + + /// Try to cast the log entry as a contained resume signal. + pub fn try_into_resume(self) -> Option { + match self { + ConsensusLog::Resume(delay) => Some(delay), + _ => None, } } } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 3bfb86c8cf..eab1859183 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -69,7 +69,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 113, + spec_version: 114, impl_version: 114, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index ba60128a89..a62f5652d4 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -91,10 +91,42 @@ impl Decode for StoredPendingChange { } } +/// Current state of the GRANDPA authority set. State transitions must happen in +/// the same order of states defined below, e.g. `Paused` implies a prior +/// `PendingPause`. +#[derive(Decode, Encode)] +#[cfg_attr(test, derive(Debug, PartialEq))] +pub enum StoredState { + /// The current authority set is live, and GRANDPA is enabled. + Live, + /// There is a pending pause event which will be enacted at the given block + /// height. + PendingPause { + /// Block at which the intention to pause was scheduled. + scheduled_at: N, + /// Number of blocks after which the change will be enacted. + delay: N + }, + /// The current GRANDPA authority set is paused. + Paused, + /// There is a pending resume event which will be enacted at the given block + /// height. + PendingResume { + /// Block at which the intention to resume was scheduled. + scheduled_at: N, + /// Number of blocks after which the change will be enacted. + delay: N, + }, +} + decl_event!( pub enum Event { /// New authority set has been applied. NewAuthorities(Vec<(AuthorityId, u64)>), + /// Current authority set has been paused. + Paused, + /// Current authority set has been resumed. + Resumed, } ); @@ -103,6 +135,9 @@ decl_storage! { /// The current authority set. Authorities get(authorities) config(): Vec<(AuthorityId, AuthorityWeight)>; + /// State of the current authority set. + State get(state): StoredState = StoredState::Live; + /// Pending change: (signaled at, scheduled change). PendingChange: Option>; @@ -125,12 +160,14 @@ decl_module! { } fn on_finalize(block_number: T::BlockNumber) { + // check for scheduled pending authority set changes if let Some(pending_change) = >::get() { + // emit signal if we're at the block that scheduled the change if block_number == pending_change.scheduled_at { if let Some(median) = pending_change.forced { Self::deposit_log(ConsensusLog::ForcedChange( median, - ScheduledChange{ + ScheduledChange { delay: pending_change.delay, next_authorities: pending_change.next_authorities.clone(), } @@ -145,6 +182,7 @@ decl_module! { } } + // enact the change if we've reached the enacting block if block_number == pending_change.scheduled_at + pending_change.delay { Authorities::put(&pending_change.next_authorities); Self::deposit_event( @@ -153,6 +191,35 @@ decl_module! { >::kill(); } } + + // check for scheduled pending state changes + match >::get() { + StoredState::PendingPause { scheduled_at, delay } => { + // signal change to pause + if block_number == scheduled_at { + Self::deposit_log(ConsensusLog::Pause(delay)); + } + + // enact change to paused state + if block_number == scheduled_at + delay { + >::put(StoredState::Paused); + Self::deposit_event(Event::Paused); + } + }, + StoredState::PendingResume { scheduled_at, delay } => { + // signal change to resume + if block_number == scheduled_at { + Self::deposit_log(ConsensusLog::Resume(delay)); + } + + // enact change to live state + if block_number == scheduled_at + delay { + >::put(StoredState::Live); + Self::deposit_event(Event::Resumed); + } + }, + _ => {}, + } } } } @@ -163,6 +230,36 @@ impl Module { Authorities::get() } + pub fn schedule_pause(in_blocks: T::BlockNumber) -> Result { + if let StoredState::Live = >::get() { + let scheduled_at = system::ChainContext::::default().current_height(); + >::put(StoredState::PendingPause { + delay: in_blocks, + scheduled_at, + }); + + Ok(()) + } else { + Err("Attempt to signal GRANDPA pause when the authority set isn't live \ + (either paused or already pending pause).") + } + } + + pub fn schedule_resume(in_blocks: T::BlockNumber) -> Result { + if let StoredState::Paused = >::get() { + let scheduled_at = system::ChainContext::::default().current_height(); + >::put(StoredState::PendingResume { + delay: in_blocks, + scheduled_at, + }); + + Ok(()) + } else { + Err("Attempt to signal GRANDPA resume when the authority set isn't paused \ + (either live or already pending resume).") + } + } + /// Schedule a change in the authorities. /// /// The change will be applied at the end of execution of the block @@ -232,6 +329,18 @@ impl Module { { Self::grandpa_log(digest).and_then(|signal| signal.try_into_forced_change()) } + + pub fn pending_pause(digest: &DigestOf) + -> Option + { + Self::grandpa_log(digest).and_then(|signal| signal.try_into_pause()) + } + + pub fn pending_resume(digest: &DigestOf) + -> Option + { + Self::grandpa_log(digest).and_then(|signal| signal.try_into_resume()) + } } impl session::OneSessionHandler for Module { @@ -254,6 +363,7 @@ impl session::OneSessionHandler for Module { } } } + fn on_disabled(i: usize) { Self::deposit_log(ConsensusLog::OnDisabled(i as u64)) } diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 763c4fce89..11700fa99f 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -202,3 +202,83 @@ fn dispatch_forced_change() { let _ = header; }); } + +#[test] +fn schedule_pause_only_when_live() { + with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { + // we schedule a pause at block 1 with delay of 1 + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + Grandpa::schedule_pause(1).unwrap(); + + // we've switched to the pending pause state + assert_eq!( + Grandpa::state(), + StoredState::PendingPause { + scheduled_at: 1u64, + delay: 1, + }, + ); + + Grandpa::on_finalize(1); + let _ = System::finalize(); + + System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); + + // signaling a pause now should fail + assert!(Grandpa::schedule_pause(1).is_err()); + + Grandpa::on_finalize(2); + let _ = System::finalize(); + + // after finalizing block 2 the set should have switched to paused state + assert_eq!( + Grandpa::state(), + StoredState::Paused, + ); + }); +} + +#[test] +fn schedule_resume_only_when_paused() { + with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + + // the set is currently live, resuming it is an error + assert!(Grandpa::schedule_resume(1).is_err()); + + assert_eq!( + Grandpa::state(), + StoredState::Live, + ); + + // we schedule a pause to be applied instantly + Grandpa::schedule_pause(0).unwrap(); + Grandpa::on_finalize(1); + let _ = System::finalize(); + + assert_eq!( + Grandpa::state(), + StoredState::Paused, + ); + + // we schedule the set to go back live in 2 blocks + System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); + Grandpa::schedule_resume(2).unwrap(); + Grandpa::on_finalize(2); + let _ = System::finalize(); + + System::initialize(&3, &Default::default(), &Default::default(), &Default::default()); + Grandpa::on_finalize(3); + let _ = System::finalize(); + + System::initialize(&4, &Default::default(), &Default::default(), &Default::default()); + Grandpa::on_finalize(4); + let _ = System::finalize(); + + // it should be live at block 4 + assert_eq!( + Grandpa::state(), + StoredState::Live, + ); + }); +} -- GitLab From afa583011eed3e8d49ee823257a3b448a24e213b Mon Sep 17 00:00:00 2001 From: Amar Singh Date: Fri, 19 Jul 2019 14:21:05 +0200 Subject: [PATCH 005/151] Transaction Fee Multiplier (#2854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added fee calculations; need some type conversions * cleaned up make_payment and other stuff * rename vars to compile * add WeightToFee type * clean test files after new type added to balances * fmting * fix balance configs in tests * more fixing mocks and tests * more comprehensive block weight limit test * fix compilation errors * more srml/executive tests && started fixing node/executor tests * new fee multiplier; still overflows :( * perbill at the end attempt; needs to be changed * clean fmting, rename some vars * new PoC implementation. * test weight_to_fee range and verify functionality * 12 of 15 tests in node executor are passing * 1 test failing; big_block imports are failing for wrong reasons * Update srml/executive/src/lib.rs Co-Authored-By: Kian Peymani * Some cleanup. * consolidate tests in runtime impls * clean and condition executive for stateful fee range test * remove comments to self * Major cleanup. * More cleanup. * Fix lock files. * Fix build. * Update node-template/runtime/Cargo.toml Co-Authored-By: Gavin Wood * Update node/executor/src/lib.rs Co-Authored-By: Gavin Wood * Update node/executor/src/lib.rs Co-Authored-By: Gavin Wood * Update node/executor/src/lib.rs Co-Authored-By: Gavin Wood * Update node/executor/src/lib.rs Co-Authored-By: Gavin Wood * Update node/executor/src/lib.rs Co-Authored-By: Gavin Wood * Update node/executor/src/lib.rs Co-Authored-By: Gavin Wood * Per-block update. * nit. * Update docs. * Fix contracts test. * Stateful fee update. * Update lock files. * Update node/runtime/src/impls.rs * Revamped again with fixed64. * fix cargo file. * nits. * Some cleanup. * Some nits. * Fix build. * Bump. * Rename to WeightMultiplier * Update node/executor/src/lib.rs Co-Authored-By: Tomasz Drwięga * Add weight to election module mock. * Fix build. * finalize merge * Update srml/system/src/lib.rs * Bring back fees. * Some nits. * Code shifting for simplicity. * Fix build + more tests. * Update weights.rs * Update core/sr-primitives/src/weights.rs * Update lib.rs * Fix test build --- core/sr-primitives/src/lib.rs | 161 +++++++++++-- core/sr-primitives/src/weights.rs | 92 +++++++- node-template/runtime/Cargo.toml | 4 +- node-template/runtime/src/lib.rs | 13 +- node-template/runtime/src/template.rs | 3 +- node/executor/src/lib.rs | 214 ++++++++++++++--- node/runtime/src/impls.rs | 214 +++++++++++++++++ node/runtime/src/lib.rs | 22 +- srml/assets/src/lib.rs | 1 + srml/aura/src/mock.rs | 1 + srml/authorship/src/lib.rs | 1 + srml/balances/Cargo.toml | 2 +- srml/balances/src/lib.rs | 7 +- srml/balances/src/mock.rs | 13 +- srml/balances/src/tests.rs | 2 +- srml/collective/src/lib.rs | 1 + srml/contracts/src/tests.rs | 7 +- srml/council/src/lib.rs | 3 +- srml/democracy/src/lib.rs | 1 + srml/elections/src/lib.rs | 1 + srml/example/src/lib.rs | 1 + srml/executive/src/lib.rs | 316 +------------------------- srml/executive/src/mock.rs | 128 +++++++++++ srml/executive/src/tests.rs | 246 ++++++++++++++++++++ srml/finality-tracker/src/lib.rs | 1 + srml/generic-asset/src/lib.rs | 1 + srml/generic-asset/src/mock.rs | 1 + srml/grandpa/src/mock.rs | 1 + srml/indices/src/mock.rs | 1 + srml/session/src/mock.rs | 1 + srml/staking/src/mock.rs | 5 +- srml/support/src/traits.rs | 9 +- srml/system/benches/bench.rs | 1 + srml/system/src/lib.rs | 37 ++- srml/timestamp/src/lib.rs | 1 + srml/treasury/src/lib.rs | 1 + 36 files changed, 1103 insertions(+), 411 deletions(-) create mode 100644 node/runtime/src/impls.rs create mode 100644 srml/executive/src/mock.rs create mode 100644 srml/executive/src/tests.rs diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 607fdff376..5f0a888ccd 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -34,7 +34,7 @@ pub use paste; #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::{prelude::*, ops}; +use rstd::{prelude::*, ops, convert::TryInto}; use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; @@ -43,7 +43,7 @@ pub mod testing; pub mod weights; pub mod traits; -use traits::{SaturatedConversion, UniqueSaturatedInto}; +use traits::{SaturatedConversion, UniqueSaturatedInto, Saturating, Bounded, CheckedSub, CheckedAdd}; pub mod generic; pub mod transaction_validity; @@ -168,7 +168,7 @@ impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { pub type ConsensusEngineId = [u8; 4]; /// Permill is parts-per-million (i.e. after multiplying by this, divide by 1000000). -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Ord, PartialOrd))] #[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] pub struct Permill(u32); @@ -273,7 +273,7 @@ impl From> for Permill { /// Perbill is parts-per-billion. It stores a value between 0 and 1 in fixed point and /// provides a means to multiply some other value by that. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] pub struct Perbill(u32); impl Perbill { @@ -377,6 +377,128 @@ impl From> for Perbill { } } + +/// A fixed point number by the scale of 1 billion. +/// +/// cannot hold a value larger than +-`9223372036854775807 / 1_000_000_000` (~9 billion). +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct Fixed64(i64); + +/// The maximum value of the `Fixed64` type +const DIV: i64 = 1_000_000_000; + +impl Fixed64 { + /// creates self from a natural number. + /// + /// Note that this might be lossy. + pub fn from_natural(int: i64) -> Self { + Self(int.saturating_mul(DIV)) + } + + /// Return the accuracy of the type. Given that this function returns the value `X`, it means + /// that an instance composed of `X` parts (`Fixed64::from_parts(X)`) is equal to `1`. + pub fn accuracy() -> i64 { + DIV + } + + /// creates self from a rational number. Equal to `n/d`. + /// + /// Note that this might be lossy. + pub fn from_rational(n: i64, d: u64) -> Self { + Self((n as i128 * DIV as i128 / (d as i128).max(1)).try_into().unwrap_or(Bounded::max_value())) + } + + /// Performs a saturated multiply and accumulate. + /// + /// Returns `n + (self * n)`. + pub fn saturated_multiply_accumulate(&self, int: u32) -> u32 { + let parts = self.0; + + let positive = parts > 0; + // natural parts might overflow. + let natural_parts = self.clone().saturated_into::(); + // fractional parts can always fit into u32. + let perbill_parts = (parts.abs() % DIV) as u32; + + let n = int.saturating_mul(natural_parts); + let p = Perbill::from_parts(perbill_parts) * int; + // everything that needs to be either added or subtracted from the original weight. + let excess = n.saturating_add(p); + + if positive { + int.saturating_add(excess) + } else { + int.saturating_sub(excess) + } + } + + /// Raw constructor. Equal to `parts / 1_000_000_000`. + pub fn from_parts(parts: i64) -> Self { + Self(parts) + } +} + +impl UniqueSaturatedInto for Fixed64 { + /// Note that the maximum value of Fixed64 might be more than what can fit in u32. This is hence, + /// expected to be lossy. + fn unique_saturated_into(self) -> u32 { + (self.0.abs() / DIV).try_into().unwrap_or(Bounded::max_value()) + } +} + +impl Saturating for Fixed64 { + fn saturating_add(self, rhs: Self) -> Self { + Self(self.0.saturating_add(rhs.0)) + } + fn saturating_mul(self, rhs: Self) -> Self { + Self(self.0.saturating_mul(rhs.0) / DIV) + } + fn saturating_sub(self, rhs: Self) -> Self { + Self(self.0.saturating_sub(rhs.0)) + } +} + +/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait for +/// safe addition. +impl ops::Add for Fixed64 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0) + } +} + +/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait for +/// safe subtraction. +impl ops::Sub for Fixed64 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0 - rhs.0) + } +} + +impl CheckedSub for Fixed64 { + fn checked_sub(&self, rhs: &Self) -> Option { + if let Some(v) = self.0.checked_sub(rhs.0) { + Some(Self(v)) + } else { + None + } + } +} + +impl CheckedAdd for Fixed64 { + fn checked_add(&self, rhs: &Self) -> Option { + if let Some(v) = self.0.checked_add(rhs.0) { + Some(Self(v)) + } else { + None + } + } +} + /// PerU128 is parts-per-u128-max-value. It stores a value between 0 and 1 in fixed point. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] @@ -755,6 +877,7 @@ impl traits::Extrinsic for OpaqueExtrinsic { #[cfg(test)] mod tests { use crate::codec::{Encode, Decode}; + use super::{Perbill, Permill}; macro_rules! per_thing_upper_test { ($num_type:tt, $per:tt) => { @@ -798,19 +921,19 @@ mod tests { fn compact_permill_perbill_encoding() { let tests = [(0u32, 1usize), (63, 1), (64, 2), (16383, 2), (16384, 4), (1073741823, 4), (1073741824, 5), (u32::max_value(), 5)]; for &(n, l) in &tests { - let compact: crate::codec::Compact = super::Permill(n).into(); + let compact: crate::codec::Compact = Permill(n).into(); let encoded = compact.encode(); assert_eq!(encoded.len(), l); - let decoded = >::decode(&mut & encoded[..]).unwrap(); - let permill: super::Permill = decoded.into(); - assert_eq!(permill, super::Permill(n)); + let decoded = >::decode(&mut & encoded[..]).unwrap(); + let permill: Permill = decoded.into(); + assert_eq!(permill, Permill(n)); - let compact: crate::codec::Compact = super::Perbill(n).into(); + let compact: crate::codec::Compact = Perbill(n).into(); let encoded = compact.encode(); assert_eq!(encoded.len(), l); - let decoded = >::decode(&mut & encoded[..]).unwrap(); - let perbill: super::Perbill = decoded.into(); - assert_eq!(perbill, super::Perbill(n)); + let decoded = >::decode(&mut & encoded[..]).unwrap(); + let perbill: Perbill = decoded.into(); + assert_eq!(perbill, Perbill(n)); } } @@ -821,16 +944,16 @@ mod tests { #[test] fn test_has_compact_permill() { - let data = WithCompact { data: super::Permill(1) }; + let data = WithCompact { data: Permill(1) }; let encoded = data.encode(); - assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); + assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); } #[test] fn test_has_compact_perbill() { - let data = WithCompact { data: super::Perbill(1) }; + let data = WithCompact { data: Perbill(1) }; let encoded = data.encode(); - assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); + assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); } #[test] @@ -850,7 +973,7 @@ mod tests { #[test] fn per_things_operate_in_output_type() { - assert_eq!(super::Perbill::one() * 255_u64, 255); + assert_eq!(Perbill::one() * 255_u64, 255); } #[test] @@ -858,12 +981,12 @@ mod tests { use primitive_types::U256; assert_eq!( - super::Perbill::from_parts(999_999_999) * std::u128::MAX, + Perbill::from_parts(999_999_999) * std::u128::MAX, ((Into::::into(std::u128::MAX) * 999_999_999u32) / 1_000_000_000u32).as_u128() ); assert_eq!( - super::Permill::from_parts(999_999) * std::u128::MAX, + Permill::from_parts(999_999) * std::u128::MAX, ((Into::::into(std::u128::MAX) * 999_999u32) / 1_000_000u32).as_u128() ); } diff --git a/core/sr-primitives/src/weights.rs b/core/sr-primitives/src/weights.rs index 3443992c73..de72231008 100644 --- a/core/sr-primitives/src/weights.rs +++ b/core/sr-primitives/src/weights.rs @@ -16,18 +16,25 @@ //! Primitives for transaction weighting. //! -//! Each dispatch function within `decl_module!` can now have an optional -//! `#[weight = $x]` attribute. $x can be any object that implements the -//! `Weighable` trait. By default, All transactions are annotated by -//! `#[weight = TransactionWeight::default()]`. +//! Each dispatch function within `decl_module!` can have an optional `#[weight = $x]` attribute. +//! $x can be any object that implements the `Weighable` trait. By default, All transactions are +//! annotated by `#[weight = TransactionWeight::default()]`. //! -//! Note that the decl_module macro _cannot_ enforce this and will simply fail -//! if an invalid struct is passed in. +//! Note that the decl_module macro _cannot_ enforce this and will simply fail if an invalid struct +//! (something that does not implement `Weighable`) is passed in. + +use crate::{Fixed64, traits::Saturating}; +use crate::codec::{Encode, Decode}; /// The final type that each `#[weight = $x:expr]`'s /// expression must evaluate to. pub type Weight = u32; +/// Maximum block saturation: 4mb +pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024; +/// Target block saturation: 25% of max block saturation = 1mb +pub const IDEAL_TRANSACTIONS_WEIGHT: u32 = MAX_TRANSACTIONS_WEIGHT / 4; + /// A `Call` enum (aka transaction) that can be weighted using the custom weight attribute of /// its dispatchable functions. Is implemented by default in the `decl_module!`. /// @@ -74,3 +81,76 @@ impl Default for TransactionWeight { TransactionWeight::Basic(0, 1) } } + +/// Representation of a weight multiplier. This represents how a fee value can be computed from a +/// weighted transaction. +/// +/// This is basically a wrapper for the `Fixed64` type a slightly tailored multiplication to u32 +/// in the form of the `apply_to` method. +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct WeightMultiplier(Fixed64); + +impl WeightMultiplier { + /// Apply the inner Fixed64 as a weight multiplier to a weight value. + /// + /// This will perform a saturated `weight + weight * self.0`. + pub fn apply_to(&self, weight: Weight) -> Weight { + self.0.saturated_multiply_accumulate(weight) + } + + /// build self from raw parts per billion. + #[cfg(feature = "std")] + pub fn from_parts(parts: i64) -> Self { + Self(Fixed64(parts)) + } + + /// build self from a fixed64 value. + pub fn from_fixed(f: Fixed64) -> Self { + Self(f) + } + + /// Approximate the fraction `n/d`. + pub fn from_rational(n: i64, d: u64) -> Self { + Self(Fixed64::from_rational(n, d)) + } +} + +impl Saturating for WeightMultiplier { + fn saturating_add(self, rhs: Self) -> Self { + Self(self.0.saturating_add(rhs.0)) + } + fn saturating_mul(self, rhs: Self) -> Self { + Self(self.0.saturating_mul(rhs.0)) + + } + fn saturating_sub(self, rhs: Self) -> Self { + Self(self.0.saturating_sub(rhs.0)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn multiplier_apply_to_works() { + let test_set = vec![0, 1, 10, 1000, 1_000_000_000]; + + // negative (1/2) + let mut fm = WeightMultiplier::from_rational(-1, 2); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i) as i32, i as i32 - i as i32 / 2); }); + + // unit (1) multiplier + fm = WeightMultiplier::from_parts(0); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i), i); }); + + // i.5 multiplier + fm = WeightMultiplier::from_rational(1, 2); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i), i * 3 / 2); }); + + // dual multiplier + fm = WeightMultiplier::from_rational(1, 1); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i), i * 2); }); + } +} diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 375a0ad64e..1bde247930 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -20,7 +20,7 @@ indices = { package = "srml-indices", path = "../../srml/indices", default_featu system = { package = "srml-system", path = "../../srml/system", default_features = false } timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default_features = false } sudo = { package = "srml-sudo", path = "../../srml/sudo", default_features = false } -runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default_features = false } +sr-primitives = { path = "../../core/sr-primitives", default_features = false } client = { package = "substrate-client", path = "../../core/client", default_features = false } consensus-aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default_features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } @@ -41,7 +41,7 @@ std = [ "aura/std", "indices/std", "primitives/std", - "runtime-primitives/std", + "sr-primitives/std", "system/std", "timestamp/std", "sudo/std", diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 865299285a..11a477df96 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -15,7 +15,7 @@ use rstd::prelude::*; #[cfg(feature = "std")] use primitives::bytes; use primitives::{ed25519, sr25519, OpaqueMetadata}; -use runtime_primitives::{ +use sr_primitives::{ ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, traits::{self, NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify} }; @@ -29,10 +29,10 @@ use version::NativeVersion; // A few exports that help ease life for downstream crates. #[cfg(any(feature = "std", test))] -pub use runtime_primitives::BuildStorage; +pub use sr_primitives::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; -pub use runtime_primitives::{Permill, Perbill}; +pub use sr_primitives::{Permill, Perbill}; pub use support::{StorageValue, construct_runtime, parameter_types}; /// Alias to the signature scheme used for Aura authority signatures. @@ -56,6 +56,9 @@ pub type BlockNumber = u64; /// Index of an account's extrinsic in the chain. pub type Nonce = u64; +/// Balance type for the node. +pub type Balance = u128; + /// Used for the module template in `./template.rs` mod template; @@ -131,6 +134,8 @@ impl system::Trait for Runtime { type Header = generic::Header; /// The ubiquitous event type. type Event = Event; + /// Update weight (to fee) multiplier per-block. + type WeightMultiplierUpdate = (); /// The ubiquitous origin type. type Origin = Origin; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). @@ -174,7 +179,7 @@ parameter_types! { impl balances::Trait for Runtime { /// The type for recording an account's balance. - type Balance = u128; + type Balance = Balance; /// What to do if an account's free balance gets zeroed. type OnFreeBalanceZero = (); /// What to do if a new account is created. diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index 05257d2a53..e7046e4f51 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -72,7 +72,7 @@ mod tests { use runtime_io::with_externalities; use primitives::{H256, Blake2Hasher}; use support::{impl_outer_origin, assert_ok, parameter_types}; - use runtime_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -95,6 +95,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index fbd537f475..3ff2d876a2 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -49,6 +49,7 @@ mod tests { use node_primitives::{Hash, BlockNumber, AccountId}; use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + use runtime_primitives::weights::{IDEAL_TRANSACTIONS_WEIGHT, WeightMultiplier}; use {balances, contracts, indices, staking, system, timestamp}; use contracts::ContractAddressFor; use system::{EventRecord, Phase}; @@ -77,8 +78,10 @@ mod tests { const BLOATY_CODE: &[u8] = node_runtime::WASM_BINARY_BLOATY; const GENESIS_HASH: [u8; 32] = [69u8; 32]; - - const TX_FEE: u128 = 3 * CENTS + 460 * MILLICENTS; + // from weight + const TX_FEE: u128 = 146; + // regardless of creation of transfer + const TRANSFER_FEE: u128 = 1 * CENTS; type TestExternalities = CoreTestExternalities; @@ -150,13 +153,13 @@ mod tests { fn panic_execution_with_foreign_code_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ blake2_256(&>::key_for(alice())).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, blake2_256(&>::key_for(0)).to_vec() => { vec![0u8; 32] @@ -186,13 +189,13 @@ mod tests { fn bad_extrinsic_with_native_equivalent_code_gives_error() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ blake2_256(&>::key_for(alice())).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, blake2_256(&>::key_for(0)).to_vec() => { vec![0u8; 32] @@ -249,7 +252,7 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -285,7 +288,7 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -479,12 +482,11 @@ mod tests { // session change => consensus authorities change => authorities change digest item appears let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; assert_eq!(digest.logs().len(), 0); -// assert!(digest.logs()[0].as_consensus().is_some()); (block1, block2) } - fn big_block() -> (Vec, Hash) { + fn block_with_size(time: u64, nonce: u64, size: usize) -> (Vec, Hash) { construct_block( &mut new_test_ext(COMPACT_CODE, false), 1, @@ -492,11 +494,11 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(time)), }, CheckedExtrinsic { - signed: Some((alice(), 0)), - function: Call::System(system::Call::remark(vec![0; 120000])), + signed: Some((charlie(), nonce)), + function: Call::System(system::Call::remark(vec![0; size])), } ] ) @@ -519,7 +521,7 @@ mod tests { runtime_io::with_externalities(&mut t, || { // block1 transfers from alice 69 to bob. // -1 is the default fee - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); let events = vec![ EventRecord { @@ -545,7 +547,6 @@ mod tests { ]; assert_eq!(System::events(), events); }); - executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", @@ -557,9 +558,9 @@ mod tests { runtime_io::with_externalities(&mut t, || { // bob sends 5, alice sends 15 | bob += 10, alice -= 10 // 111 - 69 - 10 = 32 - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * (TX_FEE + TRANSFER_FEE)); // 100 + 69 + 10 = 179 - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - TX_FEE - TRANSFER_FEE); let events = vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), @@ -615,7 +616,7 @@ mod tests { runtime_io::with_externalities(&mut t, || { // block1 transfers from alice 69 to bob. - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - (TX_FEE + TRANSFER_FEE)); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); }); @@ -624,9 +625,9 @@ mod tests { runtime_io::with_externalities(&mut t, || { // bob sends 5, alice sends 15 | bob += 10, alice -= 10 // 111 - 69 - 10 = 32 - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * (TX_FEE + TRANSFER_FEE)); // 100 + 69 + 10 = 179 - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - (TX_FEE + TRANSFER_FEE)); }); } @@ -724,7 +725,6 @@ mod tests { #[test] fn deploying_wasm_contract_should_work() { - let transfer_code = wabt::wat2wasm(CODE_TRANSFER).unwrap(); let transfer_ch = ::Hashing::hash(&transfer_code); @@ -795,7 +795,7 @@ mod tests { 4, COMPACT_CODE, "Core_execute_block", - &big_block().0 + &block_with_size(42, 0, 120_000).0 ).is_err() ); } @@ -807,7 +807,7 @@ mod tests { Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", - &big_block().0, + &block_with_size(42, 0, 120_000).0, true, None, ).0.unwrap(); @@ -821,7 +821,7 @@ mod tests { Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", - &big_block().0, + &block_with_size(42, 0, 120_000).0, false, None, ).0.is_err() @@ -832,10 +832,10 @@ mod tests { fn panic_execution_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ blake2_256(&>::key_for(alice())).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -872,7 +872,7 @@ mod tests { assert_eq!(r, Ok(ApplyOutcome::Success)); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -900,8 +900,7 @@ mod tests { let block1 = changes_trie_block(); let mut t = new_test_ext(COMPACT_CODE, true); - WasmExecutor::new() - .call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); + WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } @@ -921,6 +920,159 @@ mod tests { client.import(BlockOrigin::Own, block).unwrap(); } + + #[test] + fn weight_multiplier_increases_on_big_block() { + let mut t = new_test_ext(COMPACT_CODE, false); + + let mut prev_multiplier = WeightMultiplier::default(); + + runtime_io::with_externalities(&mut t, || { + assert_eq!(System::next_weight_multiplier(), prev_multiplier); + }); + + let mut tt = new_test_ext(COMPACT_CODE, false); + let block1 = construct_block( + &mut tt, + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(42)), + }, + CheckedExtrinsic { + signed: Some((charlie(), 0)), + function: Call::System(system::Call::remark(vec![0; (IDEAL_TRANSACTIONS_WEIGHT*2) as usize])), + } + ] + ); + let block2 = construct_block( + &mut tt, + 2, + block1.1.clone(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(52)), + }, + CheckedExtrinsic { + signed: Some((charlie(), 1)), + function: Call::System(system::Call::remark(vec![0; (IDEAL_TRANSACTIONS_WEIGHT*2) as usize])), + } + ] + ); + + // execute a big block. + executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block1.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + runtime_io::with_externalities(&mut t, || { + let fm = System::next_weight_multiplier(); + println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm > prev_multiplier); + prev_multiplier = fm; + }); + + // execute a big block. + executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block2.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + runtime_io::with_externalities(&mut t, || { + let fm = System::next_weight_multiplier(); + println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm > prev_multiplier); + }); + } + + #[test] + fn weight_multiplier_decreases_on_small_block() { + let mut t = new_test_ext(COMPACT_CODE, false); + + let mut prev_multiplier = WeightMultiplier::default(); + + runtime_io::with_externalities(&mut t, || { + assert_eq!(System::next_weight_multiplier(), prev_multiplier); + }); + + let mut tt = new_test_ext(COMPACT_CODE, false); + let block1 = construct_block( + &mut tt, + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(42)), + }, + CheckedExtrinsic { + signed: Some((charlie(), 0)), + function: Call::System(system::Call::remark(vec![0; 120])), + } + ] + ); + let block2 = construct_block( + &mut tt, + 2, + block1.1.clone(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(52)), + }, + CheckedExtrinsic { + signed: Some((charlie(), 1)), + function: Call::System(system::Call::remark(vec![0; 120])), + } + ] + ); + + // execute a big block. + executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block1.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + runtime_io::with_externalities(&mut t, || { + let fm = System::next_weight_multiplier(); + println!("After a small block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm < prev_multiplier); + prev_multiplier = fm; + }); + + // execute a big block. + executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block2.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + runtime_io::with_externalities(&mut t, || { + let fm = System::next_weight_multiplier(); + println!("After a small block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm < prev_multiplier); + }); + } + #[cfg(feature = "benchmarks")] mod benches { use super::*; diff --git a/node/runtime/src/impls.rs b/node/runtime/src/impls.rs new file mode 100644 index 0000000000..1aa7329a28 --- /dev/null +++ b/node/runtime/src/impls.rs @@ -0,0 +1,214 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Some configurable implementations as associated type for the substrate runtime. + +use node_primitives::Balance; +use runtime_primitives::weights::{Weight, WeightMultiplier, MAX_TRANSACTIONS_WEIGHT, IDEAL_TRANSACTIONS_WEIGHT}; +use runtime_primitives::traits::{Convert, Saturating}; +use runtime_primitives::Fixed64; +use crate::Balances; + +/// Struct that handles the conversion of Balance -> `u64`. This is used for staking's election +/// calculation. +pub struct CurrencyToVoteHandler; + +impl CurrencyToVoteHandler { + fn factor() -> Balance { (Balances::total_issuance() / u64::max_value() as Balance).max(1) } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: Balance) -> u64 { (x / Self::factor()) as u64 } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> Balance { x * Self::factor() } +} + +/// A struct that updates the weight multiplier based on the saturation level of the previous block. +/// This should typically be called once per-block. +/// +/// This assumes that weight is a numeric value in the u32 range. +/// +/// Formula: +/// diff = (ideal_weight - current_block_weight) +/// v = 0.00004 +/// next_weight = weight * (1 + (v . diff) + (v . diff)^2 / 2) +/// +/// https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#relay-chain-transaction-fees +pub struct WeightMultiplierUpdateHandler; +impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierUpdateHandler { + fn convert(previous_state: (Weight, WeightMultiplier)) -> WeightMultiplier { + let (block_weight, multiplier) = previous_state; + let ideal = IDEAL_TRANSACTIONS_WEIGHT as u128; + let block_weight = block_weight as u128; + + // determines if the first_term is positive + let positive = block_weight >= ideal; + let diff_abs = block_weight.max(ideal) - block_weight.min(ideal); + // diff is within u32, safe. + let diff = Fixed64::from_rational(diff_abs as i64, MAX_TRANSACTIONS_WEIGHT as u64); + let diff_squared = diff.saturating_mul(diff); + + // 0.00004 = 4/100_000 = 40_000/10^9 + let v = Fixed64::from_rational(4, 100_000); + // 0.00004^2 = 16/10^10 ~= 2/10^9. Taking the future /2 into account, then it is just 1 parts + // from a billionth. + let v_squared_2 = Fixed64::from_rational(1, 1_000_000_000); + + let first_term = v.saturating_mul(diff); + // It is very unlikely that this will exist (in our poor perbill estimate) but we are giving + // it a shot. + let second_term = v_squared_2.saturating_mul(diff_squared); + + if positive { + let excess = first_term.saturating_add(second_term); + multiplier.saturating_add(WeightMultiplier::from_fixed(excess)) + } else { + // first_term > second_term + let negative = first_term - second_term; + multiplier.saturating_sub(WeightMultiplier::from_fixed(negative)) + // despite the fact that apply_to saturates weight (final fee cannot go below 0) + // it is crucially important to stop here and don't further reduce the weight fee + // multiplier. While at -1, it means that the network is so un-congested that all + // transactions are practically free. We stop here and only increase if the network + // became more busy. + .max(WeightMultiplier::from_rational(-1, 1)) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use runtime_primitives::weights::{MAX_TRANSACTIONS_WEIGHT, IDEAL_TRANSACTIONS_WEIGHT, Weight}; + use runtime_primitives::Perbill; + + // poc reference implementation. + #[allow(dead_code)] + fn weight_multiplier_update(block_weight: Weight) -> Perbill { + let block_weight = block_weight as f32; + let v: f32 = 0.00004; + + // maximum tx weight + let m = MAX_TRANSACTIONS_WEIGHT as f32; + // Ideal saturation in terms of weight + let ss = IDEAL_TRANSACTIONS_WEIGHT as f32; + // Current saturation in terms of weight + let s = block_weight; + + let fm = 1.0 + (v * (s/m - ss/m)) + (v.powi(2) * (s/m - ss/m).powi(2)) / 2.0; + // return a per-bill-like value. + let fm = if fm >= 1.0 { fm - 1.0 } else { 1.0 - fm }; + Perbill::from_parts((fm * 1_000_000_000_f32) as u32) + } + + fn fm(parts: i64) -> WeightMultiplier { + WeightMultiplier::from_parts(parts) + } + + #[test] + fn stateless_weight_mul() { + // Light block. Fee is reduced a little. + assert_eq!( + WeightMultiplierUpdateHandler::convert((1024, WeightMultiplier::default())), + fm(-9990) + ); + // a bit more. Fee is decreased less, meaning that the fee increases as the block grows. + assert_eq!( + WeightMultiplierUpdateHandler::convert((1024 * 4, WeightMultiplier::default())), + fm(-9960) + ); + // ideal. Original fee. + assert_eq!( + WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT as u32, WeightMultiplier::default())), + fm(0) + ); + // // More than ideal. Fee is increased. + assert_eq!( + WeightMultiplierUpdateHandler::convert(((IDEAL_TRANSACTIONS_WEIGHT * 2) as u32, WeightMultiplier::default())), + fm(10000) + ); + } + + #[test] + fn stateful_weight_mul_grow_to_infinity() { + assert_eq!( + WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, WeightMultiplier::default())), + fm(10000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, fm(10000))), + fm(20000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, fm(20000))), + fm(30000) + ); + // ... + assert_eq!( + WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, fm(1_000_000_000))), + fm(1_000_000_000 + 10000) + ); + } + + #[test] + fn stateful_weight_mil_collapse_to_minus_one() { + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, WeightMultiplier::default())), + fm(-10000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, fm(-10000))), + fm(-20000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, fm(-20000))), + fm(-30000) + ); + // ... + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, fm(1_000_000_000 * -1))), + fm(-1_000_000_000) + ); + } + + #[test] + fn weight_to_fee_should_not_overflow_on_large_weights() { + // defensive-only test. at the moment we are not allowing any weight more than + // 4 * 1024 * 1024 in a block. + let kb = 1024_u32; + let mb = kb * kb; + let max_fm = WeightMultiplier::from_fixed(Fixed64::from_natural(i64::max_value())); + + vec![0, 1, 10, 1000, kb, 10 * kb, 100 * kb, mb, 10 * mb, Weight::max_value() / 2, Weight::max_value()] + .into_iter() + .for_each(|i| { + WeightMultiplierUpdateHandler::convert((i, WeightMultiplier::default())); + }); + + vec![10 * mb, Weight::max_value() / 2, Weight::max_value()] + .into_iter() + .for_each(|i| { + let fm = WeightMultiplierUpdateHandler::convert(( + i, + max_fm + )); + // won't grow. The convert saturates everything. + assert_eq!(fm, max_fm); + }); + } +} diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index eab1859183..d453e4f837 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -37,7 +37,7 @@ use client::{ use runtime_primitives::{ApplyResult, impl_opaque_keys, generic, create_runtime_str, key_types}; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::traits::{ - BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, Convert, + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, }; use version::RuntimeVersion; use elections::VoteIndex; @@ -56,6 +56,11 @@ pub use runtime_primitives::{Permill, Perbill}; pub use support::StorageValue; pub use staking::StakerStatus; +/// Implementations for `Convert` and other helper structs passed into runtime modules as associated +/// types. +pub mod impls; +use impls::{CurrencyToVoteHandler, WeightMultiplierUpdateHandler}; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); @@ -122,6 +127,7 @@ impl system::Trait for Runtime { type AccountId = AccountId; type Lookup = Indices; type Header = generic::Header; + type WeightMultiplierUpdate = WeightMultiplierUpdateHandler; type Event = Event; type BlockHashCount = BlockHashCount; } @@ -223,20 +229,6 @@ parameter_types! { pub const BondingDuration: staking::EraIndex = 24 * 28; } -pub struct CurrencyToVoteHandler; - -impl CurrencyToVoteHandler { - fn factor() -> u128 { (Balances::total_issuance() / u64::max_value() as u128).max(1) } -} - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u64 { (x / Self::factor()) as u64 } -} - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u128 { x * Self::factor() } -} - impl staking::Trait for Runtime { type Currency = Balances; type CurrencyToVote = CurrencyToVoteHandler; diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 19159bf60f..46d533b011 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -267,6 +267,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index 0cce522c76..0e5b54ad1b 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -49,6 +49,7 @@ impl system::Trait for Test { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 758eeb285e..34cdebd82f 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -348,6 +348,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/balances/Cargo.toml b/srml/balances/Cargo.toml index a61b95b2ad..cc8f442e04 100644 --- a/srml/balances/Cargo.toml +++ b/srml/balances/Cargo.toml @@ -15,7 +15,7 @@ srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -runtime_io = { package = "sr-io", path = "../../core/sr-io" } +runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } substrate-primitives = { path = "../../core/primitives" } [features] diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 30fb2a48e9..bd05d2aa02 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -163,6 +163,7 @@ use primitives::traits::{ Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, Saturating, Bounded }; +use primitives::weights::Weight; use system::{IsDeadAccount, OnNewAccount, ensure_signed, ensure_root}; mod mock; @@ -759,6 +760,7 @@ impl, I: Instance> system::Trait for ElevatedTrait { type AccountId = T::AccountId; type Lookup = T::Lookup; type Header = T::Header; + type WeightMultiplierUpdate = T::WeightMultiplierUpdate; type Event = (); type BlockHashCount = T::BlockHashCount; } @@ -1145,9 +1147,8 @@ where } impl, I: Instance> MakePayment for Module { - fn make_payment(transactor: &T::AccountId, encoded_len: usize) -> Result { - let encoded_len = T::Balance::from(encoded_len as u32); - let transaction_fee = T::TransactionBaseFee::get() + T::TransactionByteFee::get() * encoded_len; + fn make_payment(transactor: &T::AccountId, weight: Weight) -> Result { + let transaction_fee = T::Balance::from(weight); let imbalance = Self::withdraw( transactor, transaction_fee, diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index 38dae9f25f..a3a6e43faf 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -18,7 +18,7 @@ #![cfg(test)] -use primitives::{traits::{IdentityLookup}, testing::Header}; +use primitives::{traits::IdentityLookup, testing::Header}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{impl_outer_origin, parameter_types, traits::Get}; @@ -77,6 +77,7 @@ impl system::Trait for Runtime { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } @@ -118,6 +119,11 @@ impl Default for ExtBuilder { } } impl ExtBuilder { + pub fn transaction_fees(mut self, base_fee: u64, byte_fee: u64) -> Self { + self.transaction_base_fee = base_fee; + self.transaction_byte_fee = byte_fee; + self + } pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { self.existential_deposit = existential_deposit; self @@ -131,11 +137,6 @@ impl ExtBuilder { self.creation_fee = creation_fee; self } - pub fn transaction_fees(mut self, base_fee: u64, byte_fee: u64) -> Self { - self.transaction_base_fee = base_fee; - self.transaction_byte_fee = byte_fee; - self - } pub fn monied(mut self, monied: bool) -> Self { self.monied = monied; if self.existential_deposit == 0 { diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 2d53ae510c..99f03859de 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -616,7 +616,7 @@ fn check_vesting_status() { assert_eq!(System::block_number(), 10); // Account 1 has fully vested by block 10 - assert_eq!(Balances::vesting_balance(&1), 0); + assert_eq!(Balances::vesting_balance(&1), 0); // Account 2 has started vesting by block 10 assert_eq!(Balances::vesting_balance(&2), user2_free_balance); // Account 12 has started vesting by block 10 diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index 5f2a0ef281..7ee829d5bf 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -410,6 +410,7 @@ mod tests { type Lookup = IdentityLookup; type Header = Header; type Event = Event; + type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; } impl Trait for Test { diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index 3e63bc0def..f2cf4ba621 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -96,6 +96,8 @@ impl Get for BlockGasLimit { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const BalancesTransactionBaseFee: u64 = 0; + pub const BalancesTransactionByteFee: u64 = 0; } impl system::Trait for Test { type Origin = Origin; @@ -106,13 +108,10 @@ impl system::Trait for Test { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = MetaEvent; type BlockHashCount = BlockHashCount; } -parameter_types! { - pub const BalancesTransactionBaseFee: u64 = 0; - pub const BalancesTransactionByteFee: u64 = 0; -} impl balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = Contract; diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 8a52f9ec00..8a220f0a8a 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -108,6 +108,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = Event; type BlockHashCount = BlockHashCount; } @@ -115,7 +116,7 @@ mod tests { pub const ExistentialDeposit: u64 = 0; pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; - pub const TransactionBaseFee: u64 = 0; + pub const TransactionBaseFee: u64 = 1; pub const TransactionByteFee: u64 = 0; } impl balances::Trait for Test { diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index d13feb4db5..fc6110d477 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -1008,6 +1008,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 80324ecefb..827f1f4832 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -1119,6 +1119,7 @@ mod tests { type Lookup = IdentityLookup; type Header = Header; type Event = Event; + type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; } parameter_types! { diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 20ee1c6ba1..03c4e819bc 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -535,6 +535,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 49d4addb3b..33bacdd4fc 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -87,10 +87,12 @@ use parity_codec::{Codec, Encode}; use system::{extrinsics_root, DigestOf}; use primitives::{ApplyOutcome, ApplyError}; use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity}; -use primitives::weights::Weighable; +use primitives::weights::{Weighable, MAX_TRANSACTIONS_WEIGHT}; + +mod mock; +mod tests; mod internal { - pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024; pub enum ApplyError { BadSignature(&'static str), @@ -266,7 +268,7 @@ where // Check the weight of the block if that extrinsic is applied. let weight = xt.weight(encoded_len); - if >::all_extrinsics_weight() + weight > internal::MAX_TRANSACTIONS_WEIGHT { + if >::all_extrinsics_weight() + weight > MAX_TRANSACTIONS_WEIGHT { return Err(internal::ApplyError::FullBlock); } @@ -277,7 +279,8 @@ where if index < &expected_index { internal::ApplyError::Stale } else { internal::ApplyError::Future } ) } // pay any fees - Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?; + let weight_multiplier = >::next_weight_multiplier(); + Payment::make_payment(sender, weight_multiplier.apply_to(weight)).map_err(|_| internal::ApplyError::CantPay)?; // AUDIT: Under no circumstances may this function panic from here onwards. // FIXME: ensure this at compile-time (such as by not defining a panic function, forcing @@ -295,7 +298,7 @@ where // Decode parameters and dispatch let (f, s) = xt.deconstruct(); let r = f.dispatch(s.into()); - >::note_applied_extrinsic(&r, encoded_len as u32); + >::note_applied_extrinsic(&r, weight); r.map(|_| internal::ApplyOutcome::Success).or_else(|e| match e { primitives::BLOCK_FULL => Err(internal::ApplyError::FullBlock), @@ -350,8 +353,11 @@ where match (xt.sender(), xt.index()) { (Some(sender), Some(index)) => { + let weight = xt.weight(encoded_len); + // pay any fees - if Payment::make_payment(sender, encoded_len).is_err() { + let weight_multiplier = >::next_weight_multiplier(); + if Payment::make_payment(sender, weight_multiplier.apply_to(weight)).is_err() { return TransactionValidity::Invalid(ApplyError::CantPay as i8) } @@ -388,301 +394,3 @@ where >::generate_extrinsics(n) } } - -#[cfg(test)] -mod tests { - use super::*; - use balances::Call; - use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup}; - use primitives::testing::{Digest, Header, Block}; - use srml_support::{impl_outer_event, impl_outer_origin, parameter_types}; - use srml_support::traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason}; - use system; - use hex_literal::hex; - - impl_outer_origin! { - pub enum Origin for Runtime { - } - } - - impl_outer_event!{ - pub enum MetaEvent for Runtime { - balances, - } - } - - // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. - #[derive(Clone, Eq, PartialEq)] - pub struct Runtime; - parameter_types! { - pub const BlockHashCount: u64 = 250; - } - impl system::Trait for Runtime { - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Hash = substrate_primitives::H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = MetaEvent; - type BlockHashCount = BlockHashCount; - } - parameter_types! { - pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; - pub const CreationFee: u64 = 0; - pub const TransactionBaseFee: u64 = 10; - pub const TransactionByteFee: u64 = 0; - } - impl balances::Trait for Runtime { - type Balance = u64; - type OnFreeBalanceZero = (); - type OnNewAccount = (); - type Event = MetaEvent; - type TransactionPayment = (); - type DustRemoval = (); - type TransferPayment = (); - type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; - type CreationFee = CreationFee; - type TransactionBaseFee = TransactionBaseFee; - type TransactionByteFee = TransactionByteFee; - } - - impl ValidateUnsigned for Runtime { - type Call = Call; - - fn validate_unsigned(call: &Self::Call) -> TransactionValidity { - match call { - Call::set_balance(_, _, _) => TransactionValidity::Valid { - priority: 0, - requires: vec![], - provides: vec![], - longevity: std::u64::MAX, - propagate: false, - }, - _ => TransactionValidity::Invalid(0), - } - } - } - - type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive< - Runtime, - Block, - system::ChainContext, - balances::Module, - Runtime, - () - >; - - #[test] - fn balance_transfer_dispatch_works() { - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); - balances::GenesisConfig:: { - balances: vec![(1, 111)], - vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 69)); - let mut t = runtime_io::TestExternalities::::new_with_children(t); - with_externalities(&mut t, || { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - Executive::apply_extrinsic(xt).unwrap(); - assert_eq!(>::total_balance(&1), 42 - 10); - assert_eq!(>::total_balance(&2), 69); - }); - } - - fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { - balances: vec![(1, 111)], - vesting: vec![], - }.build_storage().unwrap().0); - t.into() - } - - #[test] - fn block_import_works() { - with_externalities(&mut new_test_ext(), || { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("9159f07939faa7de6ec7f46e292144fc82112c42ead820dfb588f1788f3e8058").into(), - extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), - digest: Digest { logs: vec![], }, - }, - extrinsics: vec![], - }); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_state_root_fails() { - with_externalities(&mut new_test_ext(), || { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), - digest: Digest { logs: vec![], }, - }, - extrinsics: vec![], - }); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_extrinsic_root_fails() { - with_externalities(&mut new_test_ext(), || { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("49cd58a254ccf6abc4a023d9a22dcfc421e385527a250faec69f8ad0d8ed3e48").into(), - extrinsics_root: [0u8; 32].into(), - digest: Digest { logs: vec![], }, - }, - extrinsics: vec![], - }); - }); - } - - #[test] - fn bad_extrinsic_not_inserted() { - let mut t = new_test_ext(); - let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33, 69)); - with_externalities(&mut t, || { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - assert!(Executive::apply_extrinsic(xt).is_err()); - assert_eq!(>::extrinsic_index(), Some(0)); - }); - } - - #[test] - fn block_weight_limit_enforced() { - let run_test = |should_fail: bool| { - let mut t = new_test_ext(); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(33, 69)); - let xt2 = primitives::testing::TestXt(Some(1), 1, Call::transfer(33, 69)); - let encoded = xt2.encode(); - let len = if should_fail { (internal::MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() }; - with_externalities(&mut t, || { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - assert_eq!(>::all_extrinsics_weight(), 0); - - Executive::apply_extrinsic(xt).unwrap(); - let res = Executive::apply_extrinsic_with_len(xt2, len, Some(encoded)); - - if should_fail { - assert!(res.is_err()); - assert_eq!(>::all_extrinsics_weight(), 28); - assert_eq!(>::extrinsic_index(), Some(1)); - } else { - assert!(res.is_ok()); - assert_eq!(>::all_extrinsics_weight(), 56); - assert_eq!(>::extrinsic_index(), Some(2)); - } - }); - }; - - run_test(false); - run_test(true); - } - - #[test] - fn default_block_weight() { - let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); - let mut t = new_test_ext(); - with_externalities(&mut t, || { - Executive::apply_extrinsic(xt.clone()).unwrap(); - Executive::apply_extrinsic(xt.clone()).unwrap(); - Executive::apply_extrinsic(xt.clone()).unwrap(); - assert_eq!( - >::all_extrinsics_weight(), - 3 * (0 /*base*/ + 22 /*len*/ * 1 /*byte*/) - ); - }); - } - - #[test] - fn validate_unsigned() { - let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); - let valid = TransactionValidity::Valid { - priority: 0, - requires: vec![], - provides: vec![], - longevity: 18446744073709551615, - propagate: false, - }; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(Executive::validate_transaction(xt.clone()), valid); - assert_eq!(Executive::apply_extrinsic(xt), Ok(ApplyOutcome::Fail)); - }); - } - - #[test] - fn can_pay_for_tx_fee_on_full_lock() { - let id: LockIdentifier = *b"0 "; - let execute_with_lock = |lock: WithdrawReasons| { - let mut t = new_test_ext(); - with_externalities(&mut t, || { - as LockableCurrency>::set_lock( - id, - &1, - 110, - 10, - lock, - ); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 10)); - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - if lock == WithdrawReasons::except(WithdrawReason::TransactionPayment) { - assert_eq!(Executive::apply_extrinsic(xt).unwrap(), ApplyOutcome::Fail); - // but tx fee has been deducted. the transaction failed on transfer, not on fee. - assert_eq!(>::total_balance(&1), 111 - 10); - } else { - assert_eq!(Executive::apply_extrinsic(xt), Err(ApplyError::CantPay)); - assert_eq!(>::total_balance(&1), 111); - } - }); - }; - - execute_with_lock(WithdrawReasons::all()); - execute_with_lock(WithdrawReasons::except(WithdrawReason::TransactionPayment)); - } -} diff --git a/srml/executive/src/mock.rs b/srml/executive/src/mock.rs new file mode 100644 index 0000000000..f6c8dc1ee2 --- /dev/null +++ b/srml/executive/src/mock.rs @@ -0,0 +1,128 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Test utilities + +#![cfg(test)] + +use super::*; +use runtime_io; +use substrate_primitives::{Blake2Hasher}; +use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; +use primitives::traits::{IdentityLookup, BlakeTwo256}; +use primitives::testing::{Header, Block}; +use system; +pub use balances::Call as balancesCall; +pub use system::Call as systemCall; + +impl_outer_origin! { + pub enum Origin for Runtime { + } +} + +impl_outer_event!{ + pub enum MetaEvent for Runtime { + balances, + } +} + +impl_outer_dispatch! { + pub enum Call for Runtime where origin: Origin { + balances::Balances, + system::System, + } +} + +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Clone, Eq, PartialEq)] +pub struct Runtime; +parameter_types! { + pub const BlockHashCount: u64 = 250; +} + +impl system::Trait for Runtime { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = substrate_primitives::H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type WeightMultiplierUpdate = (); + type BlockHashCount = BlockHashCount; + type Event = MetaEvent; +} +parameter_types! { + pub const ExistentialDeposit: u64 = 0; + pub const TransferFee: u64 = 0; + pub const CreationFee: u64 = 0; + pub const TransactionBaseFee: u64 = 0; + pub const TransactionByteFee: u64 = 0; +} +impl balances::Trait for Runtime { + type Balance = u64; + type OnFreeBalanceZero = (); + type OnNewAccount = (); + type Event = MetaEvent; + type TransactionPayment = (); + type DustRemoval = (); + type TransferPayment = (); + type ExistentialDeposit = ExistentialDeposit; + type TransferFee = TransferFee; + type CreationFee = CreationFee; + type TransactionBaseFee = TransactionBaseFee; + type TransactionByteFee = TransactionByteFee; +} + +impl ValidateUnsigned for Runtime { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> TransactionValidity { + match call { + Call::Balances(balancesCall::set_balance(_, _, _)) => TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![], + longevity: std::u64::MAX, + propagate: false, + }, + _ => TransactionValidity::Invalid(0), + } + } +} + +pub fn new_test_ext() -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + t.extend(balances::GenesisConfig:: { + balances: vec![(1, 1000_000_000)], + vesting: vec![], + }.build_storage().unwrap().0); + t.into() +} + +type Balances = balances::Module; +type System = system::Module; + +pub type TestXt = primitives::testing::TestXt; +pub type Executive = super::Executive< + Runtime, + Block, + system::ChainContext, + balances::Module, + Runtime, + () +>; diff --git a/srml/executive/src/tests.rs b/srml/executive/src/tests.rs new file mode 100644 index 0000000000..70ba39c737 --- /dev/null +++ b/srml/executive/src/tests.rs @@ -0,0 +1,246 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Tests for the module. + +#![cfg(test)] + +use super::*; +use mock::{new_test_ext, TestXt, Executive, Runtime, Call, systemCall, balancesCall}; +use system; +use primitives::weights::{MAX_TRANSACTIONS_WEIGHT}; +use primitives::testing::{Digest, Header, Block}; +use primitives::traits::{Header as HeaderT}; +use substrate_primitives::{Blake2Hasher, H256}; +use runtime_io::with_externalities; +use srml_support::traits::Currency; +use hex_literal::hex; + +#[test] +fn balance_transfer_dispatch_works() { + let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + t.extend(balances::GenesisConfig:: { + balances: vec![(1, 129)], + vesting: vec![], + }.build_storage().unwrap().0); + let xt = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(2, 69))); + let mut t = runtime_io::TestExternalities::::new(t); + with_externalities(&mut t, || { + Executive::initialize_block( + &Header::new(1, H256::default(), H256::default(),[69u8; 32].into(), Digest::default()) + ); + assert_eq!(Executive::apply_extrinsic(xt.clone()).unwrap(), ApplyOutcome::Success); + // default fee. + assert_eq!(>::total_balance(&1), 129 - 69 - 29); + assert_eq!(>::total_balance(&2), 69); + }); +} + +#[test] +fn block_import_works() { + with_externalities(&mut new_test_ext(), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("5518fc5383e35df8bf7cda7d6467d1307cc907424b7c8633148163aba5ee6aa8").into(), + extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); + }); +} + +#[test] +#[should_panic] +fn block_import_of_bad_state_root_fails() { + with_externalities(&mut new_test_ext(), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: [0u8; 32].into(), + extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); + }); +} + +#[test] +#[should_panic] +fn block_import_of_bad_extrinsic_root_fails() { + with_externalities(&mut new_test_ext(), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("49cd58a254ccf6abc4a023d9a22dcfc421e385527a250faec69f8ad0d8ed3e48").into(), + extrinsics_root: [0u8; 32].into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); + }); +} + +#[test] +fn bad_extrinsic_not_inserted() { + let mut t = new_test_ext(); + let xt = primitives::testing::TestXt(Some(1), 42, Call::Balances(balancesCall::transfer(33, 69))); + with_externalities(&mut t, || { + Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), + [69u8; 32].into(), Digest::default())); + assert!(Executive::apply_extrinsic(xt).is_err()); + assert_eq!(>::extrinsic_index(), Some(0)); + }); +} + +#[test] +fn block_weight_limit_enforced() { + let run_test = |should_fail: bool| { + let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + t.extend(balances::GenesisConfig:: { + balances: vec![(1, 129)], + vesting: vec![], + }.build_storage().unwrap().0); + let mut t = runtime_io::TestExternalities::::new(t); + let xt = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(1, 15))); + let xt2 = primitives::testing::TestXt(Some(1), 1, Call::Balances(balancesCall::transfer(2, 30))); + let encoded = xt2.encode(); + let len = if should_fail { (MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() }; + with_externalities(&mut t, || { + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default() + )); + assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(Executive::apply_extrinsic(xt).unwrap(), ApplyOutcome::Success); + let res = Executive::apply_extrinsic_with_len(xt2, len, Some(encoded)); + + if should_fail { + assert!(res.is_err()); + assert_eq!(>::all_extrinsics_weight(), 28); + assert_eq!(>::extrinsic_index(), Some(1)); + } else { + assert!(res.is_ok()); + assert_eq!(>::all_extrinsics_weight(), 56); + assert_eq!(>::extrinsic_index(), Some(2)); + } + }); + }; + + run_test(false); + run_test(true); +} + +#[test] +fn exceeding_block_weight_fails() { + let mut t = new_test_ext(); + let xt = |i: u32| + primitives::testing::TestXt( + Some(1), + i.into(), + Call::System(systemCall::remark(vec![0_u8; 1024 * 128])) + ); + with_externalities(&mut t, || { + let len = xt(0).clone().encode().len() as u32; + let xts_to_overflow = MAX_TRANSACTIONS_WEIGHT / len; + let xts: Vec = (0..xts_to_overflow).map(|i| xt(i) ).collect::<_>(); + + assert_eq!(>::all_extrinsics_weight(), 0); + let _ = xts.into_iter().for_each(|x| assert_eq!( + Executive::apply_extrinsic(x).unwrap(), + ApplyOutcome::Success + )); + assert_eq!(>::all_extrinsics_weight(), xts_to_overflow * len); + + // next one will be rejected. + assert_eq!(Executive::apply_extrinsic(xt(xts_to_overflow)).err().unwrap(), ApplyError::FullBlock); + }); +} + +#[test] +fn default_block_weight() { + let len = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(69, 10))) + .encode() + .len() as u32; + let mut t = new_test_ext(); + with_externalities(&mut t, || { + assert_eq!( + Executive::apply_extrinsic( + primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(69, 10))) + ).unwrap(), + ApplyOutcome::Success + ); + assert_eq!( + Executive::apply_extrinsic( + primitives::testing::TestXt(Some(1), 1, Call::Balances(balancesCall::transfer(69, 10))) + ).unwrap(), + ApplyOutcome::Success + ); + assert_eq!( + Executive::apply_extrinsic( + primitives::testing::TestXt(Some(1), 2, Call::Balances(balancesCall::transfer(69, 10))) + ).unwrap(), + ApplyOutcome::Success + ); + assert_eq!( + >::all_extrinsics_weight(), + 3 * (0 /*base*/ + len /*len*/ * 1 /*byte*/) + ); + }); +} + +#[test] +fn fail_on_bad_nonce() { + let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + t.extend(balances::GenesisConfig:: { + balances: vec![(1, 129)], + vesting: vec![], + }.build_storage().unwrap().0); + let mut t = runtime_io::TestExternalities::::new(t); + let xt = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(1, 15))); + let xt2 = primitives::testing::TestXt(Some(1), 10, Call::Balances(balancesCall::transfer(1, 15))); + with_externalities(&mut t, || { + Executive::apply_extrinsic(xt).unwrap(); + let res = Executive::apply_extrinsic(xt2); + assert_eq!(res, Err(ApplyError::Future)); + }); +} + +#[test] +fn validate_unsigned() { + let xt = primitives::testing::TestXt(None, 0, Call::Balances(balancesCall::set_balance(33, 69, 69))); + let valid = TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![], + longevity: 18446744073709551615, + propagate: false, + }; + let mut t = new_test_ext(); + + with_externalities(&mut t, || { + assert_eq!(Executive::validate_transaction(xt.clone()), valid); + assert_eq!(Executive::apply_extrinsic(xt), Ok(ApplyOutcome::Fail)); + }); +} diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index f9ccc36346..20752da325 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -309,6 +309,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 60370600a6..e7578e0268 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -1056,6 +1056,7 @@ impl system::Trait for ElevatedTrait { type Lookup = T::Lookup; type Header = T::Header; type Event = (); + type WeightMultiplierUpdate = (); type BlockHashCount = T::BlockHashCount; } impl Trait for ElevatedTrait { diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index 02e18fc335..df71d702c5 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -51,6 +51,7 @@ impl system::Trait for Test { type Lookup = IdentityLookup; type Header = Header; type Event = TestEvent; + type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 733b2deaf1..964e0fe1f2 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -53,6 +53,7 @@ impl system::Trait for Test { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = TestEvent; type BlockHashCount = BlockHashCount; } diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index 53e8f314c9..2874c37969 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -76,6 +76,7 @@ impl system::Trait for Runtime { type AccountId = u64; type Lookup = Indices; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index 13d824c807..544a51d83c 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -120,6 +120,7 @@ impl system::Trait for Test { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 246b6f96be..70339e0c8a 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -97,12 +97,13 @@ impl system::Trait for Test { type AccountId = AccountId; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } parameter_types! { - pub const TransferFee: u64 = 0; - pub const CreationFee: u64 = 0; + pub const TransferFee: Balance = 0; + pub const CreationFee: Balance = 0; pub const TransactionBaseFee: u64 = 0; pub const TransactionByteFee: u64 = 0; } diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 86071a37a2..ffa660d566 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -21,10 +21,9 @@ use crate::rstd::{result, marker::PhantomData, ops::Div}; use crate::codec::{Codec, Encode, Decode}; use substrate_primitives::u32_trait::Value as U32; -use crate::runtime_primitives::traits::{ - MaybeSerializeDebug, SimpleArithmetic, Saturating -}; +use crate::runtime_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; use crate::runtime_primitives::ConsensusEngineId; +use crate::runtime_primitives::weights::Weight; use super::for_each_tuple; @@ -97,11 +96,11 @@ pub enum UpdateBalanceOutcome { pub trait MakePayment { /// Make transaction payment from `who` for an extrinsic of encoded length /// `encoded_len` bytes. Return `Ok` iff the payment was successful. - fn make_payment(who: &AccountId, encoded_len: usize) -> Result<(), &'static str>; + fn make_payment(who: &AccountId, weight: Weight) -> Result<(), &'static str>; } impl MakePayment for () { - fn make_payment(_: &T, _: usize) -> Result<(), &'static str> { Ok(()) } + fn make_payment(_: &T, _: Weight) -> Result<(), &'static str> { Ok(()) } } /// A trait for finding the author of a block header based on the `PreRuntime` digests contained diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index ee4ebf711a..15aeb3b548 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -65,6 +65,7 @@ impl system::Trait for Runtime { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = Event; } diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index a55cb9be86..17d07f3df5 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -76,10 +76,11 @@ use serde::Serialize; use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; +use primitives::weights::{Weight, WeightMultiplier}; use primitives::{generic, traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash, MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup, - Zero, + Zero, Convert, }}; use substrate_primitives::storage::well_known_keys; use srml_support::{ @@ -174,6 +175,14 @@ pub trait Trait: 'static + Eq + Clone { /// (e.g. Indices module) may provide more functional/efficient alternatives. type Lookup: StaticLookup; + /// Handler for updating the weight multiplier at the end of each block. + /// + /// It receives the current block's weight as input and returns the next weight multiplier for next + /// block. + /// + /// Note that passing `()` will keep the value constant. + type WeightMultiplierUpdate: Convert<(Weight, WeightMultiplier), WeightMultiplier>; + /// The block header. type Header: Parameter + traits::Header< Number = Self::BlockNumber, @@ -315,7 +324,10 @@ decl_storage! { /// Total extrinsics count for the current block. ExtrinsicCount: Option; /// Total weight for all extrinsics put together, for the current block. - AllExtrinsicsWeight: Option; + AllExtrinsicsWeight: Option; + /// The next weight multiplier. This should be updated at the end of each block based on the + /// saturation level (weight). + pub NextWeightMultiplier get(next_weight_multiplier): WeightMultiplier = Default::default(); /// Map of block numbers to block hashes. pub BlockHash get(block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): map T::BlockNumber => T::Hash; /// Extrinsics data for the current block (maps an extrinsic's index to its data). @@ -533,10 +545,21 @@ impl Module { } /// Gets a total weight of all executed extrinsics. - pub fn all_extrinsics_weight() -> u32 { + pub fn all_extrinsics_weight() -> Weight { AllExtrinsicsWeight::get().unwrap_or_default() } + /// Update the next weight multiplier. + /// + /// This should be called at then end of each block, before `all_extrinsics_weight` is cleared. + pub fn update_weight_multiplier() { + // update the multiplier based on block weight. + let current_weight = Self::all_extrinsics_weight(); + NextWeightMultiplier::mutate(|fm| { + *fm = T::WeightMultiplierUpdate::convert((current_weight, *fm)) + }); + } + /// Start the execution of a particular block. pub fn initialize( number: &T::BlockNumber, @@ -565,6 +588,7 @@ impl Module { /// Remove temporary "environment" entries in storage. pub fn finalize() -> T::Header { ExtrinsicCount::kill(); + Self::update_weight_multiplier(); AllExtrinsicsWeight::kill(); let number = >::take(); @@ -720,17 +744,17 @@ impl Module { } /// To be called immediately after an extrinsic has been applied. - pub fn note_applied_extrinsic(r: &Result<(), &'static str>, encoded_len: u32) { + pub fn note_applied_extrinsic(r: &Result<(), &'static str>, weight: Weight) { Self::deposit_event(match r { Ok(_) => Event::ExtrinsicSuccess, Err(_) => Event::ExtrinsicFailed, }.into()); let next_extrinsic_index = Self::extrinsic_index().unwrap_or_default() + 1u32; - let total_length = encoded_len.saturating_add(Self::all_extrinsics_weight()); + let total_weight = weight.saturating_add(Self::all_extrinsics_weight()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &next_extrinsic_index); - AllExtrinsicsWeight::put(&total_length); + AllExtrinsicsWeight::put(&total_weight); } /// To be called immediately after `note_applied_extrinsic` of the last extrinsic of the block @@ -806,6 +830,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = u16; type BlockHashCount = BlockHashCount; } diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 48a0d04c32..be7dc8c343 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -348,6 +348,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 7c4d7b10f2..06b1a02f2e 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -380,6 +380,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; } -- GitLab From aa8c06a056f22074fd582ba8d2929e17cdce9c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Sat, 20 Jul 2019 03:19:44 +0200 Subject: [PATCH 006/151] Introduce srml/im-online (#3079) * Fix grammar and typo * Extend network service * Extend offchain API * Support creating unsigned UncheckedExtrinsic * Introduce srml/im-online * Bump impl and spec version * Fix web-wasm test * Apply suggestions from code review Remove parity-multiaddr dependency Co-Authored-By: Pierre Krieger * Replace transmute with from_raw_parts * Replace PeerId.to_string() with .to_base58() Co-Authored-By: Pierre Krieger * Update Cargo.lock * Bump impl and spec version (again) It was updated in master in the meantime. * Apply suggestions from code review Co-Authored-By: Sergei Pepyakin * Address comments * Add public function is_online_in_current_session() * Bump spec_version * Fix doc tests * Improve comments * Remove superfluous line * Name parameters consistently * Implement comments * Switch From to TryFrom * Use Vec instead of HashSet * Fix tests * Revert me: local testing * Fix check if already sent during session We gossip each session, hence we need to check if already sent in this session (not era). * Fix typos * Consistent terminology * Revert "Revert me: local testing" This reverts commit 73fbc29ff3e5ed71d99436318260b4f007e837f4. * Introduce IsMember trait * Implement misc comments * Remove unused function * Fix test * Fix external_addresses being written * Fix test * Add necessary trait bound * Do not increment version * Update lib.rs --- Cargo.lock | 18 + Cargo.toml | 1 + core/executor/src/wasm_executor.rs | 37 ++ core/network/src/lib.rs | 1 + core/network/src/service.rs | 46 +- core/offchain/Cargo.toml | 1 + core/offchain/src/api.rs | 129 +++++- core/offchain/src/lib.rs | 20 +- core/offchain/src/testing.rs | 9 + core/primitives/src/offchain.rs | 51 ++- core/service/Cargo.toml | 1 + core/service/src/components.rs | 6 +- core/service/src/lib.rs | 4 +- core/sr-io/src/lib.rs | 10 +- core/sr-io/with_std.rs | 12 + core/sr-io/without_std.rs | 62 ++- .../src/generic/unchecked_extrinsic.rs | 6 + .../unchecked_mortal_compact_extrinsic.rs | 6 + .../src/generic/unchecked_mortal_extrinsic.rs | 6 + core/sr-primitives/src/lib.rs | 4 + core/sr-primitives/src/testing.rs | 12 + core/sr-primitives/src/traits.rs | 14 +- core/state-machine/src/ext.rs | 2 +- core/state-machine/src/lib.rs | 15 +- core/test-runtime/src/lib.rs | 6 + node-template/runtime/src/lib.rs | 4 + node/cli/src/chain_spec.rs | 16 +- node/executor/src/lib.rs | 1 + node/runtime/Cargo.toml | 2 + node/runtime/src/lib.rs | 16 +- srml/aura/src/lib.rs | 10 +- srml/babe/src/lib.rs | 13 +- srml/im-online/Cargo.toml | 29 ++ srml/im-online/src/lib.rs | 433 ++++++++++++++++++ 34 files changed, 981 insertions(+), 22 deletions(-) create mode 100644 srml/im-online/Cargo.toml create mode 100644 srml/im-online/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 93cb8a6f23..73ac949723 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2360,6 +2360,7 @@ dependencies = [ "srml-executive 2.0.0", "srml-finality-tracker 2.0.0", "srml-grandpa 2.0.0", + "srml-im-online 0.1.0", "srml-indices 2.0.0", "srml-session 2.0.0", "srml-staking 2.0.0", @@ -3844,6 +3845,21 @@ dependencies = [ "substrate-primitives 2.0.0", ] +[[package]] +name = "srml-im-online" +version = "0.1.0" +dependencies = [ + "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "srml-indices" version = "2.0.0" @@ -4564,6 +4580,7 @@ dependencies = [ "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", + "substrate-network 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", @@ -4710,6 +4727,7 @@ dependencies = [ "node-primitives 2.0.0", "node-runtime 2.0.0", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index b8b6311a30..d2d1df56a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,6 +85,7 @@ members = [ "srml/system", "srml/timestamp", "srml/treasury", + "srml/im-online", "node/cli", "node/executor", "node/primitives", diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 83f1cf5a4b..3bb8412be2 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -26,6 +26,7 @@ use wasmi::{ }; use state_machine::{Externalities, ChildStorageKey}; use crate::error::{Error, Result}; +use parity_codec::Encode; use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; use primitives::offchain; use primitives::hexdisplay::HexDisplay; @@ -767,6 +768,42 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(offset) }, + ext_network_state(written_out: *mut u32) -> *mut u8 => { + let res = this.ext.offchain() + .map(|api| api.network_state()) + .ok_or_else(|| "Calling unavailable API ext_network_state: wasm")?; + + let encoded = res.encode(); + let len = encoded.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encoded) + .map_err(|_| "Invalid attempt to set memory in ext_network_state")?; + + this.memory.write_primitive(written_out, len) + .map_err(|_| "Invalid attempt to write written_out in ext_network_state")?; + + Ok(offset) + }, + ext_authority_pubkey( + kind: u32, + written_out: *mut u32 + ) -> *mut u8 => { + let kind = offchain::CryptoKind::try_from(kind) + .map_err(|_| "crypto kind OOB while ext_authority_pubkey: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.authority_pubkey(kind)) + .ok_or_else(|| "Calling unavailable API ext_authority_pubkey: wasm")?; + + let encoded = res.encode(); + let len = encoded.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encoded) + .map_err(|_| "Invalid attempt to set memory in ext_authority_pubkey")?; + this.memory.write_primitive(written_out, len) + .map_err(|_| "Invalid attempt to write written_out in ext_authority_pubkey")?; + Ok(offset) + }, ext_decrypt( key: u32, kind: u32, diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 98cbf75c63..7b740976d2 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -189,6 +189,7 @@ pub mod test; pub use chain::{Client as ClientHandle, FinalityProofProvider}; pub use service::{ NetworkService, NetworkWorker, TransactionPool, ExHashT, ReportHandle, + NetworkStateInfo, }; pub use protocol::{PeerInfo, Context, consensus_gossip, message, specialization}; pub use protocol::sync::SyncState; diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 5841336b44..4cbe704eae 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -34,6 +34,7 @@ use futures::{prelude::*, sync::mpsc}; use log::{warn, error, info}; use libp2p::core::{swarm::NetworkBehaviour, transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::{PeerId, Multiaddr, multihash::Multihash}; +use parking_lot::Mutex; use peerset::PeersetHandle; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -86,6 +87,8 @@ impl ReportHandle { pub struct NetworkService, H: ExHashT> { /// Number of peers we're connected to. num_connected: Arc, + /// The local external addresses. + external_addresses: Arc>>, /// Are we actively catching up with the chain? is_major_syncing: Arc, /// Local copy of the `PeerId` of the local node. @@ -215,8 +218,11 @@ impl, H: ExHashT> NetworkWorker Swarm::::add_external_address(&mut swarm, addr.clone()); } + let external_addresses = Arc::new(Mutex::new(Vec::new())); + let service = Arc::new(NetworkService { bandwidth, + external_addresses: external_addresses.clone(), num_connected: num_connected.clone(), is_major_syncing: is_major_syncing.clone(), peerset: peerset_handle, @@ -226,6 +232,7 @@ impl, H: ExHashT> NetworkWorker }); Ok(NetworkWorker { + external_addresses, num_connected, is_major_syncing, network_service: swarm, @@ -295,7 +302,7 @@ impl, H: ExHashT> NetworkWorker /// Get network state. /// /// **Note**: Use this only for debugging. This API is unstable. There are warnings literaly - /// everywhere about this. Please don't use this function to retreive actual information. + /// everywhere about this. Please don't use this function to retrieve actual information. pub fn network_state(&mut self) -> NetworkState { let swarm = &mut self.network_service; let open = swarm.user_protocol().open_peers().cloned().collect::>(); @@ -487,6 +494,11 @@ impl, H: ExHashT> NetworkServic pub fn num_connected(&self) -> usize { self.num_connected.load(Ordering::Relaxed) } + + /// Returns the local external addresses. + pub fn external_addresses(&self) -> Vec { + self.external_addresses.lock().clone() + } } impl, H: ExHashT> @@ -500,6 +512,32 @@ impl, H: ExHashT> } } +/// Trait for providing information about the local network state +pub trait NetworkStateInfo { + /// Returns the local external addresses. + fn external_addresses(&self) -> Vec; + + /// Returns the local Peer ID. + fn peer_id(&self) -> PeerId; +} + +impl NetworkStateInfo for NetworkService + where + B: runtime_primitives::traits::Block, + S: NetworkSpecialization, + H: ExHashT, +{ + /// Returns the local external addresses. + fn external_addresses(&self) -> Vec { + self.external_addresses.lock().clone() + } + + /// Returns the local Peer ID. + fn peer_id(&self) -> PeerId { + self.local_peer_id.clone() + } +} + /// Messages sent from the `NetworkService` to the `NetworkWorker`. /// /// Each entry corresponds to a method of `NetworkService`. @@ -520,6 +558,8 @@ enum ServerToWorkerMsg> { /// You are encouraged to poll this in a separate background thread or task. #[must_use = "The NetworkWorker must be polled in order for the network to work"] pub struct NetworkWorker, H: ExHashT> { + /// Updated by the `NetworkWorker` and loaded by the `NetworkService`. + external_addresses: Arc>>, /// Updated by the `NetworkWorker` and loaded by the `NetworkService`. num_connected: Arc, /// Updated by the `NetworkWorker` and loaded by the `NetworkService`. @@ -621,6 +661,10 @@ impl, H: ExHashT> Future for Ne // Update the variables shared with the `NetworkService`. self.num_connected.store(self.network_service.user_protocol_mut().num_connected_peers(), Ordering::Relaxed); + { + let external_addresses = Swarm::::external_addresses(&self.network_service).cloned().collect(); + *self.external_addresses.lock() = external_addresses; + } self.is_major_syncing.store(match self.network_service.user_protocol_mut().sync_state() { SyncState::Idle => false, SyncState::Downloading => true, diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 758865b49c..ecc098ae08 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -16,6 +16,7 @@ parking_lot = "0.8.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } +network = { package = "substrate-network", path = "../../core/network" } [dev-dependencies] env_logger = "0.6" diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index b6aba784b3..776b31ef12 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::sync::Arc; +use std::{str::FromStr, sync::Arc, convert::TryFrom}; use client::backend::OffchainStorage; use crate::AuthorityKeyProvider; use futures::{Stream, Future, sync::mpsc}; @@ -25,6 +25,7 @@ use primitives::offchain::{ Externalities as OffchainExt, CryptoKind, CryptoKeyId, StorageKind, + OpaqueNetworkState, OpaquePeerId, OpaqueMultiaddr, }; use primitives::crypto::{Pair, Protected}; use primitives::{ed25519, sr25519}; @@ -33,6 +34,8 @@ use runtime_primitives::{ traits::{self, Extrinsic}, }; use transaction_pool::txpool::{Pool, ChainApi}; +use network::NetworkStateInfo; +use network::{PeerId, Multiaddr}; /// A message between the offchain extension and the processing thread. enum ExtMessage { @@ -59,6 +62,7 @@ pub(crate) struct Api { db: Storage, keys_password: Protected, key_provider: KeyProvider, + network_state: Arc, } fn unavailable_yet(name: &str) -> R { @@ -158,6 +162,26 @@ impl OffchainExt for Api where Ok(CryptoKeyId(id)) } + fn authority_pubkey(&self, kind: CryptoKind) -> Result, ()> { + let key = self.read_key(None, kind)?; + let public = match key { + Key::Sr25519(pair) => pair.public().encode(), + Key::Ed25519(pair) => pair.public().encode(), + }; + + Ok(public) + } + + fn network_state(&self) -> Result { + let external_addresses = self.network_state.external_addresses(); + + let state = NetworkState::new( + self.network_state.peer_id(), + external_addresses, + ); + Ok(OpaqueNetworkState::from(state)) + } + fn encrypt(&mut self, _key: Option, _kind: CryptoKind, _data: &[u8]) -> Result, ()> { unavailable_yet::<()>("encrypt"); Err(()) @@ -285,6 +309,71 @@ impl OffchainExt for Api where } } +/// Information about the local node's network state. +#[derive(Clone, Eq, PartialEq, Debug)] +pub struct NetworkState { + peer_id: PeerId, + external_addresses: Vec, +} + +impl NetworkState { + fn new(peer_id: PeerId, external_addresses: Vec) -> Self { + NetworkState { + peer_id, + external_addresses, + } + } +} + +impl From for OpaqueNetworkState { + fn from(state: NetworkState) -> OpaqueNetworkState { + let enc = Encode::encode(&state.peer_id.into_bytes()); + let peer_id = OpaquePeerId::new(enc); + + let external_addresses: Vec = state + .external_addresses + .iter() + .map(|multiaddr| { + let e = Encode::encode(&multiaddr.to_string()); + OpaqueMultiaddr::new(e) + }) + .collect(); + + OpaqueNetworkState { + peer_id, + external_addresses, + } + } +} + +impl TryFrom for NetworkState { + type Error = (); + + fn try_from(state: OpaqueNetworkState) -> Result { + let inner_vec = state.peer_id.0; + + let bytes: Vec = Decode::decode(&mut &inner_vec[..]).ok_or(())?; + let peer_id = PeerId::from_bytes(bytes).map_err(|_| ())?; + + let external_addresses: Result, Self::Error> = state.external_addresses + .iter() + .map(|enc_multiaddr| -> Result { + let inner_vec = &enc_multiaddr.0; + let bytes = >::decode(&mut &inner_vec[..]).ok_or(())?; + let multiaddr_str = String::from_utf8(bytes).map_err(|_| ())?; + let multiaddr = Multiaddr::from_str(&multiaddr_str).map_err(|_| ())?; + Ok(multiaddr) + }) + .collect(); + let external_addresses = external_addresses?; + + Ok(NetworkState { + peer_id, + external_addresses, + }) + } +} + /// Offchain extensions implementation API /// /// This is the asynchronous processing part of the API. @@ -302,6 +391,7 @@ impl AsyncApi { keys_password: Protected, key_provider: P, at: BlockId, + network_state: Arc, ) -> (Api, AsyncApi) { let (sender, rx) = mpsc::unbounded(); @@ -310,6 +400,7 @@ impl AsyncApi { db, keys_password, key_provider, + network_state, }; let async_api = AsyncApi { @@ -355,8 +446,22 @@ impl AsyncApi { #[cfg(test)] mod tests { use super::*; + use std::{collections::HashSet, convert::TryFrom}; use client_db::offchain::LocalStorage; use crate::tests::TestProvider; + use network::PeerId; + + struct MockNetworkStateInfo(); + + impl NetworkStateInfo for MockNetworkStateInfo { + fn external_addresses(&self) -> Vec { + Vec::new() + } + + fn peer_id(&self) -> PeerId { + PeerId::random() + } + } fn offchain_api() -> (Api, AsyncApi) { let _ = env_logger::try_init(); @@ -366,7 +471,8 @@ mod tests { Pool::new(Default::default(), transaction_pool::ChainApi::new(client.clone())) ); - AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(0)) + let mock = Arc::new(MockNetworkStateInfo()); + AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(0), mock) } #[test] @@ -455,4 +561,23 @@ mod tests { "Invalid kind should trigger a missing key error." ); } + + #[test] + fn should_convert_network_states() { + // given + let state = NetworkState::new( + PeerId::random(), + vec![ + Multiaddr::try_from("/ip4/127.0.0.1/tcp/1234".to_string()).unwrap(), + Multiaddr::try_from("/ip6/2601:9:4f81:9700:803e:ca65:66e8:c21").unwrap(), + ], + ); + + // when + let opaque_state = OpaqueNetworkState::from(state.clone()); + let converted_back_state = NetworkState::try_from(opaque_state).unwrap(); + + // then + assert_eq!(state, converted_back_state); + } } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index de3a5da084..f9eb3da07a 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -51,6 +51,7 @@ use runtime_primitives::{ }; use futures::future::Future; use transaction_pool::txpool::{Pool, ChainApi}; +use network::NetworkStateInfo; mod api; @@ -130,6 +131,7 @@ impl OffchainWorkers< &self, number: &::Number, pool: &Arc>, + network_state: Arc, ) -> impl Future where A: ChainApi + 'static, { @@ -145,6 +147,7 @@ impl OffchainWorkers< self.keys_password.clone(), self.authority_key.clone(), at.clone(), + network_state.clone(), ); debug!("Running offchain workers at {:?}", at); let api = Box::new(api); @@ -161,6 +164,20 @@ mod tests { use super::*; use futures::Future; use primitives::{ed25519, sr25519, crypto::{TypedKey, Pair}}; + use std::collections::HashSet; + use network::{Multiaddr, PeerId}; + + struct MockNetworkStateInfo(); + + impl NetworkStateInfo for MockNetworkStateInfo { + fn external_addresses(&self) -> Vec { + Vec::new() + } + + fn peer_id(&self) -> PeerId { + PeerId::random() + } + } #[derive(Clone, Default)] pub(crate) struct TestProvider { @@ -186,10 +203,11 @@ mod tests { let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); let db = client_db::offchain::LocalStorage::new_test(); + let mock = Arc::new(MockNetworkStateInfo()); // when let offchain = OffchainWorkers::new(client, db, TestProvider::default(), "".to_owned().into()); - runtime.executor().spawn(offchain.on_block_imported(&0u64, &pool)); + runtime.executor().spawn(offchain.on_block_imported(&0u64, &pool, mock.clone())); // then runtime.shutdown_on_idle().wait().unwrap(); diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs index 2d8c690e9a..f2fb7e14c4 100644 --- a/core/offchain/src/testing.rs +++ b/core/offchain/src/testing.rs @@ -31,6 +31,7 @@ use primitives::offchain::{ CryptoKind, CryptoKeyId, StorageKind, + OpaqueNetworkState, }; /// Pending request. @@ -139,6 +140,14 @@ impl offchain::Externalities for TestOffchainExt { unimplemented!("not needed in tests so far") } + fn network_state(&self) -> Result { + unimplemented!("not needed in tests so far") + } + + fn authority_pubkey(&self, _kind: CryptoKind) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { unimplemented!("not needed in tests so far") } diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index 2ea93423d9..a13c26da26 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -185,6 +185,41 @@ impl TryFrom for HttpRequestStatus { } } +/// A blob to hold information about the local node's network state +/// without committing to its format. +#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct OpaqueNetworkState { + /// PeerId of the local node. + pub peer_id: OpaquePeerId, + /// List of addresses the node knows it can be reached as. + pub external_addresses: Vec, +} + +/// Simple blob to hold a `PeerId` without committing to its format. +#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct OpaquePeerId(pub Vec); + +impl OpaquePeerId { + /// Create new `OpaquePeerId` + pub fn new(vec: Vec) -> Self { + OpaquePeerId(vec) + } +} + +/// Simple blob to hold a `Multiaddr` without committing to its format. +#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct OpaqueMultiaddr(pub Vec); + +impl OpaqueMultiaddr { + /// Create new `OpaqueMultiaddr` + pub fn new(vec: Vec) -> Self { + OpaqueMultiaddr(vec) + } +} + /// Opaque timestamp type #[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] #[cfg_attr(feature = "std", derive(Debug))] @@ -241,6 +276,12 @@ pub trait Externalities { /// The transaction will end up in the pool and be propagated to others. fn submit_transaction(&mut self, extrinsic: Vec) -> Result<(), ()>; + /// Returns information about the local node's network state. + fn network_state(&self) -> Result; + + /// Returns the locally configured authority public key, if available. + fn authority_pubkey(&self, crypto: CryptoKind) -> Result, ()>; + /// Create new key(pair) for signing/encryption/decryption. /// /// Returns an error if given crypto kind is not supported. @@ -319,7 +360,7 @@ pub trait Externalities { /// offchain worker tasks running on the same machine. It IS persisted between runs. fn local_storage_get(&mut self, kind: StorageKind, key: &[u8]) -> Option>; - /// Initiaties a http request given HTTP verb and the URL. + /// Initiates a http request given HTTP verb and the URL. /// /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. /// Returns the id of newly started request. @@ -398,6 +439,14 @@ impl Externalities for Box { (&mut **self).encrypt(key, kind, data) } + fn network_state(&self) -> Result { + (& **self).network_state() + } + + fn authority_pubkey(&self, key:CryptoKind) -> Result, ()> { + (&**self).authority_pubkey(key) + } + fn decrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { (&mut **self).decrypt(key, kind, data) } diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 8be5002d2d..6a15e2eeb6 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -33,6 +33,7 @@ transaction_pool = { package = "substrate-transaction-pool", path = "../../core/ rpc = { package = "substrate-rpc-servers", path = "../../core/rpc-servers" } tel = { package = "substrate-telemetry", path = "../../core/telemetry" } offchain = { package = "substrate-offchain", path = "../../core/offchain" } +parity-multiaddr = { package = "parity-multiaddr", version = "0.5.0" } [dev-dependencies] substrate-test-runtime-client = { path = "../test-runtime/client" } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 54c94730b0..1b0f9500a1 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -23,7 +23,7 @@ use client_db; use client::{self, Client, runtime_api}; use crate::{error, Service, AuthorityKeyProvider}; use consensus_common::{import_queue::ImportQueue, SelectChain}; -use network::{self, OnDemand, FinalityProofProvider, config::BoxFinalityProofRequestBuilder}; +use network::{self, OnDemand, FinalityProofProvider, NetworkStateInfo, config::BoxFinalityProofRequestBuilder}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; use runtime_primitives::{ @@ -235,6 +235,7 @@ pub trait OffchainWorker { ComponentBlock >, pool: &Arc>, + network_state: &Arc, ) -> error::Result + Send>>; } @@ -251,8 +252,9 @@ impl OffchainWorker for C where ComponentBlock >, pool: &Arc>, + network_state: &Arc, ) -> error::Result + Send>> { - Ok(Box::new(offchain.on_block_imported(number, pool))) + Ok(Box::new(offchain.on_block_imported(number, pool, network_state.clone()))) } } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 8da3c0c0f4..1ae5a0a58a 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -37,7 +37,7 @@ use exit_future::Signal; use futures::prelude::*; use futures03::stream::{StreamExt as _, TryStreamExt as _}; use keystore::Store as Keystore; -use network::NetworkState; +use network::{NetworkState, NetworkStateInfo}; use log::{info, warn, debug, error}; use parity_codec::{Encode, Decode}; use primitives::{Pair, ed25519, crypto}; @@ -293,6 +293,7 @@ impl Service { let wclient = Arc::downgrade(&client); let offchain = offchain_workers.as_ref().map(Arc::downgrade); let to_spawn_tx_ = to_spawn_tx.clone(); + let network_state_info: Arc = network.clone(); let events = client.import_notification_stream() .map(|v| Ok::<_, ()>(v)).compat() @@ -312,6 +313,7 @@ impl Service { &number, &offchain, &txpool, + &network_state_info, ).map_err(|e| warn!("Offchain workers error processing new block: {:?}", e))?; let _ = to_spawn_tx_.unbounded_send(future); } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index f340f0a99b..4e5b9c9def 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -38,6 +38,7 @@ use primitives::offchain::{ HttpRequestId, HttpRequestStatus, HttpError, CryptoKind, CryptoKeyId, StorageKind, + OpaqueNetworkState, }; /// Error verifying ECDSA signature @@ -239,6 +240,13 @@ export_api! { /// The transaction will end up in the pool. fn submit_transaction(data: &T) -> Result<(), ()>; + /// Returns information about the local node's network state. + fn network_state() -> Result; + + /// Returns the currently configured authority public key, if available. + // TODO [#3139] change into crypto_pubkey(&self, key: Option, kind: CryptoKind) + fn authority_pubkey(crypto: CryptoKind) -> Result, ()>; + /// Create new key(pair) for signing/encryption/decryption. /// /// Returns an error if given crypto kind is not supported. @@ -313,7 +321,7 @@ export_api! { /// offchain worker tasks running on the same machine. It IS persisted between runs. fn local_storage_get(kind: StorageKind, key: &[u8]) -> Option>; - /// Initiaties a http request given HTTP verb and the URL. + /// Initiates a http request given HTTP verb and the URL. /// /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. /// Returns the id of newly started request. diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 9475aa0715..c6abef7cea 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -269,6 +269,18 @@ impl OffchainApi for () { }, "submit_transaction can be called only in the offchain worker context") } + fn network_state() -> Result { + with_offchain(|ext| { + ext.network_state() + }, "network_state can be called only in the offchain worker context") + } + + fn authority_pubkey(crypto: offchain::CryptoKind) -> Result, ()> { + with_offchain(|ext| { + ext.authority_pubkey(crypto) + }, "authority_pubkey can be called only in the offchain worker context") + } + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { with_offchain(|ext| { ext.new_crypto_key(crypto) diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 5565f9ab38..9090d449f3 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -385,6 +385,33 @@ pub mod ext { /// - nonzero otherwise. fn ext_submit_transaction(data: *const u8, len: u32) -> u32; + /// Returns information about the local node's network state. + /// + /// # Returns + /// + /// The encoded `Result`. + /// `written_out` contains the length of the message. + /// + /// The ownership of the returned buffer is transferred to the runtime + /// code and the runtime is responsible for freeing it. This is always + /// a properly allocated pointer (which cannot be NULL), hence the + /// runtime code can always rely on it. + fn ext_network_state(written_out: *mut u32) -> *mut u8; + + /// Returns the locally configured authority public key, if available. + /// The `crypto` argument is `offchain::CryptoKind` converted to `u32`. + /// + /// # Returns + /// + /// The encoded `Result, ()>`. + /// `written_out` contains the length of the message. + /// + /// The ownership of the returned buffer is transferred to the runtime + /// code and the runtime is responsible for freeing it. This is always + /// a properly allocated pointer (which cannot be NULL), hence the + /// runtime code can always rely on it. + fn ext_authority_pubkey(crypto: u32, written_out: *mut u32) -> *mut u8; + /// Create new key(pair) for signing/encryption/decryption. /// /// # Returns @@ -504,7 +531,7 @@ pub mod ext { /// - Otherwise, pointer to the value in memory. `value_len` contains the length of the value. fn ext_local_storage_get(kind: u32, key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8; - /// Initiaties a http request. + /// Initiates a http request. /// /// `meta` is parity-codec encoded additional parameters to the request (like redirection policy, /// timeouts, certificates policy, etc). The format is not yet specified and the field is currently @@ -888,6 +915,39 @@ impl OffchainApi for () { } } + fn network_state() -> Result { + let mut len = 0_u32; + let raw_result = unsafe { + let ptr = ext_network_state.get()(&mut len); + + from_raw_parts(ptr, len) + }; + + match raw_result { + Some(raw_result) => codec::Decode::decode(&mut &*raw_result).unwrap_or(Err(())), + None => Err(()) + } + } + + fn authority_pubkey(kind: offchain::CryptoKind) -> Result, ()> { + let kind = kind as isize as u32; + + let mut len = 0u32; + let raw_result = unsafe { + let ptr = ext_authority_pubkey.get()( + kind, + &mut len, + ); + + from_raw_parts(ptr, len) + }; + + match raw_result { + Some(raw_result) => codec::Decode::decode(&mut &*raw_result).unwrap_or(Err(())), + None => Err(()) + } + } + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { let crypto = crypto.into(); let ret = unsafe { diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index d6e0d60e2c..6139139ce0 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -114,9 +114,15 @@ impl< Signature: Codec, Call, > Extrinsic for UncheckedExtrinsic { + type Call = Call; + fn is_signed(&self) -> Option { Some(self.signature.is_some()) } + + fn new_unsigned(call: Self::Call) -> Option { + Some(UncheckedExtrinsic::new_unsigned(call)) + } } impl Decode diff --git a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs index 36e17fc277..7b50239a6f 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs @@ -59,9 +59,15 @@ impl UncheckedMortalCompactExtrinsic Extrinsic for UncheckedMortalCompactExtrinsic { + type Call = Call; + fn is_signed(&self) -> Option { Some(self.signature.is_some()) } + + fn new_unsigned(call: Self::Call) -> Option { + Some(UncheckedMortalCompactExtrinsic::new_unsigned(call)) + } } impl Checkable diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs index 7f92b20edd..dda5a6cd58 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs @@ -61,9 +61,15 @@ impl UncheckedMortalExtrinsic Extrinsic for UncheckedMortalExtrinsic { + type Call = Call; + fn is_signed(&self) -> Option { Some(self.signature.is_some()) } + + fn new_unsigned(call: Self::Call) -> Option { + Some(UncheckedMortalExtrinsic::new_unsigned(call)) + } } impl Checkable diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 5f0a888ccd..0b6321034c 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -869,9 +869,13 @@ impl ::serde::Serialize for OpaqueExtrinsic { } impl traits::Extrinsic for OpaqueExtrinsic { + type Call = (); + fn is_signed(&self) -> Option { None } + + fn new_unsigned(_call: Self::Call) -> Option { None } } #[cfg(test)] diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index f8df25ec59..c66d210c93 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -44,6 +44,14 @@ impl TypedKey for UintAuthorityId { const KEY_TYPE: KeyTypeId = UINT_DUMMY_KEY; } +impl AsRef<[u8]> for UintAuthorityId { + fn as_ref(&self) -> &[u8] { + let ptr = self.0 as *const _; + // It's safe to do this here since `UintAuthorityId` is `u64`. + unsafe { std::slice::from_raw_parts(ptr, 8) } + } +} + impl OpaqueKeys for UintAuthorityId { type KeyTypeIds = std::iter::Cloned>; @@ -133,6 +141,8 @@ impl<'a> Deserialize<'a> for Header { pub struct ExtrinsicWrapper(Xt); impl traits::Extrinsic for ExtrinsicWrapper { + type Call = (); + fn is_signed(&self) -> Option { None } @@ -219,6 +229,8 @@ impl Checkable for TestXt { fn check(self, _: &Context) -> Result { Ok(self) } } impl traits::Extrinsic for TestXt { + type Call = Call; + fn is_signed(&self) -> Option { Some(self.0.is_some()) } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index a6d94babbe..2dbb3761d8 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -622,6 +622,12 @@ pub trait RandomnessBeacon { pub trait Member: Send + Sync + Sized + MaybeDebug + Eq + PartialEq + Clone + 'static {} impl Member for T {} +/// Determine if a `MemberId` is a valid member. +pub trait IsMember { + /// Is the given `MemberId` a valid member? + fn is_member(member_id: &MemberId) -> bool; +} + /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. @@ -702,10 +708,16 @@ pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDes } /// Something that acts like an `Extrinsic`. -pub trait Extrinsic { +pub trait Extrinsic: Sized { + /// The function call. + type Call; + /// Is this `Extrinsic` signed? /// If no information are available about signed/unsigned, `None` should be returned. fn is_signed(&self) -> Option { None } + + /// New instance of an unsigned extrinsic aka "inherent". + fn new_unsigned(_call: Self::Call) -> Option { None } } /// Extract the hashing type for a block. diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 4ade53a6f1..f6369159ba 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -81,7 +81,7 @@ where changes_trie_transaction: Option<(MemoryDB, H::Out)>, /// Additional externalities for offchain workers. /// - /// If None, some methods from the trait might not supported. + /// If None, some methods from the trait might not be supported. offchain_externalities: Option<&'a mut O>, /// Dummy usage of N arg. _phantom: ::std::marker::PhantomData, diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index f151fedaf5..769c774756 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -24,7 +24,7 @@ use log::warn; use hash_db::Hasher; use parity_codec::{Decode, Encode}; use primitives::{ - storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain + storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain, }; pub mod backend; @@ -240,6 +240,19 @@ impl offchain::Externalities for NeverOffchainExt { unreachable!() } + fn network_state( + &self, + ) -> Result { + unreachable!() + } + + fn authority_pubkey( + &self, + _crypto: offchain::CryptoKind, + ) -> Result, ()> { + unreachable!() + } + fn new_crypto_key( &mut self, _crypto: offchain::CryptoKind, diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index b72d2af62a..55c9f52c62 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -140,6 +140,8 @@ impl BlindCheckable for Extrinsic { } impl ExtrinsicT for Extrinsic { + type Call = (); + fn is_signed(&self) -> Option { if let Extrinsic::IncludeData(_) = *self { Some(false) @@ -147,6 +149,10 @@ impl ExtrinsicT for Extrinsic { Some(true) } } + + fn new_unsigned(_call: Self::Call) -> Option { + None + } } impl Extrinsic { diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 11a477df96..26ff6f9ea9 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -80,9 +80,13 @@ pub mod opaque { } } impl traits::Extrinsic for UncheckedExtrinsic { + type Call = (); fn is_signed(&self) -> Option { None } + fn new_unsigned(_call: Self::Call) -> Option { + None + } } /// Opaque block header type. pub type Header = generic::Header; diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 857eba782a..fc07ae4cea 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -19,10 +19,10 @@ use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto}; use node_primitives::{AccountId, AuraId, Balance}; use node_runtime::{ - GrandpaConfig, BalancesConfig, ContractsConfig, ElectionsConfig, DemocracyConfig, CouncilConfig, - AuraConfig, IndicesConfig, SessionConfig, StakingConfig, SudoConfig, TechnicalCommitteeConfig, - SystemConfig, WASM_BINARY, Perbill, SessionKeys, StakerStatus, DAYS, DOLLARS, - MILLICENTS, + GrandpaConfig, BalancesConfig, ContractsConfig, ElectionsConfig, DemocracyConfig, + CouncilConfig, AuraConfig, ImOnlineConfig, IndicesConfig, SessionConfig, StakingConfig, + SudoConfig, TechnicalCommitteeConfig, SystemConfig, WASM_BINARY, Perbill, SessionKeys, + StakerStatus, DAYS, DOLLARS, MILLICENTS, }; pub use node_runtime::GenesisConfig; use substrate_service; @@ -154,6 +154,10 @@ fn staging_testnet_config_genesis() -> GenesisConfig { aura: Some(AuraConfig { authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), }), + im_online: Some(ImOnlineConfig { + gossip_at: 0, + last_new_era_start: 0, + }), grandpa: Some(GrandpaConfig { authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), }), @@ -291,6 +295,10 @@ pub fn testnet_genesis( aura: Some(AuraConfig { authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), }), + im_online: Some(ImOnlineConfig{ + gossip_at: 0, + last_new_era_start: 0, + }), grandpa: Some(GrandpaConfig { authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), }), diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 3ff2d876a2..5b2be48173 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -354,6 +354,7 @@ mod tests { gas_price: 1 * MILLICENTS, }), sudo: Some(Default::default()), + im_online: Some(Default::default()), grandpa: Some(GrandpaConfig { authorities: vec![], }), diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 3bf28f7df2..17c666dbdc 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -33,6 +33,7 @@ system = { package = "srml-system", path = "../../srml/system", default-features timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default-features = false } treasury = { package = "srml-treasury", path = "../../srml/treasury", default-features = false } sudo = { package = "srml-sudo", path = "../../srml/sudo", default-features = false } +im-online = { package = "srml-im-online", path = "../../srml/im-online", default-features = false } node-primitives = { path = "../primitives", default-features = false } consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default-features = false } rustc-hex = { version = "2.0", optional = true } @@ -79,4 +80,5 @@ std = [ "rustc-hex", "substrate-keyring", "offchain-primitives/std", + "im-online/std", ] diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index d453e4f837..2f276580f4 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -74,8 +74,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 114, - impl_version: 114, + spec_version: 115, + impl_version: 115, apis: RUNTIME_API_VERSIONS, }; @@ -193,7 +193,7 @@ parameter_types! { pub const Offset: BlockNumber = 0; } -type SessionHandlers = (Grandpa, Aura); +type SessionHandlers = (Grandpa, Aura, ImOnline); impl_opaque_keys! { pub struct SessionKeys { @@ -371,6 +371,15 @@ impl sudo::Trait for Runtime { type Proposal = Call; } +impl im_online::Trait for Runtime { + type AuthorityId = AuraId; + type Call = Call; + type Event = Event; + type SessionsPerEra = SessionsPerEra; + type UncheckedExtrinsic = UncheckedExtrinsic; + type IsValidAuthorityId = Aura; +} + impl grandpa::Trait for Runtime { type Event = Event; } @@ -409,6 +418,7 @@ construct_runtime!( Treasury: treasury::{Module, Call, Storage, Event}, Contracts: contracts, Sudo: sudo, + ImOnline: im_online::{default, ValidateUnsigned}, } ); diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 1e92d411f4..da00f25476 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -54,7 +54,7 @@ use rstd::{result, prelude::*}; use parity_codec::Encode; use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue, traits::Get}; use primitives::{ - traits::{SaturatedConversion, Saturating, Zero, One, Member, TypedKey}, + traits::{SaturatedConversion, Saturating, Zero, One, Member, IsMember, TypedKey}, generic::DigestItem, }; use timestamp::OnTimestampSet; @@ -210,6 +210,14 @@ impl session::OneSessionHandler for Module { } } +impl IsMember for Module { + fn is_member(authority_id: &T::AuthorityId) -> bool { + Self::authorities() + .iter() + .any(|id| id == authority_id) + } +} + /// A report of skipped authorities in Aura. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index f1c8894a4d..8c7045675f 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -23,7 +23,10 @@ pub use timestamp; use rstd::{result, prelude::*}; use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get}; use timestamp::{OnTimestampSet, Trait}; -use primitives::{generic::DigestItem, traits::{SaturatedConversion, Saturating, RandomnessBeacon}}; +use primitives::{ + generic::DigestItem, + traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon} +}; use primitives::ConsensusEngineId; #[cfg(feature = "std")] use timestamp::TimestampInherentData; @@ -188,6 +191,14 @@ impl FindAuthor for Module { } } +impl IsMember for Module { + fn is_member(authority_id: &AuthorityId) -> bool { + >::authorities() + .iter() + .any(|id| id == authority_id) + } +} + impl Module { /// Determine the BABE slot duration based on the Timestamp module configuration. pub fn slot_duration() -> T::Moment { diff --git a/srml/im-online/Cargo.toml b/srml/im-online/Cargo.toml new file mode 100644 index 0000000000..5ca5e0c533 --- /dev/null +++ b/srml/im-online/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "srml-im-online" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } +serde = { version = "1.0", optional = true } +session = { package = "srml-session", path = "../session", default-features = false } +srml-support = { path = "../support", default-features = false } +sr-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } +substrate_primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +system = { package = "srml-system", path = "../system", default-features = false } + +[features] +default = ["std"] +std = [ + "parity-codec/std", + "primitives/std", + "rstd/std", + "serde", + "session/std", + "srml-support/std", + "sr-io/std", + "system/std", +] diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs new file mode 100644 index 0000000000..26ca2f0581 --- /dev/null +++ b/srml/im-online/src/lib.rs @@ -0,0 +1,433 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! # I'm online Module +//! +//! If the local node is a validator (i.e. contains an authority key), this module +//! gossips a heartbeat transaction with each new session. The heartbeat functions +//! as a simple mechanism to signal that the node is online in the current era. +//! +//! Received heartbeats are tracked for one era and reset with each new era. The +//! module exposes two public functions to query if a heartbeat has been received +//! in the current era or session. +//! +//! The heartbeat is a signed transaction, which was signed using the session key +//! and includes the recent best block number of the local validators chain as well +//! as the [NetworkState](../../core/offchain/struct.NetworkState.html). +//! It is submitted as an Unsigned Transaction via off-chain workers. +//! +//! - [`im_online::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) +//! +//! ## Interface +//! +//! ### Public Functions +//! +//! - `is_online_in_current_era` - True if the validator sent a heartbeat in the current era. +//! - `is_online_in_current_session` - True if the validator sent a heartbeat in the current session. +//! +//! ## Usage +//! +//! ``` +//! use srml_support::{decl_module, dispatch::Result}; +//! use system::ensure_signed; +//! use srml_im_online::{self as im_online}; +//! +//! pub trait Trait: im_online::Trait {} +//! +//! decl_module! { +//! pub struct Module for enum Call where origin: T::Origin { +//! pub fn is_online(origin, authority_id: T::AuthorityId) -> Result { +//! let _sender = ensure_signed(origin)?; +//! let _is_online = >::is_online_in_current_era(&authority_id); +//! Ok(()) +//! } +//! } +//! } +//! # fn main() { } +//! ``` +//! +//! ## Dependencies +//! +//! This module depends on the [Session module](../srml_session/index.html). + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +use substrate_primitives::{ + crypto::TypedKey, offchain::CryptoKind, + crypto::key_types, + offchain::OpaqueNetworkState, + offchain::StorageKind, + sr25519, ed25519, +}; +use parity_codec::{Encode, Decode}; +use primitives::{ + ApplyError, traits::{Member, IsMember, Extrinsic as ExtrinsicT}, + transaction_validity::{TransactionValidity, TransactionLongevity}, +}; +use rstd::prelude::*; +use session::SessionIndex; +use sr_io::Printable; +use srml_support::{ + Parameter, StorageValue, decl_module, decl_event, decl_storage, + traits::Get, StorageDoubleMap, print, +}; +use system::ensure_none; + +// The local storage database key under which the worker progress status +// is tracked. +const DB_KEY: &[u8] = b"srml/im-online-worker-status"; + +// It's important to persist the worker state, since e.g. the +// server could be restarted while starting the gossip process, but before +// finishing it. With every execution of the off-chain worker we check +// if we need to recover and resume gossipping or if there is already +// another off-chain worker in the process of gossipping. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +struct WorkerStatus { + done: bool, + gossipping_at: BlockNumber, +} + +// Error which may occur while executing the off-chain code. +enum OffchainErr { + DecodeAuthorityId, + DecodeWorkerStatus, + ExtrinsicCreation, + FailedSigning, + NetworkState, + SubmitTransaction, + UnknownCryptoKind, +} + +impl Printable for OffchainErr { + fn print(self) { + match self { + OffchainErr::DecodeAuthorityId => print("Offchain error: decoding AuthorityId failed!"), + OffchainErr::DecodeWorkerStatus => print("Offchain error: decoding WorkerStatus failed!"), + OffchainErr::ExtrinsicCreation => print("Offchain error: extrinsic creation failed!"), + OffchainErr::FailedSigning => print("Offchain error: signing failed!"), + OffchainErr::NetworkState => print("Offchain error: fetching network state failed!"), + OffchainErr::SubmitTransaction => print("Offchain error: submitting transaction failed!"), + OffchainErr::UnknownCryptoKind => print("Offchain error: the CryptoKind is unknown!"), + } + } +} + +/// Heartbeat which is send/received. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Heartbeat + where BlockNumber: PartialEq + Eq + Decode + Encode, +{ + block_number: BlockNumber, + network_state: OpaqueNetworkState, + session_index: session::SessionIndex, + authority_id: AuthorityId, +} + +pub trait Trait: system::Trait + session::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// The function call. + type Call: From>; + + /// A extrinsic right from the external world. This is unchecked and so + /// can contain a signature. + type UncheckedExtrinsic: ExtrinsicT + Encode + Decode; + + /// The identifier type for an authority. + type AuthorityId: Member + Parameter + Default + TypedKey + Decode + Encode + AsRef<[u8]>; + + /// Number of sessions per era. + type SessionsPerEra: Get; + + /// Determine if an `AuthorityId` is a valid authority. + type IsValidAuthorityId: IsMember; +} + +decl_event!( + pub enum Event where + ::BlockNumber, + ::AuthorityId + { + /// A new heartbeat was received at this `BlockNumber` from `AuthorityId` + HeartbeatReceived(BlockNumber, AuthorityId), + } +); + +decl_storage! { + trait Store for Module as ImOnline { + // The block number when we should gossip. + GossipAt get(gossip_at) config(): T::BlockNumber; + + // The session index when the last new era started. + LastNewEraStart get(last_new_era_start) config(): Option; + + // For each session index we keep a mapping of `AuthorityId` to + // `offchain::OpaqueNetworkState`. + ReceivedHeartbeats get(received_heartbeats): double_map session::SessionIndex, + blake2_256(T::AuthorityId) => Vec; + } +} + +decl_module! { + pub struct Module for enum Call where origin: T::Origin { + /// Number of sessions per era. + const SessionsPerEra: session::SessionIndex = T::SessionsPerEra::get(); + + fn deposit_event() = default; + + fn heartbeat( + origin, + heartbeat: Heartbeat, + _signature: Vec + ) { + ensure_none(origin)?; + + let current_session = >::current_index(); + let exists = >::exists(current_session, &heartbeat.authority_id); + if !exists { + let now = >::block_number(); + Self::deposit_event(RawEvent::HeartbeatReceived(now, heartbeat.authority_id.clone())); + + let network_state = heartbeat.network_state.encode(); + >::insert(current_session, &heartbeat.authority_id, network_state); + } + } + + // Runs after every block. + fn offchain_worker(now: T::BlockNumber) { + fn gossip_at(block_number: T::BlockNumber) -> Result<(), OffchainErr> { + let kind = match ::KEY_TYPE { + key_types::SR25519 => CryptoKind::Sr25519, + key_types::ED25519 => CryptoKind::Ed25519, + _ => return Err(OffchainErr::UnknownCryptoKind), + }; + + // we run only when a local authority key is configured + if let Ok(key) = sr_io::authority_pubkey(kind) { + let authority_id = ::AuthorityId::decode(&mut &key[..]) + .ok_or(OffchainErr::DecodeAuthorityId)?; + let network_state = + sr_io::network_state().map_err(|_| OffchainErr::NetworkState)?; + let heartbeat_data = Heartbeat { + block_number, + network_state, + session_index: >::current_index(), + authority_id, + }; + + let signature = sr_io::sign(None, kind, &heartbeat_data.encode()) + .map_err(|_| OffchainErr::FailedSigning)?; + let call = Call::heartbeat(heartbeat_data, signature); + let ex = T::UncheckedExtrinsic::new_unsigned(call.into()) + .ok_or(OffchainErr::ExtrinsicCreation)?; + sr_io::submit_transaction(&ex) + .map_err(|_| OffchainErr::SubmitTransaction)?; + set_worker_status::(block_number, true); + } + Ok(()) + } + + fn set_worker_status(gossipping_at: T::BlockNumber, done: bool) { + let enc = WorkerStatus { + done, + gossipping_at, + }; + sr_io::local_storage_set(StorageKind::PERSISTENT, DB_KEY, &enc.encode()); + } + + fn was_not_yet_gossipped( + now: T::BlockNumber, + next_gossip: T::BlockNumber, + ) -> Result { + let last_gossip = sr_io::local_storage_get(StorageKind::PERSISTENT, DB_KEY); + match last_gossip { + Some(l) => { + let worker_status: WorkerStatus = Decode::decode(&mut &l[..]) + .ok_or(OffchainErr::DecodeWorkerStatus)?; + + let was_aborted = !worker_status.done && worker_status.gossipping_at < now; + + // another off-chain worker is currently in the process of submitting + let already_submitting = + !worker_status.done && worker_status.gossipping_at == now; + + let not_yet_gossipped = + worker_status.done && worker_status.gossipping_at < next_gossip; + + let ret = (was_aborted && !already_submitting) || not_yet_gossipped; + Ok(ret) + }, + None => Ok(true), + } + } + + let next_gossip = >::get(); + let not_yet_gossipped = match was_not_yet_gossipped::(now, next_gossip) { + Ok(v) => v, + Err(err) => { + print(err); + return; + }, + }; + if next_gossip < now && not_yet_gossipped { + set_worker_status::(now, false); + + match gossip_at::(now) { + Ok(_) => {}, + Err(err) => print(err), + } + } + } + } +} + +impl Module { + /// Returns `true` if a heartbeat has been received for `AuthorityId` + /// during the current era. Otherwise `false`. + pub fn is_online_in_current_era(authority_id: &T::AuthorityId) -> bool { + let curr = >::current_index(); + match LastNewEraStart::get() { + Some(start) => { + // iterate over every session + for index in start..curr { + if >::exists(index, authority_id) { + return true; + } + } + false + }, + None => >::exists(curr, authority_id), + } + } + + /// Returns `true` if a heartbeat has been received for `AuthorityId` + /// during the current session. Otherwise `false`. + pub fn is_online_in_current_session(authority_id: &T::AuthorityId) -> bool { + let current_session = >::current_index(); + >::exists(current_session, authority_id) + } + + /// Session has just changed. + fn new_session() { + let now = >::block_number(); + >::put(now); + + let current_session = >::current_index(); + + match LastNewEraStart::get() { + Some(last_new_era_start) => { + let sessions_per_era = T::SessionsPerEra::get(); + + let new_era = current_session - last_new_era_start > sessions_per_era; + if new_era { + LastNewEraStart::put(current_session); + Self::remove_heartbeats(); + } + }, + None => LastNewEraStart::put(current_session), + }; + } + + // Remove all stored heartbeats. + fn remove_heartbeats() { + let curr = >::current_index(); + match LastNewEraStart::get() { + Some(start) => { + for index in start..curr { + >::remove_prefix(index); + } + }, + None => >::remove_prefix(curr), + } + } +} + +impl session::OneSessionHandler for Module { + type Key = ::AuthorityId; + + fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I) { + Self::new_session(); + } + + fn on_disabled(_i: usize) { + // ignore + } +} + +impl srml_support::unsigned::ValidateUnsigned for Module { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> srml_support::unsigned::TransactionValidity { + if let Call::heartbeat(heartbeat, signature) = call { + // verify that the incoming (unverified) pubkey is actually an authority id + let is_authority = T::IsValidAuthorityId::is_member(&heartbeat.authority_id); + if !is_authority { + return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + } + + if >::is_online_in_current_session(&heartbeat.authority_id) { + // we already received a heartbeat for this authority + return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + } + + if signature.len() != 64 { + return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + } + + let signature = { + let mut array = [0; 64]; + array.copy_from_slice(&signature); // panics if not enough, hence the check above + array + }; + + let encoded_heartbeat = heartbeat.encode(); + + let signature_valid = match ::KEY_TYPE { + ed25519::Public::KEY_TYPE => + sr_io::ed25519_verify(&signature, &encoded_heartbeat, &heartbeat.authority_id), + sr25519::Public::KEY_TYPE => + sr_io::sr25519_verify(&signature, &encoded_heartbeat, &heartbeat.authority_id), + _ => return TransactionValidity::Invalid(ApplyError::BadSignature as i8), + }; + + if !signature_valid { + return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + } + + // check if session index from heartbeat is recent + let current_session = >::current_index(); + if heartbeat.session_index < current_session { + return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + } + + return srml_support::unsigned::TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![encoded_heartbeat], + longevity: TransactionLongevity::max_value(), + propagate: true, + } + } + TransactionValidity::Invalid(0) + } +} -- GitLab From cf98501f92a98ab7133829a746128be98aea0117 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sat, 20 Jul 2019 09:24:10 +0800 Subject: [PATCH 007/151] SS58 versioning (Network IDs) (#3147) * Introduce network IDs for SS58 * Fix * Allow numeric overrides. * Improve docs * String rather than str * Comment out code that will become valid after other PR * Fix --- Cargo.lock | 2 + core/primitives/Cargo.toml | 4 + core/primitives/src/crypto.rs | 152 +++++++++++++++++++++++++++++++--- subkey/src/cli.yml | 6 ++ subkey/src/main.rs | 32 ++++--- 5 files changed, 174 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73ac949723..3b27fd13e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4631,8 +4631,10 @@ dependencies = [ "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 94dac26bec..1d55f82fab 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -28,6 +28,8 @@ hex = { version = "0.3", optional = true } regex = { version = "1.1", optional = true } num-traits = { version = "0.2", default-features = false } zeroize = { version = "0.9.2", default-features = false } +lazy_static = { version = "1.3", optional = true } +parking_lot = { version = "0.8", optional = true } [dev-dependencies] substrate-serializer = { path = "../serializer" } @@ -47,6 +49,8 @@ bench = false default = ["std"] std = [ "wasmi", + "lazy_static", + "parking_lot", "primitive-types/std", "primitive-types/serde", "primitive-types/byteorder", diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 6aac4e08bc..3578ea9027 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -18,6 +18,10 @@ //! Cryptographic utilities. // end::description[] +#[cfg(feature = "std")] +use std::convert::{TryFrom, TryInto}; +#[cfg(feature = "std")] +use parking_lot::Mutex; #[cfg(feature = "std")] use rand::{RngCore, rngs::OsRng}; #[cfg(feature = "std")] @@ -243,12 +247,36 @@ pub enum PublicError { #[cfg(feature = "std")] pub trait Ss58Codec: Sized { /// Some if the string is a properly encoded SS58Check address. - fn from_ss58check(s: &str) -> Result; + fn from_ss58check(s: &str) -> Result { + Self::from_ss58check_with_version(s) + .and_then(|(r, v)| match v { + Ss58AddressFormat::SubstrateAccountDirect => Ok(r), + v if v == *DEFAULT_VERSION.lock() => Ok(r), + _ => Err(PublicError::UnknownVersion), + }) + } + /// Some if the string is a properly encoded SS58Check address. + fn from_ss58check_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError>; /// Some if the string is a properly encoded SS58Check address, optionally with /// a derivation path following. - fn from_string(s: &str) -> Result { Self::from_ss58check(s) } + fn from_string(s: &str) -> Result { + Self::from_string_with_version(s) + .and_then(|(r, v)| match v { + Ss58AddressFormat::SubstrateAccountDirect => Ok(r), + v if v == *DEFAULT_VERSION.lock() => Ok(r), + _ => Err(PublicError::UnknownVersion), + }) + } + /// Return the ss58-check string for this key. - fn to_ss58check(&self) -> String; + fn to_ss58check_with_version(&self, version: Ss58AddressFormat) -> String; + /// Return the ss58-check string for this key. + fn to_ss58check(&self) -> String { self.to_ss58check_with_version(*DEFAULT_VERSION.lock()) } + /// Some if the string is a properly encoded SS58Check address, optionally with + /// a derivation path following. + fn from_string_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { + Self::from_ss58check_with_version(s) + } } #[cfg(feature = "std")] @@ -273,9 +301,92 @@ fn ss58hash(data: &[u8]) -> blake2_rfc::blake2b::Blake2bResult { context.finalize() } +#[cfg(feature = "std")] +lazy_static::lazy_static! { + static ref DEFAULT_VERSION: Mutex + = Mutex::new(Ss58AddressFormat::SubstrateAccountDirect); +} + +/// A known address (sub)format/network ID for SS58. +#[cfg(feature = "std")] +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum Ss58AddressFormat { + /// Any Substrate network, direct checksum, standard account (*25519). + SubstrateAccountDirect, + /// Polkadot Relay-chain, direct checksum, standard account (*25519). + PolkadotAccountDirect, + /// Kusama Relay-chain, direct checksum, standard account (*25519). + KusamaAccountDirect, + /// Use a manually provided numeric value. + Custom(u8), +} + +#[cfg(feature = "std")] +impl From for u8 { + fn from(x: Ss58AddressFormat) -> u8 { + match x { + Ss58AddressFormat::SubstrateAccountDirect => 42, + Ss58AddressFormat::PolkadotAccountDirect => 0, + Ss58AddressFormat::KusamaAccountDirect => 2, + Ss58AddressFormat::Custom(n) => n, + } + } +} + +#[cfg(feature = "std")] +impl TryFrom for Ss58AddressFormat { + type Error = (); + fn try_from(x: u8) -> Result { + match x { + 42 => Ok(Ss58AddressFormat::SubstrateAccountDirect), + 0 => Ok(Ss58AddressFormat::PolkadotAccountDirect), + 2 => Ok(Ss58AddressFormat::KusamaAccountDirect), + _ => Err(()), + } + } +} + +#[cfg(feature = "std")] +impl<'a> TryFrom<&'a str> for Ss58AddressFormat { + type Error = (); + fn try_from(x: &'a str) -> Result { + match x { + "substrate" => Ok(Ss58AddressFormat::SubstrateAccountDirect), + "polkadot" => Ok(Ss58AddressFormat::PolkadotAccountDirect), + "kusama" => Ok(Ss58AddressFormat::KusamaAccountDirect), + a => a.parse::().map(Ss58AddressFormat::Custom).map_err(|_| ()), + } + } +} + +#[cfg(feature = "std")] +impl From for String { + fn from(x: Ss58AddressFormat) -> String { + match x { + Ss58AddressFormat::SubstrateAccountDirect => "substrate".into(), + Ss58AddressFormat::PolkadotAccountDirect => "polkadot".into(), + Ss58AddressFormat::KusamaAccountDirect => "kusama".into(), + Ss58AddressFormat::Custom(x) => x.to_string(), + } + } +} + +/// Set the default "version" (actually, this is a bit of a misnomer and the version byte is +/// typically used not just to encode format/version but also network identity) that is used for +/// encoding and decoding SS58 addresses. If an unknown version is provided then it fails. +/// +/// Current known "versions" are: +/// - 0 direct (payload) checksum for 32-byte *25519 Polkadot addresses. +/// - 2 direct (payload) checksum for 32-byte *25519 Polkadot Milestone 'K' addresses. +/// - 42 direct (payload) checksum for 32-byte *25519 addresses on any Substrate-based network. +#[cfg(feature = "std")] +pub fn set_default_ss58_version(version: Ss58AddressFormat) { + *DEFAULT_VERSION.lock() = version +} + #[cfg(feature = "std")] impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { - fn from_ss58check(s: &str) -> Result { + fn from_ss58check_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { let mut res = T::default(); let len = res.as_mut().len(); let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. @@ -283,21 +394,18 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { // Invalid length. return Err(PublicError::BadLength); } - if d[0] != 42 { - // Invalid version. - return Err(PublicError::UnknownVersion); - } + let ver = d[0].try_into().map_err(|_: ()| PublicError::UnknownVersion)?; if d[len+1..len+3] != ss58hash(&d[0..len+1]).as_bytes()[0..2] { // Invalid checksum. return Err(PublicError::InvalidChecksum); } res.as_mut().copy_from_slice(&d[1..len+1]); - Ok(res) + Ok((res, ver)) } - fn to_ss58check(&self) -> String { - let mut v = vec![42u8]; + fn to_ss58check_with_version(&self, version: Ss58AddressFormat) -> String { + let mut v = vec![version.into()]; v.extend(self.as_ref()); let r = ss58hash(&v); v.extend(&r.as_bytes()[0..2]); @@ -324,6 +432,28 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { .ok_or(PublicError::InvalidPath) } } + + fn from_string_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { + let re = Regex::new(r"^(?P[\w\d]+)?(?P(//?[^/]+)*)$") + .expect("constructed from known-good static value; qed"); + let cap = re.captures(s).ok_or(PublicError::InvalidFormat)?; + let re_junction = Regex::new(r"/(/?[^/]+)") + .expect("constructed from known-good static value; qed"); + let (addr, v) = Self::from_ss58check_with_version( + cap.name("ss58") + .map(|r| r.as_str()) + .unwrap_or(DEV_ADDRESS) + )?; + if cap["path"].is_empty() { + Ok((addr, v)) + } else { + let path = re_junction.captures_iter(&cap["path"]) + .map(|f| DeriveJunction::from(&f[1])); + addr.derive(path) + .ok_or(PublicError::InvalidPath) + .map(|a| (a, v)) + } + } } /// Trait suitable for typical cryptographic PKI key public type. diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml index 89190df362..b4f99f8743 100644 --- a/subkey/src/cli.yml +++ b/subkey/src/cli.yml @@ -18,6 +18,12 @@ args: takes_value: true required: false help: The password for the key + - network: + short: n + long: network + takes_value: true + required: false + help: Specify a network. One of substrate (default), polkadot and kusama. subcommands: - generate: about: Generate a random account diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 7cff0d6414..b0b8adaabf 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -18,15 +18,18 @@ #[cfg(feature = "bench")] extern crate test; -use std::{str::FromStr, io::{stdin, Read}}; +use std::{str::FromStr, io::{stdin, Read}, convert::TryInto}; use hex_literal::hex; use clap::load_yaml; use bip39::{Mnemonic, Language, MnemonicType}; -use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, crypto::Ss58Codec, blake2_256}; +use substrate_primitives::{ + ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, + crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat}, blake2_256 +}; use parity_codec::{Encode, Decode, Compact}; use sr_primitives::generic::Era; use node_primitives::{Balance, Index, Hash}; -use node_runtime::{Call, UncheckedExtrinsic, BalancesCall}; +use node_runtime::{Call, UncheckedExtrinsic, /*CheckNonce, TakeFees, */BalancesCall}; mod vanity; @@ -52,11 +55,12 @@ trait Crypto { HexDisplay::from(&Self::public_from_pair(&pair)), Self::ss58_from_pair(&pair) ); - } else if let Ok(public) = ::Public::from_string(uri) { - println!("Public Key URI `{}` is account:\n Public key (hex): 0x{}\n Address (SS58): {}", + } else if let Ok((public, v)) = ::Public::from_string_with_version(uri) { + println!("Public Key URI `{}` is account:\n Network ID/version: {}\n Public key (hex): 0x{}\n Address (SS58): {}", uri, + String::from(Ss58AddressFormat::from(v)), HexDisplay::from(&public.as_ref()), - public.to_ss58check() + public.to_ss58check_with_version(v) ); } else { println!("Invalid phrase/URI given"); @@ -87,6 +91,12 @@ fn execute(matches: clap::ArgMatches) where <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, { let password = matches.value_of("password"); + let maybe_network = matches.value_of("network"); + if let Some(network) = maybe_network { + let v = network.try_into() + .expect("Invalid network name: must be polkadot/substrate/kusama"); + set_default_ss58_version(v); + } match matches.subcommand() { ("generate", Some(matches)) => { // create a new randomly generated mnemonic phrase @@ -120,7 +130,7 @@ fn execute(matches: clap::ArgMatches) where let sig = pair.sign(&message); println!("{}", hex::encode(&sig)); } - ("transfer", Some(matches)) => { + /*("transfer", Some(matches)) => { let signer = matches.value_of("from") .expect("parameter is required; thus it can't be None; qed"); let signer = Sr25519::pair_from_suri(signer, password); @@ -147,7 +157,7 @@ fn execute(matches: clap::ArgMatches) where "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])) - .expect("Invalid genesis hash or unrecognised chain identifier"), + .expect("Invalid genesis hash or unrecognised chain identifier"), }; println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); @@ -161,11 +171,11 @@ fn execute(matches: clap::ArgMatches) where signer.sign(payload) }); let extrinsic = UncheckedExtrinsic::new_signed( - index, raw_payload.1, signer.public().into(), signature.into(), era, + (CheckNonce(index), TakeFees(0)), ); println!("0x{}", hex::encode(&extrinsic.encode())); } @@ -202,15 +212,15 @@ fn execute(matches: clap::ArgMatches) where ); let extrinsic = UncheckedExtrinsic::new_signed( - index, raw_payload.1, signer.public().into(), signature.into(), era, + (CheckNonce(index), TakeFees(0)), ); println!("0x{}", hex::encode(&extrinsic.encode())); - } + }*/ ("verify", Some(matches)) => { let sig_data = matches.value_of("sig") .expect("signature parameter is required; thus it can't be None; qed"); -- GitLab From df3a8b8c2459d0c3465e2e034c70a87d5bfaa344 Mon Sep 17 00:00:00 2001 From: Amar Singh Date: Sun, 21 Jul 2019 15:22:11 +0200 Subject: [PATCH 008/151] docs: add srml readme, clarify comment in staking (#3151) * add srml readme, nit on staking/lib.rs * increase impl version, not spec version * change back impl --- srml/README.adoc | 26 ++++++++++++++++++++++++-- srml/staking/src/lib.rs | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/srml/README.adoc b/srml/README.adoc index 81b4f216e6..05da2de0a0 100644 --- a/srml/README.adoc +++ b/srml/README.adoc @@ -1,4 +1,26 @@ -= Runtime += SRML -Set of libs for the substrate runtime. +The Substrate Runtime Module Library (SRML) is a collection of runtime modules. + +== What are runtime modules? + +A Substrate runtime can be composed of several smaller components for separation of concerns. These components are called runtime _modules_. Each runtime module packages together a set of functions (dispatchable extrinsic calls, public or private, mutable or immutable), storage items, and events. + +There are four primary components that support runtime modules: + +=== system module + +https://github.com/paritytech/substrate/tree/master/srml/system[`system`] provides low-level APIs and utilities for other modules. https://github.com/paritytech/substrate/tree/master/srml/system[`system`] also defines all core types and extrinsic events for the Substrate runtime. *All modules depend on the system module.* + +=== executive module + +https://github.com/paritytech/substrate/tree/master/srml/executive[`executive`] dispatches incoming extrinsic calls to the respective modules in the runtime. + +=== support macros + +https://github.com/paritytech/substrate/tree/master/srml/support[`support` macros] are a collection of Rust macros to facilitate the implementation of common module components. https://github.com/paritytech/substrate/tree/master/srml/support[`support` macros] expand at runtime to generate types (e.g. `Module`, `Call`, `Store`, `Event`) which are thereafter used by the runtime to communicate with the modules. Common support macros include https://crates.parity.io/srml_support/macro.decl_module.html[`decl_module`], https://crates.parity.io/srml_support_procedural/macro.decl_storage.html[`decl_storage`], https://crates.parity.io/srml_support/macro.decl_event.html[`decl_event`], and https://crates.parity.io/srml_support/macro.ensure.html[`ensure`]. + +=== runtime + +The runtime expands the support macros to get type and trait implementations for each module before calling https://github.com/paritytech/substrate/tree/master/srml/executive[`executive`] to dispatch calls to the individual modules. To see an example of how this might look, see https://github.com/paritytech/substrate/blob/master/node/runtime/src/lib.rs[`../node/runtime`]. \ No newline at end of file diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 7dfe7b60e9..788b46731f 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -447,7 +447,7 @@ pub const DEFAULT_BONDING_DURATION: u32 = 1; /// Means for interacting with a specialized version of the `session` trait. /// -/// This is needed because `Staking` sets the `ValidatorId` of the `session::Trait` +/// This is needed because `Staking` sets the `ValidatorIdOf` of the `session::Trait` pub trait SessionInterface: system::Trait { /// Disable a given validator by stash ID. fn disable_validator(validator: &AccountId) -> Result<(), ()>; -- GitLab From 5fd945581b862e7e215d2a49d301c78bea70db6f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 22 Jul 2019 00:43:02 +0200 Subject: [PATCH 009/151] ImportBlock -> BlockImportParams (#3158) --- core/client/src/client.rs | 12 ++++++------ core/consensus/aura/src/lib.rs | 8 ++++---- core/consensus/babe/src/lib.rs | 8 ++++---- core/consensus/common/src/block_import.rs | 8 ++++---- core/consensus/common/src/import_queue.rs | 6 +++--- core/consensus/common/src/lib.rs | 2 +- core/consensus/rhd/src/lib.rs | 6 +++--- core/finality-grandpa/src/import.rs | 6 +++--- core/finality-grandpa/src/light_import.rs | 10 +++++----- core/finality-grandpa/src/tests.rs | 6 +++--- core/network/src/test/mod.rs | 8 ++++---- core/service/src/lib.rs | 4 ++-- core/service/test/src/lib.rs | 4 ++-- core/test-client/src/client_ext.rs | 6 +++--- node/cli/src/service.rs | 8 ++++---- test-utils/transaction-factory/src/lib.rs | 4 ++-- 16 files changed, 53 insertions(+), 53 deletions(-) diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 9241d8fb0a..67a9140e9e 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -29,7 +29,7 @@ use runtime_primitives::{ generic::{BlockId, SignedBlock}, }; use consensus::{ - Error as ConsensusError, ImportBlock, + Error as ConsensusError, BlockImportParams, ImportResult, BlockOrigin, ForkChoiceStrategy, well_known_cache_keys::Id as CacheKeyId, SelectChain, self, @@ -817,12 +817,12 @@ impl Client where pub fn apply_block( &self, operation: &mut ClientImportOperation, - import_block: ImportBlock, + import_block: BlockImportParams, new_cache: HashMap>, ) -> error::Result where E: CallExecutor + Send + Sync + Clone, { - let ImportBlock { + let BlockImportParams { origin, header, justification, @@ -1460,10 +1460,10 @@ impl<'a, B, E, Block, RA> consensus::BlockImport for &'a Client, + import_block: BlockImportParams, new_cache: HashMap>, ) -> Result { self.lock_import_and_run(|operation| { @@ -1506,7 +1506,7 @@ impl consensus::BlockImport for Client fn import_block( &mut self, - import_block: ImportBlock, + import_block: BlockImportParams, new_cache: HashMap>, ) -> Result { (&*self).import_block(import_block, new_cache) diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index b4dbd79308..2bfd907646 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -32,7 +32,7 @@ use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fm use parity_codec::{Encode, Decode, Codec}; use consensus_common::{self, BlockImport, Environment, Proposer, - ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, + ForkChoiceStrategy, BlockImportParams, BlockOrigin, Error as ConsensusError, SelectChain, well_known_cache_keys::{self, Id as CacheKeyId} }; use consensus_common::import_queue::{ @@ -317,7 +317,7 @@ impl SlotWorker for AuraWorker w let signature = pair.sign(header_hash.as_ref()); let signature_digest_item = as CompatibleDigestItem

>::aura_seal(signature); - let import_block: ImportBlock = ImportBlock { + let import_block: BlockImportParams = BlockImportParams { origin: BlockOrigin::Own, header, justification: None, @@ -515,7 +515,7 @@ impl Verifier for AuraVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { let mut inherent_data = self.inherent_data_providers.create_inherent_data().map_err(String::from)?; let (timestamp_now, slot_now, _) = AuraSlotCompatible.extract_timestamp_and_slot(&inherent_data) .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; @@ -578,7 +578,7 @@ impl Verifier for AuraVerifier where _ => None, }); - let import_block = ImportBlock { + let import_block = BlockImportParams { origin, header: pre_header, post_digests: vec![seal], diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index e1279479d9..055ceca782 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -62,7 +62,7 @@ use schnorrkel::{ }; use consensus_common::{ self, BlockImport, Environment, Proposer, - ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, + ForkChoiceStrategy, BlockImportParams, BlockOrigin, Error as ConsensusError, }; use srml_babe::{ BabeInherentData, @@ -373,7 +373,7 @@ impl SlotWorker for BabeWorker w let signature = pair.sign(header_hash.as_ref()); let signature_digest_item = DigestItemFor::::babe_seal(signature); - let import_block: ImportBlock = ImportBlock { + let import_block: BlockImportParams = BlockImportParams { origin: BlockOrigin::Own, header, justification: None, @@ -598,7 +598,7 @@ impl Verifier for BabeVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { trace!( target: "babe", "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", @@ -666,7 +666,7 @@ impl Verifier for BabeVerifier where .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID))) .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); - let import_block = ImportBlock { + let import_block = BlockImportParams { origin, header: pre_header, post_digests: vec![seal], diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 8afdd31b3f..9293eda308 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -97,7 +97,7 @@ pub enum ForkChoiceStrategy { } /// Data required to import a Block -pub struct ImportBlock { +pub struct BlockImportParams { /// Origin of the Block pub origin: BlockOrigin, /// The header, without consensus post-digests applied. This should be in the same @@ -130,7 +130,7 @@ pub struct ImportBlock { pub fork_choice: ForkChoiceStrategy, } -impl ImportBlock { +impl BlockImportParams { /// Deconstruct the justified header into parts. pub fn into_inner(self) -> ( @@ -186,7 +186,7 @@ pub trait BlockImport { /// Cached data can be accessed through the blockchain cache. fn import_block( &mut self, - block: ImportBlock, + block: BlockImportParams, cache: HashMap>, ) -> Result; } @@ -206,7 +206,7 @@ where for<'r> &'r T: BlockImport fn import_block( &mut self, - block: ImportBlock, + block: BlockImportParams, cache: HashMap>, ) -> Result { (&**self).import_block(block, cache) diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index f8041ae99b..5e7969cc02 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -29,7 +29,7 @@ use std::{sync::Arc, collections::HashMap}; use runtime_primitives::{Justification, traits::{Block as BlockT, Header as _, NumberFor}}; use crate::{error::Error as ConsensusError, well_known_cache_keys::Id as CacheKeyId}; use crate::block_import::{ - BlockImport, BlockOrigin, ImportBlock, ImportedAux, JustificationImport, ImportResult, + BlockImport, BlockOrigin, BlockImportParams, ImportedAux, JustificationImport, ImportResult, FinalityProofImport, }; @@ -67,7 +67,7 @@ pub struct IncomingBlock { /// Verify a justification of a block pub trait Verifier: Send + Sync { - /// Verify the given data and return the ImportBlock and an optional + /// Verify the given data and return the BlockImportParams and an optional /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. fn verify( @@ -76,7 +76,7 @@ pub trait Verifier: Send + Sync { header: B::Header, justification: Option, body: Option>, - ) -> Result<(ImportBlock, Option)>>), String>; + ) -> Result<(BlockImportParams, Option)>>), String>; } /// Blocks import queue API. diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 1b9f31bbbc..e976adb83c 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -47,7 +47,7 @@ const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; pub use self::error::Error; pub use block_import::{ - BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, + BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult, JustificationImport, FinalityProofImport, }; pub use select_chain::SelectChain; diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 1f6582d077..4eb118c853 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -46,7 +46,7 @@ use consensus::error::{ErrorKind as CommonErrorKind}; use consensus::{Authorities, BlockImport, Environment, Proposer as BaseProposer}; use client::{Client as SubstrateClient, CallExecutor}; use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; -use runtime_primitives::generic::{BlockId, Era, ImportResult, ImportBlock, BlockOrigin}; +use runtime_primitives::generic::{BlockId, Era, ImportResult, BlockImportParams, BlockOrigin}; use runtime_primitives::traits::{Block, Header}; use runtime_primitives::traits::{ Block as BlockT, Hash as HashT, Header as HeaderT, @@ -391,7 +391,7 @@ impl Future for BftFuture, + block: BlockImportParams, _new_authorities: Option> ) -> Result { assert!(self.imported_heights.lock().insert(block.header.number)); diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index ccef682fea..8e1efaed6b 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -27,7 +27,7 @@ use client::backend::Backend; use client::runtime_api::ApiExt; use consensus_common::{ BlockImport, Error as ConsensusError, - ImportBlock, ImportResult, JustificationImport, well_known_cache_keys, + BlockImportParams, ImportResult, JustificationImport, well_known_cache_keys, SelectChain, }; use fg_primitives::GrandpaApi; @@ -244,7 +244,7 @@ where } } - fn make_authorities_changes<'a>(&'a self, block: &mut ImportBlock, hash: Block::Hash) + fn make_authorities_changes<'a>(&'a self, block: &mut BlockImportParams, hash: Block::Hash) -> Result, ConsensusError> { // when we update the authorities, we need to hold the lock @@ -405,7 +405,7 @@ impl, RA, PRA, SC> BlockImport { type Error = ConsensusError; - fn import_block(&mut self, mut block: ImportBlock, new_cache: HashMap>) + fn import_block(&mut self, mut block: BlockImportParams, new_cache: HashMap>) -> Result { let hash = block.post_header().hash(); diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 717054e308..affe2828fa 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -28,7 +28,7 @@ use client::{ use parity_codec::{Encode, Decode}; use consensus_common::{ import_queue::Verifier, well_known_cache_keys, - BlockOrigin, BlockImport, FinalityProofImport, ImportBlock, ImportResult, ImportedAux, + BlockOrigin, BlockImport, FinalityProofImport, BlockImportParams, ImportResult, ImportedAux, Error as ConsensusError, }; use network::config::{BoxFinalityProofRequestBuilder, FinalityProofRequestBuilder}; @@ -128,7 +128,7 @@ impl, RA> BlockImport fn import_block( &mut self, - block: ImportBlock, + block: BlockImportParams, new_cache: HashMap>, ) -> Result { do_import_block::<_, _, _, _, GrandpaJustification>( @@ -230,7 +230,7 @@ impl> FinalityProofRequestBuilder for GrandpaFinalityPro fn do_import_block, RA, J>( mut client: &Client, data: &mut LightImportData, - mut block: ImportBlock, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result where @@ -573,7 +573,7 @@ pub mod tests { fn import_block( &mut self, - mut block: ImportBlock, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result { block.justification.take(); @@ -640,7 +640,7 @@ pub mod tests { authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([1; 32]), 1)]), consensus_changes: ConsensusChanges::empty(), }; - let block = ImportBlock { + let block = BlockImportParams { origin: BlockOrigin::Own, header: Header { number: 1, diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 0a727df9a2..698996995f 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -30,7 +30,7 @@ use client::{ LongestChain, }; use test_client::{self, runtime::BlockNumber}; -use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult}; +use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult}; use consensus_common::import_queue::{BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport}; use std::collections::{HashMap, HashSet}; use std::result; @@ -969,7 +969,7 @@ fn allows_reimporting_change_blocks() { let block = || { let block = block.clone(); - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, header: block.header, justification: None, @@ -1018,7 +1018,7 @@ fn test_bad_justification() { let block = || { let block = block.clone(); - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, header: block.header, justification: Some(Vec::new()), diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 59a3680d40..8f9fe7d097 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -38,7 +38,7 @@ use consensus::import_queue::{ }; use consensus::block_import::{BlockImport, ImportResult}; use consensus::{Error as ConsensusError, well_known_cache_keys::{self, Id as CacheKeyId}}; -use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; +use consensus::{BlockOrigin, ForkChoiceStrategy, BlockImportParams, JustificationImport}; use futures::prelude::*; use futures03::{StreamExt as _, TryStreamExt as _}; use crate::{NetworkWorker, NetworkService, config::ProtocolId}; @@ -73,14 +73,14 @@ impl Verifier for PassThroughVerifier { header: B::Header, justification: Option, body: Option> - ) -> Result<(ImportBlock, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { let maybe_keys = header.digest() .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(b"aura")) .or_else(|| l.try_as_raw(OpaqueDigestItemId::Consensus(b"babe"))) ) .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); - Ok((ImportBlock { + Ok((BlockImportParams { origin, header, body, @@ -388,7 +388,7 @@ impl> BlockImport for BlockImportAdapter, + block: BlockImportParams, cache: HashMap>, ) -> Result { self.0.lock().import_block(block, cache) diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 1ae5a0a58a..05aa082465 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -926,7 +926,7 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { /// # use network::{config::DummyFinalityProofRequestBuilder, construct_simple_protocol}; /// # use client::{self, LongestChain}; /// # use consensus_common::import_queue::{BasicQueue, Verifier}; -/// # use consensus_common::{BlockOrigin, ImportBlock, well_known_cache_keys::Id as CacheKeyId}; +/// # use consensus_common::{BlockOrigin, BlockImportParams, well_known_cache_keys::Id as CacheKeyId}; /// # use node_runtime::{GenesisConfig, RuntimeApi}; /// # use std::sync::Arc; /// # use node_primitives::Block; @@ -944,7 +944,7 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { /// # header: B::Header, /// # justification: Option, /// # body: Option>, -/// # ) -> Result<(ImportBlock, Option)>>), String> { +/// # ) -> Result<(BlockImportParams, Option)>>), String> { /// # unimplemented!(); /// # } /// # } diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index adfee10029..353b326a91 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -37,7 +37,7 @@ use service::{ use network::{multiaddr, Multiaddr}; use network::config::{NetworkConfiguration, TransportConfig, NodeKeyConfig, Secret, NonReservedPeerMode}; use sr_primitives::generic::BlockId; -use consensus::{ImportBlock, BlockImport}; +use consensus::{BlockImportParams, BlockImport}; /// Maximum duration of single wait call. const MAX_WAIT_TIME: Duration = Duration::from_secs(60 * 3); @@ -354,7 +354,7 @@ pub fn sync(spec: FactoryChainSpec, mut block_factory: B, mut extrin F: ServiceFactory, F::FullService: Future, F::LightService: Future, - B: FnMut(&SyncService) -> ImportBlock, + B: FnMut(&SyncService) -> BlockImportParams, E: FnMut(&SyncService) -> FactoryExtrinsic, { const NUM_FULL_NODES: usize = 10; diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index 5f677108c3..cb0d5c1736 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -18,7 +18,7 @@ use client::{self, Client}; use consensus::{ - ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, + BlockImportParams, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy, }; use hash_db::Hasher; @@ -64,7 +64,7 @@ impl ClientExt for Client -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); - let import = ImportBlock { + let import = BlockImportParams { origin, header, justification: None, @@ -85,7 +85,7 @@ impl ClientExt for Client justification: Justification, ) -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); - let import = ImportBlock { + let import = BlockImportParams { origin, header, justification: Some(justification), diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 3786d5bdd1..1ce4c74584 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -214,7 +214,7 @@ construct_service_factory! { mod tests { use std::sync::Arc; use aura::CompatibleDigestItem; - use consensus_common::{Environment, Proposer, ImportBlock, BlockOrigin, ForkChoiceStrategy}; + use consensus_common::{Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy}; use node_primitives::DigestItem; use node_runtime::{BalancesCall, Call, CENTS, SECS_PER_BLOCK, UncheckedExtrinsic}; use parity_codec::{Compact, Encode, Decode}; @@ -233,7 +233,7 @@ mod tests { #[cfg(feature = "rhd")] fn test_sync() { use {service_test, Factory}; - use client::{ImportBlock, BlockOrigin}; + use client::{BlockImportParams, BlockOrigin}; let alice: Arc = Arc::new(Keyring::Alice.into()); let bob: Arc = Arc::new(Keyring::Bob.into()); @@ -253,7 +253,7 @@ mod tests { }; let (proposer, _, _) = proposer_factory.init(&parent_header, &validators, alice.clone()).unwrap(); let block = proposer.propose().expect("Error making test block"); - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, justification: Vec::new(), internal_justification: Vec::new(), @@ -331,7 +331,7 @@ mod tests { ); slot_num += 1; - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, header: new_header, justification: None, diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index e90ca412ac..61dbfab658 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -30,7 +30,7 @@ use log::info; use client::block_builder::api::BlockBuilder; use client::runtime_api::ConstructRuntimeApi; use consensus_common::{ - BlockOrigin, ImportBlock, InherentData, ForkChoiceStrategy, + BlockOrigin, BlockImportParams, InherentData, ForkChoiceStrategy, SelectChain }; use consensus_common::block_import::BlockImport; @@ -166,7 +166,7 @@ fn import_block( block: ::Block ) -> () where F: ServiceFactory { - let import = ImportBlock { + let import = BlockImportParams { origin: BlockOrigin::File, header: block.header().clone(), post_digests: Vec::new(), -- GitLab From 5453dd1714dd3fddfb6c2afa8c0f3bf7c1fddb3b Mon Sep 17 00:00:00 2001 From: David Craven Date: Mon, 22 Jul 2019 11:20:57 +0200 Subject: [PATCH 010/151] Refactors the offchain worker api (#3150) * Update offchain primitives. * Update offchain worker. * Update im-online. * Update service. * Update node and node-template. * Update runtime version. * Fix build. * Fix offchain worker tests. * Generalize authority_pubkey. * Add test. * Update lib.rs --- core/client/db/src/offchain.rs | 4 +- core/executor/src/wasm_executor.rs | 63 ++---- core/offchain/src/api.rs | 305 ++++++++++++++++++----------- core/offchain/src/lib.rs | 49 +++-- core/offchain/src/testing.rs | 19 +- core/primitives/src/crypto.rs | 13 +- core/primitives/src/offchain.rs | 108 +++++++--- core/service/src/components.rs | 20 +- core/service/src/lib.rs | 86 ++++++-- core/sr-io/src/lib.rs | 20 +- core/sr-io/with_std.rs | 26 ++- core/sr-io/without_std.rs | 79 ++++---- core/state-machine/src/lib.rs | 18 +- node-template/src/service.rs | 4 +- node/cli/src/service.rs | 7 +- node/runtime/src/lib.rs | 4 +- srml/im-online/src/lib.rs | 15 +- 17 files changed, 511 insertions(+), 329 deletions(-) diff --git a/core/client/db/src/offchain.rs b/core/client/db/src/offchain.rs index 3cefdbf47a..0640fb6c29 100644 --- a/core/client/db/src/offchain.rs +++ b/core/client/db/src/offchain.rs @@ -28,7 +28,7 @@ use parking_lot::Mutex; /// Offchain local storage #[derive(Clone)] pub struct LocalStorage { - db: Arc, + db: Arc, locks: Arc, Arc>>>>, } @@ -48,7 +48,7 @@ impl LocalStorage { } /// Create offchain local storage with given `KeyValueDB` backend. - pub fn new(db: Arc) -> Self { + pub fn new(db: Arc) -> Self { Self { db, locks: Default::default(), diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 3bb8412be2..30d5ccd542 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -122,16 +122,6 @@ fn deadline_to_timestamp(deadline: u64) -> Option { } } -fn u32_to_key(key: u32) -> std::result::Result, ()> { - if key > u16::max_value() as u32 { - Err(()) - } else if key == 0 { - Ok(None) - } else { - Ok(Some(offchain::CryptoKeyId(key as u16))) - } -} - impl_function_executor!(this: FunctionExecutor<'e, E>, ext_print_utf8(utf8_data: *const u8, utf8_len: u32) => { if let Ok(utf8) = this.memory.get(utf8_data, utf8_len as usize) { @@ -721,7 +711,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(if res.is_ok() { 0 } else { 1 }) }, - ext_new_crypto_key(crypto: u32) -> u32 => { + ext_new_crypto_key(crypto: u32) -> u64 => { let kind = offchain::CryptoKind::try_from(crypto) .map_err(|_| "crypto kind OOB while ext_new_crypto_key: wasm")?; @@ -730,26 +720,23 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, .ok_or_else(|| "Calling unavailable API ext_new_crypto_key: wasm")?; match res { - Ok(key_id) => Ok(key_id.into()), - Err(()) => Ok(u32::max_value()), + Ok(key) => Ok(key.into()), + Err(()) => Ok(u64::max_value()), } }, ext_encrypt( - key: u32, - kind: u32, + key: u64, data: *const u8, data_len: u32, msg_len: *mut u32 ) -> *mut u8 => { - let key = u32_to_key(key) + let key = offchain::CryptoKey::try_from(key) .map_err(|_| "Key OOB while ext_encrypt: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_encrypt: wasm")?; let message = this.memory.get(data, data_len as usize) .map_err(|_| "OOB while ext_encrypt: wasm")?; let res = this.ext.offchain() - .map(|api| api.encrypt(key, kind, &*message)) + .map(|api| api.encrypt(key, &*message)) .ok_or_else(|| "Calling unavailable API ext_encrypt: wasm")?; let (offset,len) = match res { @@ -784,15 +771,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(offset) }, - ext_authority_pubkey( - kind: u32, + ext_pubkey( + key: u64, written_out: *mut u32 ) -> *mut u8 => { - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_authority_pubkey: wasm")?; - + let key = offchain::CryptoKey::try_from(key) + .map_err(|_| "Key OOB while ext_decrypt: wasm")?; let res = this.ext.offchain() - .map(|api| api.authority_pubkey(kind)) + .map(|api| api.pubkey(key)) .ok_or_else(|| "Calling unavailable API ext_authority_pubkey: wasm")?; let encoded = res.encode(); @@ -805,21 +791,18 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(offset) }, ext_decrypt( - key: u32, - kind: u32, + key: u64, data: *const u8, data_len: u32, msg_len: *mut u32 ) -> *mut u8 => { - let key = u32_to_key(key) + let key = offchain::CryptoKey::try_from(key) .map_err(|_| "Key OOB while ext_decrypt: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_decrypt: wasm")?; let message = this.memory.get(data, data_len as usize) .map_err(|_| "OOB while ext_decrypt: wasm")?; let res = this.ext.offchain() - .map(|api| api.decrypt(key, kind, &*message)) + .map(|api| api.decrypt(key, &*message)) .ok_or_else(|| "Calling unavailable API ext_decrypt: wasm")?; let (offset,len) = match res { @@ -839,21 +822,18 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(offset) }, ext_sign( - key: u32, - kind: u32, + key: u64, data: *const u8, data_len: u32, sig_data_len: *mut u32 ) -> *mut u8 => { - let key = u32_to_key(key) + let key = offchain::CryptoKey::try_from(key) .map_err(|_| "Key OOB while ext_sign: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_sign: wasm")?; let message = this.memory.get(data, data_len as usize) .map_err(|_| "OOB while ext_sign: wasm")?; let res = this.ext.offchain() - .map(|api| api.sign(key, kind, &*message)) + .map(|api| api.sign(key, &*message)) .ok_or_else(|| "Calling unavailable API ext_sign: wasm")?; let (offset,len) = match res { @@ -873,24 +853,21 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(offset) }, ext_verify( - key: u32, - kind: u32, + key: u64, msg: *const u8, msg_len: u32, signature: *const u8, signature_len: u32 ) -> u32 => { - let key = u32_to_key(key) + let key = offchain::CryptoKey::try_from(key) .map_err(|_| "Key OOB while ext_verify: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_verify: wasm")?; let message = this.memory.get(msg, msg_len as usize) .map_err(|_| "OOB while ext_verify: wasm")?; let signature = this.memory.get(signature, signature_len as usize) .map_err(|_| "OOB while ext_verify: wasm")?; let res = this.ext.offchain() - .map(|api| api.verify(key, kind, &*message, &*signature)) + .map(|api| api.verify(key, &*message, &*signature)) .ok_or_else(|| "Calling unavailable API ext_verify: wasm")?; match res { diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 776b31ef12..64c6427750 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -23,11 +23,11 @@ use parity_codec::{Encode, Decode}; use primitives::offchain::{ Timestamp, HttpRequestId, HttpRequestStatus, HttpError, Externalities as OffchainExt, - CryptoKind, CryptoKeyId, + CryptoKind, CryptoKey, StorageKind, OpaqueNetworkState, OpaquePeerId, OpaqueMultiaddr, }; -use primitives::crypto::{Pair, Protected}; +use primitives::crypto::{Pair, Public, Protected}; use primitives::{ed25519, sr25519}; use runtime_primitives::{ generic::BlockId, @@ -44,25 +44,144 @@ enum ExtMessage { /// A persisted key seed. #[derive(Encode, Decode)] -struct CryptoKey { +struct StoredKey { kind: CryptoKind, phrase: String, } -enum Key { - Sr25519(sr25519::Pair), +impl StoredKey { + fn generate_with_phrase(kind: CryptoKind, password: Option<&str>) -> Self { + match kind { + CryptoKind::Ed25519 => { + let phrase = ed25519::Pair::generate_with_phrase(password).1; + Self { kind, phrase } + } + CryptoKind::Sr25519 => { + let phrase = sr25519::Pair::generate_with_phrase(password).1; + Self { kind, phrase } + } + } + } + + fn to_local_key(&self, password: Option<&str>) -> Result { + match self.kind { + CryptoKind::Ed25519 => { + ed25519::Pair::from_phrase(&self.phrase, password) + .map(|x| LocalKey::Ed25519(x.0)) + } + CryptoKind::Sr25519 => { + sr25519::Pair::from_phrase(&self.phrase, password) + .map(|x| LocalKey::Sr25519(x.0)) + } + } + .map_err(|e| { + warn!("Error recovering Offchain Worker key. Password invalid? {:?}", e); + () + }) + } +} + +enum LocalKey { Ed25519(ed25519::Pair), + Sr25519(sr25519::Pair), +} + +impl LocalKey { + fn public(&self) -> Result, ()> { + match self { + LocalKey::Ed25519(pair) => Ok(pair.public().to_raw_vec()), + LocalKey::Sr25519(pair) => Ok(pair.public().to_raw_vec()), + } + } + + fn sign(&self, data: &[u8]) -> Result, ()> { + match self { + LocalKey::Ed25519(pair) => { + let sig = pair.sign(data); + let bytes: &[u8] = sig.as_ref(); + Ok(bytes.to_vec()) + } + LocalKey::Sr25519(pair) => { + let sig = pair.sign(data); + let bytes: &[u8] = sig.as_ref(); + Ok(bytes.to_vec()) + } + } + } + + fn verify(&self, msg: &[u8], signature: &[u8]) -> Result { + match self { + LocalKey::Ed25519(pair) => { + Ok(ed25519::Pair::verify_weak(signature, msg, pair.public())) + } + LocalKey::Sr25519(pair) => { + Ok(sr25519::Pair::verify_weak(signature, msg, pair.public())) + } + } + } +} + +/// A key. +enum Key { + LocalKey(LocalKey), + AuthorityKey(ConsensusPair), + FgAuthorityKey(FinalityPair), +} + +impl Key { + fn public(&self) -> Result, ()> { + match self { + Key::LocalKey(local) => { + local.public() + } + Key::AuthorityKey(pair) => { + Ok(pair.public().to_raw_vec()) + } + Key::FgAuthorityKey(pair) => { + Ok(pair.public().to_raw_vec()) + } + } + } + + fn sign(&self, data: &[u8]) -> Result, ()> { + match self { + Key::LocalKey(local) => { + local.sign(data) + } + Key::AuthorityKey(pair) => { + Ok(pair.sign(data).as_ref().to_vec()) + } + Key::FgAuthorityKey(pair) => { + Ok(pair.sign(data).as_ref().to_vec()) + } + } + } + + fn verify(&self, msg: &[u8], signature: &[u8]) -> Result { + match self { + Key::LocalKey(local) => { + local.verify(msg, signature) + } + Key::AuthorityKey(pair) => { + Ok(ConsensusPair::verify_weak(signature, msg, pair.public())) + } + Key::FgAuthorityKey(pair) => { + Ok(FinalityPair::verify_weak(signature, msg, pair.public())) + } + } + } } /// Asynchronous offchain API. /// /// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). -pub(crate) struct Api { +pub(crate) struct Api { sender: mpsc::UnboundedSender, db: Storage, keys_password: Protected, key_provider: KeyProvider, network_state: Arc, + at: BlockId, } fn unavailable_yet(name: &str) -> R { @@ -77,55 +196,56 @@ const KEYS_PREFIX: &[u8] = b"keys"; const NEXT_ID: &[u8] = b"crypto_key_id"; -impl Api where +impl Api where Storage: OffchainStorage, - KeyProvider: AuthorityKeyProvider, + KeyProvider: AuthorityKeyProvider, + Block: traits::Block, { - fn keypair(&self, phrase: &str) -> Result { - P::from_phrase(phrase, Some(self.keys_password.as_ref())) - .map_err(|e| { - warn!("Error recovering Offchain Worker key. Password invalid? {:?}", e); - () - }) - .map(|x| x.0) - } - - fn read_key(&self, id: Option, kind: CryptoKind) -> Result { - if let Some(id) = id { - let key = self.db.get(KEYS_PREFIX, &id.0.encode()) - .and_then(|key| CryptoKey::decode(&mut &*key)) - .ok_or(())?; - if key.kind != kind { - warn!( - "Invalid crypto kind (got: {:?}, expected: {:?}), when requesting key {:?}", - key.kind, - kind, - id - ); - return Err(()) + fn password(&self) -> Option<&str> { + Some(self.keys_password.as_ref().as_str()) + } + + fn read_key( + &self, + key: CryptoKey, + ) -> Result, ()> { + match key { + CryptoKey::LocalKey { id, kind } => { + let key = self.db.get(KEYS_PREFIX, &id.encode()) + .and_then(|key| StoredKey::decode(&mut &*key)) + .ok_or(())?; + if key.kind != kind { + warn!( + "Invalid crypto kind (got: {:?}, expected: {:?}), when requesting key {:?}", + key.kind, + kind, + id + ); + return Err(()) + } + Ok(Key::LocalKey(key.to_local_key(self.password())?)) + } + CryptoKey::AuthorityKey => { + let key = self.key_provider + .authority_key(&self.at) + .ok_or(())?; + Ok(Key::AuthorityKey(key)) + } + CryptoKey::FgAuthorityKey => { + let key = self.key_provider + .fg_authority_key(&self.at) + .ok_or(())?; + Ok(Key::FgAuthorityKey(key)) } - - Ok(match key.kind { - CryptoKind::Sr25519 => Key::Sr25519(self.keypair(&key.phrase)?), - CryptoKind::Ed25519 => Key::Ed25519(self.keypair(&key.phrase)?), - }) - } else { - let key = match kind { - CryptoKind::Sr25519 => self.key_provider.authority_key().map(Key::Sr25519), - CryptoKind::Ed25519 => self.key_provider.authority_key().map(Key::Ed25519), - }; - - key.ok_or_else(|| { - warn!("AuthorityKey is not configured, yet offchain worker tried to access it."); - () - }) } } } -impl OffchainExt for Api where +impl OffchainExt for Api +where Storage: OffchainStorage, - KeyProvider: AuthorityKeyProvider, + KeyProvider: AuthorityKeyProvider, + Block: traits::Block, { fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { self.sender @@ -134,16 +254,8 @@ impl OffchainExt for Api where .map_err(|_| ()) } - fn new_crypto_key(&mut self, kind: CryptoKind) -> Result { - let phrase = match kind { - CryptoKind::Ed25519 => { - ed25519::Pair::generate_with_phrase(Some(self.keys_password.as_ref())).1 - }, - CryptoKind::Sr25519 => { - sr25519::Pair::generate_with_phrase(Some(self.keys_password.as_ref())).1 - }, - }; - + fn new_crypto_key(&mut self, kind: CryptoKind) -> Result { + let key = StoredKey::generate_with_phrase(kind, self.password()); let (id, id_encoded) = loop { let encoded = self.db.get(KEYS_PREFIX, NEXT_ID); let encoded_slice = encoded.as_ref().map(|x| x.as_slice()); @@ -157,19 +269,13 @@ impl OffchainExt for Api where } }; - self.db.set(KEYS_PREFIX, &id_encoded, &CryptoKey { phrase, kind } .encode()); + self.db.set(KEYS_PREFIX, &id_encoded, &key.encode()); - Ok(CryptoKeyId(id)) + Ok(CryptoKey::LocalKey { id, kind }) } - fn authority_pubkey(&self, kind: CryptoKind) -> Result, ()> { - let key = self.read_key(None, kind)?; - let public = match key { - Key::Sr25519(pair) => pair.public().encode(), - Key::Ed25519(pair) => pair.public().encode(), - }; - - Ok(public) + fn pubkey(&self, key: CryptoKey) -> Result, ()> { + self.read_key(key)?.public() } fn network_state(&self) -> Result { @@ -182,33 +288,23 @@ impl OffchainExt for Api where Ok(OpaqueNetworkState::from(state)) } - fn encrypt(&mut self, _key: Option, _kind: CryptoKind, _data: &[u8]) -> Result, ()> { + fn encrypt(&mut self, _key: CryptoKey, _data: &[u8]) -> Result, ()> { unavailable_yet::<()>("encrypt"); Err(()) } - fn decrypt(&mut self, _key: Option, _kind: CryptoKind, _data: &[u8]) -> Result, ()> { + fn decrypt(&mut self, _key: CryptoKey, _data: &[u8]) -> Result, ()> { unavailable_yet::<()>("decrypt"); Err(()) } - fn sign(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - let key = self.read_key(key, kind)?; - - Ok(match key { - Key::Sr25519(pair) => pair.sign(data).0.to_vec(), - Key::Ed25519(pair) => pair.sign(data).0.to_vec(), - }) + fn sign(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { + self.read_key(key)?.sign(data) } - fn verify(&mut self, key: Option, kind: CryptoKind, msg: &[u8], signature: &[u8]) -> Result { - let key = self.read_key(key, kind)?; - - Ok(match key { - Key::Sr25519(pair) => sr25519::Pair::verify_weak(signature, msg, pair.public()), - Key::Ed25519(pair) => ed25519::Pair::verify_weak(signature, msg, pair.public()), - }) + fn verify(&mut self, key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result { + self.read_key(key)?.verify(msg, signature) } fn timestamp(&mut self) -> Timestamp { @@ -385,14 +481,14 @@ pub(crate) struct AsyncApi { impl AsyncApi { /// Creates new Offchain extensions API implementation an the asynchronous processing part. - pub fn new( + pub fn new>( transaction_pool: Arc>, db: S, keys_password: Protected, key_provider: P, at: BlockId, network_state: Arc, - ) -> (Api, AsyncApi) { + ) -> (Api, AsyncApi) { let (sender, rx) = mpsc::unbounded(); let api = Api { @@ -401,6 +497,7 @@ impl AsyncApi { keys_password, key_provider, network_state, + at, }; let async_api = AsyncApi { @@ -446,10 +543,12 @@ impl AsyncApi { #[cfg(test)] mod tests { use super::*; - use std::{collections::HashSet, convert::TryFrom}; + use std::convert::TryFrom; + use runtime_primitives::traits::Zero; use client_db::offchain::LocalStorage; use crate::tests::TestProvider; use network::PeerId; + use test_client::runtime::Block; struct MockNetworkStateInfo(); @@ -463,7 +562,7 @@ mod tests { } } - fn offchain_api() -> (Api, AsyncApi) { + fn offchain_api() -> (Api, Block>, AsyncApi) { let _ = env_logger::try_init(); let db = LocalStorage::new_test(); let client = Arc::new(test_client::new()); @@ -472,7 +571,7 @@ mod tests { ); let mock = Arc::new(MockNetworkStateInfo()); - AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(0), mock) + AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(Zero::zero()), mock) } #[test] @@ -515,22 +614,16 @@ mod tests { let msg = b"Hello world!"; // when - let key_id = api.new_crypto_key(kind).unwrap(); - let signature = api.sign(Some(key_id), kind, msg).unwrap(); + let key = api.new_crypto_key(kind).unwrap(); + let signature = api.sign(key, msg).unwrap(); // then - let res = api.verify(Some(key_id), kind, msg, &signature).unwrap(); + let res = api.verify(key, msg, &signature).unwrap(); assert_eq!(res, true); - let res = api.verify(Some(key_id), kind, msg, &[]).unwrap(); + let res = api.verify(key, msg, &[]).unwrap(); assert_eq!(res, false); - let res = api.verify(Some(key_id), kind, b"Different msg", &signature).unwrap(); + let res = api.verify(key, b"Different msg", &signature).unwrap(); assert_eq!(res, false); - - assert_eq!( - api.verify(Some(key_id), CryptoKind::Sr25519, msg, &signature).is_err(), - kind != CryptoKind::Sr25519 - ); - }; test(CryptoKind::Ed25519); @@ -543,23 +636,17 @@ mod tests { let mut api = offchain_api().0; api.key_provider.ed_key = Some(ed25519::Pair::generate().0); let msg = b"Hello world!"; - let kind = CryptoKind::Ed25519; // when - let signature = api.sign(None, kind, msg).unwrap(); + let signature = api.sign(CryptoKey::AuthorityKey, msg).unwrap(); // then - let res = api.verify(None, kind, msg, &signature).unwrap(); + let res = api.verify(CryptoKey::AuthorityKey, msg, &signature).unwrap(); assert_eq!(res, true); - let res = api.verify(None, kind, msg, &[]).unwrap(); + let res = api.verify(CryptoKey::AuthorityKey, msg, &[]).unwrap(); assert_eq!(res, false); - let res = api.verify(None, kind, b"Different msg", &signature).unwrap(); + let res = api.verify(CryptoKey::AuthorityKey, b"Different msg", &signature).unwrap(); assert_eq!(res, false); - - assert!( - api.verify(None, CryptoKind::Sr25519, msg, &signature).is_err(), - "Invalid kind should trigger a missing key error." - ); } #[test] diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index f9eb3da07a..e187bbc0e3 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -60,9 +60,17 @@ pub mod testing; pub use offchain_primitives::OffchainWorkerApi; /// Provides currently configured authority key. -pub trait AuthorityKeyProvider: Clone + 'static { +pub trait AuthorityKeyProvider: Clone + 'static { + /// The crypto used by the block authoring algorithm. + type ConsensusPair: crypto::Pair; + /// The crypto used by the finality gadget. + type FinalityPair: crypto::Pair; + /// Returns currently configured authority key. - fn authority_key(&self) -> Option; + fn authority_key(&self, block_id: &BlockId) -> Option; + + /// Returns currently configured finality gadget authority key. + fn fg_authority_key(&self, block_id: &BlockId) -> Option; } /// An offchain workers manager. @@ -122,7 +130,7 @@ impl OffchainWorkers< Block: traits::Block, Client: ProvideRuntimeApi, Client::Api: OffchainWorkerApi, - KeyProvider: AuthorityKeyProvider, + KeyProvider: AuthorityKeyProvider, Storage: client::backend::OffchainStorage + 'static, { /// Start the offchain workers after given block. @@ -163,8 +171,7 @@ impl OffchainWorkers< mod tests { use super::*; use futures::Future; - use primitives::{ed25519, sr25519, crypto::{TypedKey, Pair}}; - use std::collections::HashSet; + use primitives::{ed25519, sr25519}; use network::{Multiaddr, PeerId}; struct MockNetworkStateInfo(); @@ -179,19 +186,33 @@ mod tests { } } - #[derive(Clone, Default)] - pub(crate) struct TestProvider { + #[derive(Clone)] + pub(crate) struct TestProvider { + _marker: PhantomData, pub(crate) sr_key: Option, pub(crate) ed_key: Option, } - impl AuthorityKeyProvider for TestProvider { - fn authority_key(&self) -> Option { - TPair::from_seed_slice(&match TPair::KEY_TYPE { - sr25519::Pair::KEY_TYPE => self.sr_key.as_ref().map(|key| key.to_raw_vec()), - ed25519::Pair::KEY_TYPE => self.ed_key.as_ref().map(|key| key.to_raw_vec()), - _ => None, - }?).ok() + impl Default for TestProvider { + fn default() -> Self { + Self { + _marker: PhantomData, + sr_key: None, + ed_key: None, + } + } + } + + impl AuthorityKeyProvider for TestProvider { + type ConsensusPair = ed25519::Pair; + type FinalityPair = sr25519::Pair; + + fn authority_key(&self, _: &BlockId) -> Option { + self.ed_key.clone() + } + + fn fg_authority_key(&self, _: &BlockId) -> Option { + self.sr_key.clone() } } diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs index f2fb7e14c4..6f473a9cd4 100644 --- a/core/offchain/src/testing.rs +++ b/core/offchain/src/testing.rs @@ -29,7 +29,7 @@ use primitives::offchain::{ HttpRequestStatus as RequestStatus, Timestamp, CryptoKind, - CryptoKeyId, + CryptoKey, StorageKind, OpaqueNetworkState, }; @@ -144,18 +144,17 @@ impl offchain::Externalities for TestOffchainExt { unimplemented!("not needed in tests so far") } - fn authority_pubkey(&self, _kind: CryptoKind) -> Result, ()> { + fn pubkey(&self, _key: CryptoKey) -> Result, ()> { unimplemented!("not needed in tests so far") } - fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { unimplemented!("not needed in tests so far") } fn encrypt( &mut self, - _key: Option, - _kind: CryptoKind, + _key: CryptoKey, _data: &[u8], ) -> Result, ()> { unimplemented!("not needed in tests so far") @@ -163,8 +162,7 @@ impl offchain::Externalities for TestOffchainExt { fn decrypt( &mut self, - _key: Option, - _kind: CryptoKind, + _key: CryptoKey, _data: &[u8], ) -> Result, ()> { unimplemented!("not needed in tests so far") @@ -172,8 +170,7 @@ impl offchain::Externalities for TestOffchainExt { fn sign( &mut self, - _key: Option, - _kind: CryptoKind, + _key: CryptoKey, _data: &[u8], ) -> Result, ()> { unimplemented!("not needed in tests so far") @@ -181,8 +178,7 @@ impl offchain::Externalities for TestOffchainExt { fn verify( &mut self, - _key: Option, - _kind: CryptoKind, + _key: CryptoKey, _msg: &[u8], _signature: &[u8], ) -> Result { @@ -332,4 +328,3 @@ impl offchain::Externalities for TestOffchainExt { } } } - diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 3578ea9027..327a8a3eb1 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -457,7 +457,7 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { } /// Trait suitable for typical cryptographic PKI key public type. -pub trait Public: TypedKey + PartialEq + Eq { +pub trait Public: AsRef<[u8]> + TypedKey + PartialEq + Eq + Clone + Send + Sync { /// A new instance from the given slice that should be 32 bytes long. /// /// NOTE: No checking goes on to ensure this is a real public key. Only use it if @@ -476,7 +476,7 @@ pub trait Public: TypedKey + PartialEq + Eq { /// /// For now it just specifies how to create a key from a phrase and derivation path. #[cfg(feature = "std")] -pub trait Pair: TypedKey + Sized + 'static { +pub trait Pair: TypedKey + Sized + Clone + Send + Sync + 'static { /// The type which is used to encode a public key. type Public: Public + Hash; @@ -631,7 +631,7 @@ mod tests { use hex_literal::hex; use super::*; - #[derive(Eq, PartialEq, Debug)] + #[derive(Clone, Eq, PartialEq, Debug)] enum TestPair { Generated, GeneratedWithPhrase, @@ -640,8 +640,13 @@ mod tests { Seed(Vec), } - #[derive(PartialEq, Eq, Hash)] + #[derive(Clone, PartialEq, Eq, Hash)] struct TestPublic; + impl AsRef<[u8]> for TestPublic { + fn as_ref(&self) -> &[u8] { + &[] + } + } impl Public for TestPublic { fn from_slice(_bytes: &[u8]) -> Self { Self diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index a13c26da26..fc1d4f0bda 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -87,14 +87,49 @@ impl From for u32 { } } -/// Opaque type for created crypto keys. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +/// Key to use in the offchain worker crypto api. +#[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct CryptoKeyId(pub u16); +pub enum CryptoKey { + /// Use a key from the offchain workers local storage. + LocalKey { + /// The id of the key. + id: u16, + /// The kind of the key. + kind: CryptoKind, + }, + /// Use the key the block authoring algorithm uses. + AuthorityKey, + /// Use the key the finality gadget uses. + FgAuthorityKey, +} -impl From for u32 { - fn from(c: CryptoKeyId) -> Self { - c.0 as u32 +impl TryFrom for CryptoKey { + type Error = (); + + fn try_from(key: u64) -> Result { + match key & 0xFF { + 0 => { + let id = (key >> 8 & 0xFFFF) as u16; + let kind = CryptoKind::try_from((key >> 32) as u32)?; + Ok(CryptoKey::LocalKey { id, kind }) + } + 1 => Ok(CryptoKey::AuthorityKey), + 2 => Ok(CryptoKey::FgAuthorityKey), + _ => Err(()), + } + } +} + +impl From for u64 { + fn from(key: CryptoKey) -> u64 { + match key { + CryptoKey::LocalKey { id, kind } => { + ((kind as u64) << 32) | ((id as u64) << 8) + } + CryptoKey::AuthorityKey => 1, + CryptoKey::FgAuthorityKey => 2, + } } } @@ -279,13 +314,13 @@ pub trait Externalities { /// Returns information about the local node's network state. fn network_state(&self) -> Result; - /// Returns the locally configured authority public key, if available. - fn authority_pubkey(&self, crypto: CryptoKind) -> Result, ()>; - /// Create new key(pair) for signing/encryption/decryption. /// /// Returns an error if given crypto kind is not supported. - fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; + + /// Returns the locally configured authority public key, if available. + fn pubkey(&self, key: CryptoKey) -> Result, ()>; /// Encrypt a piece of data using given crypto key. /// @@ -293,7 +328,7 @@ pub trait Externalities { /// /// Returns an error if `key` is not available or does not exist, /// or the expected `CryptoKind` does not match. - fn encrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; + fn encrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()>; /// Decrypt a piece of data using given crypto key. /// @@ -301,7 +336,7 @@ pub trait Externalities { /// /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist, /// or the expected `CryptoKind` does not match. - fn decrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; + fn decrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()>; /// Sign a piece of data using given crypto key. /// @@ -309,14 +344,14 @@ pub trait Externalities { /// /// Returns an error if `key` is not available or does not exist, /// or the expected `CryptoKind` does not match. - fn sign(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; + fn sign(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()>; /// Verifies that `signature` for `msg` matches given `key`. /// /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. /// Returns an error in case the key is not available or does not exist or the parameters /// lengths are incorrect or `CryptoKind` does not match. - fn verify(&mut self, key: Option, kind: CryptoKind, msg: &[u8], signature: &[u8]) -> Result; + fn verify(&mut self, key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result; /// Returns current UNIX timestamp (in millis) fn timestamp(&mut self) -> Timestamp; @@ -431,32 +466,32 @@ impl Externalities for Box { (&mut **self).submit_transaction(ex) } - fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { (&mut **self).new_crypto_key(crypto) } - fn encrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - (&mut **self).encrypt(key, kind, data) + fn encrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { + (&mut **self).encrypt(key, data) } fn network_state(&self) -> Result { (& **self).network_state() } - fn authority_pubkey(&self, key:CryptoKind) -> Result, ()> { - (&**self).authority_pubkey(key) + fn pubkey(&self, key: CryptoKey) -> Result, ()> { + (&**self).pubkey(key) } - fn decrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - (&mut **self).decrypt(key, kind, data) + fn decrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { + (&mut **self).decrypt(key, data) } - fn sign(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - (&mut **self).sign(key, kind, data) + fn sign(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { + (&mut **self).sign(key, data) } - fn verify(&mut self, key: Option, kind: CryptoKind, msg: &[u8], signature: &[u8]) -> Result { - (&mut **self).verify(key, kind, msg, signature) + fn verify(&mut self, key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result { + (&mut **self).verify(key, msg, signature) } fn timestamp(&mut self) -> Timestamp { @@ -536,4 +571,27 @@ mod tests { assert_eq!(t.sub(Duration::from_millis(10)), Timestamp(0)); assert_eq!(t.diff(&Timestamp(3)), Duration(2)); } + + #[test] + fn crypto_key_to_from_u64() { + let key = CryptoKey::AuthorityKey; + let uint: u64 = key.clone().into(); + let key2 = CryptoKey::try_from(uint).unwrap(); + assert_eq!(key, key2); + + let key = CryptoKey::FgAuthorityKey; + let uint: u64 = key.clone().into(); + let key2 = CryptoKey::try_from(uint).unwrap(); + assert_eq!(key, key2); + + let key = CryptoKey::LocalKey { id: 0, kind: CryptoKind::Ed25519 }; + let uint: u64 = key.clone().into(); + let key2 = CryptoKey::try_from(uint).unwrap(); + assert_eq!(key, key2); + + let key = CryptoKey::LocalKey { id: 10, kind: CryptoKind::Sr25519 }; + let uint: u64 = key.clone().into(); + let key2 = CryptoKey::try_from(uint).unwrap(); + assert_eq!(key, key2); + } } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 1b0f9500a1..e81380b320 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -30,7 +30,7 @@ use runtime_primitives::{ BuildStorage, traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi}, generic::BlockId }; use crate::config::Configuration; -use primitives::{Blake2Hasher, H256}; +use primitives::{Blake2Hasher, H256, Pair}; use rpc::{self, apis::system::SystemInfo}; use futures::{prelude::*, future::Executor, sync::mpsc}; @@ -128,6 +128,16 @@ pub type ComponentOffchainStorage = < /// Block type for `Components` pub type ComponentBlock = <::Factory as ServiceFactory>::Block; +/// ConsensusPair type for `Components` +pub type ComponentConsensusPair = <::Factory as ServiceFactory>::ConsensusPair; + +/// FinalityPair type for `Components` +pub type ComponentFinalityPair = <::Factory as ServiceFactory>::FinalityPair; + +/// AuthorityKeyProvider type for `Components` +pub type ComponentAuthorityKeyProvider = + AuthorityKeyProvider, ComponentConsensusPair, ComponentFinalityPair>; + /// Extrinsic hash type for `Components` pub type ComponentExHash = <::TransactionPoolApi as txpool::ChainApi>::Hash; @@ -231,7 +241,7 @@ pub trait OffchainWorker { offchain: &offchain::OffchainWorkers< ComponentClient, ComponentOffchainStorage, - AuthorityKeyProvider, + ComponentAuthorityKeyProvider, ComponentBlock >, pool: &Arc>, @@ -248,7 +258,7 @@ impl OffchainWorker for C where offchain: &offchain::OffchainWorkers< ComponentClient, ComponentOffchainStorage, - AuthorityKeyProvider, + ComponentAuthorityKeyProvider, ComponentBlock >, pool: &Arc>, @@ -283,6 +293,10 @@ pub type TaskExecutor = Arc + pub trait ServiceFactory: 'static + Sized { /// Block type. type Block: BlockT; + /// Consensus crypto type. + type ConsensusPair: Pair; + /// Finality crypto type. + type FinalityPair: Pair; /// The type that implements the runtime API. type RuntimeApi: Send + Sync; /// Network protocol extensions. diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 05aa082465..447abd6422 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -26,6 +26,7 @@ pub mod chain_ops; pub mod error; use std::io; +use std::marker::PhantomData; use std::net::SocketAddr; use std::collections::HashMap; use std::time::Duration; @@ -42,7 +43,7 @@ use log::{info, warn, debug, error}; use parity_codec::{Encode, Decode}; use primitives::{Pair, ed25519, crypto}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, NumberFor, SaturatedConversion}; +use runtime_primitives::traits::{Header, NumberFor, SaturatedConversion, Zero}; use substrate_executor::NativeExecutor; use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use tel::{telemetry, SUBSTRATE_INFO}; @@ -55,12 +56,14 @@ pub use transaction_pool::txpool::{ }; pub use client::FinalityNotifications; -pub use components::{ServiceFactory, FullBackend, FullExecutor, LightBackend, +pub use components::{ + ServiceFactory, FullBackend, FullExecutor, LightBackend, ComponentAuthorityKeyProvider, LightExecutor, Components, PoolApi, ComponentClient, ComponentOffchainStorage, ComponentBlock, FullClient, LightClient, FullComponents, LightComponents, CodeExecutor, NetworkService, FactoryChainSpec, FactoryBlock, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, - ComponentExHash, ComponentExtrinsic, FactoryExtrinsic + ComponentExHash, ComponentExtrinsic, FactoryExtrinsic, + ComponentConsensusPair, ComponentFinalityPair, }; use components::{StartRPC, MaintainTransactionPool, OffchainWorker}; #[doc(hidden)] @@ -82,7 +85,7 @@ pub struct Service { NetworkStatus>, NetworkState )>>>>, transaction_pool: Arc>, - keystore: AuthorityKeyProvider, + keystore: ComponentAuthorityKeyProvider, exit: ::exit_future::Exit, signal: Option, /// Sender for futures that must be spawned as background tasks. @@ -102,7 +105,7 @@ pub struct Service { _offchain_workers: Option, ComponentOffchainStorage, - AuthorityKeyProvider, + ComponentAuthorityKeyProvider, ComponentBlock> >>, } @@ -264,6 +267,7 @@ impl Service { let network_status_sinks = Arc::new(Mutex::new(Vec::new())); let keystore_authority_key = AuthorityKeyProvider { + _marker: PhantomData, roles: config.roles, password: config.password.clone(), keystore: keystore.map(Arc::new), @@ -498,10 +502,17 @@ impl Service { } /// give the authority key, if we are an authority and have a key - pub fn authority_key(&self) -> Option { + pub fn authority_key(&self) -> Option> { use offchain::AuthorityKeyProvider; - self.keystore.authority_key() + self.keystore.authority_key(&BlockId::Number(Zero::zero())) + } + + /// give the authority key, if we are an authority and have a key + pub fn fg_authority_key(&self) -> Option> { + use offchain::AuthorityKeyProvider; + + self.keystore.fg_authority_key(&BlockId::Number(Zero::zero())) } /// return a shared instance of Telemetry (if enabled) @@ -531,7 +542,8 @@ impl Service { /// If the request subscribes you to events, the `Sender` in the `RpcSession` object is used to /// send back spontaneous events. pub fn rpc_query(&self, mem: &RpcSession, request: &str) - -> impl Future, Error = ()> { + -> impl Future, Error = ()> + { self.rpc_handlers.handle_request(request, mem.metadata.clone()) } @@ -733,7 +745,7 @@ impl Drop for Service where Components: components::Comp fn start_rpc_servers rpc::RpcHandler>( config: &FactoryFullConfiguration, mut gen_handler: H -) -> Result, error::Error> { +) -> Result, error::Error> { fn maybe_start_server(address: Option, mut start: F) -> Result, io::Error> where F: FnMut(&SocketAddr) -> Result, { @@ -876,16 +888,27 @@ impl network::TransactionPool, ComponentBlock< } } -/// A provider of current authority key. #[derive(Clone)] -pub struct AuthorityKeyProvider { +/// A provider of current authority key. +pub struct AuthorityKeyProvider { + _marker: PhantomData<(Block, ConsensusPair, FinalityPair)>, roles: Roles, keystore: Option>, password: crypto::Protected, } -impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { - fn authority_key(&self) -> Option { +impl + offchain::AuthorityKeyProvider + for AuthorityKeyProvider +where + Block: runtime_primitives::traits::Block, + ConsensusPair: Pair, + FinalityPair: Pair, +{ + type ConsensusPair = ConsensusPair; + type FinalityPair = FinalityPair; + + fn authority_key(&self, _at: &BlockId) -> Option { if self.roles != Roles::AUTHORITY { return None } @@ -896,10 +919,33 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { }; let loaded_key = keystore - .contents() - .map(|keys| keys.get(0) - .map(|k| keystore.load(k, self.password.as_ref())) - ); + .contents() + .map(|keys| keys.get(0) + .map(|k| keystore.load(k, self.password.as_ref())) + ); + + if let Ok(Some(Ok(key))) = loaded_key { + Some(key) + } else { + None + } + } + + fn fg_authority_key(&self, _at: &BlockId) -> Option { + if self.roles != Roles::AUTHORITY { + return None + } + + let keystore = match self.keystore { + Some(ref keystore) => keystore, + None => return None + }; + + let loaded_key = keystore + .contents() + .map(|keys| keys.get(0) + .map(|k| keystore.load(k, self.password.as_ref())) + ); if let Ok(Some(Ok(key))) = loaded_key { Some(key) @@ -957,6 +1003,8 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { /// struct Factory { /// // Declare the block type /// Block = Block, +/// ConsensusPair = primitives::ed25519::Pair, +/// FinalityPair = primitives::ed25519::Pair, /// RuntimeApi = RuntimeApi, /// // Declare the network protocol and give an initializer. /// NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, @@ -1000,6 +1048,8 @@ macro_rules! construct_service_factory { $(#[$attr:meta])* struct $name:ident { Block = $block:ty, + ConsensusPair = $consensus_pair:ty, + FinalityPair = $finality_pair:ty, RuntimeApi = $runtime_api:ty, NetworkProtocol = $protocol:ty { $( $protocol_init:tt )* }, RuntimeDispatch = $dispatch:ty, @@ -1025,6 +1075,8 @@ macro_rules! construct_service_factory { #[allow(unused_variables)] impl $crate::ServiceFactory for $name { type Block = $block; + type ConsensusPair = $consensus_pair; + type FinalityPair = $finality_pair; type RuntimeApi = $runtime_api; type NetworkProtocol = $protocol; type RuntimeDispatch = $dispatch; diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 4e5b9c9def..6ffb15ffdf 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -36,7 +36,7 @@ pub use primitives::Blake2Hasher; use primitives::offchain::{ Timestamp, HttpRequestId, HttpRequestStatus, HttpError, - CryptoKind, CryptoKeyId, + CryptoKind, CryptoKey, StorageKind, OpaqueNetworkState, }; @@ -244,46 +244,40 @@ export_api! { fn network_state() -> Result; /// Returns the currently configured authority public key, if available. - // TODO [#3139] change into crypto_pubkey(&self, key: Option, kind: CryptoKind) - fn authority_pubkey(crypto: CryptoKind) -> Result, ()>; + fn pubkey(key: CryptoKey) -> Result, ()>; /// Create new key(pair) for signing/encryption/decryption. /// /// Returns an error if given crypto kind is not supported. - fn new_crypto_key(crypto: CryptoKind) -> Result; + fn new_crypto_key(crypto: CryptoKind) -> Result; /// Encrypt a piece of data using given crypto key. /// /// If `key` is `None`, it will attempt to use current authority key. /// /// Returns an error if `key` is not available or does not exist. - fn encrypt(key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; + fn encrypt(key: CryptoKey, data: &[u8]) -> Result, ()>; /// Decrypt a piece of data using given crypto key. /// /// If `key` is `None`, it will attempt to use current authority key. /// /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. - fn decrypt(key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; + fn decrypt(key: CryptoKey, data: &[u8]) -> Result, ()>; /// Sign a piece of data using given crypto key. /// /// If `key` is `None`, it will attempt to use current authority key. /// /// Returns an error if `key` is not available or does not exist. - fn sign(key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; + fn sign(key: CryptoKey, data: &[u8]) -> Result, ()>; /// Verifies that `signature` for `msg` matches given `key`. /// /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. /// Returns an error in case the key is not available or does not exist or the parameters /// lengths are incorrect. - fn verify( - key: Option, - kind: CryptoKind, - msg: &[u8], - signature: &[u8] - ) -> Result; + fn verify(key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result; /// Returns current UNIX timestamp (in millis) fn timestamp() -> Timestamp; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index c6abef7cea..18cb2fd2df 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -275,56 +275,52 @@ impl OffchainApi for () { }, "network_state can be called only in the offchain worker context") } - fn authority_pubkey(crypto: offchain::CryptoKind) -> Result, ()> { + fn pubkey(key: offchain::CryptoKey) -> Result, ()> { with_offchain(|ext| { - ext.authority_pubkey(crypto) + ext.pubkey(key) }, "authority_pubkey can be called only in the offchain worker context") } - fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { with_offchain(|ext| { ext.new_crypto_key(crypto) }, "new_crypto_key can be called only in the offchain worker context") } fn encrypt( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, data: &[u8], ) -> Result, ()> { with_offchain(|ext| { - ext.encrypt(key, kind, data) + ext.encrypt(key, data) }, "encrypt can be called only in the offchain worker context") } fn decrypt( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, data: &[u8], ) -> Result, ()> { with_offchain(|ext| { - ext.decrypt(key, kind, data) + ext.decrypt(key, data) }, "decrypt can be called only in the offchain worker context") } fn sign( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, data: &[u8], ) -> Result, ()> { with_offchain(|ext| { - ext.sign(key, kind, data) + ext.sign(key, data) }, "sign can be called only in the offchain worker context") } fn verify( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, msg: &[u8], signature: &[u8], ) -> Result { with_offchain(|ext| { - ext.verify(key, kind, msg, signature) + ext.verify(key, msg, signature) }, "verify can be called only in the offchain worker context") } diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 9090d449f3..001b697934 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -19,7 +19,7 @@ pub use rstd; pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; -use rstd::{vec::Vec, cell::Cell, convert::TryInto}; +use rstd::{vec::Vec, cell::Cell, convert::TryInto, convert::TryFrom}; use primitives::{offchain, Blake2Hasher}; #[cfg(not(feature = "no_panic_handler"))] @@ -410,7 +410,7 @@ pub mod ext { /// code and the runtime is responsible for freeing it. This is always /// a properly allocated pointer (which cannot be NULL), hence the /// runtime code can always rely on it. - fn ext_authority_pubkey(crypto: u32, written_out: *mut u32) -> *mut u8; + fn ext_pubkey(key: u64, written_out: *mut u32) -> *mut u8; /// Create new key(pair) for signing/encryption/decryption. /// @@ -418,7 +418,7 @@ pub mod ext { /// /// - A crypto key id (if the value is less than u16::max_value) /// - `u32::max_value` in case the crypto is not supported - fn ext_new_crypto_key(crypto: u32) -> u32; + fn ext_new_crypto_key(crypto: u32) -> u64; /// Encrypt a piece of data using given crypto key. /// @@ -430,8 +430,7 @@ pub mod ext { /// - Otherwise, pointer to the encrypted message in memory, /// `msg_len` contains the length of the message. fn ext_encrypt( - key: u32, - kind: u32, + key: u64, data: *const u8, data_len: u32, msg_len: *mut u32 @@ -448,8 +447,7 @@ pub mod ext { /// - Otherwise, pointer to the decrypted message in memory, /// `msg_len` contains the length of the message. fn ext_decrypt( - key: u32, - kind: u32, + key: u64, data: *const u8, data_len: u32, msg_len: *mut u32 @@ -466,8 +464,7 @@ pub mod ext { /// - Otherwise, pointer to the signature in memory, /// `sig_data_len` contains the length of the signature. fn ext_sign( - key: u32, - kind: u32, + key: u64, data: *const u8, data_len: u32, sig_data_len: *mut u32 @@ -482,8 +479,7 @@ pub mod ext { /// - `1` in case it doesn't match the key /// - `u32::max_value` if the key is invalid. fn ext_verify( - key: u32, - kind: u32, + key: u64, msg: *const u8, msg_len: u32, signature: *const u8, @@ -929,13 +925,11 @@ impl OffchainApi for () { } } - fn authority_pubkey(kind: offchain::CryptoKind) -> Result, ()> { - let kind = kind as isize as u32; - + fn pubkey(key: CryptoKey) -> Result, ()> { let mut len = 0u32; let raw_result = unsafe { - let ptr = ext_authority_pubkey.get()( - kind, + let ptr = ext_pubkey.get()( + key.into(), &mut len, ); @@ -948,76 +942,73 @@ impl OffchainApi for () { } } - fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { let crypto = crypto.into(); let ret = unsafe { ext_new_crypto_key.get()(crypto) }; - - if ret > u16::max_value() as u32 { - Err(()) - } else { - Ok(offchain::CryptoKeyId(ret as u16)) - } + offchain::CryptoKey::try_from(ret) } fn encrypt( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, data: &[u8], ) -> Result, ()> { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); let mut len = 0_u32; unsafe { - let ptr = ext_encrypt.get()(key, kind, data.as_ptr(), data.len() as u32, &mut len); + let ptr = ext_encrypt.get()( + key.into(), + data.as_ptr(), + data.len() as u32, + &mut len + ); from_raw_parts(ptr, len).ok_or(()) } } fn decrypt( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, data: &[u8], ) -> Result, ()> { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); let mut len = 0_u32; unsafe { - let ptr = ext_decrypt.get()(key, kind, data.as_ptr(), data.len() as u32, &mut len); + let ptr = ext_decrypt.get()( + key.into(), + data.as_ptr(), + data.len() as u32, + &mut len + ); from_raw_parts(ptr, len).ok_or(()) } } fn sign( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, data: &[u8], ) -> Result, ()> { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); let mut len = 0_u32; unsafe { - let ptr = ext_sign.get()(key, kind, data.as_ptr(), data.len() as u32, &mut len); + let ptr = ext_sign.get()( + key.into(), + data.as_ptr(), + data.len() as u32, + &mut len + ); from_raw_parts(ptr, len).ok_or(()) } } fn verify( - key: Option, - kind: offchain::CryptoKind, + key: offchain::CryptoKey, msg: &[u8], signature: &[u8], ) -> Result { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); let val = unsafe { ext_verify.get()( - key, - kind, + key.into(), msg.as_ptr(), msg.len() as u32, signature.as_ptr(), diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 769c774756..f2275cc41f 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -246,9 +246,9 @@ impl offchain::Externalities for NeverOffchainExt { unreachable!() } - fn authority_pubkey( + fn pubkey( &self, - _crypto: offchain::CryptoKind, + _key: offchain::CryptoKey, ) -> Result, ()> { unreachable!() } @@ -256,14 +256,13 @@ impl offchain::Externalities for NeverOffchainExt { fn new_crypto_key( &mut self, _crypto: offchain::CryptoKind, - ) -> Result { + ) -> Result { unreachable!() } fn encrypt( &mut self, - _key: Option, - _kind: offchain::CryptoKind, + _key: offchain::CryptoKey, _data: &[u8], ) -> Result, ()> { unreachable!() @@ -271,8 +270,7 @@ impl offchain::Externalities for NeverOffchainExt { fn decrypt( &mut self, - _key: Option, - _kind: offchain::CryptoKind, + _key: offchain::CryptoKey, _data: &[u8], ) -> Result, ()> { unreachable!() @@ -280,8 +278,7 @@ impl offchain::Externalities for NeverOffchainExt { fn sign( &mut self, - _key: Option, - _kind: offchain::CryptoKind, + _key: offchain::CryptoKey, _data: &[u8], ) -> Result, ()> { unreachable!() @@ -289,8 +286,7 @@ impl offchain::Externalities for NeverOffchainExt { fn verify( &mut self, - _key: Option, - _kind: offchain::CryptoKind, + _key: offchain::CryptoKey, _msg: &[u8], _signature: &[u8], ) -> Result { diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 050fb2646b..2a981c3bcc 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -43,6 +43,8 @@ construct_simple_protocol! { construct_service_factory! { struct Factory { Block = Block, + ConsensusPair = Pair, + FinalityPair = Pair, RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = Executor, @@ -66,7 +68,7 @@ construct_service_factory! { }, AuthoritySetup = { |service: Self::FullService| { - if let Some(key) = service.authority_key::() { + if let Some(key) = service.authority_key() { info!("Using authority key {}", key.public()); let proposer = Arc::new(ProposerFactory { client: service.client(), diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 1ce4c74584..1a40c3b45c 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -26,6 +26,7 @@ use client::{self, LongestChain}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::Pair; +use grandpa_primitives::AuthorityPair as GrandpaPair; use futures::prelude::*; use node_primitives::{AuraPair, Block}; use node_runtime::{GenesisConfig, RuntimeApi}; @@ -66,6 +67,8 @@ impl Default for NodeConfig where F: substrate_service::ServiceFactory { construct_service_factory! { struct Factory { Block = Block, + ConsensusPair = AuraPair, + FinalityPair = GrandpaPair, RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = node_executor::Executor, @@ -83,7 +86,7 @@ construct_service_factory! { let (block_import, link_half) = service.config.custom.grandpa_import_setup.take() .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); - if let Some(aura_key) = service.authority_key::() { + if let Some(aura_key) = service.authority_key() { info!("Using aura key {}", aura_key.public()); let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { @@ -113,7 +116,7 @@ construct_service_factory! { let grandpa_key = if service.config.disable_grandpa { None } else { - service.authority_key::() + service.fg_authority_key() }; let config = grandpa::Config { diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 2f276580f4..80e43393da 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -74,8 +74,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 115, - impl_version: 115, + spec_version: 116, + impl_version: 116, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 26ca2f0581..10443fda14 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -69,8 +69,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use substrate_primitives::{ - crypto::TypedKey, offchain::CryptoKind, - crypto::key_types, + crypto::TypedKey, offchain::CryptoKey, offchain::OpaqueNetworkState, offchain::StorageKind, sr25519, ed25519, @@ -113,7 +112,6 @@ enum OffchainErr { FailedSigning, NetworkState, SubmitTransaction, - UnknownCryptoKind, } impl Printable for OffchainErr { @@ -125,7 +123,6 @@ impl Printable for OffchainErr { OffchainErr::FailedSigning => print("Offchain error: signing failed!"), OffchainErr::NetworkState => print("Offchain error: fetching network state failed!"), OffchainErr::SubmitTransaction => print("Offchain error: submitting transaction failed!"), - OffchainErr::UnknownCryptoKind => print("Offchain error: the CryptoKind is unknown!"), } } } @@ -216,14 +213,8 @@ decl_module! { // Runs after every block. fn offchain_worker(now: T::BlockNumber) { fn gossip_at(block_number: T::BlockNumber) -> Result<(), OffchainErr> { - let kind = match ::KEY_TYPE { - key_types::SR25519 => CryptoKind::Sr25519, - key_types::ED25519 => CryptoKind::Ed25519, - _ => return Err(OffchainErr::UnknownCryptoKind), - }; - // we run only when a local authority key is configured - if let Ok(key) = sr_io::authority_pubkey(kind) { + if let Ok(key) = sr_io::pubkey(CryptoKey::AuthorityKey) { let authority_id = ::AuthorityId::decode(&mut &key[..]) .ok_or(OffchainErr::DecodeAuthorityId)?; let network_state = @@ -235,7 +226,7 @@ decl_module! { authority_id, }; - let signature = sr_io::sign(None, kind, &heartbeat_data.encode()) + let signature = sr_io::sign(CryptoKey::AuthorityKey, &heartbeat_data.encode()) .map_err(|_| OffchainErr::FailedSigning)?; let call = Call::heartbeat(heartbeat_data, signature); let ex = T::UncheckedExtrinsic::new_unsigned(call.into()) -- GitLab From 27b9db6dca6aac770a74d420cc3f6080c710703a Mon Sep 17 00:00:00 2001 From: Gautam Dhameja Date: Mon, 22 Jul 2019 13:32:24 +0200 Subject: [PATCH 011/151] Timestamp off-chain API (#3144) * timestamp offchain api impl * Addressed review comments * fixed expect message * fixed compile error * fixed line width --- core/offchain/src/api.rs | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 64c6427750..2598945dca 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -14,7 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{str::FromStr, sync::Arc, convert::TryFrom}; +use std::{ + str::FromStr, + sync::Arc, + convert::{TryFrom, TryInto}, + time::SystemTime +}; use client::backend::OffchainStorage; use crate::AuthorityKeyProvider; use futures::{Stream, Future, sync::mpsc}; @@ -308,7 +313,20 @@ where } fn timestamp(&mut self) -> Timestamp { - unavailable_yet("timestamp") + let now = SystemTime::now(); + let epoch_duration = now.duration_since(SystemTime::UNIX_EPOCH); + match epoch_duration { + Err(_) => { + // Current time is earlier than UNIX_EPOCH. + Timestamp::from_unix_millis(0) + }, + Ok(d) => { + let duration = d.as_millis(); + // Assuming overflow won't happen for a few hundred years. + Timestamp::from_unix_millis(duration.try_into() + .expect("epoch milliseconds won't overflow u64 for hundreds of years; qed")) + } + } } fn sleep_until(&mut self, _deadline: Timestamp) { @@ -574,6 +592,22 @@ mod tests { AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(Zero::zero()), mock) } + #[test] + fn should_get_timestamp() { + let mut api = offchain_api().0; + + // Get timestamp from std. + let now = SystemTime::now(); + let d: u64 = now.duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis().try_into().unwrap(); + + // Get timestamp from offchain api. + let timestamp = api.timestamp(); + + // Compare. + assert!(timestamp.unix_millis() > 0); + assert_eq!(timestamp.unix_millis(), d); + } + #[test] fn should_set_and_get_local_storage() { // given -- GitLab From ff7d929ba8eea4a06156584480e8a946dd154f00 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Mon, 22 Jul 2019 14:01:13 +0200 Subject: [PATCH 012/151] fix doc (#3162) --- srml/support/src/storage/hashed/generator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index cff375e1f6..4d367fb2a8 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -27,7 +27,7 @@ pub trait StorageHasher: 'static { fn hash(x: &[u8]) -> Self::Output; } -/// Hash storage keys with `concat(twox128(key), key)` +/// Hash storage keys with `concat(twox64(key), key)` pub struct Twox64Concat; impl StorageHasher for Twox64Concat { type Output = Vec; -- GitLab From 8d1c8c610954d79e3e46ad77bfbf09557fa80bfc Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 22 Jul 2019 16:00:45 +0200 Subject: [PATCH 013/151] Add a warning if network is too slow (#3160) --- core/service/src/lib.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 447abd6422..a38009120f 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -29,7 +29,7 @@ use std::io; use std::marker::PhantomData; use std::net::SocketAddr; use std::collections::HashMap; -use std::time::Duration; +use std::time::{Duration, Instant}; use futures::sync::mpsc; use parking_lot::Mutex; @@ -39,7 +39,7 @@ use futures::prelude::*; use futures03::stream::{StreamExt as _, TryStreamExt as _}; use keystore::Store as Keystore; use network::{NetworkState, NetworkStateInfo}; -use log::{info, warn, debug, error}; +use log::{log, info, warn, debug, error, Level}; use parity_codec::{Encode, Decode}; use primitives::{Pair, ed25519, crypto}; use runtime_primitives::generic::BlockId; @@ -647,6 +647,8 @@ fn build_network_future< .map(|v| Ok::<_, ()>(v)).compat(); futures::future::poll_fn(move || { + let before_polling = Instant::now(); + // We poll `imported_blocks_stream`. while let Ok(Async::Ready(Some(notification))) = imported_blocks_stream.poll() { network.on_block_imported(notification.hash, notification.header); @@ -705,10 +707,22 @@ fn build_network_future< } // Main network polling. - network.poll() - .map_err(|err| { - warn!(target: "service", "Error in network: {:?}", err); - }) + match network.poll() { + Ok(Async::NotReady) => {} + Err(err) => warn!(target: "service", "Error in network: {:?}", err), + Ok(Async::Ready(())) => warn!(target: "service", "Network service finished"), + } + + // Now some diagnostic for performances. + let polling_dur = before_polling.elapsed(); + log!( + target: "service", + if polling_dur >= Duration::from_millis(50) { Level::Warn } else { Level::Trace }, + "Polling the network future took {:?}", + polling_dur + ); + + Ok(Async::NotReady) }) } -- GitLab From a534483d546ac2554160e095772fc6fb3b47da87 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 22 Jul 2019 16:05:26 +0200 Subject: [PATCH 014/151] Alphabetical crates order (#3163) --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d2d1df56a9..a6a7b8d17b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,6 +77,7 @@ members = [ "srml/finality-tracker", "srml/generic-asset", "srml/grandpa", + "srml/im-online", "srml/indices", "srml/metadata", "srml/session", @@ -85,7 +86,6 @@ members = [ "srml/system", "srml/timestamp", "srml/treasury", - "srml/im-online", "node/cli", "node/executor", "node/primitives", -- GitLab From 030662b6bb123a9949a319bb8aa57ef3732d06ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 22 Jul 2019 19:00:20 +0200 Subject: [PATCH 015/151] Document `decl_storage!` hashers (#3170) --- srml/support/procedural/src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs index b8bcb15de1..f6da2f751d 100644 --- a/srml/support/procedural/src/lib.rs +++ b/srml/support/procedural/src/lib.rs @@ -83,6 +83,14 @@ use proc_macro::TokenStream; /// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. /// Otherwise, other items in storage with the same first key can be compromised. /// +/// Supported hashers (ordered from least to best security): +/// +/// * `twox_64_concat` - TwoX with 64bit + key concatenated. +/// * `twox_128` - TwoX with 128bit. +/// * `twox_256` - TwoX with with 256bit. +/// * `blake2_128` - Blake2 with 128bit. +/// * `blake2_256` - Blake2 with 256bit. +/// /// Basic storage can be extended as such: /// /// `#vis #name get(#getter) config(#field_name) build(#closure): #type = #default;` -- GitLab From 2b43a43dd0dca9a4bb2e3b3253af0e44f71a56ba Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 23 Jul 2019 01:06:49 +0800 Subject: [PATCH 016/151] Extensible transactions (and tips) (#3102) * Make extrinsics extensible. Also Remove old extrinsic types. * Rest of mockup. Add tips. * Fix some build issues * Runtiem builds :) * Substrate builds. * Fix a doc test * Compact encoding * Extract out the era logic into an extension * Weight Check signed extension. (#3115) * Weight signed extension. * Revert a bit + test for check era. * Update Cargo.toml * Update node/cli/src/factory_impl.rs * Update node/executor/src/lib.rs * Update node/executor/src/lib.rs * Don't use len for weight - use data. * Operational Transaction; second attempt (#3138) * working poc added. * some fixes. * Update doc. * Fix all tests + final logic. * more refactoring. * nits. * System block limit in bytes. * Silent the storage macro warnings. * More logic more tests. * Fix import. * Refactor names. * Fix build. * Update srml/balances/src/lib.rs * Final refactor. * Bump transaction version * Fix weight mult test. * Fix more tests and improve doc. * Bump. * Make some tests work again. * Fix subkey. * Remove todos + bump. * Ignore expensive test. * Bump. --- Cargo.lock | 4 + .../src/generic/checked_extrinsic.rs | 69 ++- core/sr-primitives/src/generic/mod.rs | 4 - .../src/generic/unchecked_extrinsic.rs | 302 ++++++++---- .../unchecked_mortal_compact_extrinsic.rs | 312 ------------- .../src/generic/unchecked_mortal_extrinsic.rs | 313 ------------- core/sr-primitives/src/testing.rs | 74 ++- core/sr-primitives/src/traits.rs | 209 ++++++++- .../sr-primitives/src/transaction_validity.rs | 114 +++-- core/sr-primitives/src/weights.rs | 166 +++++-- core/test-runtime/src/lib.rs | 10 +- core/test-runtime/src/system.rs | 7 +- core/transaction-pool/graph/src/pool.rs | 28 +- core/transaction-pool/src/tests.rs | 6 +- node-template/runtime/src/lib.rs | 37 +- node-template/runtime/src/template.rs | 5 + node/cli/Cargo.toml | 2 + node/cli/src/factory_impl.rs | 40 +- node/cli/src/service.rs | 17 +- node/executor/src/lib.rs | 205 +++----- node/runtime/src/impls.rs | 54 ++- node/runtime/src/lib.rs | 22 +- srml/assets/src/lib.rs | 4 + srml/aura/src/mock.rs | 4 + srml/authorship/src/lib.rs | 4 + srml/balances/src/lib.rs | 95 +++- srml/balances/src/mock.rs | 16 +- srml/balances/src/tests.rs | 47 +- srml/collective/src/lib.rs | 6 +- srml/contracts/src/tests.rs | 4 + srml/council/src/lib.rs | 4 + srml/democracy/src/lib.rs | 4 + srml/elections/src/lib.rs | 6 +- srml/example/src/lib.rs | 29 +- srml/executive/src/lib.rs | 436 ++++++++++++++---- srml/executive/src/mock.rs | 128 ----- srml/executive/src/tests.rs | 246 ---------- srml/finality-tracker/src/lib.rs | 4 + srml/generic-asset/src/lib.rs | 2 + srml/generic-asset/src/mock.rs | 4 + srml/grandpa/src/mock.rs | 4 + srml/im-online/src/lib.rs | 6 +- srml/indices/src/mock.rs | 4 + srml/session/src/mock.rs | 4 + srml/staking/src/mock.rs | 4 + srml/support/Cargo.toml | 2 +- srml/support/src/dispatch.rs | 87 ++-- srml/support/src/traits.rs | 14 - srml/support/test/tests/instance.rs | 4 +- srml/support/test/tests/issue2219.rs | 4 +- srml/system/src/lib.rs | 382 ++++++++++++++- srml/timestamp/src/lib.rs | 4 + srml/treasury/src/lib.rs | 4 + subkey/Cargo.toml | 2 + subkey/src/main.rs | 27 +- 55 files changed, 1957 insertions(+), 1638 deletions(-) delete mode 100644 core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs delete mode 100644 core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs delete mode 100644 srml/executive/src/mock.rs delete mode 100644 srml/executive/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 3b27fd13e0..7fea8d6e93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2256,9 +2256,11 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", + "srml-balances 2.0.0", "srml-contracts 2.0.0", "srml-finality-tracker 2.0.0", "srml-indices 2.0.0", + "srml-system 2.0.0", "srml-timestamp 2.0.0", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-basic-authorship 2.0.0", @@ -4135,6 +4137,8 @@ dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "srml-balances 2.0.0", + "srml-system 2.0.0", "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/sr-primitives/src/generic/checked_extrinsic.rs b/core/sr-primitives/src/generic/checked_extrinsic.rs index ee43b3af2e..04ccd1162c 100644 --- a/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -17,50 +17,83 @@ //! Generic implementation of an extrinsic that has passed the verification //! stage. -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay}; -use crate::weights::{Weighable, Weight}; +use rstd::result::Result; +use crate::traits::{ + self, Member, MaybeDisplay, SignedExtension, DispatchError, Dispatchable, DispatchResult, + ValidateUnsigned +}; +use crate::weights::{GetDispatchInfo, DispatchInfo}; +use crate::transaction_validity::TransactionValidity; /// Definition of something that the external world might want to say; its /// existence implies that it has been checked and is good, particularly with /// regards to the signature. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct CheckedExtrinsic { +pub struct CheckedExtrinsic { /// Who this purports to be from and the number of extrinsics have come before /// from the same signer, if anyone (note this is not a signature). - pub signed: Option<(AccountId, Index)>, + pub signed: Option<(AccountId, Extra)>, + /// The function that should be called. pub function: Call, } -impl traits::Applyable for CheckedExtrinsic +impl traits::Applyable +for + CheckedExtrinsic where AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, + Call: Member + Dispatchable, + Extra: SignedExtension, + Origin: From>, { - type Index = Index; type AccountId = AccountId; - type Call = Call; - fn index(&self) -> Option<&Self::Index> { - self.signed.as_ref().map(|x| &x.1) - } + type Call = Call; fn sender(&self) -> Option<&Self::AccountId> { self.signed.as_ref().map(|x| &x.0) } - fn deconstruct(self) -> (Self::Call, Option) { - (self.function, self.signed.map(|x| x.0)) + fn validate>(&self, + info: DispatchInfo, + len: usize, + ) -> TransactionValidity { + if let Some((ref id, ref extra)) = self.signed { + Extra::validate(extra, id, info, len).into() + } else { + match Extra::validate_unsigned(info, len) { + Ok(extra) => match U::validate_unsigned(&self.function) { + TransactionValidity::Valid(v) => + TransactionValidity::Valid(v.combine_with(extra)), + x => x, + }, + x => x.into(), + } + } + } + + fn dispatch(self, + info: DispatchInfo, + len: usize, + ) -> Result { + let maybe_who = if let Some((id, extra)) = self.signed { + Extra::pre_dispatch(extra, &id, info, len)?; + Some(id) + } else { + Extra::pre_dispatch_unsigned(info, len)?; + None + }; + Ok(self.function.dispatch(Origin::from(maybe_who))) } } -impl Weighable for CheckedExtrinsic +impl GetDispatchInfo for CheckedExtrinsic where - Call: Weighable, + Call: GetDispatchInfo, { - fn weight(&self, len: usize) -> Weight { - self.function.weight(len) + fn get_dispatch_info(&self) -> DispatchInfo { + self.function.get_dispatch_info() } } diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index a4e4106780..1511753d2c 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -19,8 +19,6 @@ // end::description[] mod unchecked_extrinsic; -mod unchecked_mortal_extrinsic; -mod unchecked_mortal_compact_extrinsic; mod era; mod checked_extrinsic; mod header; @@ -30,8 +28,6 @@ mod digest; mod tests; pub use self::unchecked_extrinsic::UncheckedExtrinsic; -pub use self::unchecked_mortal_extrinsic::UncheckedMortalExtrinsic; -pub use self::unchecked_mortal_compact_extrinsic::UncheckedMortalCompactExtrinsic; pub use self::era::{Era, Phase}; pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index 6139139ce0..092af6e6f3 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -20,48 +20,40 @@ use std::fmt; use rstd::prelude::*; -use crate::codec::{Decode, Encode, Codec, Input, HasCompact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, Lookup, Extrinsic}; +use runtime_io::blake2_256; +use crate::codec::{Decode, Encode, Input}; +use crate::traits::{self, Member, MaybeDisplay, SignedExtension, Checkable, Extrinsic}; use super::CheckedExtrinsic; -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -pub struct SignatureContent -where - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, -{ - signed: Address, - signature: Signature, - index: Index, -} +const TRANSACTION_VERSION: u8 = 2; /// A extrinsic right from the external world. This is unchecked and so /// can contain a signature. #[derive(PartialEq, Eq, Clone)] -pub struct UncheckedExtrinsic +pub struct UncheckedExtrinsic where - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, + Extra: SignedExtension { - /// The signature, address and number of extrinsics have come before from - /// the same signer, if this is a signed extrinsic. - pub signature: Option>, + /// The signature, address, number of extrinsics have come before from + /// the same signer and an era describing the longevity of this transaction, + /// if this is a signed extrinsic. + pub signature: Option<(Address, Signature, Extra)>, /// The function that should be called. pub function: Call, } -impl UncheckedExtrinsic -where - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, +impl + UncheckedExtrinsic { /// New instance of a signed extrinsic aka "transaction". - pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature) -> Self { + pub fn new_signed( + function: Call, + signed: Address, + signature: Signature, + extra: Extra + ) -> Self { UncheckedExtrinsic { - signature: Some(SignatureContent{signed, signature, index}), + signature: Some((signed, signature, extra)), function, } } @@ -75,29 +67,52 @@ where } } -impl traits::Checkable - for UncheckedExtrinsic +impl Extrinsic + for UncheckedExtrinsic +{ + type Call = Call; + + fn is_signed(&self) -> Option { + Some(self.signature.is_some()) + } + + fn new_unsigned(function: Call) -> Option { + Some(UncheckedExtrinsic::new_unsigned(function)) + } +} + +impl + Checkable +for + UncheckedExtrinsic where - Address: Member + MaybeDisplay + Codec, - Index: Member + MaybeDisplay + SimpleArithmetic + Codec, + Address: Member + MaybeDisplay, Call: Encode + Member, - Signature: Member + traits::Verify + Codec, + Signature: Member + traits::Verify, + Extra: SignedExtension, AccountId: Member + MaybeDisplay, - Context: Lookup, + Lookup: traits::Lookup { - type Checked = CheckedExtrinsic; + type Checked = CheckedExtrinsic; - fn check(self, context: &Context) -> Result { + fn check(self, lookup: &Lookup) -> Result { Ok(match self.signature { - Some(SignatureContent{signed, signature, index}) => { - let payload = (index, self.function); - let signed = context.lookup(signed)?; - if !crate::verify_encoded_lazy(&signature, &payload, &signed) { + Some((signed, signature, extra)) => { + let additional_signed = extra.additional_signed()?; + let raw_payload = (self.function, extra, additional_signed); + let signed = lookup.lookup(signed)?; + if !raw_payload.using_encoded(|payload| { + if payload.len() > 256 { + signature.verify(&blake2_256(payload)[..], &signed) + } else { + signature.verify(payload, &signed) + } + }) { return Err(crate::BAD_SIGNATURE) } CheckedExtrinsic { - signed: Some((signed, payload.0)), - function: payload.1, + signed: Some((signed, raw_payload.1)), + function: raw_payload.0, } } None => CheckedExtrinsic { @@ -108,25 +123,13 @@ where } } -impl< - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, - Call, -> Extrinsic for UncheckedExtrinsic { - type Call = Call; - - fn is_signed(&self) -> Option { - Some(self.signature.is_some()) - } - - fn new_unsigned(call: Self::Call) -> Option { - Some(UncheckedExtrinsic::new_unsigned(call)) - } -} - -impl Decode - for UncheckedExtrinsic +impl Decode + for UncheckedExtrinsic +where + Address: Decode, + Signature: Decode, + Call: Decode, + Extra: SignedExtension, { fn decode(input: &mut I) -> Option { // This is a little more complicated than usual since the binary format must be compatible @@ -135,70 +138,191 @@ impl // to use this). let _length_do_not_remove_me_see_above: Vec<()> = Decode::decode(input)?; + let version = input.read_byte()?; + + let is_signed = version & 0b1000_0000 != 0; + let version = version & 0b0111_1111; + if version != TRANSACTION_VERSION { + return None + } + Some(UncheckedExtrinsic { - signature: Decode::decode(input)?, + signature: if is_signed { Some(Decode::decode(input)?) } else { None }, function: Decode::decode(input)?, }) } } -impl Encode - for UncheckedExtrinsic +impl Encode + for UncheckedExtrinsic +where + Address: Encode, + Signature: Encode, + Call: Encode, + Extra: SignedExtension, { fn encode(&self) -> Vec { super::encode_with_vec_prefix::(|v| { - self.signature.encode_to(v); + // 1 byte version id. + match self.signature.as_ref() { + Some(s) => { + v.push(TRANSACTION_VERSION | 0b1000_0000); + s.encode_to(v); + } + None => { + v.push(TRANSACTION_VERSION & 0b0111_1111); + } + } self.function.encode_to(v); }) } } #[cfg(feature = "std")] -impl serde::Serialize - for UncheckedExtrinsic +impl serde::Serialize + for UncheckedExtrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - self.using_encoded(|bytes| ::substrate_primitives::bytes::serialize(bytes, seq)) + self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } } #[cfg(feature = "std")] -impl fmt::Debug - for UncheckedExtrinsic +impl fmt::Debug + for UncheckedExtrinsic where - Address: fmt::Debug + Codec, - Index: fmt::Debug + HasCompact + Codec, - Signature: Codec, + Address: fmt::Debug, Call: fmt::Debug, + Extra: SignedExtension, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.signed, &x.index)), self.function) + write!(f, "UncheckedExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.0, &x.2)), self.function) } } #[cfg(test)] -mod test { - use crate::codec::{Decode, Encode}; - use super::UncheckedExtrinsic; +mod tests { + use super::*; + use runtime_io::blake2_256; + use crate::codec::{Encode, Decode}; + use crate::traits::{SignedExtension, BlockNumberToHash, Lookup, CurrentHeight}; + use serde::{Serialize, Deserialize}; + + struct TestContext; + impl Lookup for TestContext { + type Source = u64; + type Target = u64; + fn lookup(&self, s: u64) -> Result { Ok(s) } + } + impl CurrentHeight for TestContext { + type BlockNumber = u64; + fn current_height(&self) -> u64 { 42 } + } + impl BlockNumberToHash for TestContext { + type BlockNumber = u64; + type Hash = u64; + fn block_number_to_hash(&self, n: u64) -> Option { Some(n) } + } + + #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] + struct TestSig(u64, Vec); + impl traits::Verify for TestSig { + type Signer = u64; + fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { + *signer == self.0 && msg.get() == &self.1[..] + } + } + + type TestAccountId = u64; + type TestCall = Vec; + + const TEST_ACCOUNT: TestAccountId = 0; + + // NOTE: this is demonstration. One can simply use `()` for testing. + #[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, Ord, PartialOrd)] + struct TestExtra; + impl SignedExtension for TestExtra { + type AccountId = u64; + type AdditionalSigned = (); + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + } + + type Ex = UncheckedExtrinsic; + type CEx = CheckedExtrinsic; #[test] - fn encoding_matches_vec() { - type Extrinsic = UncheckedExtrinsic; - let ex = Extrinsic::new_unsigned(42); - let encoded = ex.encode(); - let decoded = Extrinsic::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(decoded, ex); - let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(as_vec.encode(), encoded); + fn unsigned_codec_should_work() { + let ux = Ex::new_unsigned(vec![0u8; 0]); + let encoded = ux.encode(); + assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); } + #[test] + fn signed_codec_should_work() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, (vec![0u8; 0], TestExtra).encode()), + TestExtra + ); + let encoded = ux.encode(); + assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); + } #[test] - #[cfg(feature = "std")] - fn serialization_of_unchecked_extrinsics() { - type Extrinsic = UncheckedExtrinsic; - let ex = Extrinsic::new_unsigned(42); + fn large_signed_codec_should_work() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, (vec![0u8; 257], TestExtra) + .using_encoded(blake2_256)[..].to_owned()), + TestExtra + ); + let encoded = ux.encode(); + assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); + } + + #[test] + fn unsigned_check_should_work() { + let ux = Ex::new_unsigned(vec![0u8; 0]); + assert!(!ux.is_signed().unwrap_or(false)); + assert!(>::check(ux, &TestContext).is_ok()); + } + + #[test] + fn badly_signed_check_should_fail() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, vec![0u8; 0]), + TestExtra + ); + assert!(ux.is_signed().unwrap_or(false)); + assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); + } + + #[test] + fn signed_check_should_work() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, (vec![0u8; 0], TestExtra).encode()), + TestExtra + ); + assert!(ux.is_signed().unwrap_or(false)); + assert_eq!( + >::check(ux, &TestContext), + Ok(CEx { signed: Some((TEST_ACCOUNT, TestExtra)), function: vec![0u8; 0] }) + ); + } - assert_eq!(serde_json::to_string(&ex).unwrap(), "\"0x14002a000000\""); + #[test] + fn encoding_matches_vec() { + let ex = Ex::new_unsigned(vec![0u8; 0]); + let encoded = ex.encode(); + let decoded = Ex::decode(&mut encoded.as_slice()).unwrap(); + assert_eq!(decoded, ex); + let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); + assert_eq!(as_vec.encode(), encoded); } } diff --git a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs deleted file mode 100644 index 7b50239a6f..0000000000 --- a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Generic implementation of an unchecked (pre-verification) extrinsic. - -#[cfg(feature = "std")] -use std::fmt; - -use rstd::prelude::*; -use runtime_io::blake2_256; -use crate::codec::{Decode, Encode, Input, Compact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, - Lookup, Checkable, Extrinsic, SaturatedConversion}; -use super::{CheckedExtrinsic, Era}; - -const TRANSACTION_VERSION: u8 = 1; - -/// A extrinsic right from the external world. This is unchecked and so -/// can contain a signature. -#[derive(PartialEq, Eq, Clone)] -pub struct UncheckedMortalCompactExtrinsic { - /// The signature, address, number of extrinsics have come before from - /// the same signer and an era describing the longevity of this transaction, - /// if this is a signed extrinsic. - pub signature: Option<(Address, Signature, Compact, Era)>, - /// The function that should be called. - pub function: Call, -} - -impl UncheckedMortalCompactExtrinsic { - /// New instance of a signed extrinsic aka "transaction". - pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature, era: Era) -> Self { - UncheckedMortalCompactExtrinsic { - signature: Some((signed, signature, index.into(), era)), - function, - } - } - - /// New instance of an unsigned extrinsic aka "inherent". - pub fn new_unsigned(function: Call) -> Self { - UncheckedMortalCompactExtrinsic { - signature: None, - function, - } - } -} - -impl Extrinsic for UncheckedMortalCompactExtrinsic { - type Call = Call; - - fn is_signed(&self) -> Option { - Some(self.signature.is_some()) - } - - fn new_unsigned(call: Self::Call) -> Option { - Some(UncheckedMortalCompactExtrinsic::new_unsigned(call)) - } -} - -impl Checkable - for UncheckedMortalCompactExtrinsic -where - Address: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Compact: Encode, - Call: Encode + Member, - Signature: Member + traits::Verify, - AccountId: Member + MaybeDisplay, - BlockNumber: SimpleArithmetic, - Hash: Encode, - Context: Lookup - + CurrentHeight - + BlockNumberToHash, -{ - type Checked = CheckedExtrinsic; - - fn check(self, context: &Context) -> Result { - Ok(match self.signature { - Some((signed, signature, index, era)) => { - let current_u64 = context.current_height().saturated_into::(); - let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) - .ok_or("transaction birth block ancient")?; - let signed = context.lookup(signed)?; - let raw_payload = (index, self.function, era, h); - if !raw_payload.using_encoded(|payload| { - if payload.len() > 256 { - signature.verify(&blake2_256(payload)[..], &signed) - } else { - signature.verify(payload, &signed) - } - }) { - return Err(crate::BAD_SIGNATURE) - } - CheckedExtrinsic { - signed: Some((signed, (raw_payload.0).0)), - function: raw_payload.1, - } - } - None => CheckedExtrinsic { - signed: None, - function: self.function, - }, - }) - } -} - -impl Decode - for UncheckedMortalCompactExtrinsic -where - Address: Decode, - Signature: Decode, - Compact: Decode, - Call: Decode, -{ - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usual since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of vector length (we don't need - // to use this). - let _length_do_not_remove_me_see_above: Vec<()> = Decode::decode(input)?; - - let version = input.read_byte()?; - - let is_signed = version & 0b1000_0000 != 0; - let version = version & 0b0111_1111; - if version != TRANSACTION_VERSION { - return None - } - - Some(UncheckedMortalCompactExtrinsic { - signature: if is_signed { Some(Decode::decode(input)?) } else { None }, - function: Decode::decode(input)?, - }) - } -} - -impl Encode - for UncheckedMortalCompactExtrinsic -where - Address: Encode, - Signature: Encode, - Compact: Encode, - Call: Encode, -{ - fn encode(&self) -> Vec { - super::encode_with_vec_prefix::(|v| { - // 1 byte version id. - match self.signature.as_ref() { - Some(s) => { - v.push(TRANSACTION_VERSION | 0b1000_0000); - s.encode_to(v); - } - None => { - v.push(TRANSACTION_VERSION & 0b0111_1111); - } - } - self.function.encode_to(v); - }) - } -} - -#[cfg(feature = "std")] -impl serde::Serialize - for UncheckedMortalCompactExtrinsic - where Compact: Encode -{ - fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - self.using_encoded(|bytes| seq.serialize_bytes(bytes)) - } -} - -#[cfg(feature = "std")] -impl fmt::Debug for UncheckedMortalCompactExtrinsic where - Address: fmt::Debug, - Index: fmt::Debug, - Call: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedMortalCompactExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.0, &x.2)), self.function) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::blake2_256; - use crate::codec::{Encode, Decode}; - use serde::{Serialize, Deserialize}; - - struct TestContext; - impl Lookup for TestContext { - type Source = u64; - type Target = u64; - fn lookup(&self, s: u64) -> Result { Ok(s) } - } - impl CurrentHeight for TestContext { - type BlockNumber = u64; - fn current_height(&self) -> u64 { 42 } - } - impl BlockNumberToHash for TestContext { - type BlockNumber = u64; - type Hash = u64; - fn block_number_to_hash(&self, n: u64) -> Option { Some(n) } - } - - #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] - struct TestSig(u64, Vec); - impl traits::Verify for TestSig { - type Signer = u64; - fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - *signer == self.0 && msg.get() == &self.1[..] - } - } - - const DUMMY_ACCOUNTID: u64 = 0; - - type Ex = UncheckedMortalCompactExtrinsic, TestSig>; - type CEx = CheckedExtrinsic>; - - #[test] - fn unsigned_codec_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn large_signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8; 257], Era::immortal(), 0u64).using_encoded(blake2_256)[..].to_owned()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn unsigned_check_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - assert!(!ux.is_signed().unwrap_or(false)); - assert!(>::check(ux, &TestContext).is_ok()); - } - - #[test] - fn badly_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, vec![0u8]), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); - } - - #[test] - fn immortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (Compact::from(DUMMY_ACCOUNTID), vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (Compact::from(DUMMY_ACCOUNTID), vec![0u8;0], Era::mortal(32, 42), 42u64).encode()), Era::mortal(32, 42)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn later_mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (Compact::from(DUMMY_ACCOUNTID), vec![0u8;0], Era::mortal(32, 11), 11u64).encode()), Era::mortal(32, 11)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn too_late_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 10), 10u64).encode()), Era::mortal(32, 10)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); - } - - #[test] - fn too_early_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 43), 43u64).encode()), Era::mortal(32, 43)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); - } - - #[test] - fn encoding_matches_vec() { - let ex = Ex::new_unsigned(vec![0u8;0]); - let encoded = ex.encode(); - let decoded = Ex::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(decoded, ex); - let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(as_vec.encode(), encoded); - } -} diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs deleted file mode 100644 index dda5a6cd58..0000000000 --- a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Generic implementation of an unchecked (pre-verification) extrinsic. - -#[cfg(feature = "std")] -use std::fmt; - -use rstd::prelude::*; -use runtime_io::blake2_256; -use crate::codec::{Decode, Encode, Input}; -use crate::traits::{ - self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, - Lookup, Checkable, Extrinsic, SaturatedConversion -}; -use super::{CheckedExtrinsic, Era}; - -const TRANSACTION_VERSION: u8 = 1; - -/// A extrinsic right from the external world. This is unchecked and so -/// can contain a signature. -#[derive(PartialEq, Eq, Clone)] -pub struct UncheckedMortalExtrinsic { - /// The signature, address, number of extrinsics have come before from - /// the same signer and an era describing the longevity of this transaction, - /// if this is a signed extrinsic. - pub signature: Option<(Address, Signature, Index, Era)>, - /// The function that should be called. - pub function: Call, -} - -impl UncheckedMortalExtrinsic { - /// New instance of a signed extrinsic aka "transaction". - pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature, era: Era) -> Self { - UncheckedMortalExtrinsic { - signature: Some((signed, signature, index, era)), - function, - } - } - - /// New instance of an unsigned extrinsic aka "inherent". - pub fn new_unsigned(function: Call) -> Self { - UncheckedMortalExtrinsic { - signature: None, - function, - } - } -} - -impl Extrinsic for UncheckedMortalExtrinsic { - type Call = Call; - - fn is_signed(&self) -> Option { - Some(self.signature.is_some()) - } - - fn new_unsigned(call: Self::Call) -> Option { - Some(UncheckedMortalExtrinsic::new_unsigned(call)) - } -} - -impl Checkable - for UncheckedMortalExtrinsic -where - Address: Member + MaybeDisplay, - Index: Encode + Member + MaybeDisplay + SimpleArithmetic, - Call: Encode + Member, - Signature: Member + traits::Verify, - AccountId: Member + MaybeDisplay, - BlockNumber: SimpleArithmetic, - Hash: Encode, - Context: Lookup - + CurrentHeight - + BlockNumberToHash, -{ - type Checked = CheckedExtrinsic; - - fn check(self, context: &Context) -> Result { - Ok(match self.signature { - Some((signed, signature, index, era)) => { - let current_u64 = context.current_height().saturated_into::(); - let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) - .ok_or("transaction birth block ancient")?; - let signed = context.lookup(signed)?; - let raw_payload = (index, self.function, era, h); - - if !raw_payload.using_encoded(|payload| { - if payload.len() > 256 { - signature.verify(&blake2_256(payload)[..], &signed) - } else { - signature.verify(payload, &signed) - } - }) { - return Err(crate::BAD_SIGNATURE) - } - CheckedExtrinsic { - signed: Some((signed, raw_payload.0)), - function: raw_payload.1, - } - } - None => CheckedExtrinsic { - signed: None, - function: self.function, - }, - }) - } -} - -impl Decode - for UncheckedMortalExtrinsic -where - Address: Decode, - Signature: Decode, - Index: Decode, - Call: Decode, -{ - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usual since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of vector length (we don't need - // to use this). - let _length_do_not_remove_me_see_above: Vec<()> = Decode::decode(input)?; - - let version = input.read_byte()?; - - let is_signed = version & 0b1000_0000 != 0; - let version = version & 0b0111_1111; - if version != TRANSACTION_VERSION { - return None - } - - Some(UncheckedMortalExtrinsic { - signature: if is_signed { Some(Decode::decode(input)?) } else { None }, - function: Decode::decode(input)?, - }) - } -} - -impl Encode - for UncheckedMortalExtrinsic -where - Address: Encode, - Signature: Encode, - Index: Encode, - Call: Encode, -{ - fn encode(&self) -> Vec { - super::encode_with_vec_prefix::(|v| { - // 1 byte version id. - match self.signature.as_ref() { - Some(s) => { - v.push(TRANSACTION_VERSION | 0b1000_0000); - s.encode_to(v); - } - None => { - v.push(TRANSACTION_VERSION & 0b0111_1111); - } - } - self.function.encode_to(v); - }) - } -} - -#[cfg(feature = "std")] -impl serde::Serialize - for UncheckedMortalExtrinsic -{ - fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - self.using_encoded(|bytes| seq.serialize_bytes(bytes)) - } -} - -#[cfg(feature = "std")] -impl fmt::Debug for UncheckedMortalExtrinsic where - Address: fmt::Debug, - Index: fmt::Debug, - Call: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedMortalExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.0, &x.2)), self.function) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::blake2_256; - use crate::codec::{Encode, Decode}; - use serde::{Serialize, Deserialize}; - - struct TestContext; - impl Lookup for TestContext { - type Source = u64; - type Target = u64; - fn lookup(&self, s: u64) -> Result { Ok(s) } - } - impl CurrentHeight for TestContext { - type BlockNumber = u64; - fn current_height(&self) -> u64 { 42 } - } - impl BlockNumberToHash for TestContext { - type BlockNumber = u64; - type Hash = u64; - fn block_number_to_hash(&self, n: u64) -> Option { Some(n) } - } - - #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] - struct TestSig(u64, Vec); - impl traits::Verify for TestSig { - type Signer = u64; - fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - *signer == self.0 && msg.get() == &self.1[..] - } - } - - const DUMMY_ACCOUNTID: u64 = 0; - - type Ex = UncheckedMortalExtrinsic, TestSig>; - type CEx = CheckedExtrinsic>; - - #[test] - fn unsigned_codec_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn large_signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8; 257], Era::immortal(), 0u64).using_encoded(blake2_256)[..].to_owned()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn unsigned_check_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - assert!(!ux.is_signed().unwrap_or(false)); - assert!(>::check(ux, &TestContext).is_ok()); - } - - #[test] - fn badly_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, vec![0u8]), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); - } - - #[test] - fn immortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 42), 42u64).encode()), Era::mortal(32, 42)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn later_mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 11), 11u64).encode()), Era::mortal(32, 11)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn too_late_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 10), 10u64).encode()), Era::mortal(32, 10)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); - } - - #[test] - fn too_early_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 43), 43u64).encode()), Era::mortal(32, 43)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); - } - - #[test] - fn encoding_matches_vec() { - let ex = Ex::new_unsigned(vec![0u8;0]); - let encoded = ex.encode(); - let decoded = Ex::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(decoded, ex); - let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(as_vec.encode(), encoded); - } -} diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index c66d210c93..fcafe6dad9 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -19,12 +19,16 @@ use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializer}; use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; -use crate::traits::{self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, TypedKey}; +use crate::traits::{ + self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, TypedKey, DispatchError, DispatchResult, + ValidateUnsigned, SignedExtension, Dispatchable, +}; use crate::{generic, KeyTypeId}; -use crate::weights::{Weighable, Weight}; +use crate::weights::{GetDispatchInfo, DispatchInfo}; pub use substrate_primitives::H256; use substrate_primitives::U256; use substrate_primitives::ed25519::{Public as AuthorityId}; +use crate::transaction_validity::TransactionValidity; /// Authority Id #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] @@ -204,52 +208,82 @@ impl<'a, Xt> Deserialize<'a> for Block where Block: Decode { } } -/// Test transaction, tuple of (sender, index, call) +/// Test transaction, tuple of (sender, call, signed_extra) /// with index only used if sender is some. /// /// If sender is some then the transaction is signed otherwise it is unsigned. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -pub struct TestXt(pub Option, pub u64, pub Call); +pub struct TestXt(pub Option<(u64, Extra)>, pub Call); -impl Serialize for TestXt where TestXt: Encode -{ +impl Serialize for TestXt where TestXt: Encode { fn serialize(&self, seq: S) -> Result where S: Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } } -impl Debug for TestXt { +impl Debug for TestXt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "TestXt({:?}, {:?})", self.0, self.1) + write!(f, "TestXt({:?}, ...)", self.0.as_ref().map(|x| &x.0)) } } -impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; fn check(self, _: &Context) -> Result { Ok(self) } } -impl traits::Extrinsic for TestXt { +impl traits::Extrinsic for TestXt { type Call = Call; fn is_signed(&self) -> Option { Some(self.0.is_some()) } + + fn new_unsigned(_c: Call) -> Option { + None + } } -impl Applyable for TestXt where - Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug, + +impl Applyable for TestXt where + Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug + Dispatchable, + Extra: SignedExtension, + Origin: From> { type AccountId = u64; - type Index = u64; type Call = Call; - fn sender(&self) -> Option<&u64> { self.0.as_ref() } - fn index(&self) -> Option<&u64> { self.0.as_ref().map(|_| &self.1) } - fn deconstruct(self) -> (Self::Call, Option) { - (self.2, self.0) + + fn sender(&self) -> Option<&u64> { self.0.as_ref().map(|x| &x.0) } + + /// Checks to see if this is a valid *transaction*. It returns information on it if so. + fn validate>(&self, + _info: DispatchInfo, + _len: usize, + ) -> TransactionValidity { + TransactionValidity::Valid(Default::default()) + } + + /// Executes all necessary logic needed prior to dispatch and deconstructs into function call, + /// index and sender. + fn dispatch(self, + info: DispatchInfo, + len: usize, + ) -> Result { + let maybe_who = if let Some((who, extra)) = self.0 { + Extra::pre_dispatch(extra, &who, info, len)?; + Some(who) + } else { + Extra::pre_dispatch_unsigned(info, len)?; + None + }; + Ok(self.1.dispatch(maybe_who.into())) } } -impl Weighable for TestXt { - fn weight(&self, len: usize) -> Weight { + +impl GetDispatchInfo for TestXt { + fn get_dispatch_info(&self) -> DispatchInfo { // for testing: weight == size. - len as Weight + DispatchInfo { + weight: self.encode().len() as u32, + ..Default::default() + } } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 2dbb3761d8..eccf975132 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -23,8 +23,9 @@ use runtime_io; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use substrate_primitives::{self, Hasher, Blake2Hasher}; use crate::codec::{Codec, Encode, Decode, HasCompact}; -use crate::transaction_validity::TransactionValidity; +use crate::transaction_validity::{ValidTransaction, TransactionValidity}; use crate::generic::{Digest, DigestItem}; +use crate::weights::DispatchInfo; pub use substrate_primitives::crypto::TypedKey; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ @@ -716,7 +717,8 @@ pub trait Extrinsic: Sized { /// If no information are available about signed/unsigned, `None` should be returned. fn is_signed(&self) -> Option { None } - /// New instance of an unsigned extrinsic aka "inherent". + /// New instance of an unsigned extrinsic aka "inherent". `None` if this is an opaque + /// extrinsic type. fn new_unsigned(_call: Self::Call) -> Option { None } } @@ -761,6 +763,184 @@ impl Checkable for T { } } +/// An abstract error concerning an attempt to verify, check or dispatch the transaction. This +/// cannot be more concrete because it's designed to work reasonably well over a broad range of +/// possible transaction types. +#[cfg_attr(feature = "std", derive(Debug))] +pub enum DispatchError { + /// General error to do with the inability to pay some fees (e.g. account balance too low). + Payment, + + /// General error to do with the permissions of the sender. + NoPermission, + + /// General error to do with the state of the system in general. + BadState, + + /// General error to do with the transaction being outdated (e.g. nonce too low). + Stale, + + /// General error to do with the transaction not yet being valid (e.g. nonce too high). + Future, + + /// General error to do with the transaction's proofs (e.g. signature). + BadProof, + +/* /// General error to do with actually executing the dispatched logic. + User(&'static str),*/ +} + +impl From for i8 { + fn from(e: DispatchError) -> i8 { + match e { + DispatchError::Payment => -64, + DispatchError::NoPermission => -65, + DispatchError::BadState => -66, + DispatchError::Stale => -67, + DispatchError::Future => -68, + DispatchError::BadProof => -69, + } + } +} + +/// Result of a module function call; either nothing (functions are only called for "side effects") +/// or an error message. +pub type DispatchResult = result::Result<(), &'static str>; + +/// A lazy call (module function and argument values) that can be executed via its `dispatch` +/// method. +pub trait Dispatchable { + /// Every function call from your runtime has an origin, which specifies where the extrinsic was + /// generated from. In the case of a signed extrinsic (transaction), the origin contains an + /// identifier for the caller. The origin can be empty in the case of an inherent extrinsic. + type Origin; + /// ... + type Trait; + /// Actually dispatch this call and result the result of it. + fn dispatch(self, origin: Self::Origin) -> DispatchResult; +} + +/// Means by which a transaction may be extended. This type embodies both the data and the logic +/// that should be additionally associated with the transaction. It should be plain old data. +pub trait SignedExtension: + Codec + MaybeDebug + Sync + Send + Clone + Eq + PartialEq +{ + /// The type which encodes the sender identity. + type AccountId; + + /// Any additional data that will go into the signed payload. This may be created dynamically + /// from the transaction using the `additional_signed` function. + type AdditionalSigned: Encode; + + /// Construct any additional data that should be in the signed payload of the transaction. Can + /// also perform any pre-signature-verification checks and return an error if needed. + fn additional_signed(&self) -> Result; + + /// Validate a signed transaction for the transaction queue. + fn validate( + &self, + _who: &Self::AccountId, + _info: DispatchInfo, + _len: usize, + ) -> Result { Ok(Default::default()) } + + /// Do any pre-flight stuff for a signed transaction. + fn pre_dispatch( + self, + who: &Self::AccountId, + info: DispatchInfo, + len: usize, + ) -> Result<(), DispatchError> { self.validate(who, info, len).map(|_| ()) } + + /// Validate an unsigned transaction for the transaction queue. Normally the default + /// implementation is fine since `ValidateUnsigned` is a better way of recognising and + /// validating unsigned transactions. + fn validate_unsigned( + _info: DispatchInfo, + _len: usize, + ) -> Result { Ok(Default::default()) } + + /// Do any pre-flight stuff for a unsigned transaction. + fn pre_dispatch_unsigned( + info: DispatchInfo, + len: usize, + ) -> Result<(), DispatchError> { Self::validate_unsigned(info, len).map(|_| ()) } +} + +macro_rules! tuple_impl_indexed { + ($first:ident, $($rest:ident,)+ ; $first_index:tt, $($rest_index:tt,)+) => { + tuple_impl_indexed!([$first] [$($rest)+] ; [$first_index,] [$($rest_index,)+]); + }; + ([$($direct:ident)+] ; [$($index:tt,)+]) => { + impl< + AccountId, + $($direct: SignedExtension),+ + > SignedExtension for ($($direct),+,) { + type AccountId = AccountId; + type AdditionalSigned = ($($direct::AdditionalSigned,)+); + fn additional_signed(&self) -> Result { + Ok(( $(self.$index.additional_signed()?,)+ )) + } + fn validate( + &self, + who: &Self::AccountId, + info: DispatchInfo, + len: usize, + ) -> Result { + let aggregator = vec![$(<$direct as SignedExtension>::validate(&self.$index, who, info, len)?),+]; + Ok(aggregator.into_iter().fold(ValidTransaction::default(), |acc, a| acc.combine_with(a))) + } + fn pre_dispatch( + self, + who: &Self::AccountId, + info: DispatchInfo, + len: usize, + ) -> Result<(), DispatchError> { + $(self.$index.pre_dispatch(who, info, len)?;)+ + Ok(()) + } + fn validate_unsigned( + info: DispatchInfo, + len: usize, + ) -> Result { + let aggregator = vec![$($direct::validate_unsigned(info, len)?),+]; + Ok(aggregator.into_iter().fold(ValidTransaction::default(), |acc, a| acc.combine_with(a))) + } + fn pre_dispatch_unsigned( + info: DispatchInfo, + len: usize, + ) -> Result<(), DispatchError> { + $($direct::pre_dispatch_unsigned(info, len)?;)+ + Ok(()) + } + } + + }; + ([$($direct:ident)+] [] ; [$($index:tt,)+] []) => { + tuple_impl_indexed!([$($direct)+] ; [$($index,)+]); + }; + ( + [$($direct:ident)+] [$first:ident $($rest:ident)*] + ; + [$($index:tt,)+] [$first_index:tt, $($rest_index:tt,)*] + ) => { + tuple_impl_indexed!([$($direct)+] ; [$($index,)+]); + tuple_impl_indexed!([$($direct)+ $first] [$($rest)*] ; [$($index,)+ $first_index,] [$($rest_index,)*]); + }; +} + +// TODO: merge this into `tuple_impl` once codec supports `trait Codec` for longer tuple lengths. #3152 +#[allow(non_snake_case)] +tuple_impl_indexed!(A, B, C, D, E, F, G, H, I, J, ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,); + +/// Only for base bone testing when you don't care about signed extensions at all.\ +#[cfg(feature = "std")] +impl SignedExtension for () { + type AccountId = u64; + type AdditionalSigned = (); + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } +} + /// An "executable" piece of information, used by the standard Substrate Executive in order to /// enact a piece of extrinsic information by marshalling and dispatching to a named function /// call. @@ -770,16 +950,25 @@ impl Checkable for T { pub trait Applyable: Sized + Send + Sync { /// Id of the account that is responsible for this piece of information (sender). type AccountId: Member + MaybeDisplay; - /// Index allowing to disambiguate other `Applyable`s from the same `AccountId`. - type Index: Member + MaybeDisplay + SimpleArithmetic; - /// Function call. - type Call: Member; - /// Returns a reference to the index if any. - fn index(&self) -> Option<&Self::Index>; + + /// Type by which we can dispatch. Restricts the UnsignedValidator type. + type Call; + /// Returns a reference to the sender if any. fn sender(&self) -> Option<&Self::AccountId>; - /// Deconstructs into function call and sender. - fn deconstruct(self) -> (Self::Call, Option); + + /// Checks to see if this is a valid *transaction*. It returns information on it if so. + fn validate>(&self, + info: DispatchInfo, + len: usize, + ) -> TransactionValidity; + + /// Executes all necessary logic needed prior to dispatch and deconstructs into function call, + /// index and sender. + fn dispatch(self, + info: DispatchInfo, + len: usize, + ) -> Result; } /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index f36599b67b..a6cc43c5a3 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -18,6 +18,7 @@ use rstd::prelude::*; use crate::codec::{Encode, Decode}; +use crate::traits::DispatchError; /// Priority for a transaction. Additive. Higher is better. pub type TransactionPriority = u64; @@ -36,40 +37,81 @@ pub enum TransactionValidity { /// Transaction is invalid. Details are described by the error code. Invalid(i8), /// Transaction is valid. - Valid { - /// Priority of the transaction. - /// - /// Priority determines the ordering of two transactions that have all - /// their dependencies (required tags) satisfied. - priority: TransactionPriority, - /// Transaction dependencies - /// - /// A non-empty list signifies that some other transactions which provide - /// given tags are required to be included before that one. - requires: Vec, - /// Provided tags - /// - /// A list of tags this transaction provides. Successfully importing the transaction - /// will enable other transactions that depend on (require) those tags to be included as well. - /// Provided and required tags allow Substrate to build a dependency graph of transactions - /// and import them in the right (linear) order. - provides: Vec, - /// Transaction longevity - /// - /// Longevity describes minimum number of blocks the validity is correct. - /// After this period transaction should be removed from the pool or revalidated. - longevity: TransactionLongevity, - /// A flag indicating if the transaction should be propagated to other peers. - /// - /// By setting `false` here the transaction will still be considered for - /// including in blocks that are authored on the current node, but will - /// never be sent to other peers. - propagate: bool, - }, + Valid(ValidTransaction), /// Transaction validity can't be determined. Unknown(i8), } +impl From> for TransactionValidity { + fn from(r: Result) -> Self { + match r { + Ok(v) => TransactionValidity::Valid(v), + Err(e) => TransactionValidity::Invalid(e.into()), + } + } +} + +/// Information concerning a valid transaction. +#[derive(Clone, PartialEq, Eq, Encode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct ValidTransaction { + /// Priority of the transaction. + /// + /// Priority determines the ordering of two transactions that have all + /// their dependencies (required tags) satisfied. + pub priority: TransactionPriority, + /// Transaction dependencies + /// + /// A non-empty list signifies that some other transactions which provide + /// given tags are required to be included before that one. + pub requires: Vec, + /// Provided tags + /// + /// A list of tags this transaction provides. Successfully importing the transaction + /// will enable other transactions that depend on (require) those tags to be included as well. + /// Provided and required tags allow Substrate to build a dependency graph of transactions + /// and import them in the right (linear) order. + pub provides: Vec, + /// Transaction longevity + /// + /// Longevity describes minimum number of blocks the validity is correct. + /// After this period transaction should be removed from the pool or revalidated. + pub longevity: TransactionLongevity, + /// A flag indicating if the transaction should be propagated to other peers. + /// + /// By setting `false` here the transaction will still be considered for + /// including in blocks that are authored on the current node, but will + /// never be sent to other peers. + pub propagate: bool, +} + +impl Default for ValidTransaction { + fn default() -> Self { + ValidTransaction { + priority: 0, + requires: vec![], + provides: vec![], + longevity: TransactionLongevity::max_value(), + propagate: true, + } + } +} + +impl ValidTransaction { + /// Combine two instances into one, as a best effort. This will take the superset of each of the + /// `provides` and `requires` tags, it will sum the priorities, take the minimum longevity and + /// the logic *And* of the propagate flags. + pub fn combine_with(mut self, mut other: ValidTransaction) -> Self { + ValidTransaction { + priority: self.priority.saturating_add(other.priority), + requires: { self.requires.append(&mut other.requires); self.requires }, + provides: { self.provides.append(&mut other.provides); self.provides }, + longevity: self.longevity.min(other.longevity), + propagate: self.propagate && other.propagate, + } + } +} + impl Decode for TransactionValidity { fn decode(value: &mut I) -> Option { match value.read_byte()? { @@ -81,9 +123,9 @@ impl Decode for TransactionValidity { let longevity = TransactionLongevity::decode(value)?; let propagate = bool::decode(value).unwrap_or(true); - Some(TransactionValidity::Valid { + Some(TransactionValidity::Valid(ValidTransaction { priority, requires, provides, longevity, propagate, - }) + })) }, 2 => Some(TransactionValidity::Unknown(i8::decode(value)?)), _ => None, @@ -101,24 +143,24 @@ mod tests { 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0 ]; - assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid { + assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid(ValidTransaction { priority: 5, requires: vec![vec![1, 2, 3, 4]], provides: vec![vec![4, 5, 6]], longevity: 42, propagate: true, - })); + }))); } #[test] fn should_encode_and_decode() { - let v = TransactionValidity::Valid { + let v = TransactionValidity::Valid(ValidTransaction { priority: 5, requires: vec![vec![1, 2, 3, 4]], provides: vec![vec![4, 5, 6]], longevity: 42, propagate: false, - }; + }); let encoded = v.encode(); assert_eq!( diff --git a/core/sr-primitives/src/weights.rs b/core/sr-primitives/src/weights.rs index de72231008..c592d9e195 100644 --- a/core/sr-primitives/src/weights.rs +++ b/core/sr-primitives/src/weights.rs @@ -17,8 +17,8 @@ //! Primitives for transaction weighting. //! //! Each dispatch function within `decl_module!` can have an optional `#[weight = $x]` attribute. -//! $x can be any object that implements the `Weighable` trait. By default, All transactions are -//! annotated by `#[weight = TransactionWeight::default()]`. +//! `$x` can be any type that implements the `ClassifyDispatch` and `WeighData` traits. By +//! default, All transactions are annotated with `#[weight = SimpleDispatchInfo::default()]`. //! //! Note that the decl_module macro _cannot_ enforce this and will simply fail if an invalid struct //! (something that does not implement `Weighable`) is passed in. @@ -26,59 +26,147 @@ use crate::{Fixed64, traits::Saturating}; use crate::codec::{Encode, Decode}; -/// The final type that each `#[weight = $x:expr]`'s -/// expression must evaluate to. +pub use crate::transaction_validity::TransactionPriority; +use crate::traits::Bounded; + +/// Numeric range of a transaction weight. pub type Weight = u32; -/// Maximum block saturation: 4mb -pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024; -/// Target block saturation: 25% of max block saturation = 1mb -pub const IDEAL_TRANSACTIONS_WEIGHT: u32 = MAX_TRANSACTIONS_WEIGHT / 4; +/// A generalized group of dispatch types. This is only distinguishing normal, user-triggered transactions +/// (`Normal`) and anything beyond which serves a higher purpose to the system (`Operational`). +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(PartialEq, Eq, Clone, Copy)] +pub enum DispatchClass { + /// A normal dispatch. + Normal, + /// An operational dispatch. + Operational, +} -/// A `Call` enum (aka transaction) that can be weighted using the custom weight attribute of -/// its dispatchable functions. Is implemented by default in the `decl_module!`. -/// -/// Both the outer Call enum and the per-module individual ones will implement this. -/// The outer enum simply calls the inner ones based on call type. -pub trait Weighable { - /// Return the weight of this call. - /// The `len` argument is the encoded length of the transaction/call. - fn weight(&self, len: usize) -> Weight; +impl Default for DispatchClass { + fn default() -> Self { + DispatchClass::Normal + } +} + +impl From for DispatchClass { + fn from(tx: SimpleDispatchInfo) -> Self { + match tx { + SimpleDispatchInfo::FixedOperational(_) => DispatchClass::Operational, + SimpleDispatchInfo::MaxOperational => DispatchClass::Operational, + SimpleDispatchInfo::FreeOperational => DispatchClass::Operational, + + SimpleDispatchInfo::FixedNormal(_) => DispatchClass::Normal, + SimpleDispatchInfo::MaxNormal => DispatchClass::Normal, + SimpleDispatchInfo::FreeNormal => DispatchClass::Normal, + } + } +} + +/// A bundle of static information collected from the `#[weight = $x]` attributes. +#[cfg_attr(feature = "std", derive(PartialEq, Eq, Debug))] +#[derive(Clone, Copy, Default)] +pub struct DispatchInfo { + /// Weight of this transaction. + pub weight: Weight, + /// Class of this transaction. + pub class: DispatchClass, } -/// Default type used as the weight representative in a `#[weight = x]` attribute. +impl DispatchInfo { + /// Determine if this dispatch should pay the base length-related fee or not. + pub fn pay_length_fee(&self) -> bool { + match self.class { + DispatchClass::Normal => true, + // For now we assume all operational transactions don't pay the length fee. + DispatchClass::Operational => false, + } + } +} + +/// A `Dispatchable` function (aka transaction) that can carry some static information along with it, using the +/// `#[weight]` attribute. +pub trait GetDispatchInfo { + /// Return a `DispatchInfo`, containing relevant information of this dispatch. + /// + /// This is done independently of its encoded size. + fn get_dispatch_info(&self) -> DispatchInfo; +} + +/// Means of weighing some particular kind of data (`T`). +pub trait WeighData { + /// Weigh the data `T` given by `target`. + fn weigh_data(&self, target: T) -> Weight; +} + +/// Means of classifying a dispatchable function. +pub trait ClassifyDispatch { + /// Classify the dispatch function based on input data `target` of type `T`. + fn classify_dispatch(&self, target: T) -> DispatchClass; +} + +/// Default type used with the `#[weight = x]` attribute in a substrate chain. /// -/// A user may pass in any other type that implements [`Weighable`]. If not, the `Default` -/// implementation of [`TransactionWeight`] is used. -pub enum TransactionWeight { - /// Basic weight (base, byte). - /// The values contained are the base weight and byte weight respectively. - Basic(Weight, Weight), - /// Maximum fee. This implies that this transaction _might_ get included but - /// no more transaction can be added. This can be done by setting the - /// implementation to _maximum block weight_. - Max, - /// Free. The transaction does not increase the total weight - /// (i.e. is not included in weight calculation). - Free, +/// A user may pass in any other type that implements the correct traits. If not, the `Default` +/// implementation of [`SimpleDispatchInfo`] is used. +/// +/// For each generalized group (`Normal` and `Operation`): +/// - A `Fixed` variant means weight fee is charged normally and the weight is the number +/// specified in the inner value of the variant. +/// - A `Free` variant is equal to `::Fixed(0)`. Note that this does not guarantee inclusion. +/// - A `Max` variant is equal to `::Fixed(Weight::max_value())`. +/// +/// Based on the final weight value, based on the above variants: +/// - A _weight-fee_ is deducted. +/// - The block weight is consumed proportionally. +/// +/// As for the generalized groups themselves: +/// - `Normal` variants will be assigned a priority proportional to their weight. They can only +/// consume a portion (1/4) of the maximum block resource limits. +/// - `Operational` variants will be assigned the maximum priority. They can potentially consume +/// the entire block resource limit. +#[derive(Clone, Copy)] +pub enum SimpleDispatchInfo { + /// A normal dispatch with fixed weight. + FixedNormal(Weight), + /// A normal dispatch with the maximum weight. + MaxNormal, + /// A normal dispatch with no weight. + FreeNormal, + /// An operational dispatch with fixed weight. + FixedOperational(Weight), + /// An operational dispatch with the maximum weight. + MaxOperational, + /// An operational dispatch with no weight. + FreeOperational, } -impl Weighable for TransactionWeight { - fn weight(&self, len: usize) -> Weight { +impl WeighData for SimpleDispatchInfo { + fn weigh_data(&self, _: T) -> Weight { match self { - TransactionWeight::Basic(base, byte) => base + byte * len as Weight, - TransactionWeight::Max => 3 * 1024 * 1024, - TransactionWeight::Free => 0, + SimpleDispatchInfo::FixedNormal(w) => *w, + SimpleDispatchInfo::MaxNormal => Bounded::max_value(), + SimpleDispatchInfo::FreeNormal => Bounded::min_value(), + + SimpleDispatchInfo::FixedOperational(w) => *w, + SimpleDispatchInfo::MaxOperational => Bounded::max_value(), + SimpleDispatchInfo::FreeOperational => Bounded::min_value(), } } } -impl Default for TransactionWeight { +impl ClassifyDispatch for SimpleDispatchInfo { + fn classify_dispatch(&self, _: T) -> DispatchClass { + DispatchClass::from(*self) + } +} + +impl Default for SimpleDispatchInfo { fn default() -> Self { - // This implies that the weight is currently equal to tx-size, nothing more + // This implies that the weight is currently equal to 100, nothing more // for all substrate transactions that do NOT explicitly annotate weight. // TODO #2431 needs to be updated with proper max values. - TransactionWeight::Basic(0, 1) + SimpleDispatchInfo::FixedNormal(100) } } diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 55c9f52c62..df30832f12 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -36,7 +36,7 @@ use substrate_client::{ use runtime_primitives::{ ApplyResult, create_runtime_str, - transaction_validity::TransactionValidity, + transaction_validity::{TransactionValidity, ValidTransaction}, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, GetNodeBlockType, GetRuntimeBlockType, Verify @@ -377,13 +377,13 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { if let Extrinsic::IncludeData(data) = utx { - return TransactionValidity::Valid { + return TransactionValidity::Valid(ValidTransaction { priority: data.len() as u64, requires: vec![], provides: vec![data], longevity: 1, propagate: false, - }; + }); } system::validate_transaction(utx) @@ -518,13 +518,13 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { if let Extrinsic::IncludeData(data) = utx { - return TransactionValidity::Valid { + return TransactionValidity::Valid(ValidTransaction{ priority: data.len() as u64, requires: vec![], provides: vec![data], longevity: 1, propagate: false, - }; + }); } system::validate_transaction(utx) diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index f4433e391c..01b032f599 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -23,7 +23,8 @@ use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; use runtime_primitives::generic; -use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; +use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult}; +use runtime_primitives::transaction_validity::{TransactionValidity, ValidTransaction}; use parity_codec::{KeyedVec, Encode}; use super::{ AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId @@ -175,13 +176,13 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { p }; - TransactionValidity::Valid { + TransactionValidity::Valid(ValidTransaction { priority: tx.amount, requires, provides, longevity: 64, propagate: true, - } + }) } /// Execute a transaction outside of the block execution function. diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 4498598aee..8f76a17ed9 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -129,18 +129,19 @@ impl Pool { } match self.api.validate_transaction(at, xt.clone())? { - TransactionValidity::Valid { priority, requires, provides, longevity, propagate } => { + TransactionValidity::Valid(validity) => { Ok(base::Transaction { data: xt, - bytes, + bytes + , hash, - priority, - requires, - provides, - propagate, + priority: validity.priority, + requires: validity.requires, + provides: validity.provides, + propagate: validity.propagate, valid_till: block_number .saturated_into::() - .saturating_add(longevity), + .saturating_add(validity.longevity), }) }, TransactionValidity::Invalid(e) => { @@ -233,7 +234,7 @@ impl Pool { for (extrinsic, existing_in_pool) in all { match *existing_in_pool { - // reuse the tags for extrinsis that were found in the pool + // reuse the tags for extrinsics that were found in the pool Some(ref transaction) => { tags.extend(transaction.provides.iter().cloned()); }, @@ -242,8 +243,8 @@ impl Pool { None => { let validity = self.api.validate_transaction(parent, extrinsic.clone()); match validity { - Ok(TransactionValidity::Valid { mut provides, .. }) => { - tags.append(&mut provides); + Ok(TransactionValidity::Valid(mut validity)) => { + tags.append(&mut validity.provides); }, // silently ignore invalid extrinsics, // cause they might just be inherent @@ -306,7 +307,7 @@ impl Pool { let hashes = status.pruned.iter().map(|tx| tx.hash.clone()).collect::>(); let results = self.submit_at(at, status.pruned.into_iter().map(|tx| tx.data.clone()))?; - // Collect the hashes of transactions that now became invalid (meaning that they are succesfully pruned). + // Collect the hashes of transactions that now became invalid (meaning that they are successfully pruned). let hashes = results.into_iter().enumerate().filter_map(|(idx, r)| match r.map_err(error::IntoPoolError::into_pool_error) { Err(Ok(error::Error::InvalidTransaction(_))) => Some(hashes[idx].clone()), _ => None, @@ -451,6 +452,7 @@ fn fire_events( #[cfg(test)] mod tests { use super::*; + use sr_primitives::transaction_validity::ValidTransaction; use futures::Stream; use parity_codec::Encode; use test_runtime::{Block, Extrinsic, Transfer, H256, AccountId}; @@ -486,13 +488,13 @@ mod tests { if nonce < block_number { Ok(TransactionValidity::Invalid(0)) } else { - Ok(TransactionValidity::Valid { + Ok(TransactionValidity::Valid(ValidTransaction { priority: 4, requires: if nonce > block_number { vec![vec![nonce as u8 - 1]] } else { vec![] }, provides: vec![vec![nonce as u8]], longevity: 3, propagate: true, - }) + })) } } diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index a1ee4a50df..7fb94936d2 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -23,7 +23,7 @@ use test_client::{runtime::{AccountId, Block, Hash, Index, Extrinsic, Transfer}, use sr_primitives::{ generic::{self, BlockId}, traits::{Hash as HashT, BlakeTwo256}, - transaction_validity::TransactionValidity, + transaction_validity::{TransactionValidity, ValidTransaction}, }; struct TestApi; @@ -48,13 +48,13 @@ impl txpool::ChainApi for TestApi { }; let provides = vec![vec![uxt.transfer().nonce as u8]]; - Ok(TransactionValidity::Valid { + Ok(TransactionValidity::Valid(ValidTransaction { priority: 1, requires, provides, longevity: 64, propagate: true, - }) + })) } fn block_id_to_number(&self, at: &BlockId) -> error::Result>> { diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 26ff6f9ea9..332df0ec0d 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -17,7 +17,7 @@ use primitives::bytes; use primitives::{ed25519, sr25519, OpaqueMetadata}; use sr_primitives::{ ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, - traits::{self, NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify} + traits::{self, NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify}, weights::Weight, }; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, @@ -69,25 +69,8 @@ mod template; pub mod opaque { use super::*; - /// Opaque, encoded, unchecked extrinsic. - #[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub struct UncheckedExtrinsic(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - #[cfg(feature = "std")] - impl std::fmt::Debug for UncheckedExtrinsic { - fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(fmt, "{}", primitives::hexdisplay::HexDisplay::from(&self.0)) - } - } - impl traits::Extrinsic for UncheckedExtrinsic { - type Call = (); - fn is_signed(&self) -> Option { - None - } - fn new_unsigned(_call: Self::Call) -> Option { - None - } - } + pub use sr_primitives::OpaqueExtrinsic as UncheckedExtrinsic; + /// Opaque block header type. pub type Header = generic::Header; /// Opaque block type. @@ -119,6 +102,8 @@ pub fn native_version() -> NativeVersion { parameter_types! { pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; } impl system::Trait for Runtime { @@ -144,6 +129,10 @@ impl system::Trait for Runtime { type Origin = Origin; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount = BlockHashCount; + /// Maximum weight of each block. With a default weight system of 1byte == 1weight, 4mb is ok. + type MaximumBlockWeight = MaximumBlockWeight; + /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. + type MaximumBlockLength = MaximumBlockLength; } impl aura::Trait for Runtime { @@ -239,12 +228,14 @@ pub type Header = generic::Header; pub type Block = generic::Block; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = (system::CheckNonce, system::CheckWeight, balances::TakeFees); /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive; +pub type Executive = executive::Executive; // Implement our runtime API endpoints. This is just a bunch of proxying. impl_runtime_apis! { diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index e7046e4f51..63b5e27b96 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -73,6 +73,7 @@ mod tests { use primitives::{H256, Blake2Hasher}; use support::{impl_outer_origin, assert_ok, parameter_types}; use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sr_primitives::weights::Weight; impl_outer_origin! { pub enum Origin for Test {} @@ -85,6 +86,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -98,6 +101,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Test { type Event = (); diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index ad49cbe36c..17efcc400f 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -40,6 +40,8 @@ timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default rand = "0.6" finality_tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } contracts = { package = "srml-contracts", path = "../../srml/contracts" } +system = { package = "srml-system", path = "../../srml/system" } +balances = { package = "srml-balances", path = "../../srml/balances" } [dev-dependencies] consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index 211d16f148..182cf4080e 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -23,13 +23,10 @@ use rand::rngs::StdRng; use parity_codec::Decode; use keyring::sr25519::Keyring; -use node_primitives::Hash; -use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, BalancesCall}; -use primitives::sr25519; -use primitives::crypto::Pair; +use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall}; +use primitives::{sr25519, crypto::Pair}; use parity_codec::Encode; -use sr_primitives::generic::Era; -use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; +use sr_primitives::{generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension}}; use substrate_service::ServiceFactory; use transaction_factory::RuntimeAdapter; use transaction_factory::modes::Mode; @@ -54,6 +51,17 @@ pub struct FactoryState { type Number = <::Header as HeaderT>::Number; +impl FactoryState { + fn build_extra(index: node_primitives::Index, phase: u64) -> node_runtime::SignedExtra { + ( + system::CheckEra::from(Era::mortal(256, phase)), + system::CheckNonce::from(index), + system::CheckWeight::from(), + balances::TakeFees::from(0) + ) + } +} + impl RuntimeAdapter for FactoryState { type AccountId = node_primitives::AccountId; type Balance = node_primitives::Balance; @@ -132,16 +140,14 @@ impl RuntimeAdapter for FactoryState { let phase = self.extract_phase(*prior_block_hash); sign::(CheckedExtrinsic { - signed: Some((sender.clone(), index)), + signed: Some((sender.clone(), Self::build_extra(index, phase))), function: Call::Balances( BalancesCall::transfer( - indices::address::Address::Id( - destination.clone().into() - ), + indices::address::Address::Id(destination.clone().into()), (*amount).into() ) ) - }, key, &prior_block_hash, phase) + }, key, (prior_block_hash.clone(), (), (), ())) } fn inherent_extrinsics(&self) -> InherentData { @@ -229,13 +235,11 @@ fn gen_seed_bytes(seed: u64) -> [u8; 32] { fn sign( xt: CheckedExtrinsic, key: &sr25519::Pair, - prior_block_hash: &Hash, - phase: u64, + additional_signed: ::AdditionalSigned, ) -> ::Extrinsic { let s = match xt.signed { - Some((signed, index)) => { - let era = Era::mortal(256, phase); - let payload = (index.into(), xt.function, era, prior_block_hash); + Some((signed, extra)) => { + let payload = (xt.function, extra.clone(), additional_signed); let signature = payload.using_encoded(|b| { if b.len() > 256 { key.sign(&sr_io::blake2_256(b)) @@ -244,8 +248,8 @@ fn sign( } }).into(); UncheckedExtrinsic { - signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), - function: payload.1, + signature: Some((indices::address::Address::Id(signed), signature, extra)), + function: payload.0, } } None => UncheckedExtrinsic { diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 1a40c3b45c..53d6f927b4 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -220,7 +220,7 @@ mod tests { use consensus_common::{Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy}; use node_primitives::DigestItem; use node_runtime::{BalancesCall, Call, CENTS, SECS_PER_BLOCK, UncheckedExtrinsic}; - use parity_codec::{Compact, Encode, Decode}; + use parity_codec::{Encode, Decode}; use primitives::{ crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, sr25519::Public as AddressPublic, H256, @@ -358,19 +358,24 @@ mod tests { let signer = charlie.clone(); let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); - let era = Era::immortal(); - let raw_payload = (Compact(index), function, era, genesis_hash); + + let check_era = system::CheckEra::from(Era::Immortal); + let check_nonce = system::CheckNonce::from(index); + let check_weight = system::CheckWeight::from(); + let take_fees = balances::TakeFees::from(0); + let extra = (check_era, check_nonce, check_weight, take_fees); + + let raw_payload = (function, extra.clone(), genesis_hash); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) } else { signer.sign(payload) }); let xt = UncheckedExtrinsic::new_signed( - index, - raw_payload.1, + raw_payload.0, from.into(), signature.into(), - era, + extra, ).encode(); let v: Vec = Decode::decode(&mut xt.as_slice()).unwrap(); diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 5b2be48173..b554614926 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -40,24 +40,25 @@ mod tests { use substrate_executor::{WasmExecutor, NativeExecutionDispatch}; use parity_codec::{Encode, Decode, Joiner}; use keyring::{AuthorityKeyring, AccountKeyring}; - use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; + use runtime_support::{Hashable, StorageValue, StorageMap, traits::{Currency, Get}}; use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; use primitives::{ twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded }; - use node_primitives::{Hash, BlockNumber, AccountId}; + use node_primitives::{Hash, BlockNumber, AccountId, Balance, Index}; use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; - use runtime_primitives::weights::{IDEAL_TRANSACTIONS_WEIGHT, WeightMultiplier}; + use runtime_primitives::weights::{WeightMultiplier, SimpleDispatchInfo, WeighData}; use {balances, contracts, indices, staking, system, timestamp}; use contracts::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{ Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, SystemConfig, - GrandpaConfig, IndicesConfig, ContractsConfig, Event, SessionKeys, - CENTS, DOLLARS, MILLICENTS, + GrandpaConfig, IndicesConfig, ContractsConfig, Event, SessionKeys, CreationFee, + CENTS, DOLLARS, MILLICENTS, SignedExtra, TransactionBaseFee, TransactionByteFee, + MaximumBlockWeight, }; use wabt; use primitives::map; @@ -78,13 +79,25 @@ mod tests { const BLOATY_CODE: &[u8] = node_runtime::WASM_BINARY_BLOATY; const GENESIS_HASH: [u8; 32] = [69u8; 32]; - // from weight - const TX_FEE: u128 = 146; - // regardless of creation of transfer - const TRANSFER_FEE: u128 = 1 * CENTS; type TestExternalities = CoreTestExternalities; + fn transfer_fee(extrinsic: &E) -> Balance { + let length_fee = >::get() + + >::get() * + (extrinsic.encode().len() as Balance); + let weight_fee = SimpleDispatchInfo::default().weigh_data(()) as Balance; + length_fee + weight_fee + } + + fn multiplier_ideal() -> u32 { + >::get() / 4 / 4 + } + + fn creation_fee() -> Balance { + >::get() + } + fn alice() -> AccountId { AccountKeyring::Alice.into() } @@ -111,9 +124,8 @@ mod tests { fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { match xt.signed { - Some((signed, index)) => { - let era = Era::mortal(256, 0); - let payload = (index.into(), xt.function, era, GENESIS_HASH); + Some((signed, extra)) => { + let payload = (xt.function, extra.clone(), GENESIS_HASH); let key = AccountKeyring::from_public(&signed).unwrap(); let signature = payload.using_encoded(|b| { if b.len() > 256 { @@ -123,8 +135,8 @@ mod tests { } }).into(); UncheckedExtrinsic { - signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), - function: payload.1, + signature: Some((indices::address::Address::Id(signed), signature, extra)), + function: payload.0, } } None => UncheckedExtrinsic { @@ -134,9 +146,18 @@ mod tests { } } + fn signed_extra(nonce: Index, extra_fee: Balance) -> SignedExtra { + ( + system::CheckEra::from(Era::mortal(256, 0)), + system::CheckNonce::from(nonce), + system::CheckWeight::from(), + balances::TakeFees::from(extra_fee) + ) + } + fn xt() -> UncheckedExtrinsic { sign(CheckedExtrinsic { - signed: Some((alice(), 0)), + signed: Some((alice(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer::(bob().into(), 69 * DOLLARS)), }) } @@ -252,7 +273,7 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -288,7 +309,7 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -433,7 +454,7 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(42)), }, CheckedExtrinsic { - signed: Some((alice(), 0)), + signed: Some((alice(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer(bob().into(), 69 * DOLLARS)), }, ] @@ -455,7 +476,7 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(42)), }, CheckedExtrinsic { - signed: Some((alice(), 0)), + signed: Some((alice(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer(bob().into(), 69 * DOLLARS)), }, ] @@ -470,11 +491,11 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(52)), }, CheckedExtrinsic { - signed: Some((bob(), 0)), + signed: Some((bob(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer(alice().into(), 5 * DOLLARS)), }, CheckedExtrinsic { - signed: Some((alice(), 1)), + signed: Some((alice(), signed_extra(1, 0))), function: Call::Balances(balances::Call::transfer(bob().into(), 15 * DOLLARS)), } ] @@ -498,7 +519,7 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(time)), }, CheckedExtrinsic { - signed: Some((charlie(), nonce)), + signed: Some((alice(), signed_extra(nonce, 0))), function: Call::System(system::Call::remark(vec![0; size])), } ] @@ -520,9 +541,7 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - // block1 transfers from alice 69 to bob. - // -1 is the default fee - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); let events = vec![ EventRecord { @@ -557,11 +576,9 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - // bob sends 5, alice sends 15 | bob += 10, alice -= 10 - // 111 - 69 - 10 = 32 - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * (TX_FEE + TRANSFER_FEE)); - // 100 + 69 + 10 = 179 - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - TX_FEE - TRANSFER_FEE); + // TODO TODO: this needs investigating: why are we deducting creation fee twice here? and why bob also pays it? + assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * transfer_fee(&xt()) - 2 * creation_fee()); + assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - transfer_fee(&xt()) - creation_fee()); let events = vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), @@ -616,19 +633,15 @@ mod tests { WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); runtime_io::with_externalities(&mut t, || { - // block1 transfers from alice 69 to bob. - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - (TX_FEE + TRANSFER_FEE)); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); }); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block2.0).unwrap(); runtime_io::with_externalities(&mut t, || { - // bob sends 5, alice sends 15 | bob += 10, alice -= 10 - // 111 - 69 - 10 = 32 - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * (TX_FEE + TRANSFER_FEE)); - // 100 + 69 + 10 = 179 - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - (TX_FEE + TRANSFER_FEE)); + assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * transfer_fee(&xt()) - 2 * creation_fee()); + assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - 1 * transfer_fee(&xt()) - creation_fee()); }); } @@ -745,19 +758,19 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(42)), }, CheckedExtrinsic { - signed: Some((charlie(), 0)), + signed: Some((charlie(), signed_extra(0, 0))), function: Call::Contracts( contracts::Call::put_code::(10_000, transfer_code) ), }, CheckedExtrinsic { - signed: Some((charlie(), 1)), + signed: Some((charlie(), signed_extra(1, 0))), function: Call::Contracts( contracts::Call::create::(1 * DOLLARS, 10_000, transfer_ch, Vec::new()) ), }, CheckedExtrinsic { - signed: Some((charlie(), 2)), + signed: Some((charlie(), signed_extra(2, 0))), function: Call::Contracts( contracts::Call::call::( indices::address::Address::Id(addr.clone()), @@ -873,7 +886,7 @@ mod tests { assert_eq!(r, Ok(ApplyOutcome::Success)); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - TX_FEE - TRANSFER_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt()) - creation_fee()); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -923,7 +936,8 @@ mod tests { #[test] - fn weight_multiplier_increases_on_big_block() { + #[ignore] + fn weight_multiplier_increases_and_decreases_on_big_weight() { let mut t = new_test_ext(COMPACT_CODE, false); let mut prev_multiplier = WeightMultiplier::default(); @@ -933,97 +947,28 @@ mod tests { }); let mut tt = new_test_ext(COMPACT_CODE, false); - let block1 = construct_block( - &mut tt, - 1, - GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), - }, - CheckedExtrinsic { - signed: Some((charlie(), 0)), - function: Call::System(system::Call::remark(vec![0; (IDEAL_TRANSACTIONS_WEIGHT*2) as usize])), - } - ] - ); - let block2 = construct_block( - &mut tt, - 2, - block1.1.clone(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(timestamp::Call::set(52)), - }, - CheckedExtrinsic { - signed: Some((charlie(), 1)), - function: Call::System(system::Call::remark(vec![0; (IDEAL_TRANSACTIONS_WEIGHT*2) as usize])), - } - ] - ); - - // execute a big block. - executor().call::<_, NeverNativeValue, fn() -> _>( - &mut t, - "Core_execute_block", - &block1.0, - true, - None, - ).0.unwrap(); - - // weight multiplier is increased for next block. - runtime_io::with_externalities(&mut t, || { - let fm = System::next_weight_multiplier(); - println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); - assert!(fm > prev_multiplier); - prev_multiplier = fm; - }); - - // execute a big block. - executor().call::<_, NeverNativeValue, fn() -> _>( - &mut t, - "Core_execute_block", - &block2.0, - true, - None, - ).0.unwrap(); - - // weight multiplier is increased for next block. - runtime_io::with_externalities(&mut t, || { - let fm = System::next_weight_multiplier(); - println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); - assert!(fm > prev_multiplier); - }); - } - - #[test] - fn weight_multiplier_decreases_on_small_block() { - let mut t = new_test_ext(COMPACT_CODE, false); - - let mut prev_multiplier = WeightMultiplier::default(); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(System::next_weight_multiplier(), prev_multiplier); + // NOTE: This assumes that system::remark has the default. + let num_to_exhaust = multiplier_ideal() * 2 / SimpleDispatchInfo::default().weigh_data(()); + println!("++ Generating {} transactions to fill {} weight units", num_to_exhaust, multiplier_ideal() * 2); + + let mut xts = (0..num_to_exhaust).map(|i| CheckedExtrinsic { + signed: Some((charlie(), signed_extra(i.into(), 0))), + function: Call::System(system::Call::remark(vec![0; 1])), + }).collect::>(); + xts.insert(0, CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(42)), }); - let mut tt = new_test_ext(COMPACT_CODE, false); + // big one in terms of weight. let block1 = construct_block( &mut tt, 1, GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), - }, - CheckedExtrinsic { - signed: Some((charlie(), 0)), - function: Call::System(system::Call::remark(vec![0; 120])), - } - ] + xts ); + + // small one in terms of weight. let block2 = construct_block( &mut tt, 2, @@ -1034,8 +979,8 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(52)), }, CheckedExtrinsic { - signed: Some((charlie(), 1)), - function: Call::System(system::Call::remark(vec![0; 120])), + signed: Some((charlie(), signed_extra(num_to_exhaust.into(), 0))), + function: Call::System(system::Call::remark(vec![0; 1])), } ] ); @@ -1052,8 +997,8 @@ mod tests { // weight multiplier is increased for next block. runtime_io::with_externalities(&mut t, || { let fm = System::next_weight_multiplier(); - println!("After a small block: {:?} -> {:?}", prev_multiplier, fm); - assert!(fm < prev_multiplier); + println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm > prev_multiplier); prev_multiplier = fm; }); diff --git a/node/runtime/src/impls.rs b/node/runtime/src/impls.rs index 1aa7329a28..85365b6a7e 100644 --- a/node/runtime/src/impls.rs +++ b/node/runtime/src/impls.rs @@ -17,10 +17,11 @@ //! Some configurable implementations as associated type for the substrate runtime. use node_primitives::Balance; -use runtime_primitives::weights::{Weight, WeightMultiplier, MAX_TRANSACTIONS_WEIGHT, IDEAL_TRANSACTIONS_WEIGHT}; +use runtime_primitives::weights::{Weight, WeightMultiplier}; use runtime_primitives::traits::{Convert, Saturating}; use runtime_primitives::Fixed64; -use crate::Balances; +use support::traits::Get; +use crate::{Balances, MaximumBlockWeight}; /// Struct that handles the conversion of Balance -> `u64`. This is used for staking's election /// calculation. @@ -53,14 +54,19 @@ pub struct WeightMultiplierUpdateHandler; impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierUpdateHandler { fn convert(previous_state: (Weight, WeightMultiplier)) -> WeightMultiplier { let (block_weight, multiplier) = previous_state; - let ideal = IDEAL_TRANSACTIONS_WEIGHT as u128; + // CRITICAL NOTE: what the system module interprets as maximum block weight, and a portion + // of it (1/4 usually) as ideal weight demonstrate the gap in block weights for operational + // transactions. What this weight multiplier interprets as the maximum, is actually the + // maximum that is available to normal transactions. Hence, + let max_weight = >::get() / 4; + let ideal_weight = (max_weight / 4) as u128; let block_weight = block_weight as u128; // determines if the first_term is positive - let positive = block_weight >= ideal; - let diff_abs = block_weight.max(ideal) - block_weight.min(ideal); + let positive = block_weight >= ideal_weight; + let diff_abs = block_weight.max(ideal_weight) - block_weight.min(ideal_weight); // diff is within u32, safe. - let diff = Fixed64::from_rational(diff_abs as i64, MAX_TRANSACTIONS_WEIGHT as u64); + let diff = Fixed64::from_rational(diff_abs as i64, max_weight as u64); let diff_squared = diff.saturating_mul(diff); // 0.00004 = 4/100_000 = 40_000/10^9 @@ -94,9 +100,17 @@ impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierU #[cfg(test)] mod tests { use super::*; - use runtime_primitives::weights::{MAX_TRANSACTIONS_WEIGHT, IDEAL_TRANSACTIONS_WEIGHT, Weight}; + use runtime_primitives::weights::Weight; use runtime_primitives::Perbill; + fn max() -> Weight { + >::get() + } + + fn ideal() -> Weight { + max() / 4 / 4 + } + // poc reference implementation. #[allow(dead_code)] fn weight_multiplier_update(block_weight: Weight) -> Perbill { @@ -104,9 +118,9 @@ mod tests { let v: f32 = 0.00004; // maximum tx weight - let m = MAX_TRANSACTIONS_WEIGHT as f32; + let m = max() as f32; // Ideal saturation in terms of weight - let ss = IDEAL_TRANSACTIONS_WEIGHT as f32; + let ss = ideal() as f32; // Current saturation in terms of weight let s = block_weight; @@ -124,22 +138,22 @@ mod tests { fn stateless_weight_mul() { // Light block. Fee is reduced a little. assert_eq!( - WeightMultiplierUpdateHandler::convert((1024, WeightMultiplier::default())), - fm(-9990) + WeightMultiplierUpdateHandler::convert((ideal() / 4, WeightMultiplier::default())), + fm(-7500) ); // a bit more. Fee is decreased less, meaning that the fee increases as the block grows. assert_eq!( - WeightMultiplierUpdateHandler::convert((1024 * 4, WeightMultiplier::default())), - fm(-9960) + WeightMultiplierUpdateHandler::convert((ideal() / 2, WeightMultiplier::default())), + fm(-5000) ); - // ideal. Original fee. + // ideal. Original fee. No changes. assert_eq!( - WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT as u32, WeightMultiplier::default())), + WeightMultiplierUpdateHandler::convert((ideal() as u32, WeightMultiplier::default())), fm(0) ); // // More than ideal. Fee is increased. assert_eq!( - WeightMultiplierUpdateHandler::convert(((IDEAL_TRANSACTIONS_WEIGHT * 2) as u32, WeightMultiplier::default())), + WeightMultiplierUpdateHandler::convert(((ideal() * 2) as u32, WeightMultiplier::default())), fm(10000) ); } @@ -147,20 +161,20 @@ mod tests { #[test] fn stateful_weight_mul_grow_to_infinity() { assert_eq!( - WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, WeightMultiplier::default())), + WeightMultiplierUpdateHandler::convert((ideal() * 2, WeightMultiplier::default())), fm(10000) ); assert_eq!( - WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, fm(10000))), + WeightMultiplierUpdateHandler::convert((ideal() * 2, fm(10000))), fm(20000) ); assert_eq!( - WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, fm(20000))), + WeightMultiplierUpdateHandler::convert((ideal() * 2, fm(20000))), fm(30000) ); // ... assert_eq!( - WeightMultiplierUpdateHandler::convert((IDEAL_TRANSACTIONS_WEIGHT * 2, fm(1_000_000_000))), + WeightMultiplierUpdateHandler::convert((ideal() * 2, fm(1_000_000_000))), fm(1_000_000_000 + 10000) ); } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 80e43393da..71af5d9417 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -36,6 +36,7 @@ use client::{ }; use runtime_primitives::{ApplyResult, impl_opaque_keys, generic, create_runtime_str, key_types}; use runtime_primitives::transaction_validity::TransactionValidity; +use runtime_primitives::weights::Weight; use runtime_primitives::traits::{ BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, }; @@ -74,8 +75,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 116, - impl_version: 116, + spec_version: 117, + impl_version: 117, apis: RUNTIME_API_VERSIONS, }; @@ -116,6 +117,8 @@ pub const DAYS: Moment = HOURS * 24; parameter_types! { pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; } impl system::Trait for Runtime { @@ -130,6 +133,8 @@ impl system::Trait for Runtime { type WeightMultiplierUpdate = WeightMultiplierUpdateHandler; type Event = Event; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl aura::Trait for Runtime { @@ -432,12 +437,19 @@ pub type Block = generic::Block; pub type SignedBlock = generic::SignedBlock; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + system::CheckEra, + system::CheckNonce, + system::CheckWeight, + balances::TakeFees +); /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Balances, Runtime, AllModules>; +pub type Executive = executive::Executive, Runtime, AllModules>; impl_runtime_apis! { impl client_api::Core for Runtime { diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 46d533b011..940f7cdf3f 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -257,6 +257,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -270,6 +272,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Test { type Event = (); diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index 0e5b54ad1b..4348f6af2d 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -37,6 +37,8 @@ pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; pub const MinimumPeriod: u64 = 1; } @@ -52,6 +54,8 @@ impl system::Trait for Test { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl timestamp::Trait for Test { diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 34cdebd82f..50b27f83f6 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -337,6 +337,8 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { @@ -351,6 +353,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Test { diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index bd05d2aa02..48960f1e54 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -154,16 +154,17 @@ use rstd::{cmp, result, mem}; use parity_codec::{Codec, Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module}; use srml_support::traits::{ - UpdateBalanceOutcome, Currency, OnFreeBalanceZero, MakePayment, OnUnbalanced, + UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnUnbalanced, WithdrawReason, WithdrawReasons, LockIdentifier, LockableCurrency, ExistenceRequirement, - Imbalance, SignedImbalance, ReservableCurrency + Imbalance, SignedImbalance, ReservableCurrency, Get, }; -use srml_support::{dispatch::Result, traits::Get}; +use srml_support::dispatch::Result; use primitives::traits::{ - Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, - MaybeSerializeDebug, Saturating, Bounded + Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, + Saturating, Bounded, SignedExtension, SaturatedConversion, DispatchError }; -use primitives::weights::Weight; +use primitives::transaction_validity::{TransactionPriority, ValidTransaction}; +use primitives::weights::DispatchInfo; use system::{IsDeadAccount, OnNewAccount, ensure_signed, ensure_root}; mod mock; @@ -763,6 +764,8 @@ impl, I: Instance> system::Trait for ElevatedTrait { type WeightMultiplierUpdate = T::WeightMultiplierUpdate; type Event = (); type BlockHashCount = T::BlockHashCount; + type MaximumBlockWeight = T::MaximumBlockWeight; + type MaximumBlockLength = T::MaximumBlockLength; } impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; @@ -1146,17 +1149,79 @@ where } } -impl, I: Instance> MakePayment for Module { - fn make_payment(transactor: &T::AccountId, weight: Weight) -> Result { - let transaction_fee = T::Balance::from(weight); - let imbalance = Self::withdraw( - transactor, - transaction_fee, +/// Require the transactor pay for themselves and maybe include a tip to gain additional priority +/// in the queue. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct TakeFees, I: Instance = DefaultInstance>(#[codec(compact)] T::Balance); + +impl, I: Instance> TakeFees { + /// utility constructor. Used only in client/factory code. + #[cfg(feature = "std")] + pub fn from(fee: T::Balance) -> Self { + Self(fee) + } + + /// Compute the final fee value for a particular transaction. + /// + /// The final fee is composed of: + /// - _length-fee_: This is the amount paid merely to pay for size of the transaction. + /// - _weight-fee_: This amount is computed based on the weight of the transaction. Unlike + /// size-fee, this is not input dependent and reflects the _complexity_ of the execution + /// and the time it consumes. + /// - (optional) _tip_: if included in the transaction, it will be added on top. Only signed + /// transactions can have a tip. + fn compute_fee(len: usize, info: DispatchInfo, tip: T::Balance) -> T::Balance { + // length fee + let len_fee = if info.pay_length_fee() { + let len = T::Balance::from(len as u32); + let base = T::TransactionBaseFee::get(); + let byte = T::TransactionByteFee::get(); + base.saturating_add(byte.saturating_mul(len)) + } else { + Zero::zero() + }; + + // weight fee + let weight = info.weight; + let weight_fee: T::Balance = >::next_weight_multiplier().apply_to(weight).into(); + + len_fee.saturating_add(weight_fee).saturating_add(tip) + } +} + +#[cfg(feature = "std")] +impl, I: Instance> rstd::fmt::Debug for TakeFees { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + self.0.fmt(f) + } +} + +impl, I: Instance + Clone + Eq> SignedExtension for TakeFees { + type AccountId = T::AccountId; + type AdditionalSigned = (); + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + + fn validate( + &self, + who: &Self::AccountId, + info: DispatchInfo, + len: usize, + ) -> rstd::result::Result { + // pay any fees. + let fee = Self::compute_fee(len, info, self.0); + let imbalance = >::withdraw( + who, + fee, WithdrawReason::TransactionPayment, - ExistenceRequirement::KeepAlive - )?; + ExistenceRequirement::KeepAlive, + ).map_err(|_| DispatchError::Payment)?; T::TransactionPayment::on_unbalanced(imbalance); - Ok(()) + + let mut r = ValidTransaction::default(); + // NOTE: we probably want to maximize the _fee (of any type) per weight unit_ here, which + // will be a bit more than setting the priority to tip. For now, this is enough. + r.priority = fee.saturated_into::(); + Ok(r) } } diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index a3a6e43faf..fecec82180 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -18,10 +18,11 @@ #![cfg(test)] -use primitives::{traits::IdentityLookup, testing::Header}; +use primitives::{traits::IdentityLookup, testing::Header, weights::{DispatchInfo, Weight}}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; -use srml_support::{impl_outer_origin, parameter_types, traits::Get}; +use srml_support::{impl_outer_origin, parameter_types}; +use srml_support::traits::Get; use std::cell::RefCell; use crate::{GenesisConfig, Module, Trait}; @@ -34,7 +35,7 @@ thread_local! { static TRANSFER_FEE: RefCell = RefCell::new(0); static CREATION_FEE: RefCell = RefCell::new(0); static TRANSACTION_BASE_FEE: RefCell = RefCell::new(0); - static TRANSACTION_BYTE_FEE: RefCell = RefCell::new(0); + static TRANSACTION_BYTE_FEE: RefCell = RefCell::new(1); } pub struct ExistentialDeposit; @@ -67,6 +68,8 @@ impl Get for TransactionByteFee { pub struct Runtime; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Runtime { type Origin = Origin; @@ -80,6 +83,8 @@ impl system::Trait for Runtime { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Runtime { type Balance = u64; @@ -186,3 +191,8 @@ impl ExtBuilder { pub type System = system::Module; pub type Balances = Module; + +/// create a transaction info struct from weight. Handy to avoid building the whole struct. +pub fn info_from_weight(w: Weight) -> DispatchInfo { + DispatchInfo { weight: w, ..Default::default() } +} diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 99f03859de..2828d40e63 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -19,12 +19,12 @@ #![cfg(test)] use super::*; -use mock::{Balances, ExtBuilder, Runtime, System}; +use mock::{Balances, ExtBuilder, Runtime, System, info_from_weight}; use runtime_io::with_externalities; use srml_support::{ assert_noop, assert_ok, assert_err, traits::{LockableCurrency, LockIdentifier, WithdrawReason, WithdrawReasons, - Currency, MakePayment, ReservableCurrency} + Currency, ReservableCurrency} }; const ID_1: LockIdentifier = *b"1 "; @@ -123,7 +123,13 @@ fn lock_reasons_should_work() { "account liquidity restrictions prevent withdrawal" ); assert_ok!(>::reserve(&1, 1)); - assert_ok!(>::make_payment(&1, 1)); + // NOTE: this causes a fee payment. + assert!( as SignedExtension>::pre_dispatch( + TakeFees::from(1), + &1, + info_from_weight(1), + 0, + ).is_ok()); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Reserve.into()); assert_ok!(>::transfer(&1, &2, 1)); @@ -131,15 +137,22 @@ fn lock_reasons_should_work() { >::reserve(&1, 1), "account liquidity restrictions prevent withdrawal" ); - assert_ok!(>::make_payment(&1, 1)); + assert!( as SignedExtension>::pre_dispatch( + TakeFees::from(1), + &1, + info_from_weight(1), + 0, + ).is_ok()); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::TransactionPayment.into()); assert_ok!(>::transfer(&1, &2, 1)); assert_ok!(>::reserve(&1, 1)); - assert_noop!( - >::make_payment(&1, 1), - "account liquidity restrictions prevent withdrawal" - ); + assert!( as SignedExtension>::pre_dispatch( + TakeFees::from(1), + &1, + info_from_weight(1), + 0, + ).is_err()); } ); } @@ -733,3 +746,21 @@ fn liquid_funds_should_transfer_with_delayed_vesting() { } ); } + +#[test] +fn signed_extension_take_fees_work() { + with_externalities( + &mut ExtBuilder::default() + .existential_deposit(10) + .transaction_fees(10, 1) + .monied(true) + .build(), + || { + let len = 10; + assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(0), len).is_ok()); + assert_eq!(Balances::free_balance(&1), 100 - 20); + assert!(TakeFees::::from(5 /* tipped */).pre_dispatch(&1, info_from_weight(0), len).is_ok()); + assert_eq!(Balances::free_balance(&1), 100 - 20 - 25); + } + ); +} diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index 7ee829d5bf..d729b8a300 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -399,6 +399,8 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -412,6 +414,8 @@ mod tests { type Event = Event; type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Test { type Origin = Origin; @@ -425,7 +429,7 @@ mod tests { } pub type Block = primitives::generic::Block; - pub type UncheckedExtrinsic = primitives::generic::UncheckedMortalCompactExtrinsic; + pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic; srml_support::construct_runtime!( pub enum Test where diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index f2cf4ba621..3af81d8d84 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -96,6 +96,8 @@ impl Get for BlockGasLimit { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; pub const BalancesTransactionBaseFee: u64 = 0; pub const BalancesTransactionByteFee: u64 = 0; } @@ -111,6 +113,8 @@ impl system::Trait for Test { type WeightMultiplierUpdate = (); type Event = MetaEvent; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl balances::Trait for Test { type Balance = u64; diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 8a220f0a8a..0ebf50ce16 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -98,6 +98,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -111,6 +113,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = Event; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index fc6110d477..cb7f665b30 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -998,6 +998,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -1011,6 +1013,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 827f1f4832..0f2bf3df12 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -1108,6 +1108,8 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -1121,6 +1123,8 @@ mod tests { type Event = Event; type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -1212,7 +1216,7 @@ mod tests { } pub type Block = primitives::generic::Block; - pub type UncheckedExtrinsic = primitives::generic::UncheckedMortalCompactExtrinsic; + pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic; srml_support::construct_runtime!( pub enum Test where diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 03c4e819bc..a64cfc0af0 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -255,7 +255,7 @@ use srml_support::{StorageValue, dispatch::Result, decl_module, decl_storage, decl_event}; use system::{ensure_signed, ensure_root}; -use sr_primitives::weights::TransactionWeight; +use sr_primitives::weights::SimpleDispatchInfo; /// Our module's configuration trait. All our types and consts go in here. If the /// module is dependent on specific other modules, then their configuration traits @@ -396,19 +396,18 @@ decl_module! { // // If you don't respect these rules, it is likely that your chain will be attackable. // - // Each transaction can optionally indicate a weight. The weight is passed in as a - // custom attribute and the value can be anything that implements the `Weighable` - // trait. Most often using substrate's default `TransactionWeight` is enough for you. + // Each transaction can define an optional `#[weight]` attribute to convey a set of static + // information about its dispatch. The `system` and `executive` module then use this + // information to properly execute the transaction, whilst keeping the total load of the + // chain in a moderate rate. // - // A basic weight is a tuple of `(base_weight, byte_weight)`. Upon including each transaction - // in a block, the final weight is calculated as `base_weight + byte_weight * tx_size`. - // If this value, added to the weight of all included transactions, exceeds `MAX_TRANSACTION_WEIGHT`, - // the transaction is not included. If no weight attribute is provided, the `::default()` - // implementation of `TransactionWeight` is used. - // - // The example below showcases a transaction which is relatively costly, but less dependent on - // the input, hence `byte_weight` is configured smaller. - #[weight = TransactionWeight::Basic(100_000, 10)] + // The _right-hand-side_ value of the `#[weight]` attribute can be any type that implements + // a set of traits, namely [`WeighData`] and [`ClassifyDispatch`]. The former conveys the + // weight (a numeric representation of pure execution time and difficulty) of the + // transaction and the latter demonstrates the `DispatchClass` of the call. A higher weight + // means a larger transaction (less of which can be placed in a single block). See the + // `CheckWeight` signed extension struct in the `system` module for more information. + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] fn accumulate_dummy(origin, increase_by: T::Balance) -> Result { // This is a public call, so we ensure that the origin is some signed account. let _sender = ensure_signed(origin)?; @@ -525,6 +524,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -538,6 +539,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 33bacdd4fc..326c3d7ab9 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -69,7 +69,7 @@ //! # } //! # } //! /// Executive: handles dispatch to the various modules. -//! pub type Executive = executive::Executive; +//! pub type Executive = executive::Executive; //! ``` #![cfg_attr(not(feature = "std"), no_std)] @@ -79,20 +79,17 @@ use rstd::marker::PhantomData; use rstd::result; use primitives::{generic::Digest, traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, - OnInitialize, NumberFor, Block as BlockT, OffchainWorker, - ValidateUnsigned, + OnInitialize, NumberFor, Block as BlockT, OffchainWorker, ValidateUnsigned }}; -use srml_support::{Dispatchable, traits::MakePayment}; +use srml_support::Dispatchable; use parity_codec::{Codec, Encode}; use system::{extrinsics_root, DigestOf}; use primitives::{ApplyOutcome, ApplyError}; -use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity}; -use primitives::weights::{Weighable, MAX_TRANSACTIONS_WEIGHT}; - -mod mock; -mod tests; +use primitives::transaction_validity::TransactionValidity; +use primitives::weights::GetDispatchInfo; mod internal { + use primitives::traits::DispatchError; pub enum ApplyError { BadSignature(&'static str), @@ -106,6 +103,19 @@ mod internal { Success, Fail(&'static str), } + + impl From for ApplyError { + fn from(d: DispatchError) -> Self { + match d { + DispatchError::Payment => ApplyError::CantPay, + DispatchError::NoPermission => ApplyError::CantPay, + DispatchError::BadState => ApplyError::CantPay, + DispatchError::Stale => ApplyError::Stale, + DispatchError::Future => ApplyError::Future, + DispatchError::BadProof => ApplyError::BadSignature(""), + } + } + } } /// Trait that can be used to execute a block. @@ -118,27 +128,26 @@ pub type CheckedOf = >::Checked; pub type CallOf = as Applyable>::Call; pub type OriginOf = as Dispatchable>::Origin; -pub struct Executive( - PhantomData<(System, Block, Context, Payment, UnsignedValidator, AllModules)> +pub struct Executive( + PhantomData<(System, Block, Context, UnsignedValidator, AllModules)> ); impl< System: system::Trait, Block: traits::Block, Context: Default, - Payment: MakePayment, UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> ExecuteBlock for Executive +> ExecuteBlock for Executive where Block::Extrinsic: Checkable + Codec, - CheckedOf: Applyable + Weighable, + CheckedOf: Applyable + GetDispatchInfo, CallOf: Dispatchable, OriginOf: From>, UnsignedValidator: ValidateUnsigned>, { fn execute_block(block: Block) { - Executive::::execute_block(block); + Executive::::execute_block(block); } } @@ -146,13 +155,12 @@ impl< System: system::Trait, Block: traits::Block, Context: Default, - Payment: MakePayment, UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> Executive +> Executive where Block::Extrinsic: Checkable + Codec, - CheckedOf: Applyable + Weighable, + CheckedOf: Applyable + GetDispatchInfo, CallOf: Dispatchable, OriginOf: From>, UnsignedValidator: ValidateUnsigned>, @@ -266,39 +274,21 @@ where // Verify that the signature is good. let xt = uxt.check(&Default::default()).map_err(internal::ApplyError::BadSignature)?; - // Check the weight of the block if that extrinsic is applied. - let weight = xt.weight(encoded_len); - if >::all_extrinsics_weight() + weight > MAX_TRANSACTIONS_WEIGHT { - return Err(internal::ApplyError::FullBlock); - } - - if let (Some(sender), Some(index)) = (xt.sender(), xt.index()) { - // check index - let expected_index = >::account_nonce(sender); - if index != &expected_index { return Err( - if index < &expected_index { internal::ApplyError::Stale } else { internal::ApplyError::Future } - ) } - // pay any fees - let weight_multiplier = >::next_weight_multiplier(); - Payment::make_payment(sender, weight_multiplier.apply_to(weight)).map_err(|_| internal::ApplyError::CantPay)?; - - // AUDIT: Under no circumstances may this function panic from here onwards. - // FIXME: ensure this at compile-time (such as by not defining a panic function, forcing - // a linker error unless the compiler can prove it cannot be called). - // increment nonce in storage - >::inc_account_nonce(sender); - } - - // Make sure to `note_extrinsic` only after we know it's going to be executed - // to prevent it from leaking in storage. + // We don't need to make sure to `note_extrinsic` only after we know it's going to be + // executed to prevent it from leaking in storage since at this point, it will either + // execute or panic (and revert storage changes). if let Some(encoded) = to_note { >::note_extrinsic(encoded); } + // AUDIT: Under no circumstances may this function panic from here onwards. + // Decode parameters and dispatch - let (f, s) = xt.deconstruct(); - let r = f.dispatch(s.into()); - >::note_applied_extrinsic(&r, weight); + let dispatch_info = xt.get_dispatch_info(); + let r = Applyable::dispatch(xt, dispatch_info, encoded_len) + .map_err(internal::ApplyError::from)?; + + >::note_applied_extrinsic(&r, encoded_len as u32); r.map(|_| internal::ApplyOutcome::Success).or_else(|e| match e { primitives::BLOCK_FULL => Err(internal::ApplyError::FullBlock), @@ -335,11 +325,9 @@ where pub fn validate_transaction(uxt: Block::Extrinsic) -> TransactionValidity { // Note errors > 0 are from ApplyError const UNKNOWN_ERROR: i8 = -127; - const MISSING_SENDER: i8 = -20; const INVALID_INDEX: i8 = -10; - let encoded_len = uxt.encode().len(); - + let encoded_len = uxt.using_encoded(|d| d.len()); let xt = match uxt.check(&Default::default()) { // Checks out. Carry on. Ok(xt) => xt, @@ -351,46 +339,328 @@ where Err(_) => return TransactionValidity::Invalid(UNKNOWN_ERROR), }; - match (xt.sender(), xt.index()) { - (Some(sender), Some(index)) => { - let weight = xt.weight(encoded_len); + let dispatch_info = xt.get_dispatch_info(); + xt.validate::(dispatch_info, encoded_len) + } - // pay any fees - let weight_multiplier = >::next_weight_multiplier(); - if Payment::make_payment(sender, weight_multiplier.apply_to(weight)).is_err() { - return TransactionValidity::Invalid(ApplyError::CantPay as i8) - } + /// Start an offchain worker and generate extrinsics. + pub fn offchain_worker(n: System::BlockNumber) { + >::generate_extrinsics(n) + } +} - // check index - let expected_index = >::account_nonce(sender); - if index < &expected_index { - return TransactionValidity::Invalid(ApplyError::Stale as i8) - } - let index = *index; - let provides = vec![(sender, index).encode()]; - let requires = if expected_index < index { - vec![(sender, index - One::one()).encode()] +#[cfg(test)] +mod tests { + use super::*; + use balances::Call; + use runtime_io::with_externalities; + use substrate_primitives::{H256, Blake2Hasher}; + use primitives::generic::Era; + use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup}; + use primitives::testing::{Digest, Header, Block}; + use srml_support::{impl_outer_event, impl_outer_origin, parameter_types}; + use srml_support::traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason, Get}; + use system; + use hex_literal::hex; + + impl_outer_origin! { + pub enum Origin for Runtime { + } + } + + impl_outer_event!{ + pub enum MetaEvent for Runtime { + balances, + } + } + + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. + #[derive(Clone, Eq, PartialEq)] + pub struct Runtime; + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + } + impl system::Trait for Runtime { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = substrate_primitives::H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = MetaEvent; + type BlockHashCount = BlockHashCount; + type WeightMultiplierUpdate = (); + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + } + parameter_types! { + pub const ExistentialDeposit: u64 = 0; + pub const TransferFee: u64 = 0; + pub const CreationFee: u64 = 0; + pub const TransactionBaseFee: u64 = 10; + pub const TransactionByteFee: u64 = 0; + } + impl balances::Trait for Runtime { + type Balance = u64; + type OnFreeBalanceZero = (); + type OnNewAccount = (); + type Event = MetaEvent; + type TransactionPayment = (); + type DustRemoval = (); + type TransferPayment = (); + type ExistentialDeposit = ExistentialDeposit; + type TransferFee = TransferFee; + type CreationFee = CreationFee; + type TransactionBaseFee = TransactionBaseFee; + type TransactionByteFee = TransactionByteFee; + } + + impl ValidateUnsigned for Runtime { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> TransactionValidity { + match call { + Call::set_balance(_, _, _) => TransactionValidity::Valid(Default::default()), + _ => TransactionValidity::Invalid(0), + } + } + } + + type SignedExtra = ( + system::CheckEra, + system::CheckNonce, + system::CheckWeight, + balances::TakeFees + ); + type TestXt = primitives::testing::TestXt, SignedExtra>; + type Executive = super::Executive, system::ChainContext, Runtime, ()>; + + fn extra(nonce: u64, fee: u64) -> SignedExtra { + ( + system::CheckEra::from(Era::Immortal), + system::CheckNonce::from(nonce), + system::CheckWeight::from(), + balances::TakeFees::from(fee) + ) + } + + fn sign_extra(who: u64, nonce: u64, fee: u64) -> Option<(u64, SignedExtra)> { + Some((who, extra(nonce, fee))) + } + + #[test] + fn balance_transfer_dispatch_works() { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + balances::GenesisConfig:: { + balances: vec![(1, 111)], + vesting: vec![], + }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); + let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 69)); + let weight = xt.get_dispatch_info().weight as u64; + let mut t = runtime_io::TestExternalities::::new_with_children(t); + with_externalities(&mut t, || { + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + let r = Executive::apply_extrinsic(xt); + assert_eq!(r, Ok(ApplyOutcome::Success)); + assert_eq!(>::total_balance(&1), 42 - 10 - weight); + assert_eq!(>::total_balance(&2), 69); + }); + } + + fn new_test_ext(balance_factor: u64) -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + t.extend(balances::GenesisConfig:: { + balances: vec![(1, 111 * balance_factor)], + vesting: vec![], + }.build_storage().unwrap().0); + t.into() + } + + #[test] + fn block_import_works() { + with_externalities(&mut new_test_ext(1), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("ba811447b8ae3bf798a07a18f5355ea59926917c8a9cc7527ede20b261aacfdf").into(), + extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); + }); + } + + #[test] + #[should_panic] + fn block_import_of_bad_state_root_fails() { + with_externalities(&mut new_test_ext(1), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: [0u8; 32].into(), + extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); + }); + } + + #[test] + #[should_panic] + fn block_import_of_bad_extrinsic_root_fails() { + with_externalities(&mut new_test_ext(1), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("49cd58a254ccf6abc4a023d9a22dcfc421e385527a250faec69f8ad0d8ed3e48").into(), + extrinsics_root: [0u8; 32].into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); + }); + } + + #[test] + fn bad_extrinsic_not_inserted() { + let mut t = new_test_ext(1); + // bad nonce check! + let xt = primitives::testing::TestXt(sign_extra(1, 30, 0), Call::transfer(33, 69)); + with_externalities(&mut t, || { + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + assert!(Executive::apply_extrinsic(xt).is_err()); + assert_eq!(>::extrinsic_index(), Some(0)); + }); + } + + #[test] + fn block_weight_limit_enforced() { + let mut t = new_test_ext(10000); + // given: TestXt uses the encoded len as fixed Len: + let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer::(33, 0)); + let encoded = xt.encode(); + let encoded_len = encoded.len() as u32; + let limit = >::get() / 4; + let num_to_exhaust_block = limit / encoded_len; + with_externalities(&mut t, || { + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + assert_eq!(>::all_extrinsics_weight(), 0); + + for nonce in 0..=num_to_exhaust_block { + let xt = primitives::testing::TestXt(sign_extra(1, nonce.into(), 0), Call::transfer::(33, 0)); + let res = Executive::apply_extrinsic(xt); + if nonce != num_to_exhaust_block { + assert_eq!(res.unwrap(), ApplyOutcome::Success); + assert_eq!(>::all_extrinsics_weight(), encoded_len * (nonce + 1)); + assert_eq!(>::extrinsic_index(), Some(nonce + 1)); } else { - vec![] - }; - - TransactionValidity::Valid { - priority: encoded_len as TransactionPriority, - requires, - provides, - longevity: TransactionLongevity::max_value(), - propagate: true, + assert_eq!(res, Err(ApplyError::CantPay)); } - }, - (None, None) => UnsignedValidator::validate_unsigned(&xt.deconstruct().0), - (Some(_), None) => TransactionValidity::Invalid(INVALID_INDEX), - (None, Some(_)) => TransactionValidity::Invalid(MISSING_SENDER), - } + } + }); } - /// Start an offchain worker and generate extrinsics. - pub fn offchain_worker(n: System::BlockNumber) { - >::generate_extrinsics(n) + #[test] + fn block_weight_and_size_is_stored_per_tx() { + let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(33, 0)); + let x1 = primitives::testing::TestXt(sign_extra(1, 1, 0), Call::transfer(33, 0)); + let x2 = primitives::testing::TestXt(sign_extra(1, 2, 0), Call::transfer(33, 0)); + let len = xt.clone().encode().len() as u32; + let mut t = new_test_ext(1); + with_externalities(&mut t, || { + assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(>::all_extrinsics_weight(), 0); + + assert_eq!(Executive::apply_extrinsic(xt.clone()).unwrap(), ApplyOutcome::Success); + assert_eq!(Executive::apply_extrinsic(x1.clone()).unwrap(), ApplyOutcome::Success); + assert_eq!(Executive::apply_extrinsic(x2.clone()).unwrap(), ApplyOutcome::Success); + + // default weight for `TestXt` == encoded length. + assert_eq!( >::all_extrinsics_weight(), 3 * len); + assert_eq!(>::all_extrinsics_len(), 3 * len); + + let _ = >::finalize(); + + assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(>::all_extrinsics_weight(), 0); + }); + } + + #[test] + fn validate_unsigned() { + let xt = primitives::testing::TestXt(None, Call::set_balance(33, 69, 69)); + let valid = TransactionValidity::Valid(Default::default()); + let mut t = new_test_ext(1); + + with_externalities(&mut t, || { + assert_eq!(Executive::validate_transaction(xt.clone()), valid); + assert_eq!(Executive::apply_extrinsic(xt), Ok(ApplyOutcome::Fail)); + }); + } + + #[test] + fn can_pay_for_tx_fee_on_full_lock() { + let id: LockIdentifier = *b"0 "; + let execute_with_lock = |lock: WithdrawReasons| { + let mut t = new_test_ext(1); + with_externalities(&mut t, || { + as LockableCurrency>::set_lock( + id, + &1, + 110, + 10, + lock, + ); + let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 10)); + let weight = xt.get_dispatch_info().weight as u64; + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + + if lock == WithdrawReasons::except(WithdrawReason::TransactionPayment) { + assert_eq!(Executive::apply_extrinsic(xt).unwrap(), ApplyOutcome::Fail); + // but tx fee has been deducted. the transaction failed on transfer, not on fee. + assert_eq!(>::total_balance(&1), 111 - 10 - weight); + } else { + assert_eq!(Executive::apply_extrinsic(xt), Err(ApplyError::CantPay)); + assert_eq!(>::total_balance(&1), 111); + } + }); + }; + + execute_with_lock(WithdrawReasons::all()); + execute_with_lock(WithdrawReasons::except(WithdrawReason::TransactionPayment)); } } diff --git a/srml/executive/src/mock.rs b/srml/executive/src/mock.rs deleted file mode 100644 index f6c8dc1ee2..0000000000 --- a/srml/executive/src/mock.rs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Test utilities - -#![cfg(test)] - -use super::*; -use runtime_io; -use substrate_primitives::{Blake2Hasher}; -use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; -use primitives::traits::{IdentityLookup, BlakeTwo256}; -use primitives::testing::{Header, Block}; -use system; -pub use balances::Call as balancesCall; -pub use system::Call as systemCall; - -impl_outer_origin! { - pub enum Origin for Runtime { - } -} - -impl_outer_event!{ - pub enum MetaEvent for Runtime { - balances, - } -} - -impl_outer_dispatch! { - pub enum Call for Runtime where origin: Origin { - balances::Balances, - system::System, - } -} - -// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. -#[derive(Clone, Eq, PartialEq)] -pub struct Runtime; -parameter_types! { - pub const BlockHashCount: u64 = 250; -} - -impl system::Trait for Runtime { - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Hash = substrate_primitives::H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type WeightMultiplierUpdate = (); - type BlockHashCount = BlockHashCount; - type Event = MetaEvent; -} -parameter_types! { - pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; - pub const CreationFee: u64 = 0; - pub const TransactionBaseFee: u64 = 0; - pub const TransactionByteFee: u64 = 0; -} -impl balances::Trait for Runtime { - type Balance = u64; - type OnFreeBalanceZero = (); - type OnNewAccount = (); - type Event = MetaEvent; - type TransactionPayment = (); - type DustRemoval = (); - type TransferPayment = (); - type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; - type CreationFee = CreationFee; - type TransactionBaseFee = TransactionBaseFee; - type TransactionByteFee = TransactionByteFee; -} - -impl ValidateUnsigned for Runtime { - type Call = Call; - - fn validate_unsigned(call: &Self::Call) -> TransactionValidity { - match call { - Call::Balances(balancesCall::set_balance(_, _, _)) => TransactionValidity::Valid { - priority: 0, - requires: vec![], - provides: vec![], - longevity: std::u64::MAX, - propagate: false, - }, - _ => TransactionValidity::Invalid(0), - } - } -} - -pub fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { - balances: vec![(1, 1000_000_000)], - vesting: vec![], - }.build_storage().unwrap().0); - t.into() -} - -type Balances = balances::Module; -type System = system::Module; - -pub type TestXt = primitives::testing::TestXt; -pub type Executive = super::Executive< - Runtime, - Block, - system::ChainContext, - balances::Module, - Runtime, - () ->; diff --git a/srml/executive/src/tests.rs b/srml/executive/src/tests.rs deleted file mode 100644 index 70ba39c737..0000000000 --- a/srml/executive/src/tests.rs +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Tests for the module. - -#![cfg(test)] - -use super::*; -use mock::{new_test_ext, TestXt, Executive, Runtime, Call, systemCall, balancesCall}; -use system; -use primitives::weights::{MAX_TRANSACTIONS_WEIGHT}; -use primitives::testing::{Digest, Header, Block}; -use primitives::traits::{Header as HeaderT}; -use substrate_primitives::{Blake2Hasher, H256}; -use runtime_io::with_externalities; -use srml_support::traits::Currency; -use hex_literal::hex; - -#[test] -fn balance_transfer_dispatch_works() { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { - balances: vec![(1, 129)], - vesting: vec![], - }.build_storage().unwrap().0); - let xt = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(2, 69))); - let mut t = runtime_io::TestExternalities::::new(t); - with_externalities(&mut t, || { - Executive::initialize_block( - &Header::new(1, H256::default(), H256::default(),[69u8; 32].into(), Digest::default()) - ); - assert_eq!(Executive::apply_extrinsic(xt.clone()).unwrap(), ApplyOutcome::Success); - // default fee. - assert_eq!(>::total_balance(&1), 129 - 69 - 29); - assert_eq!(>::total_balance(&2), 69); - }); -} - -#[test] -fn block_import_works() { - with_externalities(&mut new_test_ext(), || { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("5518fc5383e35df8bf7cda7d6467d1307cc907424b7c8633148163aba5ee6aa8").into(), - extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), - digest: Digest { logs: vec![], }, - }, - extrinsics: vec![], - }); - }); -} - -#[test] -#[should_panic] -fn block_import_of_bad_state_root_fails() { - with_externalities(&mut new_test_ext(), || { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), - digest: Digest { logs: vec![], }, - }, - extrinsics: vec![], - }); - }); -} - -#[test] -#[should_panic] -fn block_import_of_bad_extrinsic_root_fails() { - with_externalities(&mut new_test_ext(), || { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("49cd58a254ccf6abc4a023d9a22dcfc421e385527a250faec69f8ad0d8ed3e48").into(), - extrinsics_root: [0u8; 32].into(), - digest: Digest { logs: vec![], }, - }, - extrinsics: vec![], - }); - }); -} - -#[test] -fn bad_extrinsic_not_inserted() { - let mut t = new_test_ext(); - let xt = primitives::testing::TestXt(Some(1), 42, Call::Balances(balancesCall::transfer(33, 69))); - with_externalities(&mut t, || { - Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), - [69u8; 32].into(), Digest::default())); - assert!(Executive::apply_extrinsic(xt).is_err()); - assert_eq!(>::extrinsic_index(), Some(0)); - }); -} - -#[test] -fn block_weight_limit_enforced() { - let run_test = |should_fail: bool| { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { - balances: vec![(1, 129)], - vesting: vec![], - }.build_storage().unwrap().0); - let mut t = runtime_io::TestExternalities::::new(t); - let xt = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(1, 15))); - let xt2 = primitives::testing::TestXt(Some(1), 1, Call::Balances(balancesCall::transfer(2, 30))); - let encoded = xt2.encode(); - let len = if should_fail { (MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() }; - with_externalities(&mut t, || { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default() - )); - assert_eq!(>::all_extrinsics_weight(), 0); - assert_eq!(Executive::apply_extrinsic(xt).unwrap(), ApplyOutcome::Success); - let res = Executive::apply_extrinsic_with_len(xt2, len, Some(encoded)); - - if should_fail { - assert!(res.is_err()); - assert_eq!(>::all_extrinsics_weight(), 28); - assert_eq!(>::extrinsic_index(), Some(1)); - } else { - assert!(res.is_ok()); - assert_eq!(>::all_extrinsics_weight(), 56); - assert_eq!(>::extrinsic_index(), Some(2)); - } - }); - }; - - run_test(false); - run_test(true); -} - -#[test] -fn exceeding_block_weight_fails() { - let mut t = new_test_ext(); - let xt = |i: u32| - primitives::testing::TestXt( - Some(1), - i.into(), - Call::System(systemCall::remark(vec![0_u8; 1024 * 128])) - ); - with_externalities(&mut t, || { - let len = xt(0).clone().encode().len() as u32; - let xts_to_overflow = MAX_TRANSACTIONS_WEIGHT / len; - let xts: Vec = (0..xts_to_overflow).map(|i| xt(i) ).collect::<_>(); - - assert_eq!(>::all_extrinsics_weight(), 0); - let _ = xts.into_iter().for_each(|x| assert_eq!( - Executive::apply_extrinsic(x).unwrap(), - ApplyOutcome::Success - )); - assert_eq!(>::all_extrinsics_weight(), xts_to_overflow * len); - - // next one will be rejected. - assert_eq!(Executive::apply_extrinsic(xt(xts_to_overflow)).err().unwrap(), ApplyError::FullBlock); - }); -} - -#[test] -fn default_block_weight() { - let len = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(69, 10))) - .encode() - .len() as u32; - let mut t = new_test_ext(); - with_externalities(&mut t, || { - assert_eq!( - Executive::apply_extrinsic( - primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(69, 10))) - ).unwrap(), - ApplyOutcome::Success - ); - assert_eq!( - Executive::apply_extrinsic( - primitives::testing::TestXt(Some(1), 1, Call::Balances(balancesCall::transfer(69, 10))) - ).unwrap(), - ApplyOutcome::Success - ); - assert_eq!( - Executive::apply_extrinsic( - primitives::testing::TestXt(Some(1), 2, Call::Balances(balancesCall::transfer(69, 10))) - ).unwrap(), - ApplyOutcome::Success - ); - assert_eq!( - >::all_extrinsics_weight(), - 3 * (0 /*base*/ + len /*len*/ * 1 /*byte*/) - ); - }); -} - -#[test] -fn fail_on_bad_nonce() { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { - balances: vec![(1, 129)], - vesting: vec![], - }.build_storage().unwrap().0); - let mut t = runtime_io::TestExternalities::::new(t); - let xt = primitives::testing::TestXt(Some(1), 0, Call::Balances(balancesCall::transfer(1, 15))); - let xt2 = primitives::testing::TestXt(Some(1), 10, Call::Balances(balancesCall::transfer(1, 15))); - with_externalities(&mut t, || { - Executive::apply_extrinsic(xt).unwrap(); - let res = Executive::apply_extrinsic(xt2); - assert_eq!(res, Err(ApplyError::Future)); - }); -} - -#[test] -fn validate_unsigned() { - let xt = primitives::testing::TestXt(None, 0, Call::Balances(balancesCall::set_balance(33, 69, 69))); - let valid = TransactionValidity::Valid { - priority: 0, - requires: vec![], - provides: vec![], - longevity: 18446744073709551615, - propagate: false, - }; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(Executive::validate_transaction(xt.clone()), valid); - assert_eq!(Executive::apply_extrinsic(xt), Ok(ApplyOutcome::Fail)); - }); -} diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 20752da325..38377f3500 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -299,6 +299,8 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -312,6 +314,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const WindowSize: u64 = 11; diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index e7578e0268..884f4e9b9b 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -1056,6 +1056,8 @@ impl system::Trait for ElevatedTrait { type Lookup = T::Lookup; type Header = T::Header; type Event = (); + type MaximumBlockWeight = T::MaximumBlockWeight; + type MaximumBlockLength = T::MaximumBlockLength; type WeightMultiplierUpdate = (); type BlockHashCount = T::BlockHashCount; } diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index df71d702c5..fb7fc04caa 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -40,6 +40,8 @@ impl_outer_origin! { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -51,6 +53,8 @@ impl system::Trait for Test { type Lookup = IdentityLookup; type Header = Header; type Event = TestEvent; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; } diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 964e0fe1f2..87845a7a4d 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -43,6 +43,8 @@ impl Trait for Test { } parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -56,6 +58,8 @@ impl system::Trait for Test { type WeightMultiplierUpdate = (); type Event = TestEvent; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } mod grandpa { diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 10443fda14..3ed3d1d7c0 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -77,7 +77,7 @@ use substrate_primitives::{ use parity_codec::{Encode, Decode}; use primitives::{ ApplyError, traits::{Member, IsMember, Extrinsic as ExtrinsicT}, - transaction_validity::{TransactionValidity, TransactionLongevity}, + transaction_validity::{TransactionValidity, TransactionLongevity, ValidTransaction}, }; use rstd::prelude::*; use session::SessionIndex; @@ -411,13 +411,13 @@ impl srml_support::unsigned::ValidateUnsigned for Module { return TransactionValidity::Invalid(ApplyError::BadSignature as i8); } - return srml_support::unsigned::TransactionValidity::Valid { + return TransactionValidity::Valid(ValidTransaction { priority: 0, requires: vec![], provides: vec![encoded_heartbeat], longevity: TransactionLongevity::max_value(), propagate: true, - } + }) } TransactionValidity::Invalid(0) } diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index 2874c37969..151a5186f7 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -66,6 +66,8 @@ impl ResolveHint for TestResolveHint { pub struct Runtime; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Runtime { type Origin = Origin; @@ -79,6 +81,8 @@ impl system::Trait for Runtime { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Runtime { type AccountIndex = u64; diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index 544a51d83c..c469993bcf 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -109,6 +109,8 @@ pub fn set_next_validators(next: Vec) { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; pub const MinimumPeriod: u64 = 5; } impl system::Trait for Test { @@ -123,6 +125,8 @@ impl system::Trait for Test { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl timestamp::Trait for Test { type Moment = u64; diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 70339e0c8a..329bdcda2c 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -87,6 +87,8 @@ impl_outer_origin!{ pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -100,6 +102,8 @@ impl system::Trait for Test { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const TransferFee: Balance = 0; diff --git a/srml/support/Cargo.toml b/srml/support/Cargo.toml index 88cad9651a..6abe1fb336 100644 --- a/srml/support/Cargo.toml +++ b/srml/support/Cargo.toml @@ -20,7 +20,7 @@ bitmask = { version = "0.5", default-features = false } [dev-dependencies] pretty_assertions = "0.6.1" -srml-system = { path = "../system", default-features = false } +srml-system = { path = "../system" } [features] default = ["std"] diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index f990cbd8d5..7afbd11cd1 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -25,25 +25,18 @@ pub use srml_metadata::{ FunctionMetadata, DecodeDifferent, DecodeDifferentArray, FunctionArgumentMetadata, ModuleConstantMetadata, DefaultByte, DefaultByteGetter, }; -pub use sr_primitives::weights::{TransactionWeight, Weighable, Weight}; +pub use sr_primitives::weights::{SimpleDispatchInfo, GetDispatchInfo, DispatchInfo, WeighData, + ClassifyDispatch, + TransactionPriority +}; +pub use sr_primitives::traits::{Dispatchable, DispatchResult}; /// A type that cannot be instantiated. pub enum Never {} /// Result of a module function call; either nothing (functions are only called for "side effects") /// or an error message. -pub type Result = result::Result<(), &'static str>; - -/// A lazy call (module function and argument values) that can be executed via its `dispatch` -/// method. -pub trait Dispatchable { - /// Every function call from your runtime has an origin, which specifies where the extrinsic was - /// generated from. In the case of a signed extrinsic (transaction), the origin contains an - /// identifier for the caller. The origin can be empty in the case of an inherent extrinsic. - type Origin; - type Trait; - fn dispatch(self, origin: Self::Origin) -> Result; -} +pub type Result = DispatchResult; /// Serializable version of Dispatchable. /// This value can be used as a "function" in an extrinsic. @@ -593,7 +586,7 @@ macro_rules! decl_module { { $( $constants )* } [ $( $dispatchables )* ] $(#[doc = $doc_attr])* - #[weight = $crate::dispatch::TransactionWeight::default()] + #[weight = $crate::dispatch::SimpleDispatchInfo::default()] $fn_vis fn $fn_name( $from $(, $(#[$codec_attr])* $param_name : $param )* ) $( -> $result )* { $( $impl )* } @@ -1117,14 +1110,38 @@ macro_rules! decl_module { } // Implement weight calculation function for Call - impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::Weighable + impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::GetDispatchInfo for $call_type<$trait_instance $(, $instance)?> where $( $other_where_bounds )* { - fn weight(&self, _len: usize) -> $crate::dispatch::Weight { - match self { - $( $call_type::$fn_name(..) => $crate::dispatch::Weighable::weight(&$weight, _len), )* - $call_type::__PhantomItem(_, _) => { unreachable!("__PhantomItem should never be used.") }, - } + fn get_dispatch_info(&self) -> $crate::dispatch::DispatchInfo { + $( + if let $call_type::$fn_name($( ref $param_name ),*) = self { + let weight = >::weigh_data( + &$weight, + ($( $param_name, )*) + ); + let class = >::classify_dispatch( + &$weight, + ($( $param_name, )*) + ); + return $crate::dispatch::DispatchInfo { weight, class }; + } + if let $call_type::__PhantomItem(_, _) = self { unreachable!("__PhantomItem should never be used.") } + )* + // Defensive only: this function must have already returned at this point. + // all dispatchable function will have a weight which has the `::default` + // implementation of `SimpleDispatchInfo`. Nonetheless, we create one if it does + // not exist. + let weight = >::weigh_data( + &$crate::dispatch::SimpleDispatchInfo::default(), + () + ); + let class = >::classify_dispatch( + &$crate::dispatch::SimpleDispatchInfo::default(), + () + ); + $crate::dispatch::DispatchInfo { weight, class } + } } @@ -1269,10 +1286,10 @@ macro_rules! impl_outer_dispatch { $camelcase ( $crate::dispatch::CallableCallFor<$camelcase, $runtime> ) ,)* } - impl $crate::dispatch::Weighable for $call_type { - fn weight(&self, len: usize) -> $crate::dispatch::Weight { + impl $crate::dispatch::GetDispatchInfo for $call_type { + fn get_dispatch_info(&self) -> $crate::dispatch::DispatchInfo { match self { - $( $call_type::$camelcase(call) => call.weight(len), )* + $( $call_type::$camelcase(call) => call.get_dispatch_info(), )* } } } @@ -1579,6 +1596,7 @@ macro_rules! __check_reserved_fn_name { mod tests { use super::*; use crate::runtime_primitives::traits::{OnInitialize, OnFinalize}; + use sr_primitives::weights::{DispatchInfo, DispatchClass}; pub trait Trait: system::Trait + Sized where Self::AccountId: From { type Origin; @@ -1604,7 +1622,7 @@ mod tests { fn aux_0(_origin) -> Result { unreachable!() } fn aux_1(_origin, #[compact] _data: u32) -> Result { unreachable!() } fn aux_2(_origin, _data: i32, _data2: String) -> Result { unreachable!() } - #[weight = TransactionWeight::Basic(10, 100)] + #[weight = SimpleDispatchInfo::FixedNormal(10)] fn aux_3(_origin) -> Result { unreachable!() } fn aux_4(_origin, _data: i32) -> Result { unreachable!() } fn aux_5(_origin, _data: i32, #[compact] _data2: u32) -> Result { unreachable!() } @@ -1613,8 +1631,8 @@ mod tests { fn on_finalize(n: T::BlockNumber) { if n.into() == 42 { panic!("on_finalize") } } fn offchain_worker() {} - #[weight = TransactionWeight::Max] - fn weighted(_origin) { unreachable!() } + #[weight = SimpleDispatchInfo::FixedOperational(5)] + fn operational(_origin) { unreachable!() } } } @@ -1680,7 +1698,7 @@ mod tests { documentation: DecodeDifferent::Encode(&[]), }, FunctionMetadata { - name: DecodeDifferent::Encode("weighted"), + name: DecodeDifferent::Encode("operational"), arguments: DecodeDifferent::Encode(&[]), documentation: DecodeDifferent::Encode(&[]), }, @@ -1755,10 +1773,19 @@ mod tests { #[test] fn weight_should_attach_to_call_enum() { // max weight. not dependent on input. - assert_eq!(Call::::weighted().weight(100), 3 * 1024 * 1024); + assert_eq!( + Call::::operational().get_dispatch_info(), + DispatchInfo { weight: 5, class: DispatchClass::Operational }, + ); // default weight. - assert_eq!(Call::::aux_0().weight(5), 5 /*tx-len*/); + assert_eq!( + Call::::aux_0().get_dispatch_info(), + DispatchInfo { weight: 100, class: DispatchClass::Normal }, + ); // custom basic - assert_eq!(Call::::aux_3().weight(5), 10 + 100 * 5 ); + assert_eq!( + Call::::aux_3().get_dispatch_info(), + DispatchInfo { weight: 10, class: DispatchClass::Normal }, + ); } } diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index ffa660d566..0b35eca659 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -23,7 +23,6 @@ use crate::codec::{Codec, Encode, Decode}; use substrate_primitives::u32_trait::Value as U32; use crate::runtime_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; use crate::runtime_primitives::ConsensusEngineId; -use crate::runtime_primitives::weights::Weight; use super::for_each_tuple; @@ -90,19 +89,6 @@ pub enum UpdateBalanceOutcome { AccountKilled, } -/// Simple trait designed for hooking into a transaction payment. -/// -/// It operates over a single generic `AccountId` type. -pub trait MakePayment { - /// Make transaction payment from `who` for an extrinsic of encoded length - /// `encoded_len` bytes. Return `Ok` iff the payment was successful. - fn make_payment(who: &AccountId, weight: Weight) -> Result<(), &'static str>; -} - -impl MakePayment for () { - fn make_payment(_: &T, _: Weight) -> Result<(), &'static str> { Ok(()) } -} - /// A trait for finding the author of a block header based on the `PreRuntime` digests contained /// within it. pub trait FindAuthor { diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 62e7263b51..a5f40878e0 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -269,7 +269,7 @@ srml_support::construct_runtime!( pub type Header = generic::Header; pub type Block = generic::Block; -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; fn new_test_ext() -> runtime_io::TestExternalities { GenesisConfig{ @@ -407,4 +407,4 @@ fn storage_with_instance_basic_operation() { DoubleMap::remove(key1, key2); assert_eq!(DoubleMap::get(key1, key2), 0); }); -} \ No newline at end of file +} diff --git a/srml/support/test/tests/issue2219.rs b/srml/support/test/tests/issue2219.rs index 185b5e2480..54ad62cc93 100644 --- a/srml/support/test/tests/issue2219.rs +++ b/srml/support/test/tests/issue2219.rs @@ -152,7 +152,7 @@ pub type BlockNumber = u64; pub type Index = u64; pub type Header = generic::Header; pub type Block = generic::Block; -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; impl system::Trait for Runtime { type Hash = H256; @@ -183,4 +183,4 @@ fn create_genesis_config() { enable_storage_role: true, }) }; -} \ No newline at end of file +} diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 17d07f3df5..bd1f76299e 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -76,16 +76,19 @@ use serde::Serialize; use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; -use primitives::weights::{Weight, WeightMultiplier}; -use primitives::{generic, traits::{self, CheckEqual, SimpleArithmetic, +use rstd::marker::PhantomData; +use primitives::generic::{self, Era}; +use primitives::weights::{Weight, DispatchInfo, DispatchClass, WeightMultiplier}; +use primitives::transaction_validity::{ValidTransaction, TransactionPriority, TransactionLongevity}; +use primitives::traits::{self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Convert, SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup, - Zero, Convert, -}}; + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, + Lookup, DispatchError, SaturatedConversion, +}; use substrate_primitives::storage::well_known_keys; use srml_support::{ - storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, - StorageMap, Parameter, for_each_tuple, traits::{Contains, Get}, + storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, StorageMap, + Parameter, for_each_tuple, traits::{Contains, Get} }; use safe_mix::TripletMix; use parity_codec::{Encode, Decode}; @@ -194,6 +197,12 @@ pub trait Trait: 'static + Eq + Clone { /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount: Get; + + /// The maximum weight of a block. + type MaximumBlockWeight: Get; + + /// The maximum length of a block (in bytes). + type MaximumBlockLength: Get; } pub type DigestOf = generic::Digest<::Hash>; @@ -325,6 +334,8 @@ decl_storage! { ExtrinsicCount: Option; /// Total weight for all extrinsics put together, for the current block. AllExtrinsicsWeight: Option; + /// Total length (in bytes) for all extrinsics put together, for the current block. + AllExtrinsicsLen: Option; /// The next weight multiplier. This should be updated at the end of each block based on the /// saturation level (weight). pub NextWeightMultiplier get(next_weight_multiplier): WeightMultiplier = Default::default(); @@ -549,6 +560,10 @@ impl Module { AllExtrinsicsWeight::get().unwrap_or_default() } + pub fn all_extrinsics_len() -> u32 { + AllExtrinsicsLen::get().unwrap_or_default() + } + /// Update the next weight multiplier. /// /// This should be called at then end of each block, before `all_extrinsics_weight` is cleared. @@ -590,6 +605,7 @@ impl Module { ExtrinsicCount::kill(); Self::update_weight_multiplier(); AllExtrinsicsWeight::kill(); + AllExtrinsicsLen::kill(); let number = >::take(); let parent_hash = >::take(); @@ -744,17 +760,15 @@ impl Module { } /// To be called immediately after an extrinsic has been applied. - pub fn note_applied_extrinsic(r: &Result<(), &'static str>, weight: Weight) { + pub fn note_applied_extrinsic(r: &Result<(), &'static str>, _encoded_len: u32) { Self::deposit_event(match r { Ok(_) => Event::ExtrinsicSuccess, Err(_) => Event::ExtrinsicFailed, }.into()); let next_extrinsic_index = Self::extrinsic_index().unwrap_or_default() + 1u32; - let total_weight = weight.saturating_add(Self::all_extrinsics_weight()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &next_extrinsic_index); - AllExtrinsicsWeight::put(&total_weight); } /// To be called immediately after `note_applied_extrinsic` of the last extrinsic of the block @@ -772,6 +786,207 @@ impl Module { } } +/// resource limit check. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckWeight(PhantomData); + +impl CheckWeight { + + /// Get the quota divisor of each dispatch class type. This indicates that all operational + /// dispatches can use the full capacity of any resource, while user-triggered ones can consume + /// a quarter. + fn get_dispatch_limit_divisor(class: DispatchClass) -> Weight { + match class { + DispatchClass::Operational => 1, + DispatchClass::Normal => 4, + } + } + /// Checks if the current extrinsic can fit into the block with respect to block weight limits. + /// + /// Upon successes, it returns the new block weight as a `Result`. + fn check_weight(info: DispatchInfo) -> Result { + let current_weight = Module::::all_extrinsics_weight(); + let maximum_weight = T::MaximumBlockWeight::get(); + let limit = maximum_weight / Self::get_dispatch_limit_divisor(info.class); + let added_weight = info.weight.min(limit); + let next_weight = current_weight.saturating_add(added_weight); + if next_weight > limit { + return Err(DispatchError::BadState) + } + Ok(next_weight) + } + + /// Checks if the current extrinsic can fit into the block with respect to block length limits. + /// + /// Upon successes, it returns the new block length as a `Result`. + fn check_block_length(info: DispatchInfo, len: usize) -> Result { + let current_len = Module::::all_extrinsics_len(); + let maximum_len = T::MaximumBlockLength::get(); + let limit = maximum_len / Self::get_dispatch_limit_divisor(info.class); + let added_len = len as u32; + let next_len = current_len.saturating_add(added_len); + if next_len > limit { + return Err(DispatchError::BadState) + } + Ok(next_len) + } + + /// get the priority of an extrinsic denoted by `info`. + fn get_priority(info: DispatchInfo) -> TransactionPriority { + match info.class { + DispatchClass::Normal => info.weight.into(), + DispatchClass::Operational => Bounded::max_value() + } + } + + /// Utility constructor for tests and client code. + #[cfg(feature = "std")] + pub fn from() -> Self { + Self(PhantomData) + } +} + +impl SignedExtension for CheckWeight { + type AccountId = T::AccountId; + type AdditionalSigned = (); + + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + + fn pre_dispatch( + self, + _who: &Self::AccountId, + info: DispatchInfo, + len: usize, + ) -> Result<(), DispatchError> { + let next_len = Self::check_block_length(info, len)?; + AllExtrinsicsLen::put(next_len); + let next_weight = Self::check_weight(info)?; + AllExtrinsicsWeight::put(next_weight); + Ok(()) + } + + fn validate( + &self, + _who: &Self::AccountId, + info: DispatchInfo, + len: usize, + ) -> Result { + // There is no point in writing to storage here since changes are discarded. This basically + // discards any transaction which is bigger than the length or weight limit alone, which is + // a guarantee that it will fail in the pre-dispatch phase. + let _ = Self::check_block_length(info, len)?; + let _ = Self::check_weight(info)?; + Ok(ValidTransaction { priority: Self::get_priority(info), ..Default::default() }) + } +} + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckWeight { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + write!(f, "CheckWeight") + } +} + +/// Nonce check and increment to give replay protection for transactions. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckNonce(#[codec(compact)] T::Index); + +#[cfg(feature = "std")] +impl CheckNonce { + /// utility constructor. Used only in client/factory code. + pub fn from(nonce: T::Index) -> Self { + Self(nonce) + } +} + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckNonce { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + self.0.fmt(f) + } +} + +impl SignedExtension for CheckNonce { + type AccountId = T::AccountId; + type AdditionalSigned = (); + + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + + fn pre_dispatch( + self, + who: &Self::AccountId, + _info: DispatchInfo, + _len: usize, + ) -> Result<(), DispatchError> { + let expected = >::get(who); + if self.0 != expected { + return Err( + if self.0 < expected { DispatchError::Stale } else { DispatchError::Future } + ) + } + >::insert(who, expected + T::Index::one()); + Ok(()) + } + + fn validate( + &self, + who: &Self::AccountId, + info: DispatchInfo, + _len: usize, + ) -> Result { + // check index + let expected = >::get(who); + if self.0 < expected { + return Err(DispatchError::Stale) + } + + let provides = vec![Encode::encode(&(who, self.0))]; + let requires = if expected < self.0 { + vec![Encode::encode(&(who, self.0 - One::one()))] + } else { + vec![] + }; + + Ok(ValidTransaction { + priority: info.weight as TransactionPriority, + requires, + provides, + longevity: TransactionLongevity::max_value(), + propagate: true, + }) + } +} + +/// Nonce check and increment to give replay protection for transactions. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckEra((Era, rstd::marker::PhantomData)); + +#[cfg(feature = "std")] +impl CheckEra { + /// utility constructor. Used only in client/factory code. + pub fn from(era: Era) -> Self { + Self((era, rstd::marker::PhantomData)) + } +} + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckEra { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + self.0.fmt(f) + } +} + +impl SignedExtension for CheckEra { + type AccountId = T::AccountId; + type AdditionalSigned = T::Hash; + fn additional_signed(&self) -> Result { + let current_u64 = >::block_number().saturated_into::(); + let n = (self.0).0.birth(current_u64).saturated_into::(); + if !>::exists(n) { Err("transaction birth block ancient")? } + Ok(>::block_hash(n)) + } +} + pub struct ChainContext(::rstd::marker::PhantomData); impl Default for ChainContext { fn default() -> Self { @@ -819,6 +1034,8 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 10; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl Trait for Test { @@ -833,6 +1050,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = u16; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl From for u16 { @@ -983,4 +1202,147 @@ mod tests { } }) } + + #[test] + fn signed_ext_check_nonce_works() { + with_externalities(&mut new_test_ext(), || { + >::insert(1, 1); + let info = DispatchInfo::default(); + let len = 0_usize; + // stale + assert!(CheckNonce::(0).validate(&1, info, len).is_err()); + assert!(CheckNonce::(0).pre_dispatch(&1, info, len).is_err()); + // correct + assert!(CheckNonce::(1).validate(&1, info, len).is_ok()); + assert!(CheckNonce::(1).pre_dispatch(&1, info, len).is_ok()); + // future + assert!(CheckNonce::(5).validate(&1, info, len).is_ok()); + assert!(CheckNonce::(5).pre_dispatch(&1, info, len).is_err()); + }) + } + + #[test] + fn signed_ext_check_weight_works_user_tx() { + with_externalities(&mut new_test_ext(), || { + let small = DispatchInfo { weight: 100, ..Default::default() }; + let medium = DispatchInfo { + weight: >::get() / 4 - 1, + ..Default::default() + }; + let big = DispatchInfo { + weight: >::get() / 4 + 1, + ..Default::default() + }; + let len = 0_usize; + + let reset_check_weight = |i, f, s| { + AllExtrinsicsWeight::put(s); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, i, len); + if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } + }; + + reset_check_weight(small, false, 0); + reset_check_weight(medium, false, 0); + reset_check_weight(big, true, 1); + }) + } + + #[test] + fn signed_ext_check_weight_fee_works() { + with_externalities(&mut new_test_ext(), || { + let free = DispatchInfo { weight: 0, ..Default::default() }; + let len = 0_usize; + + assert_eq!(System::all_extrinsics_weight(), 0); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, free, len); + assert!(r.is_ok()); + assert_eq!(System::all_extrinsics_weight(), 0); + }) + } + + #[test] + fn signed_ext_check_weight_max_works() { + with_externalities(&mut new_test_ext(), || { + let max = DispatchInfo { weight: Weight::max_value(), ..Default::default() }; + let len = 0_usize; + + assert_eq!(System::all_extrinsics_weight(), 0); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, max, len); + assert!(r.is_ok()); + assert_eq!(System::all_extrinsics_weight(), >::get() / 4); + }) + } + + #[test] + fn signed_ext_check_weight_works_operational_tx() { + with_externalities(&mut new_test_ext(), || { + let normal = DispatchInfo { weight: 100, ..Default::default() }; + let op = DispatchInfo { weight: 100, class: DispatchClass::Operational }; + let len = 0_usize; + + // given almost full block + AllExtrinsicsWeight::put(>::get() / 4); + // will not fit. + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, normal, len).is_err()); + // will fit. + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, op, len).is_ok()); + + // likewise for length limit. + let len = 100_usize; + AllExtrinsicsLen::put(>::get() / 4); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, normal, len).is_err()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, op, len).is_ok()); + }) + } + + #[test] + fn signed_ext_check_weight_priority_works() { + with_externalities(&mut new_test_ext(), || { + let normal = DispatchInfo { weight: 100, class: DispatchClass::Normal }; + let op = DispatchInfo { weight: 100, class: DispatchClass::Operational }; + let len = 0_usize; + + assert_eq!( + CheckWeight::(PhantomData).validate(&1, normal, len).unwrap().priority, + 100, + ); + assert_eq!( + CheckWeight::(PhantomData).validate(&1, op, len).unwrap().priority, + Bounded::max_value(), + ); + }) + } + + #[test] + fn signed_ext_check_weight_block_size_works() { + with_externalities(&mut new_test_ext(), || { + let tx = DispatchInfo::default(); + + let reset_check_weight = |s, f| { + AllExtrinsicsLen::put(0); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, tx, s); + if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } + }; + + reset_check_weight(128, false); + reset_check_weight(512, false); + reset_check_weight(513, true); + }) + } + + #[test] + fn signed_ext_check_era_should_work() { + with_externalities(&mut new_test_ext(), || { + // future + assert_eq!( + CheckEra::::from(Era::mortal(4, 2)).additional_signed().err().unwrap(), + "transaction birth block ancient" + ); + + // correct + System::set_block_number(13); + >::insert(12, H256::repeat_byte(1)); + assert!(CheckEra::::from(Era::mortal(4, 12)).additional_signed().is_ok()); + }) + } } diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index be7dc8c343..43aa29e04f 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -338,6 +338,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -351,6 +353,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const MinimumPeriod: u64 = 5; diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 06b1a02f2e..c8cf84355a 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -370,6 +370,8 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; } impl system::Trait for Test { type Origin = Origin; @@ -383,6 +385,8 @@ mod tests { type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 699448e174..6ecede88ed 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -18,6 +18,8 @@ schnorrkel = "0.1.1" hex = "0.3" hex-literal = "0.2" parity-codec = "4.1.1" +system = { package = "srml-system", path = "../srml/system" } +balances = { package = "srml-balances", path = "../srml/balances" } [features] bench = [] diff --git a/subkey/src/main.rs b/subkey/src/main.rs index b0b8adaabf..f9432b42c1 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -23,8 +23,8 @@ use hex_literal::hex; use clap::load_yaml; use bip39::{Mnemonic, Language, MnemonicType}; use substrate_primitives::{ - ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, - crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat}, blake2_256 + ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, blake2_256, + crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat} }; use parity_codec::{Encode, Decode, Compact}; use sr_primitives::generic::Era; @@ -90,6 +90,14 @@ fn execute(matches: clap::ArgMatches) where <::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default, <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, { + // let extra = |i: Index, f: Balance| { + // ( + // system::CheckEra::::from(Era::Immortal), + // system::CheckNonce::::from(i), + // system::CheckWeight::::from(), + // balances::TakeFees::::from(f), + // ) + // }; let password = matches.value_of("password"); let maybe_network = matches.value_of("network"); if let Some(network) = maybe_network { @@ -162,8 +170,7 @@ fn execute(matches: clap::ArgMatches) where println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); - let era = Era::immortal(); - let raw_payload = (Compact(index), function, era, genesis_hash); + let raw_payload = (function, extra(index, 0), genesis_hash); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) } else { @@ -171,11 +178,10 @@ fn execute(matches: clap::ArgMatches) where signer.sign(payload) }); let extrinsic = UncheckedExtrinsic::new_signed( - raw_payload.1, + raw_payload.0, signer.public().into(), signature.into(), - era, - (CheckNonce(index), TakeFees(0)), + extra(index, 0), ); println!("0x{}", hex::encode(&extrinsic.encode())); } @@ -202,7 +208,7 @@ fn execute(matches: clap::ArgMatches) where let era = Era::immortal(); - let raw_payload = (Compact(index), function, era, prior_block_hash); + let raw_payload = (function, era, prior_block_hash, extra(index, 0)); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) @@ -212,11 +218,10 @@ fn execute(matches: clap::ArgMatches) where ); let extrinsic = UncheckedExtrinsic::new_signed( - raw_payload.1, + raw_payload.0, signer.public().into(), signature.into(), - era, - (CheckNonce(index), TakeFees(0)), + extra(index, 0), ); println!("0x{}", hex::encode(&extrinsic.encode())); -- GitLab From a626ba78cc72cbe3775a8a0b9de006894f221a06 Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Tue, 23 Jul 2019 04:36:16 -0400 Subject: [PATCH 017/151] BABE Epochs (#3028) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add `epoch` field to `SlotInfo` * Add slot calculations * More work on epochs in BABE * Apply suggestions from code review Co-Authored-By: Bastian Köcher * Typo: `/` not `%` for division * Delete useless `LastSlotInEpoch::put(false)` * Bump `spec_version` * Make test suite pass again * Implement BABE epoch randomness signing * Try to fix compilation Currently causes a stack overflow in the compiler * Fix rustc stack overflow * Add missing `PartialEq` and `Eq` implementations * Fix compile errors in test suite * Another silly compile error * Clone `epoch` * Fix compile error in benchmarks * Implement `clone` for `Epoch` * Merge master * AUTHORING TEST PASSES!!! * Fix compilation * Bump `spec_version` * Fix compilation * Fix compilation (again) * Remove an outdated FIXME * Fix run.sh and move it to scripts/ * Delete commented-out code * Fix documentation Co-Authored-By: André Silva * Fix BABE initialization and refactor * Respond to review * typo * Remove useless data in `CheckedHeader::Deferred` * Remove `slot_number` from Epoch It is not needed, and only served to waste space and cause confusion. * Remove epoch from BABE digests * Move digest.rs to primitives * Fix incorrect warning names * Fix compile error * Consistent field naming for BABE digests * More compiler error fixex * Unbound variable * more compile errors * another compile error * Fix compile errors in runtime * another compile error * Another compile error * Fix wasm build * missing import * Fix more compile errors * yet another compile error * compile fix in test runtime * Fix and simplify the BABE runtime The BABE runtime was massively overcomplicated and also wrong. It assumed it needed to: 1. delay new authorities taking effect until the next epoch 2. not delay emitting `Consensus` digests to mark epoch changes However, the first is handled by the `srml_session` crate, and the second is flat-out incorrect: `Consensus` digests take effect immediately. Furthermore, `srml_babe` tried to duplicate the functionality of `srml_session::PeriodicSession`, but did it both clumsily and incorrectly. Fortunately, the new code is simpler and far more likely to be correct. * Use `system` to get the test authorities The genesis block used by tests defines no authorities. Only the test suite is affected. * Fix test runtime impl for BabeApi::epoch() with std * Fix compilation * Cached authorities are in the form of an epoch not a `Vec`. * `slots_per_epoch` is not fixed in general The BABE code previously assumed `slots_per_epoch` to be a constant, but that assumption is false in general. Furthermore, removing this assumption also allows a lot of code to go away. * fix compile error * Implement epoch checker * Fix runtime compilation * fork-tree: add method for finding a node in the tree * babe: register epoch transitions in fork tree and validate them * fork-tree: add method for arbitrary pruning * Expose the queued validator set to SRML modules BABE needs to know not only what the current validator set is, but also what the next validator set will be. Expose this to clients of the session module. * Bump hex-literal Hopefully this will fix the panic * babe: prune epoch change fork tree on finality * babe: validate epoch index on transition * babe: persist epoch changes tree * Fix compile error in tests * Fix compile error in tests * Another compile error in tests * Fix compilation of tests * core: move grandpa::is_descendent_of to client utils * babe: use is_descendent_of from client utils * babe: extract slot_number from pre_digest in import_block * Move BABE testsuite to its own file * Initial part of test code * Missing `WeightMultiplierUpdate` in test-runtime * bump `spec_version` * Add a test that a very bogus is rejected * Run the tests again * Fix compiler diagnostics * Bump `spec_version` * Initial infrastructure for mutation testing * Mutation testing of block import * babe: revert epoch changes in case of block import error * babe: fix logging target * babe: BabeBlockImport doesn't box inner BlockImport * babe: fix epoch check in block import * babe: populate authorities cache on block authorship * babe: remove unused functions * babe: use RANDOMNESS_LENGTH const * babe: remove unneeded config parameters * core: revert change to hex dependency version * cleanup gitignore * babe: add docs to aux_schema * babe: remove useless drops in tests * babe: remove annoying macos smart quotes * fork-tree: docs * fork-tree: add tests * babe: style * babe: rename randomness config variable * babe: remove randomness helper function * babe: style fixes * babe: add docs * babe: fix tests * node: bump spec_version * babe: fix tests --- Cargo.lock | 6 + Dockerfile | 4 +- core/client/src/client.rs | 47 ++ core/client/src/lib.rs | 1 + core/consensus/babe/Cargo.toml | 3 +- core/consensus/babe/primitives/Cargo.toml | 2 + .../babe/{ => primitives}/src/digest.rs | 97 ++- core/consensus/babe/primitives/src/lib.rs | 37 +- core/consensus/babe/src/aux_schema.rs | 69 ++ core/consensus/babe/src/lib.rs | 776 +++++++++--------- core/consensus/babe/src/tests.rs | 340 ++++++++ core/consensus/slots/src/lib.rs | 6 +- core/consensus/slots/src/slots.rs | 2 +- core/finality-grandpa/src/environment.rs | 42 +- core/finality-grandpa/src/import.rs | 3 +- core/network/src/protocol/sync.rs | 1 - core/sr-api-macros/tests/runtime_calls.rs | 2 +- core/test-runtime/Cargo.toml | 6 + core/test-runtime/src/lib.rs | 76 +- core/utils/fork-tree/src/lib.rs | 165 +++- srml/aura/src/lib.rs | 2 +- srml/babe/Cargo.toml | 2 + srml/babe/src/lib.rs | 155 ++-- srml/grandpa/src/lib.rs | 2 +- srml/im-online/src/lib.rs | 2 +- srml/session/src/lib.rs | 29 +- srml/session/src/mock.rs | 6 +- srml/staking/src/lib.rs | 2 +- srml/staking/src/mock.rs | 6 +- srml/system/benches/bench.rs | 8 +- 30 files changed, 1348 insertions(+), 551 deletions(-) rename core/consensus/babe/{ => primitives}/src/digest.rs (55%) create mode 100644 core/consensus/babe/src/aux_schema.rs create mode 100644 core/consensus/babe/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 7fea8d6e93..48edf4fa28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3672,6 +3672,7 @@ dependencies = [ "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-session 2.0.0", + "srml-staking 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -4318,6 +4319,7 @@ name = "substrate-consensus-babe" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4352,6 +4354,7 @@ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4854,8 +4857,11 @@ dependencies = [ "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", + "srml-babe 2.0.0", "srml-executive 2.0.0", "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-babe-primitives 2.0.0", diff --git a/Dockerfile b/Dockerfile index b7512b2656..0271db8d14 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ WORKDIR /substrate COPY . /substrate RUN apt-get update && \ - apt-get upgrade -y && \ + apt-get dist-upgrade -y && \ apt-get install -y cmake pkg-config libssl-dev git clang RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ @@ -21,7 +21,7 @@ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ cargo install --git https://github.com/alexcrichton/wasm-gc && \ rustup default nightly && \ rustup default stable && \ - cargo build --$PROFILE + cargo build "--$PROFILE" # ===== SECOND STAGE ====== diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 67a9140e9e..6decdfc9ca 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1799,6 +1799,53 @@ impl backend::AuxStore for Client crate::backend::AuxStore::get_aux(&*self.backend, key) } } + +/// Utility methods for the client. +pub mod utils { + use super::*; + use crate::{backend::Backend, blockchain, error}; + use primitives::H256; + + /// Returns a function for checking block ancestry, the returned function will + /// return `true` if the given hash (second parameter) is a descendent of the + /// base (first parameter). If the `current` parameter is defined, it should + /// represent the current block `hash` and its `parent hash`, if given the + /// function that's returned will assume that `hash` isn't part of the local DB + /// yet, and all searches in the DB will instead reference the parent. + pub fn is_descendent_of<'a, B, E, Block: BlockT, RA>( + client: &'a Client, + current: Option<(&'a H256, &'a H256)>, + ) -> impl Fn(&H256, &H256) -> Result + 'a + where B: Backend, + E: CallExecutor + Send + Sync, + { + move |base, hash| { + if base == hash { return Ok(false); } + + let mut hash = hash; + if let Some((current_hash, current_parent_hash)) = current { + if base == current_hash { return Ok(false); } + if hash == current_hash { + if base == current_parent_hash { + return Ok(true); + } else { + hash = current_parent_hash; + } + } + } + + let tree_route = blockchain::tree_route( + #[allow(deprecated)] + client.backend().blockchain(), + BlockId::Hash(*hash), + BlockId::Hash(*base), + )?; + + Ok(tree_route.common_block().hash == *base) + } + } +} + #[cfg(test)] pub(crate) mod tests { use std::collections::HashMap; diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index 67cfdd4a64..441b2480e9 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -60,6 +60,7 @@ pub use crate::client::{ BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, FinalityNotification, LongestChain, + utils, }; #[cfg(feature = "std")] pub use crate::notifications::{StorageEventStream, StorageChangeSet}; diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 29c706dd13..8b473932dd 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -19,7 +19,9 @@ client = { package = "substrate-client", path = "../../client" } consensus_common = { package = "substrate-consensus-common", path = "../common" } slots = { package = "substrate-consensus-slots", path = "../slots" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +fork-tree = { path = "../../utils/fork-tree" } futures = "0.1.26" +futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } tokio-timer = "0.2.11" parking_lot = "0.8.0" log = "0.4.6" @@ -28,7 +30,6 @@ rand = "0.6.5" merlin = "1.0.3" [dev-dependencies] -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } keyring = { package = "substrate-keyring", path = "../../keyring" } substrate-executor = { path = "../../executor" } network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index a41fdeac5a..6eb0a251e1 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -12,6 +12,7 @@ runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives substrate-primitives = { path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } parity-codec = { version = "4.1.1", default-features = false } +schnorrkel = { version = "0.1.1", optional = true } [features] default = ["std"] @@ -20,5 +21,6 @@ std = [ "runtime_primitives/std", "substrate-client/std", "parity-codec/std", + "schnorrkel", "slots", ] diff --git a/core/consensus/babe/src/digest.rs b/core/consensus/babe/primitives/src/digest.rs similarity index 55% rename from core/consensus/babe/src/digest.rs rename to core/consensus/babe/primitives/src/digest.rs index 37ba27a309..f39cc96287 100644 --- a/core/consensus/babe/src/digest.rs +++ b/core/consensus/babe/primitives/src/digest.rs @@ -16,66 +16,85 @@ //! Private implementation details of BABE digests. -use primitives::sr25519::Signature; -use babe_primitives::{self, BABE_ENGINE_ID, SlotNumber}; +#[cfg(feature = "std")] +use substrate_primitives::sr25519::Signature; +#[cfg(feature = "std")] +use super::{BABE_ENGINE_ID, Epoch}; +#[cfg(not(feature = "std"))] +use super::{VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}; +use super::SlotNumber; +#[cfg(feature = "std")] use runtime_primitives::{DigestItem, generic::OpaqueDigestItemId}; +#[cfg(feature = "std")] use std::fmt::Debug; -use parity_codec::{Decode, Encode, Codec, Input}; -use schnorrkel::{vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}}; - -/// A BABE pre-digest. It includes: -/// -/// * The public key of the author. -/// * The VRF proof. -/// * The VRF output. -/// * The slot number. -#[derive(Clone, Debug, PartialEq, Eq)] +use parity_codec::{Decode, Encode}; +#[cfg(feature = "std")] +use parity_codec::{Codec, Input}; +#[cfg(feature = "std")] +use schnorrkel::vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}; + +/// A BABE pre-digest +#[cfg(feature = "std")] +#[derive(Clone, Debug)] pub struct BabePreDigest { - pub(super) vrf_output: VRFOutput, - pub(super) proof: VRFProof, - pub(super) index: babe_primitives::AuthorityIndex, - pub(super) slot_num: SlotNumber, + /// VRF output + pub vrf_output: VRFOutput, + /// VRF proof + pub vrf_proof: VRFProof, + /// Authority index + pub authority_index: super::AuthorityIndex, + /// Slot number + pub slot_number: SlotNumber, } /// The prefix used by BABE for its VRF keys. pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; -type RawBabePreDigest = ( - [u8; VRF_OUTPUT_LENGTH], - [u8; VRF_PROOF_LENGTH], - u64, - u64, -); +/// A raw version of `BabePreDigest`, usable on `no_std`. +#[derive(Copy, Clone, Encode, Decode)] +pub struct RawBabePreDigest { + /// Slot number + pub slot_number: SlotNumber, + /// Authority index + pub authority_index: super::AuthorityIndex, + /// VRF output + pub vrf_output: [u8; VRF_OUTPUT_LENGTH], + /// VRF proof + pub vrf_proof: [u8; VRF_PROOF_LENGTH], +} +#[cfg(feature = "std")] impl Encode for BabePreDigest { fn encode(&self) -> Vec { - let tmp: RawBabePreDigest = ( - *self.vrf_output.as_bytes(), - self.proof.to_bytes(), - self.index, - self.slot_num, - ); + let tmp = RawBabePreDigest { + vrf_output: *self.vrf_output.as_bytes(), + vrf_proof: self.vrf_proof.to_bytes(), + authority_index: self.authority_index, + slot_number: self.slot_number, + }; parity_codec::Encode::encode(&tmp) } } +#[cfg(feature = "std")] impl Decode for BabePreDigest { fn decode(i: &mut R) -> Option { - let (output, proof, index, slot_num): RawBabePreDigest = Decode::decode(i)?; + let RawBabePreDigest { vrf_output, vrf_proof, authority_index, slot_number } = Decode::decode(i)?; // Verify (at compile time) that the sizes in babe_primitives are correct - let _: [u8; babe_primitives::VRF_OUTPUT_LENGTH] = output; - let _: [u8; babe_primitives::VRF_PROOF_LENGTH] = proof; + let _: [u8; super::VRF_OUTPUT_LENGTH] = vrf_output; + let _: [u8; super::VRF_PROOF_LENGTH] = vrf_proof; Some(BabePreDigest { - proof: VRFProof::from_bytes(&proof).ok()?, - vrf_output: VRFOutput::from_bytes(&output).ok()?, - index, - slot_num, + vrf_proof: VRFProof::from_bytes(&vrf_proof).ok()?, + vrf_output: VRFOutput::from_bytes(&vrf_output).ok()?, + authority_index, + slot_number, }) } } /// A digest item which is usable with BABE consensus. +#[cfg(feature = "std")] pub trait CompatibleDigestItem: Sized { /// Construct a digest item which contains a BABE pre-digest. fn babe_pre_digest(seal: BabePreDigest) -> Self; @@ -88,8 +107,12 @@ pub trait CompatibleDigestItem: Sized { /// If this item is a BABE signature, return the signature. fn as_babe_seal(&self) -> Option; + + /// If this item is a BABE epoch, return it. + fn as_babe_epoch(&self) -> Option; } +#[cfg(feature = "std")] impl CompatibleDigestItem for DigestItem where Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static { @@ -108,4 +131,8 @@ impl CompatibleDigestItem for DigestItem where fn as_babe_seal(&self) -> Option { self.try_to(OpaqueDigestItemId::Seal(&BABE_ENGINE_ID)) } + + fn as_babe_epoch(&self) -> Option { + self.try_to(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID)) + } } diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 655751b763..a7b49364f4 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -15,15 +15,22 @@ // along with Substrate. If not, see . //! Primitives for BABE. -#![deny(warnings, unsafe_code, missing_docs)] +#![deny(warnings)] +#![forbid(unsafe_code, missing_docs, unused_variables, unused_imports)] #![cfg_attr(not(feature = "std"), no_std)] +mod digest; + use parity_codec::{Encode, Decode}; use rstd::vec::Vec; use runtime_primitives::ConsensusEngineId; use substrate_primitives::sr25519::Public; use substrate_client::decl_runtime_apis; +#[cfg(feature = "std")] +pub use digest::{BabePreDigest, CompatibleDigestItem}; +pub use digest::{BABE_VRF_PREFIX, RawBabePreDigest}; + /// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in /// the main Babe module. If that ever changes, then this must, too. pub type AuthorityId = Public; @@ -49,15 +56,29 @@ pub type SlotNumber = u64; /// The weight of an authority. pub type Weight = u64; +/// BABE epoch information +#[derive(Decode, Encode, Default, PartialEq, Eq, Clone)] +#[cfg_attr(any(feature = "std", test), derive(Debug))] +pub struct Epoch { + /// The authorities and their weights + pub authorities: Vec<(AuthorityId, Weight)>, + /// The epoch index + pub epoch_index: u64, + /// Randomness for this epoch + pub randomness: [u8; VRF_OUTPUT_LENGTH], + /// The duration of this epoch + pub duration: SlotNumber, +} + /// An consensus log item for BABE. -#[derive(Decode, Encode)] +#[derive(Decode, Encode, Clone, PartialEq, Eq)] pub enum ConsensusLog { /// The epoch has changed. This provides information about the /// epoch _after_ next: what slot number it will start at, who are the authorities (and their weights) /// and the next epoch randomness. The information for the _next_ epoch should already /// be available. #[codec(index = "1")] - NextEpochData(SlotNumber, Vec<(AuthorityId, Weight)>, [u8; VRF_OUTPUT_LENGTH]), + NextEpochData(Epoch), /// Disable the authority with given index. #[codec(index = "2")] OnDisabled(AuthorityIndex), @@ -72,6 +93,12 @@ pub struct BabeConfiguration { /// Dynamic slot duration may be supported in the future. pub slot_duration: u64, + /// The number of slots per BABE epoch. Currently, only + /// the value provided by this type at genesis will be used. + /// + /// Dynamic slot duration may be supported in the future. + pub slots_per_epoch: u64, + /// The expected block time in milliseconds for BABE. Currently, /// only the value provided by this type at genesis will be used. /// @@ -116,7 +143,7 @@ decl_runtime_apis! { /// Dynamic configuration may be supported in the future. fn startup_data() -> BabeConfiguration; - /// Get the current authorites for Babe. - fn authorities() -> Vec; + /// Get the current epoch data for Babe. + fn epoch() -> Epoch; } } diff --git a/core/consensus/babe/src/aux_schema.rs b/core/consensus/babe/src/aux_schema.rs new file mode 100644 index 0000000000..50d2a727f1 --- /dev/null +++ b/core/consensus/babe/src/aux_schema.rs @@ -0,0 +1,69 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Schema for BABE epoch changes in the aux-db. + +use log::info; +use parity_codec::{Decode, Encode}; + +use client::backend::AuxStore; +use client::error::{Result as ClientResult, Error as ClientError}; +use runtime_primitives::traits::Block as BlockT; + +use super::{EpochChanges, SharedEpochChanges}; + +const BABE_EPOCH_CHANGES: &[u8] = b"babe_epoch_changes"; + +fn load_decode(backend: &B, key: &[u8]) -> ClientResult> + where + B: AuxStore, + T: Decode, +{ + let corrupt = || ClientError::Backend(format!("BABE DB is corrupted.")).into(); + match backend.get_aux(key)? { + None => Ok(None), + Some(t) => T::decode(&mut &t[..]).ok_or_else(corrupt).map(Some) + } +} + +/// Load or initialize persistent epoch change data from backend. +pub(crate) fn load_epoch_changes( + backend: &B, +) -> ClientResult> { + let epoch_changes = load_decode::<_, EpochChanges>(backend, BABE_EPOCH_CHANGES)? + .map(Into::into) + .unwrap_or_else(|| { + info!(target: "babe", + "Creating empty BABE epoch changes on what appears to be first startup." + ); + SharedEpochChanges::new() + }); + + Ok(epoch_changes) +} + +/// Update the epoch changes on disk after a change. +pub(crate) fn write_epoch_changes( + epoch_changes: &EpochChanges, + write_aux: F, +) -> R where + F: FnOnce(&[(&'static [u8], &[u8])]) -> R, +{ + let encoded_epoch_changes = epoch_changes.encode(); + write_aux( + &[(BABE_EPOCH_CHANGES, encoded_epoch_changes.as_slice())], + ) +} diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 055ceca782..be5b476dd2 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -17,34 +17,26 @@ //! # BABE consensus //! //! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. -//! -//! # Stability -//! -//! This crate is highly unstable and experimental. Breaking changes may -//! happen at any point. This crate is also missing features, such as banning -//! of malicious validators, that are essential for a production network. -#![forbid(unsafe_code, missing_docs, unused_must_use)] + +#![forbid(unsafe_code, missing_docs, unused_must_use, unused_imports, unused_variables)] #![cfg_attr(not(test), forbid(dead_code))] -extern crate core; -mod digest; -use digest::CompatibleDigestItem; -pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; pub use babe_primitives::*; pub use consensus_common::SyncOracle; +use consensus_common::ImportResult; use consensus_common::import_queue::{ - BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport, + BoxJustificationImport, BoxFinalityProofImport, }; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use runtime_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; +use runtime_primitives::{generic, generic::BlockId, Justification}; use runtime_primitives::traits::{ - Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, + Block as BlockT, Header, DigestItemFor, NumberFor, ProvideRuntimeApi, SimpleBitOps, Zero, }; -use std::{sync::Arc, u64, fmt::{Debug, Display}, time::{Instant, Duration}}; +use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, time::{Instant, Duration}}; use runtime_support::serde::{Serialize, Deserialize}; use parity_codec::{Decode, Encode}; -use parking_lot::Mutex; -use primitives::{Pair, Public, sr25519}; +use parking_lot::{Mutex, MutexGuard}; +use primitives::{Blake2Hasher, H256, Pair, Public, sr25519}; use merlin::Transcript; use inherents::{InherentDataProviders, InherentData}; use substrate_telemetry::{ @@ -72,18 +64,26 @@ use consensus_common::{SelectChain, well_known_cache_keys}; use consensus_common::import_queue::{Verifier, BasicQueue}; use client::{ block_builder::api::BlockBuilder as BlockBuilderApi, - blockchain::ProvideCache, + blockchain::{self, HeaderBackend, ProvideCache}, + BlockchainEvents, + CallExecutor, Client, runtime_api::ApiExt, - error::Result as CResult, - backend::AuxStore, + error::Result as ClientResult, + backend::{AuxStore, Backend}, + utils::is_descendent_of, }; +use fork_tree::ForkTree; use slots::{CheckedHeader, check_equivocation}; -use futures::{Future, IntoFuture, future}; +use futures::{Future, IntoFuture, future, stream::Stream}; +use futures03::{StreamExt as _, TryStreamExt as _}; use tokio_timer::Timeout; use log::{error, warn, debug, info, trace}; use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, SignedDuration}; +mod aux_schema; +#[cfg(test)] +mod tests; pub use babe_primitives::AuthorityId; /// A slot duration. Create with `get_or_compute`. @@ -95,7 +95,7 @@ pub struct Config(slots::SlotDuration); impl Config { /// Either fetch the slot duration from disk or compute it from the genesis /// state. - pub fn get_or_compute(client: &C) -> CResult + pub fn get_or_compute(client: &C) -> ClientResult where C: AuxStore + ProvideRuntimeApi, C::Api: BabeApi, { @@ -137,7 +137,7 @@ impl SlotCompatible for BabeLink { /// Parameters for BABE. pub struct BabeParams { - /// The configuration for BABE. Includes the slot duration, threshold, and + /// The configuration for BABE. Includes the slot duration, threshold, and /// other parameters. pub config: Config, @@ -207,7 +207,7 @@ pub fn start_babe(BabeParams { threshold: config.threshold(), }; register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; - Ok(slots::start_slot_worker::<_, _, _, _, _, _>( + Ok(slots::start_slot_worker( config.0, select_chain, worker, @@ -254,10 +254,10 @@ impl SlotWorker for BabeWorker w let block_import = self.block_import.clone(); let ref env = self.env; - let (timestamp, slot_num, slot_duration) = + let (timestamp, slot_number, slot_duration) = (slot_info.timestamp, slot_info.number, slot_info.duration); - let authorities = match authorities(client.as_ref(), &BlockId::Hash(chain_head.hash())) { + let epoch = match epoch(client.as_ref(), &BlockId::Hash(chain_head.hash())) { Ok(authorities) => authorities, Err(e) => { error!( @@ -273,6 +273,12 @@ impl SlotWorker for BabeWorker w } }; + let Epoch { ref authorities, randomness, epoch_index, .. } = epoch; + + if authorities.is_empty() { + error!(target: "babe", "No authorities at block {:?}", chain_head.hash()); + } + if !self.force_authoring && self.sync_oracle.is_offline() && authorities.len() > 1 { debug!(target: "babe", "Skipping proposal slot. Waiting for the network."); telemetry!(CONSENSUS_DEBUG; "babe.skipping_proposal_slot"; @@ -281,44 +287,40 @@ impl SlotWorker for BabeWorker w return Box::new(future::ok(())); } - // FIXME replace the dummy empty slices with real data - // https://github.com/paritytech/substrate/issues/2435 - // https://github.com/paritytech/substrate/issues/2436 - let proposal_work = if let Some(((inout, proof, _batchable_proof), index)) = claim_slot( - &[0u8; 0], + let proposal_work = if let Some(((inout, vrf_proof, _batchable_proof), authority_index)) = claim_slot( + &randomness, slot_info.number, - &[0u8; 0], - 0, - &authorities, + epoch_index, + epoch, &pair, self.threshold, ) { debug!( target: "babe", "Starting authorship at slot {}; timestamp = {}", - slot_num, + slot_number, timestamp, ); telemetry!(CONSENSUS_DEBUG; "babe.starting_authorship"; - "slot_num" => slot_num, "timestamp" => timestamp + "slot_number" => slot_number, "timestamp" => timestamp ); // we are the slot author. make a block and sign it. let proposer = match env.init(&chain_head) { Ok(p) => p, Err(e) => { - warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_num, e); + warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_number, e); telemetry!(CONSENSUS_WARN; "babe.unable_authoring_block"; - "slot" => slot_num, "err" => ?e + "slot" => slot_number, "err" => ?e ); return Box::new(future::ok(())) } }; let inherent_digest = BabePreDigest { - proof, + vrf_proof, vrf_output: inout.to_output(), - index: index as u64, - slot_num, + authority_index: authority_index as u64, + slot_number, }; // deadline our production to approx. the end of the slot @@ -343,27 +345,19 @@ impl SlotWorker for BabeWorker w // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); - if slot_after_building != slot_num { + if slot_after_building != slot_number { info!( target: "babe", "Discarding proposal for slot {}; block production took too long", - slot_num + slot_number ); telemetry!(CONSENSUS_INFO; "babe.discarding_proposal_took_too_long"; - "slot" => slot_num + "slot" => slot_number ); - return + return; } let (header, body) = b.deconstruct(); - let pre_digest: Result = find_pre_digest::(&header); - if let Err(e) = pre_digest { - error!(target: "babe", "FATAL ERROR: Invalid pre-digest: {}!", e); - return - } else { - trace!(target: "babe", "Got correct number of seals. Good!") - }; - let header_num = header.number().clone(); let parent_hash = header.parent_hash().clone(); @@ -373,7 +367,12 @@ impl SlotWorker for BabeWorker w let signature = pair.sign(header_hash.as_ref()); let signature_digest_item = DigestItemFor::::babe_seal(signature); - let import_block: BlockImportParams = BlockImportParams { + let cache = find_epoch_digest::(&header) + .map(|epoch| vec![(well_known_cache_keys::AUTHORITIES, epoch.encode())]) + .map(|keys| keys.into_iter().collect()) + .unwrap_or_default(); + + let import_block = BlockImportParams:: { origin: BlockOrigin::Own, header, justification: None, @@ -390,13 +389,14 @@ impl SlotWorker for BabeWorker w import_block.post_header().hash(), header_hash, ); + telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; "header_num" => ?header_num, "hash_now" => ?import_block.post_header().hash(), "hash_previously" => ?header_hash, ); - if let Err(e) = block_import.lock().import_block(import_block, Default::default()) { + if let Err(e) = block_import.lock().import_block(import_block, cache) { warn!(target: "babe", "Error with block built on {:?}: {:?}", parent_hash, e); telemetry!(CONSENSUS_WARN; "babe.err_with_block_built_on"; @@ -418,22 +418,34 @@ macro_rules! babe_err { }; } +/// Extract the BABE pre digest from the given header. Pre-runtime digests are +/// mandatory, the function will return `Err` if none is found. fn find_pre_digest(header: &B::Header) -> Result where DigestItemFor: CompatibleDigestItem, { - let mut pre_digest: Option<_> = None; for log in header.digest().logs() { - trace!(target: "babe", "Checking log {:?}", log); - match (log.as_babe_pre_digest(), pre_digest.is_some()) { - (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime headers, rejecting!"))?, - (None, _) => trace!(target: "babe", "Ignoring digest not meant for us"), - (s, false) => pre_digest = s, + if let Some(pre_digest) = log.as_babe_pre_digest() { + return Ok(pre_digest); + } + } + + Err(babe_err!("No BABE pre-runtime digest found")) +} + +/// Extract the BABE epoch change digest from the given header, if it exists. +fn find_epoch_digest(header: &B::Header) -> Option + where DigestItemFor: CompatibleDigestItem, +{ + for log in header.digest().logs() { + if let Some(epoch_digest) = log.as_babe_epoch() { + return Some(epoch_digest); } } - pre_digest.ok_or_else(|| babe_err!("No BABE pre-runtime digest found")) + + return None; } -/// check a header has been signed by the right key. If the slot is too far in +/// Check a header has been signed by the right key. If the slot is too far in /// the future, an error will be returned. If successful, returns the pre-header /// and the digest item containing the seal. /// @@ -441,7 +453,6 @@ fn find_pre_digest(header: &B::Header) -> Result( client: &C, @@ -449,6 +460,8 @@ fn check_header( mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId], + randomness: [u8; 32], + epoch_index: u64, threshold: u64, ) -> Result, DigestItemFor)>, String> where DigestItemFor: CompatibleDigestItem, @@ -464,26 +477,27 @@ fn check_header( })?; let pre_digest = find_pre_digest::(&header)?; - let BabePreDigest { slot_num, index, ref proof, ref vrf_output } = pre_digest; - if slot_num > slot_now { + let BabePreDigest { slot_number, authority_index, ref vrf_proof, ref vrf_output } = pre_digest; + + if slot_number > slot_now { header.digest_mut().push(seal); - Ok(CheckedHeader::Deferred(header, slot_num)) - } else if index > authorities.len() as u64 { + Ok(CheckedHeader::Deferred(header, slot_number)) + } else if authority_index > authorities.len() as u64 { Err(babe_err!("Slot author not found")) } else { - let (pre_hash, author): (_, &sr25519::Public) = (header.hash(), &authorities[index as usize]); + let (pre_hash, author) = (header.hash(), &authorities[authority_index as usize]); if sr25519::Pair::verify(&sig, pre_hash, author.clone()) { let (inout, _batchable_proof) = { let transcript = make_transcript( - Default::default(), - slot_num, - Default::default(), - 0, + &randomness, + slot_number, + epoch_index, ); + schnorrkel::PublicKey::from_bytes(author.as_slice()).and_then(|p| { - p.vrf_verify(transcript, vrf_output, proof) + p.vrf_verify(transcript, vrf_output, vrf_proof) }).map_err(|s| { babe_err!("VRF verification failed: {:?}", s) })? @@ -497,14 +511,14 @@ fn check_header( if let Some(equivocation_proof) = check_equivocation( client, slot_now, - slot_num, + slot_number, &header, author, ).map_err(|e| e.to_string())? { info!( "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", author, - slot_num, + slot_number, equivocation_proof.fst_header().hash(), equivocation_proof.snd_header().hash(), ); @@ -524,7 +538,7 @@ pub struct BabeLink(Arc, Vec<(Instant, u64)>)>>); /// A verifier for Babe blocks. pub struct BabeVerifier { - client: Arc, + api: Arc, inherent_data_providers: inherents::InherentDataProviders, config: Config, time_source: BabeLink, @@ -539,7 +553,7 @@ impl BabeVerifier { ) -> Result<(), String> where C: ProvideRuntimeApi, C::Api: BlockBuilderApi { - let inherent_res = self.client.runtime_api().check_inherents( + let inherent_res = self.api.runtime_api().check_inherents( &block_id, block, inherent_data, @@ -558,29 +572,33 @@ impl BabeVerifier { fn median_algorithm( median_required_blocks: u64, slot_duration: u64, - slot_num: u64, + slot_number: u64, slot_now: u64, time_source: &mut (Option, Vec<(Instant, u64)>), ) { let num_timestamps = time_source.1.len(); if num_timestamps as u64 >= median_required_blocks && median_required_blocks > 0 { let mut new_list: Vec<_> = time_source.1.iter().map(|&(t, sl)| { - let offset: u128 = u128::from(slot_duration) - .checked_mul(1_000_000u128) // self.config.get() returns *milliseconds* - .and_then(|x| x.checked_mul(u128::from(slot_num).saturating_sub(u128::from(sl)))) - .expect("we cannot have timespans long enough for this to overflow; qed"); - const NANOS_PER_SEC: u32 = 1_000_000_000; - let nanos = (offset % u128::from(NANOS_PER_SEC)) as u32; - let secs = (offset / u128::from(NANOS_PER_SEC)) as u64; - t + Duration::new(secs, nanos) - }).collect(); + let offset: u128 = u128::from(slot_duration) + .checked_mul(1_000_000u128) // self.config.get() returns *milliseconds* + .and_then(|x| x.checked_mul(u128::from(slot_number).saturating_sub(u128::from(sl)))) + .expect("we cannot have timespans long enough for this to overflow; qed"); + + const NANOS_PER_SEC: u32 = 1_000_000_000; + let nanos = (offset % u128::from(NANOS_PER_SEC)) as u32; + let secs = (offset / u128::from(NANOS_PER_SEC)) as u64; + + t + Duration::new(secs, nanos) + }).collect(); + // FIXME #2926: use a selection algorithm instead of a full sorting algorithm. new_list.sort_unstable(); + let &median = new_list .get(num_timestamps / 2) .expect("we have at least one timestamp, so this is a valid index; qed"); + time_source.1.clear(); - // FIXME #2927: pass this to the block authoring logic somehow time_source.0.replace(Instant::now() - median); } else { time_source.1.push((Instant::now(), slot_now)) @@ -590,7 +608,6 @@ fn median_algorithm( impl Verifier for BabeVerifier where C: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, C::Api: BlockBuilderApi + BabeApi, - DigestItemFor: CompatibleDigestItem, { fn verify( &self, @@ -613,34 +630,41 @@ impl Verifier for BabeVerifier where .inherent_data_providers .create_inherent_data() .map_err(String::from)?; + let (_, slot_now, _) = self.time_source.extract_timestamp_and_slot(&inherent_data) .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; + let hash = header.hash(); let parent_hash = *header.parent_hash(); - let authorities = authorities(self.client.as_ref(), &BlockId::Hash(parent_hash)) - .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; + let Epoch { authorities, randomness, epoch_index, .. } = + epoch(self.api.as_ref(), &BlockId::Hash(parent_hash)) + .map_err(|e| format!("Could not fetch epoch at {:?}: {:?}", parent_hash, e))?; - // we add one to allow for some small drift. - // FIXME #1019 in the future, alter this queue to allow deferring of - // headers + let authorities: Vec<_> = authorities.into_iter().map(|(s, _)| s).collect(); + + // We add one to allow for some small drift. + // FIXME #1019 in the future, alter this queue to allow deferring of headers let checked_header = check_header::( - &self.client, + &self.api, slot_now + 1, header, hash, &authorities[..], + randomness, + epoch_index, self.config.threshold(), )?; + match checked_header { CheckedHeader::Checked(pre_header, (pre_digest, seal)) => { - let BabePreDigest { slot_num, .. } = pre_digest.as_babe_pre_digest() + let BabePreDigest { slot_number, .. } = pre_digest.as_babe_pre_digest() .expect("check_header always returns a pre-digest digest item; qed"); // if the body is passed through, we need to use the runtime // to check that the internally-set timestamp in the inherents // actually matches the slot set in the seal. if let Some(inner_body) = body.take() { - inherent_data.babe_replace_inherent_data(slot_num); + inherent_data.babe_replace_inherent_data(slot_number); let block = B::new(pre_header.clone(), inner_body); self.check_inherents( @@ -660,11 +684,10 @@ impl Verifier for BabeVerifier where "pre_header" => ?pre_header); // `Consensus` is the Babe-specific authorities change log. - // It's an encoded `Vec`, the same format as is stored in the cache, - // so no need to decode/re-encode. - let maybe_keys = pre_header.digest() - .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID))) - .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); + // It's an encoded `Epoch`, the same format as is stored in the + // cache, so no need to decode/re-encode. + let maybe_keys = find_epoch_digest::(&pre_header) + .map(|epoch| vec![(well_known_cache_keys::AUTHORITIES, epoch.encode())]); let import_block = BlockImportParams { origin, @@ -676,13 +699,16 @@ impl Verifier for BabeVerifier where auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, }; + + // FIXME: this should eventually be moved to BabeBlockImport median_algorithm( self.config.0.median_required_blocks, self.config.get(), - slot_num, + slot_number, slot_now, &mut *self.time_source.0.lock(), ); + // FIXME #1019 extract authorities Ok((import_block, maybe_keys)) } @@ -697,10 +723,9 @@ impl Verifier for BabeVerifier where } } -fn authorities(client: &C, at: &BlockId) -> Result< - Vec, - ConsensusError, -> where +/// Extract current epoch data from cache and fallback to querying the runtime +/// if the cache isn't populated. +fn epoch(client: &C, at: &BlockId) -> Result where B: BlockT, C: ProvideRuntimeApi + ProvideCache, C::Api: BabeApi, @@ -711,10 +736,16 @@ fn authorities(client: &C, at: &BlockId) -> Result< .and_then(|v| Decode::decode(&mut &v[..]))) .or_else(|| { if client.runtime_api().has_api::>(at).unwrap_or(false) { - BabeApi::authorities(&*client.runtime_api(), at).ok() + let s = BabeApi::epoch(&*client.runtime_api(), at).ok()?; + if s.authorities.is_empty() { + error!("No authorities!"); + None + } else { + Some(s) + } } else { - panic!("We don’t support deprecated code with new consensus algorithms, \ - therefore this is unreachable; qed") + error!("bad api!"); + None } }).ok_or(consensus_common::Error::InvalidAuthoritiesSet) } @@ -746,12 +777,10 @@ fn get_keypair(q: &sr25519::Pair) -> &Keypair { fn make_transcript( randomness: &[u8], slot_number: u64, - genesis_hash: &[u8], epoch: u64, ) -> Transcript { let mut transcript = Transcript::new(&BABE_ENGINE_ID); transcript.commit_bytes(b"slot number", &slot_number.to_le_bytes()); - transcript.commit_bytes(b"genesis block hash", genesis_hash); transcript.commit_bytes(b"current epoch", &epoch.to_le_bytes()); transcript.commit_bytes(b"chain randomness", randomness); transcript @@ -769,30 +798,24 @@ fn check(inout: &VRFInOut, threshold: u64) -> bool { fn claim_slot( randomness: &[u8], slot_number: u64, - genesis_hash: &[u8], epoch: u64, - authorities: &[AuthorityId], + Epoch { ref authorities, .. }: Epoch, key: &sr25519::Pair, threshold: u64, ) -> Option<((VRFInOut, VRFProof, VRFProofBatchable), usize)> { let public = &key.public(); - let index = authorities.iter().position(|s| s == public)?; - let transcript = make_transcript( - randomness, - slot_number, - genesis_hash, - epoch, - ); + let authority_index = authorities.iter().position(|s| &s.0 == public)?; + let transcript = make_transcript(randomness, slot_number, epoch); // Compute the threshold we will use. // - // We already checked that authorities contains `key.public()`, so it can’t + // We already checked that authorities contains `key.public()`, so it can't // be empty. Therefore, this division is safe. let threshold = threshold / authorities.len() as u64; get_keypair(key) .vrf_sign_n_check(transcript, |inout| check(inout, threshold)) - .map(|s|(s, index)) + .map(|s|(s, authority_index)) } fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where @@ -808,10 +831,10 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> // check if we already have initialized the cache let genesis_id = BlockId::Number(Zero::zero()); - let genesis_authorities: Option> = cache + let genesis_epoch: Option = cache .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) .and_then(|v| Decode::decode(&mut &v[..])); - if genesis_authorities.is_some() { + if genesis_epoch.is_some() { return Ok(()); } @@ -820,285 +843,298 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> "Error initializing authorities cache: {}", error, ))); - let genesis_authorities = authorities(client, &genesis_id)?; - cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) + + let genesis_epoch = epoch(client, &genesis_id)?; + cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_epoch.encode()) .map_err(map_err) } -/// Start an import queue for the Babe consensus algorithm. -pub fn import_queue( - config: Config, - block_import: BoxBlockImport, - justification_import: Option>, - finality_proof_import: Option>, - client: Arc, - inherent_data_providers: InherentDataProviders, -) -> Result<(BabeImportQueue, BabeLink), consensus_common::Error> where - B: BlockT, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, - C::Api: BlockBuilderApi + BabeApi, - DigestItemFor: CompatibleDigestItem, - E: 'static, -{ - register_babe_inherent_data_provider(&inherent_data_providers, config.get())?; - initialize_authorities_cache(&*client)?; - - let verifier = BabeVerifier { - client: client, - inherent_data_providers, - time_source: Default::default(), - config, - }; - let timestamp_core = verifier.time_source.clone(); - Ok((BasicQueue::new( - Arc::new(verifier), - block_import, - justification_import, - finality_proof_import, - ), timestamp_core)) +/// Tree of all epoch changes across all *seen* forks. Data stored in tree is the +/// hash and block number of the block signaling the epoch change, the new epoch +/// index and the minimum *slot number* when the next epoch should start (i.e. +/// slot number begin + duration). +type EpochChanges = ForkTree< + ::Hash, + NumberFor, + (u64, SlotNumber), +>; + +/// A shared epoch changes tree. +#[derive(Clone)] +struct SharedEpochChanges { + inner: Arc>>, } -// FIXME #2532: need to allow deprecated until refactor is done -// https://github.com/paritytech/substrate/issues/2532 -#[cfg(test)] -#[allow(unused_imports, deprecated)] -#[cfg_attr(test, allow(dead_code))] -mod tests { - use super::*; - - use client::LongestChain; - use consensus_common::NoNetwork as DummyOracle; - use network::test::*; - use network::test::{Block as TestBlock, PeersClient}; - use runtime_primitives::traits::{Block as BlockT, DigestFor}; - use network::config::ProtocolConfig; - use tokio::runtime::current_thread; - use keyring::sr25519::Keyring; - use super::generic::DigestItem; - use client::BlockchainEvents; - use test_client; - use futures::{Async, stream::Stream as _}; - use futures03::{StreamExt as _, TryStreamExt as _}; - use log::debug; - use std::time::Duration; - type Item = generic::DigestItem; - use test_client::AuthorityKeyring; - - type Error = client::error::Error; - - type TestClient = client::Client< - test_client::Backend, - test_client::Executor, - TestBlock, - test_client::runtime::RuntimeApi, - >; - - struct DummyFactory(Arc); - struct DummyProposer(u64, Arc); - - impl Environment for DummyFactory { - type Proposer = DummyProposer; - type Error = Error; - - fn init(&self, parent_header: &::Header) - -> Result - { - Ok(DummyProposer(parent_header.number + 1, self.0.clone())) +impl SharedEpochChanges { + fn new() -> Self { + SharedEpochChanges { + inner: Arc::new(Mutex::new(EpochChanges::::new())) } } - impl Proposer for DummyProposer { - type Error = Error; - type Create = Result; - - fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { - self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) - } + fn lock(&self) -> MutexGuard> { + self.inner.lock() } +} - const SLOT_DURATION: u64 = 1; - - pub struct BabeTestNet { - peers: Vec>, +impl From> for SharedEpochChanges { + fn from(epoch_changes: EpochChanges) -> Self { + SharedEpochChanges { + inner: Arc::new(Mutex::new(epoch_changes)) + } } +} - impl TestNetFactory for BabeTestNet { - type Specialization = DummySpecialization; - type Verifier = BabeVerifier; - type PeerData = (); +/// A block-import handler for BABE. +/// +/// This scans each imported block for epoch change signals. The signals are +/// tracked in a tree (of all forks), and the import logic validates all epoch +/// change transitions, i.e. whether a given epoch change is expected or whether +/// it is missing. +/// +/// The epoch change tree should be pruned as blocks are finalized. +pub struct BabeBlockImport { + inner: I, + client: Arc>, + epoch_changes: SharedEpochChanges, +} - /// Create new test network with peers and given config. - fn from_config(_config: &ProtocolConfig) -> Self { - debug!(target: "babe", "Creating test network from config"); - BabeTestNet { - peers: Vec::new(), - } +impl Clone for BabeBlockImport { + fn clone(&self) -> Self { + BabeBlockImport { + inner: self.inner.clone(), + client: self.client.clone(), + epoch_changes: self.epoch_changes.clone(), } + } +} - fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) - -> Arc - { - let client = client.as_full().expect("only full clients are used in test"); - trace!(target: "babe", "Creating a verifier"); - let config = Config::get_or_compute(&*client) - .expect("slot duration available"); - let inherent_data_providers = InherentDataProviders::new(); - register_babe_inherent_data_provider( - &inherent_data_providers, - config.get() - ).expect("Registers babe inherent data provider"); - trace!(target: "babe", "Provider registered"); - - assert_eq!(config.get(), SLOT_DURATION); - Arc::new(BabeVerifier { - client, - inherent_data_providers, - config, - time_source: Default::default(), - }) +impl BabeBlockImport { + fn new( + client: Arc>, + epoch_changes: SharedEpochChanges, + block_import: I, + ) -> Self { + BabeBlockImport { + client, + inner: block_import, + epoch_changes, } + } +} - fn peer(&mut self, i: usize) -> &mut Peer { - trace!(target: "babe", "Retreiving a peer"); - &mut self.peers[i] +impl BlockImport for BabeBlockImport where + Block: BlockT, + I: BlockImport + Send + Sync, + I::Error: Into, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn import_block( + &mut self, + mut block: BlockImportParams, + new_cache: HashMap>, + ) -> Result { + let hash = block.post_header().hash(); + let number = block.header.number().clone(); + + // early exit if block already in chain, otherwise the check for + // epoch changes will error when trying to re-import an epoch change + #[allow(deprecated)] + match self.client.backend().blockchain().status(BlockId::Hash(hash)) { + Ok(blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), + Ok(blockchain::BlockStatus::Unknown) => {}, + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), } - fn peers(&self) -> &Vec> { - trace!(target: "babe", "Retreiving peers"); - &self.peers - } + let slot_number = { + let pre_digest = find_pre_digest::(&block.header) + .expect("valid babe headers must contain a predigest; \ + header has been already verified; qed"); + let BabePreDigest { slot_number, .. } = pre_digest; + slot_number + }; - fn mut_peers>)>( - &mut self, - closure: F, - ) { - closure(&mut self.peers); - } - } + // returns a function for checking whether a block is a descendent of another + // consistent with querying client directly after importing the block. + let parent_hash = *block.header.parent_hash(); + let is_descendent_of = is_descendent_of(&self.client, Some((&hash, &parent_hash))); + + // check if there's any epoch change expected to happen at this slot + let mut epoch_changes = self.epoch_changes.lock(); + let epoch_change = epoch_changes.find_node_where( + &hash, + &number, + &is_descendent_of, + &|(_, expected_epoch_change_slot)| { + *expected_epoch_change_slot <= slot_number + } + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; - #[test] - fn can_serialize_block() { - drop(env_logger::try_init()); - assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); - } + let check_roots = || -> Result { + // this can only happen when the chain starts, since there's no epoch change at genesis. + // afterwards every time we expect an epoch change it means we will import another one. + for (root, _, _) in epoch_changes.roots() { + let is_descendent_of = is_descendent_of(root, &hash) + .map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; - #[test] - fn authoring_blocks() { - drop(env_logger::try_init()); - debug!(target: "babe", "checkpoint 1"); - let net = BabeTestNet::new(3); - debug!(target: "babe", "checkpoint 2"); - - debug!(target: "babe", "checkpoint 3"); - - let peers = &[ - (0, Keyring::Alice), - (1, Keyring::Bob), - (2, Keyring::Charlie), - ]; - - let net = Arc::new(Mutex::new(net)); - let mut import_notifications = Vec::new(); - debug!(target: "babe", "checkpoint 4"); - let mut runtime = current_thread::Runtime::new().unwrap(); - for (peer_id, key) in peers { - let client = net.lock().peer(*peer_id).client().as_full().unwrap(); - let environ = Arc::new(DummyFactory(client.clone())); - import_notifications.push( - client.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) - .for_each(move |_| Ok(())) - ); + if is_descendent_of { + return Ok(false); + } + } - let config = Config::get_or_compute(&*client) - .expect("slot duration available"); + Ok(true) + }; - let inherent_data_providers = InherentDataProviders::new(); - register_babe_inherent_data_provider( - &inherent_data_providers, config.get() - ).expect("Registers babe inherent data provider"); + let expected_epoch_change = epoch_change.is_some(); + match (expected_epoch_change, new_cache.contains_key(&well_known_cache_keys::AUTHORITIES)) { + (true, true) => {}, + (false, false) => {}, + (true, false) => { + return Err( + ConsensusError::ClientImport("Expected epoch change to happen by this block".into()) + ); + }, + (false, true) => { + if !check_roots()? { + return Err(ConsensusError::ClientImport("Unexpected epoch change".into())); + } + }, + } - #[allow(deprecated)] - let select_chain = LongestChain::new(client.backend().clone()); + // if there's a pending epoch we'll save the previous epoch changes here + // this way we can revert it if there's any error + let mut old_epoch_changes = None; + + if let Some(entry) = new_cache.get(&well_known_cache_keys::AUTHORITIES) { + if let Some(epoch) = Epoch::decode(&mut &entry[..]) { + if let Some(last_epoch_change) = epoch_change { + let last_epoch_index = last_epoch_change.data.0; + if epoch.epoch_index.checked_sub(last_epoch_index) != Some(1) { + return Err(ConsensusError::ClientImport(format!( + "Invalid BABE epoch change: expected next epoch to be {:?}, got {:?}", + last_epoch_index.saturating_add(1), + epoch.epoch_index, + ))); + } + } - runtime.spawn(start_babe(BabeParams { - config, - local_key: Arc::new(key.clone().into()), - block_import: client.clone(), - select_chain, - client, - env: environ.clone(), - sync_oracle: DummyOracle, - inherent_data_providers, - force_authoring: false, - time_source: Default::default(), - }).expect("Starts babe")); + old_epoch_changes = Some(epoch_changes.clone()); + + // track the epoch change in the fork tree + epoch_changes.import( + hash, + number, + (epoch.epoch_index, slot_number + epoch.duration), + &is_descendent_of, + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + + crate::aux_schema::write_epoch_changes::( + &*epoch_changes, + |insert| block.auxiliary.extend( + insert.iter().map(|(k, v)| (k.to_vec(), Some(v.to_vec()))) + ) + ); + } else { + return Err( + ConsensusError::ClientImport("Failed to decode epoch change digest".into()) + ); + } } - debug!(target: "babe", "checkpoint 5"); - // wait for all finalized on each. - let wait_for = ::futures::future::join_all(import_notifications) - .map(drop) - .map_err(drop); + let import_result = self.inner.import_block(block, new_cache); - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap(); - } + // revert to the original epoch changes in case there's an error + // importing the block + if let Err(_) = import_result { + if let Some(old_epoch_changes) = old_epoch_changes { + *epoch_changes = old_epoch_changes; + } + } - #[test] - fn wrong_consensus_engine_id_rejected() { - drop(env_logger::try_init()); - let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal([0; 4], sig.0.to_vec()); - assert!(bad_seal.as_babe_pre_digest().is_none()); - assert!(bad_seal.as_babe_seal().is_none()) + import_result.map_err(Into::into) } - #[test] - fn malformed_pre_digest_rejected() { - drop(env_logger::try_init()); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, [0; 64].to_vec()); - assert!(bad_seal.as_babe_pre_digest().is_none()); + fn check_block( + &mut self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.inner.check_block(hash, parent_hash).map_err(Into::into) } +} - #[test] - fn sig_is_not_pre_digest() { - drop(env_logger::try_init()); - let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.0.to_vec()); - assert!(bad_seal.as_babe_pre_digest().is_none()); - assert!(bad_seal.as_babe_seal().is_some()) - } +/// Start an import queue for the BABE consensus algorithm. This method returns +/// the import queue, some data that needs to be passed to the block authoring +/// logic (`BabeLink`), a `BabeBlockImport` which should be used by the +/// authoring when importing its own blocks, and a future that must be run to +/// completion and is responsible for listening to finality notifications and +/// pruning the epoch changes tree. +pub fn import_queue, I, RA, PRA>( + config: Config, + block_import: I, + justification_import: Option>, + finality_proof_import: Option>, + client: Arc>, + api: Arc, + inherent_data_providers: InherentDataProviders, +) -> ClientResult<( + BabeImportQueue, + BabeLink, + BabeBlockImport, + impl Future, +)> where + B: Backend + 'static, + I: BlockImport + Clone + Send + Sync + 'static, + I::Error: Into, + E: CallExecutor + Clone + Send + Sync + 'static, + RA: Send + Sync + 'static, + PRA: ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore + 'static, + PRA::Api: BlockBuilderApi + BabeApi, +{ + register_babe_inherent_data_provider(&inherent_data_providers, config.get())?; + initialize_authorities_cache(&*api)?; - #[test] - fn can_author_block() { - drop(env_logger::try_init()); - let randomness = &[]; - let (pair, _) = sr25519::Pair::generate(); - let mut i = 0; - loop { - match claim_slot(randomness, i, &[], 0, &[pair.public()], &pair, u64::MAX / 10) { - None => i += 1, - Some(s) => { - debug!(target: "babe", "Authored block {:?}", s); - break - } - } - } - } + let verifier = BabeVerifier { + api, + inherent_data_providers, + time_source: Default::default(), + config, + }; - #[test] - fn authorities_call_works() { - drop(env_logger::try_init()); - let client = test_client::new(); - - assert_eq!(client.info().chain.best_number, 0); - assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ - Keyring::Alice.into(), - Keyring::Bob.into(), - Keyring::Charlie.into() - ]); - } + #[allow(deprecated)] + let epoch_changes = aux_schema::load_epoch_changes(&**client.backend())?; + + let block_import = BabeBlockImport::new( + client.clone(), + epoch_changes.clone(), + block_import, + ); + + let pruning_task = client.finality_notification_stream() + .map(|v| Ok::<_, ()>(v)).compat() + .for_each(move |notification| { + let is_descendent_of = is_descendent_of(&client, None); + epoch_changes.lock().prune( + ¬ification.hash, + *notification.header.number(), + &is_descendent_of, + ).map_err(|e| debug!(target: "babe", "Error pruning epoch changes fork tree: {:?}", e))?; + + Ok(()) + }); + + let timestamp_core = verifier.time_source.clone(); + let queue = BasicQueue::new( + Arc::new(verifier), + Box::new(block_import.clone()), + justification_import, + finality_proof_import, + ); + + Ok((queue, timestamp_core, block_import, pruning_task)) } diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs new file mode 100644 index 0000000000..4054fb9306 --- /dev/null +++ b/core/consensus/babe/src/tests.rs @@ -0,0 +1,340 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! BABE testsuite + +// FIXME #2532: need to allow deprecated until refactor is done +// https://github.com/paritytech/substrate/issues/2532 +#![allow(deprecated)] +use super::*; + +use client::{LongestChain, block_builder::BlockBuilder}; +use consensus_common::NoNetwork as DummyOracle; +use network::test::*; +use network::test::{Block as TestBlock, PeersClient}; +use runtime_primitives::traits::{Block as BlockT, DigestFor}; +use network::config::ProtocolConfig; +use tokio::runtime::current_thread; +use keyring::sr25519::Keyring; +use super::generic::DigestItem; +use client::BlockchainEvents; +use test_client; +use futures::Async; +use log::debug; +use std::{time::Duration, borrow::Borrow, cell::RefCell}; +type Item = generic::DigestItem; + +type Error = client::error::Error; + +type TestClient = client::Client< + test_client::Backend, + test_client::Executor, + TestBlock, + test_client::runtime::RuntimeApi, +>; + +struct DummyFactory(Arc); +struct DummyProposer(u64, Arc); + +impl Environment for DummyFactory { + type Proposer = DummyProposer; + type Error = Error; + + fn init(&self, parent_header: &::Header) + -> Result + { + Ok(DummyProposer(parent_header.number + 1, self.0.clone())) + } +} + +impl Proposer for DummyProposer { + type Error = Error; + type Create = Result; + + fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) + } +} + +type Mutator = Arc Fn(&'r mut TestHeader) + Send + Sync>; + +thread_local! { + static MUTATOR: RefCell = RefCell::new(Arc::new(|_|())); +} + +pub struct BabeTestNet { + peers: Vec>, +} + +type TestHeader = ::Header; +type TestExtrinsic = ::Extrinsic; + +pub struct TestVerifier { + inner: BabeVerifier, + mutator: Mutator, +} + +impl Verifier for TestVerifier { + /// Verify the given data and return the BlockImportParams and an optional + /// new set of validators to import. If not, err with an Error-Message + /// presented to the User in the logs. + fn verify( + &self, + origin: BlockOrigin, + mut header: TestHeader, + justification: Option, + body: Option>, + ) -> Result<(BlockImportParams, Option)>>), String> { + let cb: &(dyn Fn(&mut TestHeader) + Send + Sync) = self.mutator.borrow(); + cb(&mut header); + Ok(self.inner.verify(origin, header, justification, body).expect("verification failed!")) + } +} + +impl TestNetFactory for BabeTestNet { + type Specialization = DummySpecialization; + type Verifier = TestVerifier; + type PeerData = (); + + /// Create new test network with peers and given config. + fn from_config(_config: &ProtocolConfig) -> Self { + debug!(target: "babe", "Creating test network from config"); + BabeTestNet { + peers: Vec::new(), + } + } + + /// KLUDGE: this function gets the mutator from thread-local storage. + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) + -> Arc + { + let api = client.as_full().expect("only full clients are used in test"); + trace!(target: "babe", "Creating a verifier"); + let config = Config::get_or_compute(&*api) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, + config.get() + ).expect("Registers babe inherent data provider"); + trace!(target: "babe", "Provider registered"); + + Arc::new(TestVerifier { + inner: BabeVerifier { + api, + inherent_data_providers, + config, + time_source: Default::default(), + }, + mutator: MUTATOR.with(|s| s.borrow().clone()), + }) + } + + fn peer(&mut self, i: usize) -> &mut Peer { + trace!(target: "babe", "Retreiving a peer"); + &mut self.peers[i] + } + + fn peers(&self) -> &Vec> { + trace!(target: "babe", "Retreiving peers"); + &self.peers + } + + fn mut_peers>)>( + &mut self, + closure: F, + ) { + closure(&mut self.peers); + } +} + +#[test] +fn can_serialize_block() { + let _ = env_logger::try_init(); + assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); +} + +#[test] +#[should_panic] +fn rejects_empty_block() { + env_logger::try_init().unwrap(); + let mut net = BabeTestNet::new(3); + let block_builder = |builder: BlockBuilder<_, _>| { + builder.bake().unwrap() + }; + net.mut_peers(|peer| { + peer[0].generate_blocks(1, BlockOrigin::NetworkInitialSync, block_builder); + }) +} + +fn run_one_test() { + let _ = env_logger::try_init(); + let net = BabeTestNet::new(3); + + let peers = &[ + (0, Keyring::Alice), + (1, Keyring::Bob), + (2, Keyring::Charlie), + ]; + + let net = Arc::new(Mutex::new(net)); + let mut import_notifications = Vec::new(); + let mut runtime = current_thread::Runtime::new().unwrap(); + for (peer_id, key) in peers { + let client = net.lock().peer(*peer_id).client().as_full().unwrap(); + let environ = Arc::new(DummyFactory(client.clone())); + import_notifications.push( + client.import_notification_stream() + .map(|v| Ok::<_, ()>(v)).compat() + .take_while(|n| Ok(n.header.number() < &5)) + .for_each(move |_| Ok(())) + ); + + let config = Config::get_or_compute(&*client) + .expect("slot duration available"); + + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, config.get() + ).expect("Registers babe inherent data provider"); + + + #[allow(deprecated)] + let select_chain = LongestChain::new(client.backend().clone()); + + runtime.spawn(start_babe(BabeParams { + config, + local_key: Arc::new(key.clone().into()), + block_import: client.clone(), + select_chain, + client, + env: environ.clone(), + sync_oracle: DummyOracle, + inherent_data_providers, + force_authoring: false, + time_source: Default::default(), + }).expect("Starts babe")); + } + + // wait for all finalized on each. + let wait_for = futures::future::join_all(import_notifications); + + let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); + runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); +} + +#[test] +fn authoring_blocks() { run_one_test() } + +#[test] +#[should_panic] +fn rejects_missing_inherent_digest() { + MUTATOR.with(|s| *s.borrow_mut() = Arc::new(move |header: &mut TestHeader| { + let v = std::mem::replace(&mut header.digest_mut().logs, vec![]); + header.digest_mut().logs = v.into_iter() + .filter(|v| v.as_babe_pre_digest().is_none()) + .collect() + })); + run_one_test() +} + +#[test] +#[should_panic] +fn rejects_missing_seals() { + MUTATOR.with(|s| *s.borrow_mut() = Arc::new(move |header: &mut TestHeader| { + let v = std::mem::replace(&mut header.digest_mut().logs, vec![]); + header.digest_mut().logs = v.into_iter() + .filter(|v| v.as_babe_seal().is_none()) + .collect() + })); + run_one_test() +} + +// TODO: this test assumes that the test runtime will trigger epoch changes +// which isn't the case since it doesn't include the session module. +#[test] +#[should_panic] +#[ignore] +fn rejects_missing_consensus_digests() { + MUTATOR.with(|s| *s.borrow_mut() = Arc::new(move |header: &mut TestHeader| { + let v = std::mem::replace(&mut header.digest_mut().logs, vec![]); + header.digest_mut().logs = v.into_iter() + .filter(|v| v.as_babe_epoch().is_none()) + .collect() + })); + run_one_test() +} + +#[test] +fn wrong_consensus_engine_id_rejected() { + let _ = env_logger::try_init(); + let sig = sr25519::Pair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal([0; 4], sig.0.to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_none()) +} + +#[test] +fn malformed_pre_digest_rejected() { + let _ = env_logger::try_init(); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, [0; 64].to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); +} + +#[test] +fn sig_is_not_pre_digest() { + let _ = env_logger::try_init(); + let sig = sr25519::Pair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.0.to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_some()) +} + +#[test] +fn can_author_block() { + let _ = env_logger::try_init(); + let randomness = &[]; + let (pair, _) = sr25519::Pair::generate(); + let mut i = 0; + let epoch = Epoch { + authorities: vec![(pair.public(), 0)], + randomness: [0; 32], + epoch_index: 1, + duration: 100, + }; + loop { + match claim_slot(randomness, i, 0, epoch.clone(), &pair, u64::MAX / 10) { + None => i += 1, + Some(s) => { + debug!(target: "babe", "Authored block {:?}", s); + break + } + } + } +} + +#[test] +fn authorities_call_works() { + let _ = env_logger::try_init(); + let client = test_client::new(); + + assert_eq!(client.info().chain.best_number, 0); + assert_eq!(epoch(&client, &BlockId::Number(0)).unwrap().authorities, vec![ + (Keyring::Alice.into(), 1), + (Keyring::Bob.into(), 1), + (Keyring::Charlie.into(), 1), + ]); +} diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index dd6d55345b..816a61babd 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -20,12 +20,14 @@ //! time during which certain events can and/or must occur. This crate //! provides generic functionality for slots. -#![forbid(warnings, unsafe_code, missing_docs)] +#![deny(warnings)] +#![forbid(unsafe_code, missing_docs)] mod slots; mod aux_schema; -pub use slots::{SignedDuration, SlotInfo, Slots}; +pub use slots::{SignedDuration, SlotInfo}; +use slots::Slots; pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; use codec::{Decode, Encode}; diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index c35b252b40..0142f32b82 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -96,7 +96,7 @@ impl SlotInfo { } /// A stream that returns every time there is a new slot. -pub struct Slots { +pub(crate) struct Slots { last_slot: u64, slot_duration: u64, inner_delay: Option, diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 414e3ca0ab..e3189ecd92 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -26,7 +26,8 @@ use tokio_timer::Delay; use parking_lot::RwLock; use client::{ - backend::Backend, BlockchainEvents, CallExecutor, Client, error::Error as ClientError + backend::Backend, BlockchainEvents, CallExecutor, Client, error::Error as ClientError, + utils::is_descendent_of, }; use grandpa::{ BlockNumberOps, Equivocation, Error as GrandpaError, round::State as RoundState, @@ -990,42 +991,3 @@ pub(crate) fn canonical_at_height, RA>( Ok(Some(current.hash())) } - -/// Returns a function for checking block ancestry, the returned function will -/// return `true` if the given hash (second parameter) is a descendent of the -/// base (first parameter). If the `current` parameter is defined, it should -/// represent the current block `hash` and its `parent hash`, if given the -/// function that's returned will assume that `hash` isn't part of the local DB -/// yet, and all searches in the DB will instead reference the parent. -pub fn is_descendent_of<'a, B, E, Block: BlockT, RA>( - client: &'a Client, - current: Option<(&'a H256, &'a H256)>, -) -> impl Fn(&H256, &H256) -> Result + 'a -where B: Backend, - E: CallExecutor + Send + Sync, -{ - move |base, hash| { - if base == hash { return Ok(false); } - - let mut hash = hash; - if let Some((current_hash, current_parent_hash)) = current { - if base == current_hash { return Ok(false); } - if hash == current_hash { - if base == current_parent_hash { - return Ok(true); - } else { - hash = current_parent_hash; - } - } - } - - let tree_route = client::blockchain::tree_route( - #[allow(deprecated)] - client.backend().blockchain(), - BlockId::Hash(*hash), - BlockId::Hash(*base), - )?; - - Ok(tree_route.common_block().hash == *base) - } -} diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 8e1efaed6b..b16bf83576 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -25,6 +25,7 @@ use client::{blockchain, CallExecutor, Client}; use client::blockchain::HeaderBackend; use client::backend::Backend; use client::runtime_api::ApiExt; +use client::utils::is_descendent_of; use consensus_common::{ BlockImport, Error as ConsensusError, BlockImportParams, ImportResult, JustificationImport, well_known_cache_keys, @@ -42,7 +43,7 @@ use substrate_primitives::{H256, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; use crate::consensus_changes::SharedConsensusChanges; -use crate::environment::{finalize_block, is_descendent_of}; +use crate::environment::finalize_block; use crate::justification::GrandpaJustification; /// A block-import handler for GRANDPA. diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs index 3cc4b8243c..e4e1c35599 100644 --- a/core/network/src/protocol/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -1189,4 +1189,3 @@ fn peer_block_request( None } } - diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index 6fa155437b..fec6015835 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -104,7 +104,7 @@ fn calling_with_both_strategy_and_fail_on_native_should_work() { #[test] -fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { +fn calling_with_native_else_wasm_and_fail_on_wasm_should_work() { let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index d14d324006..873c1eb624 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -25,6 +25,9 @@ trie-db = { version = "0.14.0", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../offchain/primitives", default-features = false} executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" +srml-babe = { path = "../../srml/babe", default-features = false } +srml-timestamp = { path = "../../srml/timestamp", default-features = false } +srml-system = { path = "../../srml/system", default-features = false } [dev-dependencies] substrate-executor = { path = "../executor" } @@ -58,4 +61,7 @@ std = [ "trie-db/std", "offchain-primitives/std", "executive/std", + "srml-babe/std", + "srml-timestamp/std", + "srml-system/std", ] diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index df30832f12..c40b551a3e 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -39,7 +39,7 @@ use runtime_primitives::{ transaction_validity::{TransactionValidity, ValidTransaction}, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, - GetNodeBlockType, GetRuntimeBlockType, Verify + GetNodeBlockType, GetRuntimeBlockType, Verify, IdentityLookup }, }; use runtime_version::RuntimeVersion; @@ -47,10 +47,10 @@ pub use primitives::hash::H256; use primitives::{sr25519, OpaqueMetadata}; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; +use runtime_support::{impl_outer_origin, parameter_types}; use inherents::{CheckInherentsResult, InherentData}; use cfg_if::cfg_if; pub use consensus_babe::AuthorityId; - // Ensure Babe and Aura use the same crypto to simplify things a bit. pub type AuraId = AuthorityId; // Ensure Babe and Aura use the same crypto to simplify things a bit. @@ -301,6 +301,7 @@ cfg_if! { } } +#[derive(Clone, Eq, PartialEq)] pub struct Runtime; impl GetNodeBlockType for Runtime { @@ -311,6 +312,46 @@ impl GetRuntimeBlockType for Runtime { type RuntimeBlock = Block; } +impl_outer_origin!{ + pub enum Origin for Runtime where system = srml_system {} +} + +#[derive(Clone, Encode, Decode, Eq, PartialEq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Event; + +impl From for Event { + fn from(_evt: srml_system::Event) -> Self { + unimplemented!("Not required in tests!") + } +} + +parameter_types! { + pub const BlockHashCount: BlockNumber = 250; + pub const MinimumPeriod: u64 = 5; +} + +impl srml_system::Trait for Runtime { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type WeightMultiplierUpdate = (); + type BlockHashCount = BlockHashCount; +} + +impl srml_timestamp::Trait for Runtime { + /// A timestamp: seconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; +} + /// Adds one to the given input and returns the final result. #[inline(never)] fn benchmark_add_one(i: u64) -> u64 { @@ -477,13 +518,23 @@ cfg_if! { impl consensus_babe::BabeApi for Runtime { fn startup_data() -> consensus_babe::BabeConfiguration { consensus_babe::BabeConfiguration { - slot_duration: 1, + median_required_blocks: 0, + slot_duration: 3, expected_block_time: 1, - threshold: std::u64::MAX, - median_required_blocks: 100, + threshold: core::u64::MAX, + slots_per_epoch: 6, + } + } + fn epoch() -> consensus_babe::Epoch { + let authorities = system::authorities(); + let authorities: Vec<_> = authorities.into_iter().map(|x|(x, 1)).collect(); + consensus_babe::Epoch { + authorities, + randomness: >::randomness(), + epoch_index: 1, + duration: 6, } } - fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -626,9 +677,20 @@ cfg_if! { slot_duration: 1, expected_block_time: 1, threshold: core::u64::MAX, + slots_per_epoch: 6, + } + } + + fn epoch() -> consensus_babe::Epoch { + let authorities = system::authorities(); + let authorities: Vec<_> = authorities.into_iter().map(|x|(x, 1)).collect(); + consensus_babe::Epoch { + authorities, + randomness: >::randomness(), + epoch_index: 1, + duration: 6, } } - fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { diff --git a/core/utils/fork-tree/src/lib.rs b/core/utils/fork-tree/src/lib.rs index 7a2e2f422a..d202ba6c84 100644 --- a/core/utils/fork-tree/src/lib.rs +++ b/core/utils/fork-tree/src/lib.rs @@ -81,6 +81,62 @@ pub struct ForkTree { best_finalized_number: Option, } +impl ForkTree where + H: PartialEq + Clone, + N: Ord + Clone, + V: Clone, +{ + /// Prune all nodes that are not descendents of `hash` according to + /// `is_descendent_of`. The given function `is_descendent_of` should return + /// `true` if the second hash (target) is a descendent of the first hash + /// (base). After pruning the tree it should have one or zero roots. The + /// number and order of calls to `is_descendent_of` is unspecified and + /// subject to change. + pub fn prune( + &mut self, + hash: &H, + number: N, + is_descendent_of: &F + ) -> Result<(), Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result + { + let mut new_root = None; + for node in self.node_iter() { + // if the node has a lower number than the one being finalized then + // we only keep if it has no children and the finalized block is a + // descendent of this node + if node.number < number { + if !node.children.is_empty() || !is_descendent_of(&node.hash, hash)? { + continue; + } + } + + // if the node has the same number as the finalized block then it + // must have the same hash + if node.number == number && node.hash != *hash { + continue; + } + + // if the node has a higher number then we keep it if it is a + // descendent of the finalized block + if node.number > number && !is_descendent_of(hash, &node.hash)? { + continue; + } + + new_root = Some(node); + break; + } + + if let Some(root) = new_root { + self.roots = vec![root.clone()]; + } + + Ok(()) + } + +} + impl ForkTree where H: PartialEq, N: Ord, @@ -152,6 +208,34 @@ impl ForkTree where self.node_iter().map(|node| (&node.hash, &node.number, &node.data)) } + /// Find a node in the tree that is the lowest ancestor of the given + /// block hash and which passes the given predicate. The given function + /// `is_descendent_of` should return `true` if the second hash (target) + /// is a descendent of the first hash (base). + pub fn find_node_where( + &self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>, Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + // search for node starting from all roots + for root in self.roots.iter() { + let node = root.find_node_where(hash, number, is_descendent_of, predicate)?; + + // found the node, early exit + if node.is_some() { + return Ok(node); + } + } + + Ok(None) + } + /// Finalize a root in the tree and return it, return `None` in case no root /// with the given hash exists. All other roots are pruned, and the children /// of the finalized node become the new roots. @@ -167,7 +251,7 @@ impl ForkTree where } /// Finalize a node in the tree. This method will make sure that the node - /// being finalized is either an existing root (an return its data), or a + /// being finalized is either an existing root (and return its data), or a /// node from a competing branch (not in the tree), tree pruning is done /// accordingly. The given function `is_descendent_of` should return `true` /// if the second hash (target) is a descendent of the first hash (base). @@ -400,6 +484,49 @@ mod node_implementation { Ok(Some((hash, number, data))) } } + + /// Find a node in the tree that is the lowest ancestor of the given + /// block hash and which passes the given predicate. The given function + /// `is_descendent_of` should return `true` if the second hash (target) + /// is a descendent of the first hash (base). + // FIXME: it would be useful if this returned a mutable reference but + // rustc can't deal with lifetimes properly. an option would be to try + // an iterative definition instead. + pub fn find_node_where( + &self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>, Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + // stop searching this branch + if *number < self.number { + return Ok(None); + } + + // continue depth-first search through all children + for node in self.children.iter() { + let node = node.find_node_where(hash, number, is_descendent_of, predicate)?; + + // found node, early exit + if node.is_some() { + return Ok(node); + } + } + + // node not found in any of the descendents, if the node we're + // searching for is a descendent of this node and it passes the + // predicate, then it is this one. + if predicate(&self.data) && is_descendent_of(&self.hash, hash)? { + Ok(Some(self)) + } else { + Ok(None) + } + } } } @@ -870,4 +997,40 @@ mod test { ); } } + + #[test] + fn find_node_works() { + let (tree, is_descendent_of) = test_fork_tree(); + + let node = tree.find_node_where( + &"D", + &4, + &is_descendent_of, + &|_| true, + ).unwrap().unwrap(); + + assert_eq!(node.hash, "C"); + assert_eq!(node.number, 3); + } + + #[test] + fn prune_works() { + let (mut tree, is_descendent_of) = test_fork_tree(); + + tree.prune( + &"C", + 3, + &is_descendent_of, + ).unwrap(); + + assert_eq!( + tree.roots.iter().map(|node| node.hash).collect::>(), + vec!["C"], + ); + + assert_eq!( + tree.iter().map(|(hash, _, _)| *hash).collect::>(), + vec!["C", "D", "E"], + ); + } } diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index da00f25476..a0f7ad6242 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -188,7 +188,7 @@ impl Module { impl session::OneSessionHandler for Module { type Key = T::AuthorityId; - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued_validators: I) where I: Iterator { // instant changes diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index e8dc183b54..7922c1dfe7 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -11,6 +11,7 @@ serde = { version = "1.0.93", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +staking = { package = "srml-staking", path = "../staking", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } @@ -37,4 +38,5 @@ std = [ "babe-primitives/std", "session/std", "runtime_io/std", + "staking/std", ] diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index 8c7045675f..577bda8c01 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -23,26 +23,22 @@ pub use timestamp; use rstd::{result, prelude::*}; use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get}; use timestamp::{OnTimestampSet, Trait}; -use primitives::{ - generic::DigestItem, - traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon} -}; -use primitives::ConsensusEngineId; +use primitives::{generic::DigestItem, ConsensusEngineId}; +use primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; -use babe_primitives::{BABE_ENGINE_ID, ConsensusLog}; -pub use babe_primitives::{AuthorityId, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH, PUBLIC_KEY_LENGTH}; +use babe_primitives::{BABE_ENGINE_ID, ConsensusLog, Weight, Epoch, RawBabePreDigest}; +pub use babe_primitives::{AuthorityId, VRF_OUTPUT_LENGTH, PUBLIC_KEY_LENGTH}; /// The BABE inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; /// The type of the BABE inherent. pub type InherentType = u64; - /// Auxiliary trait to extract BABE inherent data. pub trait BabeInherentData { /// Get BABE inherent data. @@ -101,8 +97,8 @@ impl ProvideInherentData for InherentDataProvider { inherent_data: &mut InherentData, ) -> result::Result<(), RuntimeString> { let timestamp = inherent_data.timestamp_inherent_data()?; - let slot_num = timestamp / self.slot_duration; - inherent_data.put_data(INHERENT_IDENTIFIER, &slot_num) + let slot_number = timestamp / self.slot_duration; + inherent_data.put_data(INHERENT_IDENTIFIER, &slot_number) } fn error_to_string(&self, error: &[u8]) -> Option { @@ -115,13 +111,15 @@ pub const RANDOMNESS_LENGTH: usize = 32; decl_storage! { trait Store for Module as Babe { - /// The last timestamp. - LastTimestamp get(last): T::Moment; + NextRandomness: [u8; RANDOMNESS_LENGTH]; + + /// Randomness under construction + UnderConstruction: [u8; VRF_OUTPUT_LENGTH]; - /// The current authorities set. - Authorities get(authorities): Vec; + /// Current epoch + pub Authorities get(authorities) config(): Vec<(AuthorityId, Weight)>; - /// The epoch randomness. + /// The epoch randomness for the *current* epoch. /// /// # Security /// @@ -131,16 +129,10 @@ decl_storage! { /// (like everything else on-chain) it is public. For example, it can be /// used where a number is needed that cannot have been chosen by an /// adversary, for purposes such as public-coin zero-knowledge proofs. - EpochRandomness get(epoch_randomness): [u8; VRF_OUTPUT_LENGTH]; - - /// The randomness under construction - UnderConstruction: [u8; VRF_OUTPUT_LENGTH]; - - /// The randomness for the next epoch - NextEpochRandomness: [u8; VRF_OUTPUT_LENGTH]; + pub Randomness get(randomness): [u8; RANDOMNESS_LENGTH]; - /// The current epoch - EpochIndex get(epoch_index): u64; + /// Current epoch index + EpochIndex: u64; } } @@ -154,11 +146,13 @@ decl_module! { .iter() .filter_map(|s| s.as_pre_runtime()) .filter_map(|(id, mut data)| if id == BABE_ENGINE_ID { - <[u8; VRF_OUTPUT_LENGTH]>::decode(&mut data) + RawBabePreDigest::decode(&mut data) } else { None }) { - Self::deposit_vrf_output(&i); + + Self::deposit_vrf_output(&i.vrf_output); + return; } } } @@ -166,7 +160,7 @@ decl_module! { impl RandomnessBeacon for Module { fn random() -> [u8; VRF_OUTPUT_LENGTH] { - Self::epoch_randomness() + Self::randomness() } } @@ -179,15 +173,10 @@ impl FindAuthor for Module { { for (id, mut data) in digests.into_iter() { if id == BABE_ENGINE_ID { - let (_, _, i): ( - [u8; VRF_OUTPUT_LENGTH], - [u8; VRF_PROOF_LENGTH], - u64, - ) = Decode::decode(&mut data)?; - return Some(i) + return Some(RawBabePreDigest::decode(&mut data)?.authority_index); } } - return None + return None; } } @@ -195,7 +184,7 @@ impl IsMember for Module { fn is_member(authority_id: &AuthorityId) -> bool { >::authorities() .iter() - .any(|id| id == authority_id) + .any(|id| &id.0 == authority_id) } } @@ -207,65 +196,97 @@ impl Module { ::MinimumPeriod::get().saturating_mul(2.into()) } - fn change_authorities(new: Vec) { - Authorities::put(&new); - + fn deposit_consensus(new: U) { let log: DigestItem = DigestItem::Consensus(BABE_ENGINE_ID, new.encode()); - >::deposit_log(log.into()); + >::deposit_log(log.into()) + } + + fn get_inherent_digests() -> system::DigestOf { + >::digest() + } + + fn change_epoch(new: Epoch) { + Authorities::put(&new.authorities); + Randomness::put(&new.randomness); + Self::deposit_consensus(ConsensusLog::NextEpochData(new)) } fn deposit_vrf_output(vrf_output: &[u8; VRF_OUTPUT_LENGTH]) { UnderConstruction::mutate(|z| z.iter_mut().zip(vrf_output).for_each(|(x, y)| *x^=y)) } - fn get_inherent_digests() -> system::DigestOf { - >::digest() + /// Call this function exactly once when an epoch changes, to update the + /// randomness. Returns the new randomness. + fn randomness_change_epoch(epoch_index: u64) -> [u8; RANDOMNESS_LENGTH] { + let this_randomness = NextRandomness::get(); + let next_randomness = compute_randomness( + this_randomness, + epoch_index, + UnderConstruction::get(), + ); + UnderConstruction::put(&[0; RANDOMNESS_LENGTH]); + NextRandomness::put(&next_randomness); + this_randomness } + } impl OnTimestampSet for Module { fn on_timestamp_set(_moment: T::Moment) { } } -impl session::OneSessionHandler for Module { - type Key = AuthorityId; +pub trait Duration { + fn babe_epoch_duration() -> u64; +} - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) +impl session::OneSessionHandler for Module { + type Key = AuthorityId; + fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I, queued_validators: I) where I: Iterator { - // instant changes - if changed { - let next_authorities = validators.map(|(_, k)| k).collect::>(); - let last_authorities = >::authorities(); - if next_authorities != last_authorities { - Self::change_authorities(next_authorities); - } - } + use staking::BalanceOf; + let to_votes = |b: BalanceOf| { + , u64>>::convert(b) + }; - let rho = UnderConstruction::get(); - UnderConstruction::put([0; 32]); - let last_epoch_randomness = EpochRandomness::get(); let epoch_index = EpochIndex::get() .checked_add(1) .expect("epoch indices will never reach 2^64 before the death of the universe; qed"); + EpochIndex::put(epoch_index); - EpochRandomness::put(NextEpochRandomness::get()); - let mut s = [0; 72]; - s[..32].copy_from_slice(&last_epoch_randomness); - s[32..40].copy_from_slice(&epoch_index.to_le_bytes()); - s[40..].copy_from_slice(&rho); - NextEpochRandomness::put(runtime_io::blake2_256(&s)) + + // *Next* epoch's authorities. + let authorities = queued_validators.map(|(account, k)| { + (k, to_votes(staking::Module::::stakers(account).total)) + }).collect::>(); + + // What was the next epoch is now the current epoch + let randomness = Self::randomness_change_epoch(epoch_index); + Self::change_epoch(Epoch { + randomness, + authorities, + epoch_index, + duration: T::babe_epoch_duration(), + }) } fn on_disabled(i: usize) { - let log: DigestItem = DigestItem::Consensus( - BABE_ENGINE_ID, - ConsensusLog::OnDisabled(i as u64).encode(), - ); - >::deposit_log(log.into()); + Self::deposit_consensus(ConsensusLog::OnDisabled(i as u64)) } } +fn compute_randomness( + last_epoch_randomness: [u8; RANDOMNESS_LENGTH], + epoch_index: u64, + rho: [u8; VRF_OUTPUT_LENGTH], +) -> [u8; RANDOMNESS_LENGTH] { + let mut s = [0; 40 + VRF_OUTPUT_LENGTH]; + s[..32].copy_from_slice(&last_epoch_randomness); + s[32..40].copy_from_slice(&epoch_index.to_le_bytes()); + s[40..].copy_from_slice(&rho); + runtime_io::blake2_256(&s) +} + impl ProvideInherent for Module { type Call = timestamp::Call; type Error = MakeFatalError; @@ -286,7 +307,7 @@ impl ProvideInherent for Module { if timestamp_based_slot == seal_slot { Ok(()) } else { - Err(RuntimeString::from("timestamp set in block doesn’t match slot in seal").into()) + Err(RuntimeString::from("timestamp set in block doesn't match slot in seal").into()) } } } diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index a62f5652d4..9615953e67 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -346,7 +346,7 @@ impl Module { impl session::OneSessionHandler for Module { type Key = AuthorityId; - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued_validators: I) where I: Iterator { // instant changes diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 3ed3d1d7c0..f1868c599b 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -356,7 +356,7 @@ impl Module { impl session::OneSessionHandler for Module { type Key = ::AuthorityId; - fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I) { + fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I, _next_validators: I) { Self::new_session(); } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 546513c953..5495cdbe65 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -186,7 +186,11 @@ impl OnSessionEnding for () { /// Handler for when a session keys set changes. pub trait SessionHandler { /// Session set has changed; act appropriately. - fn on_new_session(changed: bool, validators: &[(ValidatorId, Ks)]); + fn on_new_session( + changed: bool, + validators: &[(ValidatorId, Ks)], + queued_validators: &[(ValidatorId, Ks)], + ); /// A validator got disabled. Act accordingly until a new session begins. fn on_disabled(validator_index: usize); @@ -197,7 +201,7 @@ pub trait OneSessionHandler { /// The key type expected. type Key: Decode + Default + TypedKey; - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued_validators: I) where I: Iterator, ValidatorId: 'a; fn on_disabled(i: usize); } @@ -205,19 +209,26 @@ pub trait OneSessionHandler { macro_rules! impl_session_handlers { () => ( impl SessionHandler for () { - fn on_new_session(_: bool, _: &[(AId, Ks)]) {} + fn on_new_session(_: bool, _: &[(AId, Ks)], _: &[(AId, Ks)]) {} fn on_disabled(_: usize) {} } ); ( $($t:ident)* ) => { impl ),*> SessionHandler for ( $( $t , )* ) { - fn on_new_session(changed: bool, validators: &[(AId, Ks)]) { + fn on_new_session( + changed: bool, + validators: &[(AId, Ks)], + queued_validators: &[(AId, Ks)], + ) { $( - let our_keys = validators.iter() + let our_keys: Box> = Box::new(validators.iter() + .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as TypedKey>::KEY_TYPE) + .unwrap_or_default()))); + let queued_keys: Box> = Box::new(queued_validators.iter() .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as TypedKey>::KEY_TYPE) - .unwrap_or_default())); - $t::on_new_session(changed, our_keys); + .unwrap_or_default()))); + $t::on_new_session(changed, our_keys, queued_keys); )* } fn on_disabled(i: usize) { @@ -420,14 +431,14 @@ impl Module { .map(|a| { let k = Self::load_keys(&a).unwrap_or_default(); (a, k) }) .collect::>(); - >::put(queued_amalgamated); + >::put(queued_amalgamated.clone()); QueuedChanged::put(next_changed); // Record that this happened. Self::deposit_event(Event::NewSession(session_index)); // Tell everyone about the new session keys. - T::SessionHandler::on_new_session::(changed, &session_keys); + T::SessionHandler::on_new_session::(changed, &session_keys, &queued_amalgamated); } /// Disable the validator of index `i`. diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index c469993bcf..b5cb7e4278 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -50,7 +50,11 @@ impl ShouldEndSession for TestShouldEndSession { pub struct TestSessionHandler; impl SessionHandler for TestSessionHandler { - fn on_new_session(changed: bool, validators: &[(u64, T)]) { + fn on_new_session( + changed: bool, + validators: &[(u64, T)], + _queued_validators: &[(u64, T)], + ) { SESSION_CHANGED.with(|l| *l.borrow_mut() = changed); AUTHORITIES.with(|l| *l.borrow_mut() = validators.iter().map(|(_, id)| id.get::(0).unwrap_or_default()).collect() diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 788b46731f..c72aa36e8b 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -429,7 +429,7 @@ pub struct Exposure { pub others: Vec>, } -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; type PositiveImbalanceOf = <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 329bdcda2c..f0151bf915 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -51,7 +51,11 @@ thread_local! { pub struct TestSessionHandler; impl session::SessionHandler for TestSessionHandler { - fn on_new_session(_changed: bool, validators: &[(AccountId, Ks)]) { + fn on_new_session( + _changed: bool, + validators: &[(AccountId, Ks)], + _queued_validators: &[(AccountId, Ks)], + ) { SESSION.with(|x| *x.borrow_mut() = (validators.iter().map(|x| x.0.clone()).collect(), HashSet::new()) ); diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index 15aeb3b548..0f4c453ee8 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -20,7 +20,7 @@ use srml_support::{decl_module, decl_event, impl_outer_origin, impl_outer_event} use runtime_io::{with_externalities, Blake2Hasher}; use substrate_primitives::H256; use primitives::{ - BuildStorage, traits::{BlakeTwo256, IdentityLookup}, + traits::{BlakeTwo256, IdentityLookup}, testing::Header, }; @@ -54,6 +54,9 @@ impl_outer_event! { } } +srml_support::parameter_types! { + pub const BlockHashCount: u64 = 250; +} #[derive(Clone, Eq, PartialEq)] pub struct Runtime; impl system::Trait for Runtime { @@ -67,6 +70,7 @@ impl system::Trait for Runtime { type Header = Header; type WeightMultiplierUpdate = (); type Event = Event; + type BlockHashCount = BlockHashCount; } impl module::Trait for Runtime { @@ -74,7 +78,7 @@ impl module::Trait for Runtime { } fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::::default().build_storage().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().0.into() } fn deposit_events(n: usize) { -- GitLab From f5067f1c34bdcea007452e4404fad4d36df17732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 23 Jul 2019 10:51:00 +0200 Subject: [PATCH 018/151] Export `VOTER_SET_SIZE` and `APPROVAL_SET_SIZE` in srml elections (#3173) * Export `VOTER_SET_SIZE` and `APPROVAL_SET_SIZE` in srml elections * Fix compilation --- srml/elections/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 0f2bf3df12..9960ef22b7 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -300,6 +300,11 @@ decl_module! { /// approval voting). A reasonable default value is 24. const DecayRatio: u32 = T::DecayRatio::get(); + /// The chunk size of the voter vector. + const VOTER_SET_SIZE: u32 = VOTER_SET_SIZE as u32; + /// The chunk size of the approval vector. + const APPROVAL_SET_SIZE: u32 = APPROVAL_SET_SIZE as u32; + fn deposit_event() = default; /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots -- GitLab From edd88f4dfa641d25e8d76a913a16519ff0570ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 23 Jul 2019 10:59:01 +0200 Subject: [PATCH 019/151] Run each offchain worker in a separate thread. (#3169) * Run each offchain worker in a separate thread. * Start a thread only on supported targets. * Flip conditions. * Remove platform-specific code. --- core/offchain/src/lib.rs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index e187bbc0e3..d4947e271f 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -128,9 +128,9 @@ impl OffchainWorkers< Block, > where Block: traits::Block, - Client: ProvideRuntimeApi, + Client: ProvideRuntimeApi + Send + Sync + 'static, Client::Api: OffchainWorkerApi, - KeyProvider: AuthorityKeyProvider, + KeyProvider: AuthorityKeyProvider + Send, Storage: client::backend::OffchainStorage + 'static, { /// Start the offchain workers after given block. @@ -157,9 +157,22 @@ impl OffchainWorkers< at.clone(), network_state.clone(), ); - debug!("Running offchain workers at {:?}", at); - let api = Box::new(api); - runtime.offchain_worker_with_context(&at, ExecutionContext::OffchainWorker(api), *number).unwrap(); + debug!("Spawning offchain workers at {:?}", at); + let number = *number; + let client = self.client.clone(); + spawn_worker(move || { + let runtime = client.runtime_api(); + let api = Box::new(api); + debug!("Running offchain workers at {:?}", at); + let run = runtime.offchain_worker_with_context( + &at, + ExecutionContext::OffchainWorker(api), + number + ); + if let Err(e) = run { + log::error!("Error running offchain workers at {:?}: {:?}", at, e); + } + }); futures::future::Either::A(runner.process()) } else { futures::future::Either::B(futures::future::ok(())) @@ -167,6 +180,19 @@ impl OffchainWorkers< } } +/// Spawns a new offchain worker. +/// +/// We spawn offchain workers for each block in a separate thread, +/// since they can run for a significant amount of time +/// in a blocking fashion and we don't want to block the runtime. +/// +/// Note that we should avoid that if we switch to future-based runtime in the future, +/// alternatively: +/// TODO [ToDr] (#1458) we can consider using a thread pool instead. +fn spawn_worker(f: impl FnOnce() -> () + Send + 'static) { + std::thread::spawn(f); +} + #[cfg(test)] mod tests { use super::*; -- GitLab From 0671a41b31b596686a41be6d338108a62de4e0af Mon Sep 17 00:00:00 2001 From: Gautam Dhameja Date: Tue, 23 Jul 2019 10:59:37 +0200 Subject: [PATCH 020/151] sleep_until off-chain API (#3164) * sleep_until Offchain API * addressed review comments --- core/offchain/src/api.rs | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 2598945dca..949602f3f7 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -18,7 +18,8 @@ use std::{ str::FromStr, sync::Arc, convert::{TryFrom, TryInto}, - time::SystemTime + time::{SystemTime, Duration}, + thread::sleep, }; use client::backend::OffchainStorage; use crate::AuthorityKeyProvider; @@ -26,7 +27,8 @@ use futures::{Stream, Future, sync::mpsc}; use log::{info, debug, warn, error}; use parity_codec::{Encode, Decode}; use primitives::offchain::{ - Timestamp, HttpRequestId, HttpRequestStatus, HttpError, + Timestamp, + HttpRequestId, HttpRequestStatus, HttpError, Externalities as OffchainExt, CryptoKind, CryptoKey, StorageKind, @@ -329,8 +331,13 @@ where } } - fn sleep_until(&mut self, _deadline: Timestamp) { - unavailable_yet::<()>("sleep_until") + fn sleep_until(&mut self, deadline: Timestamp) { + // Get current timestamp. + let now = self.timestamp(); + // Calculate the diff with the deadline. + let diff = deadline.diff(&now); + // Call thread::sleep for the diff duration. + sleep(Duration::from_millis(diff.millis())); } fn random_seed(&mut self) -> [u8; 32] { @@ -608,6 +615,24 @@ mod tests { assert_eq!(timestamp.unix_millis(), d); } + #[test] + fn should_sleep() { + let mut api = offchain_api().0; + + // Arrange. + let now = api.timestamp(); + let delta = primitives::offchain::Duration::from_millis(100); + let deadline = now.add(delta); + + // Act. + api.sleep_until(deadline); + let new_now = api.timestamp(); + + // Assert. + // The diff could be more than the sleep duration. + assert!(new_now.unix_millis() - 100 >= now.unix_millis()); + } + #[test] fn should_set_and_get_local_storage() { // given -- GitLab From 5ef22246ae1dc7d9d9fbef84d167c9beee1d2d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 23 Jul 2019 12:10:00 +0200 Subject: [PATCH 021/151] Fix test-runtime build (#3176) * Fix test-runtime build * Fix build --- core/test-runtime/src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index c40b551a3e..13b8a9eac8 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -329,6 +329,8 @@ impl From for Event { parameter_types! { pub const BlockHashCount: BlockNumber = 250; pub const MinimumPeriod: u64 = 5; + pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; } impl srml_system::Trait for Runtime { @@ -343,6 +345,8 @@ impl srml_system::Trait for Runtime { type Event = Event; type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl srml_timestamp::Trait for Runtime { -- GitLab From 75521d509e746c1551df8613d8bd184859f156a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 23 Jul 2019 13:57:32 +0200 Subject: [PATCH 022/151] Bkchr check all benches (#3180) * Make sure CI checks all benchmarks * Fix babe --- .gitlab-ci.yml | 2 +- README.adoc | 2 +- core/consensus/babe/src/tests.rs | 2 +- srml/system/benches/bench.rs | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 916dcb7b96..832b754162 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -95,7 +95,7 @@ cargo-check-benches: stage: test <<: *docker-env script: - - BUILD_DUMMY_WASM_BINARY=1 time cargo check --benches + - BUILD_DUMMY_WASM_BINARY=1 time cargo check --benches --all - sccache -s diff --git a/README.adoc b/README.adoc index fd929e87a2..89c042bb32 100644 --- a/README.adoc +++ b/README.adoc @@ -308,7 +308,7 @@ cargo run --release \-- \ Additional Substrate CLI usage options are available and may be shown by running `cargo run \-- --help`. -== WASM binaries +=== WASM binaries The WASM binaries are built during the normal `cargo build` process. To control the WASM binary building, we support multiple environment variables: diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index 4054fb9306..17864142db 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -233,7 +233,7 @@ fn run_one_test() { let wait_for = futures::future::join_all(import_notifications); let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } #[test] diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index 0f4c453ee8..5ff63baa1c 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -56,6 +56,8 @@ impl_outer_event! { srml_support::parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; } #[derive(Clone, Eq, PartialEq)] pub struct Runtime; @@ -71,6 +73,8 @@ impl system::Trait for Runtime { type WeightMultiplierUpdate = (); type Event = Event; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; } impl module::Trait for Runtime { -- GitLab From 8cbfc10a28aafb6aec5487eebca16116f45bbf84 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 23 Jul 2019 14:03:21 +0200 Subject: [PATCH 023/151] Fix mDNS not working (#3181) * Fix mDNS not working * Fix WASM build --- core/network/src/discovery.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/network/src/discovery.rs b/core/network/src/discovery.rs index 87aa966e10..e256f8490d 100644 --- a/core/network/src/discovery.rs +++ b/core/network/src/discovery.rs @@ -202,6 +202,8 @@ where .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) .collect::>(); list.extend(self.kademlia.addresses_of_peer(peer_id)); + #[cfg(not(target_os = "unknown"))] + list.extend(self.mdns.addresses_of_peer(peer_id)); trace!(target: "sub-libp2p", "Addresses of {:?} are {:?}", peer_id, list); if list.is_empty() { if self.kademlia.kbuckets_entries().any(|p| p == peer_id) { -- GitLab From 869f0e8c4e9f6359a968e8162ca881a50838d187 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 24 Jul 2019 06:43:50 +0200 Subject: [PATCH 024/151] Report to the PSM when a severe protocol error happens (#3161) --- core/network/src/custom_proto/behaviour.rs | 5 +++++ core/peerset/src/lib.rs | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs index e54f5910e3..50aed1cfca 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -930,6 +930,11 @@ where CustomProtoHandlerOut::ProtocolError { error, .. } => { debug!(target: "sub-libp2p", "Handler({:?}) => Severe protocol error: {:?}", source, error); + // A severe protocol error happens when we detect a "bad" node, such as a node on + // a different chain, or a node that doesn't speak the same protocol(s). We + // decrease the node's reputation, hence lowering the chances we try this node + // again in the short term. + self.peerset.report_peer(source.clone(), i32::min_value()); self.disconnect_peer_inner(&source, Some(Duration::from_secs(5))); } } diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index 763c94d0d6..c7c7850f16 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -20,7 +20,7 @@ mod peersstate; use std::{collections::{HashSet, HashMap}, collections::VecDeque, time::Instant}; -use futures::{prelude::*, channel::mpsc, stream::Fuse}; +use futures::{prelude::*, channel::mpsc}; use libp2p::PeerId; use log::{debug, error, trace}; use serde_json::json; @@ -156,7 +156,11 @@ pub struct Peerset { data: peersstate::PeersState, /// If true, we only accept reserved nodes. reserved_only: bool, - rx: Fuse>, + /// Receiver for messages from the `PeersetHandle` and from `tx`. + rx: mpsc::UnboundedReceiver, + /// Sending side of `rx`. + tx: mpsc::UnboundedSender, + /// Queue of messages to be emitted when the `Peerset` is polled. message_queue: VecDeque, /// When the `Peerset` was created. created: Instant, @@ -170,12 +174,13 @@ impl Peerset { let (tx, rx) = mpsc::unbounded(); let handle = PeersetHandle { - tx, + tx: tx.clone(), }; let mut peerset = Peerset { data: peersstate::PeersState::new(config.in_peers, config.out_peers), - rx: rx.fuse(), + tx, + rx, reserved_only: config.reserved_only, message_queue: VecDeque::new(), created: Instant::now(), @@ -424,6 +429,14 @@ impl Peerset { } } + /// Reports an adjustment to the reputation of the given peer. + pub fn report_peer(&mut self, peer_id: PeerId, score_diff: i32) { + // We don't immediately perform the adjustments in order to have state consistency. We + // don't want the reporting here to take priority over messages sent using the + // `PeersetHandle`. + let _ = self.tx.unbounded_send(Action::ReportPeer(peer_id, score_diff)); + } + /// Produces a JSON object containing the state of the peerset manager, for debugging purposes. pub fn debug_info(&mut self) -> serde_json::Value { self.update_time(); -- GitLab From 8c1ed555bfb2bcbe5abe4e901c3a6a1796b273ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 24 Jul 2019 10:40:04 +0200 Subject: [PATCH 025/151] Switch `srml-session` keys to `decl_storage!` (#3184) * Switch `srml-session` keys to `decl_storage!` * Expose `DEDUP_KEY_PREFIX` in constants * Fix test * Bump spec version --- node/runtime/src/lib.rs | 4 +- srml/generic-asset/src/lib.rs | 8 +- srml/im-online/src/lib.rs | 14 +- srml/session/src/lib.rs | 56 +++--- srml/support/procedural/src/lib.rs | 2 +- srml/support/procedural/src/storage/impls.rs | 69 +++++-- .../procedural/src/storage/transformation.rs | 10 +- srml/support/src/double_map.rs | 4 +- srml/support/src/lib.rs | 42 ++--- srml/support/src/storage/mod.rs | 177 ++++++++++++------ .../support/src/storage/unhashed/generator.rs | 96 ++++++++-- srml/support/src/storage/unhashed/mod.rs | 2 +- srml/support/test/tests/final_keys.rs | 20 +- srml/support/test/tests/instance.rs | 36 ++-- 14 files changed, 352 insertions(+), 188 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 71af5d9417..2b8750d2de 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -75,8 +75,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 117, - impl_version: 117, + spec_version: 118, + impl_version: 118, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 884f4e9b9b..60947e68eb 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -336,7 +336,7 @@ decl_module! { >::put(next_id); >::insert(id, &options.initial_issuance); - >::insert(&id, &origin, options.initial_issuance); + >::insert(&id, &origin, &options.initial_issuance); >::insert(&id, permissions); Self::deposit_event(RawEvent::Created(id, origin, options)); @@ -560,7 +560,7 @@ impl Module { let permissions: PermissionVersions = options.permissions.clone().into(); >::insert(asset_id, &options.initial_issuance); - >::insert(&asset_id, &account_id, options.initial_issuance); + >::insert(&asset_id, &account_id, &options.initial_issuance); >::insert(&asset_id, permissions); Self::deposit_event(RawEvent::Created(asset_id, account_id, options)); @@ -768,13 +768,13 @@ impl Module { /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. fn set_reserved_balance(asset_id: &T::AssetId, who: &T::AccountId, balance: T::Balance) { - >::insert(asset_id, who, balance); + >::insert(asset_id, who, &balance); } /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. fn set_free_balance(asset_id: &T::AssetId, who: &T::AccountId, balance: T::Balance) { - >::insert(asset_id, who, balance); + >::insert(asset_id, who, &balance); } fn set_lock( diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index f1868c599b..e2b23f1dbd 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -200,13 +200,13 @@ decl_module! { ensure_none(origin)?; let current_session = >::current_index(); - let exists = >::exists(current_session, &heartbeat.authority_id); + let exists = >::exists(¤t_session, &heartbeat.authority_id); if !exists { let now = >::block_number(); Self::deposit_event(RawEvent::HeartbeatReceived(now, heartbeat.authority_id.clone())); let network_state = heartbeat.network_state.encode(); - >::insert(current_session, &heartbeat.authority_id, network_state); + >::insert(¤t_session, &heartbeat.authority_id, &network_state); } } @@ -301,13 +301,13 @@ impl Module { Some(start) => { // iterate over every session for index in start..curr { - if >::exists(index, authority_id) { + if >::exists(&index, authority_id) { return true; } } false }, - None => >::exists(curr, authority_id), + None => >::exists(&curr, authority_id), } } @@ -315,7 +315,7 @@ impl Module { /// during the current session. Otherwise `false`. pub fn is_online_in_current_session(authority_id: &T::AuthorityId) -> bool { let current_session = >::current_index(); - >::exists(current_session, authority_id) + >::exists(¤t_session, authority_id) } /// Session has just changed. @@ -345,10 +345,10 @@ impl Module { match LastNewEraStart::get() { Some(start) => { for index in start..curr { - >::remove_prefix(index); + >::remove_prefix(&index); } }, - None => >::remove_prefix(curr), + None => >::remove_prefix(&curr), } } } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 5495cdbe65..d425c44e2e 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -120,14 +120,12 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::{prelude::*, marker::PhantomData, ops::{Sub, Rem}}; -use parity_codec::{Decode, Encode}; +use parity_codec::Decode; use primitives::KeyTypeId; -use primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey, Hash}; +use primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey}; use srml_support::{ - dispatch::Result, - storage, - ConsensusEngineId, StorageValue, for_each_tuple, decl_module, - decl_event, decl_storage, + dispatch::Result, ConsensusEngineId, StorageValue, StorageDoubleMap, for_each_tuple, + decl_module, decl_event, decl_storage, }; use srml_support::{ensure, traits::{OnFreeBalanceZero, Get, FindAuthor}, Parameter}; use system::{self, ensure_signed}; @@ -283,8 +281,7 @@ pub trait Trait: system::Trait { type SelectInitialValidators: SelectInitialValidators; } -const DEDUP_KEY_LEN: usize = 13; -const DEDUP_KEY_PREFIX: &[u8; DEDUP_KEY_LEN] = b":session:keys"; +const DEDUP_KEY_PREFIX: &[u8] = b":session:keys"; decl_storage! { trait Store for Module as Session { @@ -304,6 +301,17 @@ decl_storage! { /// will be used to determine the validator's session keys. QueuedKeys get(queued_keys): Vec<(T::ValidatorId, T::Keys)>; + /// The next session keys for a validator. + /// + /// The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of + /// the trie. Having all data in the same branch should prevent slowing down other queries. + NextKeys: double_map hasher(twox_64_concat) Vec, blake2_256(T::ValidatorId) => Option; + + /// The owner of a key. The second key is the `KeyTypeId` + the encoded key. + /// + /// The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of + /// the trie. Having all data in the same branch should prevent slowing down other queries. + KeyOwner: double_map hasher(twox_64_concat) Vec, blake2_256((KeyTypeId, Vec)) => Option; } add_extra_genesis { config(keys): Vec<(T::ValidatorId, T::Keys)>; @@ -354,6 +362,10 @@ decl_event!( decl_module! { pub struct Module for enum Call where origin: T::Origin { + /// Used as first key for `NextKeys` and `KeyOwner` to put all the data into the same branch + /// of the trie. + const DEDUP_KEY_PREFIX: &[u8] = DEDUP_KEY_PREFIX; + fn deposit_event() = default; /// Sets the session key(s) of the function caller to `key`. @@ -494,47 +506,31 @@ impl Module { } } - // Child trie storage. - fn load_keys(v: &T::ValidatorId) -> Option { - storage::unhashed::get(&dedup_trie_key::(v)) + >::get(DEDUP_KEY_PREFIX, v) } fn take_keys(v: &T::ValidatorId) -> Option { - storage::unhashed::take(&dedup_trie_key::(v)) + >::take(DEDUP_KEY_PREFIX, v) } fn put_keys(v: &T::ValidatorId, keys: &T::Keys) { - storage::unhashed::put(&dedup_trie_key::(v), keys) + >::insert(DEDUP_KEY_PREFIX, v, keys); } fn key_owner(id: KeyTypeId, key_data: &[u8]) -> Option { - storage::unhashed::get(&dedup_trie_key::(&(id, key_data))) + >::get(DEDUP_KEY_PREFIX, &(id, key_data.to_vec())) } fn put_key_owner(id: KeyTypeId, key_data: &[u8], v: &T::ValidatorId) { - storage::unhashed::put(&dedup_trie_key::(&(id, key_data)), v); + >::insert(DEDUP_KEY_PREFIX, &(id, key_data.to_vec()), v) } fn clear_key_owner(id: KeyTypeId, key_data: &[u8]) { - storage::unhashed::kill(&dedup_trie_key::(&(id, key_data))); + >::remove(DEDUP_KEY_PREFIX, &(id, key_data.to_vec())); } } -fn dedup_trie_key(key: &K) -> [u8; 32 + DEDUP_KEY_LEN] { - key.using_encoded(|s| { - // take at most 32 bytes from the hash of the value. - let hash = ::Hashing::hash(s); - let hash: &[u8] = hash.as_ref(); - let len = rstd::cmp::min(hash.len(), 32); - - let mut data = [0; 32 + DEDUP_KEY_LEN]; - data[..DEDUP_KEY_LEN].copy_from_slice(DEDUP_KEY_PREFIX); - data[DEDUP_KEY_LEN..][..len].copy_from_slice(hash); - data - }) -} - impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::ValidatorId) { Self::prune_dead_keys(who); diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs index f6da2f751d..78051ee8f2 100644 --- a/srml/support/procedural/src/lib.rs +++ b/srml/support/procedural/src/lib.rs @@ -18,7 +18,7 @@ //! Proc macro of Support code for the runtime. // end::description[] -#![recursion_limit="256"] +#![recursion_limit="512"] extern crate proc_macro; diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index d5dc91635b..45d7fada9f 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -694,13 +694,18 @@ impl<'a, I: Iterator> Impls<'a, I> { let mutate_impl = if !is_option { quote!{ - #as_double_map::insert(key1, key2, &val, storage) + #as_double_map::insert(k1, k2, &val, storage) } } else { quote!{ match val { - Some(ref val) => #as_double_map::insert(key1, key2, &val, storage), - None => #as_double_map::remove(key1, key2, storage), + Some(ref val) => #as_double_map::insert::( + k1, + k2, + val, + storage, + ), + None => #as_double_map::remove(k1, k2, storage), } } }; @@ -751,7 +756,10 @@ impl<'a, I: Iterator> Impls<'a, I> { { type Query = #value_type; - fn prefix_for(k1: &#k1ty) -> Vec { + fn prefix_for(k1: &KArg1) -> #scrate::rstd::vec::Vec where + KArg1: ?Sized + #scrate::codec::Encode, + #k1ty: #scrate::rstd::borrow::Borrow, + { use #scrate::storage::hashed::generator::StorageHasher; let mut key = #as_double_map::prefix().to_vec(); @@ -763,7 +771,15 @@ impl<'a, I: Iterator> Impls<'a, I> { #final_prefix } - fn key_for(k1: &#k1ty, k2: &#k2ty) -> Vec { + fn key_for( + k1: &KArg1, + k2: &KArg2, + ) -> #scrate::rstd::vec::Vec where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, + { use #scrate::storage::hashed::generator::StorageHasher; let mut key = #as_double_map::prefix_for(k1); @@ -771,25 +787,50 @@ impl<'a, I: Iterator> Impls<'a, I> { key } - fn get(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query { - let key = #as_double_map::key_for(key1, key2); + fn get( + k1: &KArg1, + k2: &KArg2, + storage: &S, + ) -> Self::Query where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, + { + let key = #as_double_map::key_for(k1, k2); storage.get(&key).#option_simple_1(|| #fielddefault) } - fn take(key1: &#k1ty, key2: &#k2ty, storage: &mut S) -> Self::Query { - let key = #as_double_map::key_for(key1, key2); + fn take( + k1: &KArg1, + k2: &KArg2, + storage: &mut S, + ) -> Self::Query where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, + { + let key = #as_double_map::key_for(k1, k2); storage.take(&key).#option_simple_1(|| #fielddefault) } - fn mutate(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R - where + fn mutate( + k1: &KArg1, + k2: &KArg2, + f: F, + storage: &mut S, + ) -> R where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, F: FnOnce(&mut Self::Query) -> R, - S: #scrate::UnhashedStorage, { - let mut val = #as_double_map::get(key1, key2, storage); + let mut val = #as_double_map::get(k1, k2, storage); let ret = f(&mut val); - #mutate_impl ; + #mutate_impl; ret } } diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 6f0cf93179..ae0531c57d 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -905,15 +905,17 @@ fn impl_store_fns( }; quote!{ - pub fn #get_fn(k1: KArg1, k2: KArg2) -> #value_type + pub fn #get_fn(k1: &KArg1, k2: &KArg2) -> #value_type where - KArg1: #scrate::rstd::borrow::Borrow<#key1_type>, - KArg2: #scrate::rstd::borrow::Borrow<#key2_type>, + #key1_type: #scrate::rstd::borrow::Borrow, + #key2_type: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, { < #name<#struct_trait #instance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ> - >::get(k1.borrow(), k2.borrow(), &#scrate::storage::RuntimeStorage) + >::get(k1, k2, &#scrate::storage::RuntimeStorage) } } } diff --git a/srml/support/src/double_map.rs b/srml/support/src/double_map.rs index d35570ae4f..aec7f497a6 100644 --- a/srml/support/src/double_map.rs +++ b/srml/support/src/double_map.rs @@ -34,8 +34,8 @@ use sr_std::borrow::Borrow; /// /// Hasher are implemented in derive_key* methods. pub trait StorageDoubleMapWithHasher { - type Key1: Codec; - type Key2: Codec; + type Key1: Encode; + type Key2: Encode; type Value: Codec + Default; const PREFIX: &'static [u8]; diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 361fef969b..e1300c5925 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -387,32 +387,32 @@ mod tests { // get / insert / take let key1 = 17u32; let key2 = 18u32; - assert_eq!(DoubleMap::get(key1, key2), 0u64); - DoubleMap::insert(key1, key2, 4u64); - assert_eq!(DoubleMap::get(key1, key2), 4u64); - assert_eq!(DoubleMap::take(key1, key2), 4u64); - assert_eq!(DoubleMap::get(key1, key2), 0u64); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); + DoubleMap::insert(&key1, &key2, &4u64); + assert_eq!(DoubleMap::get(&key1, &key2), 4u64); + assert_eq!(DoubleMap::take(&key1, &key2), 4u64); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); // mutate - DoubleMap::mutate(key1, key2, |val| { + DoubleMap::mutate(&key1, &key2, |val| { *val = 15; }); - assert_eq!(DoubleMap::get(key1, key2), 15u64); + assert_eq!(DoubleMap::get(&key1, &key2), 15u64); // remove - DoubleMap::remove(key1, key2); - assert_eq!(DoubleMap::get(key1, key2), 0u64); + DoubleMap::remove(&key1, &key2); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); // remove prefix - DoubleMap::insert(key1, key2, 4u64); - DoubleMap::insert(key1, key2+1, 4u64); - DoubleMap::insert(key1+1, key2, 4u64); - DoubleMap::insert(key1+1, key2+1, 4u64); - DoubleMap::remove_prefix(key1); - assert_eq!(DoubleMap::get(key1, key2), 0u64); - assert_eq!(DoubleMap::get(key1, key2+1), 0u64); - assert_eq!(DoubleMap::get(key1+1, key2), 4u64); - assert_eq!(DoubleMap::get(key1+1, key2+1), 4u64); + DoubleMap::insert(&key1, &key2, &4u64); + DoubleMap::insert(&key1, &(key2 + 1), &4u64); + DoubleMap::insert(&(key1 + 1), &key2, &4u64); + DoubleMap::insert(&(key1 + 1), &(key2 + 1), &4u64); + DoubleMap::remove_prefix(&key1); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); + assert_eq!(DoubleMap::get(&key1, &(key2 + 1)), 0u64); + assert_eq!(DoubleMap::get(&(key1 + 1), &key2), 4u64); + assert_eq!(DoubleMap::get(&(key1 + 1), &(key2 + 1)), 4u64); }); } @@ -425,9 +425,9 @@ mod tests { let key1 = 17u32; let key2 = 18u32; - DoubleMap::insert(key1, key2, vec![1]); - DoubleMap::append(key1, key2, &[2, 3]).unwrap(); - assert_eq!(DoubleMap::get(key1, key2), vec![1, 2, 3]); + DoubleMap::insert(&key1, &key2, &vec![1]); + DoubleMap::append(&key1, &key2, &[2, 3]).unwrap(); + assert_eq!(DoubleMap::get(&key1, &key2), &[1, 2, 3]); }); } diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index db9e4bc31d..446855b55c 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -104,7 +104,7 @@ impl UnhashedStorage for RuntimeStorage { } /// Put a value in under a key. - fn put(&mut self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { unhashed::put(key, val) } @@ -332,60 +332,83 @@ impl EnumerableStorageMap for U /// is a hash of a `Key2`. /// /// /!\ be careful while choosing the Hash, indeed malicious could craft second keys to lower the trie. -pub trait StorageDoubleMap { +pub trait StorageDoubleMap { /// The type that get/take returns. type Query; - /// Get the prefix key in storage. fn prefix() -> &'static [u8]; - /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Vec; - - /// Get the storage prefix used to fetch keys corresponding to a specific key1. - fn prefix_for>(k1: KArg1) -> Vec; + fn key_for(k1: &KArg1, k2: &KArg2) -> Vec + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// true if the value is defined in storage. - fn exists, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> bool; + fn prefix_for(k1: &KArg1) -> Vec where KArg1: ?Sized + Encode, K1: Borrow; - /// Load the value associated with the given key from the map. - fn get, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query; + fn exists(k1: &KArg1, k2: &KArg2) -> bool + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Take the value under a key. - fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query; + fn get(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Store a value to be associated with the given key from the map. - fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg); + fn take(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Remove the value under a key. - fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2); + fn insert(k1: &KArg1, k2: &KArg2, val: &VArg) + where + K1: Borrow, + K2: Borrow, + V: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + VArg: ?Sized + Encode; + + fn remove(k1: &KArg1, k2: &KArg2) + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix>(k1: KArg1); + fn remove_prefix(k1: &KArg1) where KArg1: ?Sized + Encode, K1: Borrow; - /// Mutate the value under a key. - fn mutate(k1: KArg1, k2: KArg2, f: F) -> R + fn mutate(k1: &KArg1, k2: &KArg2, f: F) -> R where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, F: FnOnce(&mut Self::Query) -> R; - /// Append the given items to the value under the key specified. - /// - /// `V` is required to implement `codec::EncodeAppend`. fn append( - k1: KArg1, - k2: KArg2, + k1: &KArg1, + k2: &KArg2, items: &[I], ) -> Result<(), &'static str> where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, I: codec::Encode, V: EncodeAppend; } -impl StorageDoubleMap for U +impl StorageDoubleMap for U where U: unhashed::generator::StorageDoubleMap { @@ -395,59 +418,101 @@ where >::prefix() } - fn key_for, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Vec { - >::key_for(k1.borrow(), k2.borrow()) + fn key_for(k1: &KArg1, k2: &KArg2) -> Vec + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + >::key_for(k1, k2) } - fn prefix_for>(k1: KArg1) -> Vec { - >::prefix_for(k1.borrow()) + fn prefix_for(k1: &KArg1) -> Vec where KArg1: ?Sized + Encode, K1: Borrow { + >::prefix_for(k1) } - fn exists, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> bool { - U::exists(k1.borrow(), k2.borrow(), &RuntimeStorage) + fn exists(k1: &KArg1, k2: &KArg2) -> bool + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + U::exists(k1, k2, &RuntimeStorage) } - fn get, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query { - U::get(k1.borrow(), k2.borrow(), &RuntimeStorage) + fn get(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + U::get(k1, k2, &RuntimeStorage) } - fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query { + fn take(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { U::take(k1.borrow(), k2.borrow(), &mut RuntimeStorage) } - fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg) { - U::insert(k1.borrow(), k2.borrow(), val.borrow(), &mut RuntimeStorage) + fn insert(k1: &KArg1, k2: &KArg2, val: &VArg) + where + K1: Borrow, + K2: Borrow, + V: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + VArg: ?Sized + Encode, + { + U::insert(k1, k2, val, &mut RuntimeStorage) } - fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2) { - U::remove(k1.borrow(), k2.borrow(), &mut RuntimeStorage) + fn remove(k1: &KArg1, k2: &KArg2) + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + U::remove(k1, k2, &mut RuntimeStorage) } - fn remove_prefix>(k1: KArg1) { - U::remove_prefix(k1.borrow(), &mut RuntimeStorage) + fn remove_prefix(k1: &KArg1) where KArg1: ?Sized + Encode, K1: Borrow { + U::remove_prefix(k1, &mut RuntimeStorage) } - fn mutate(k1: KArg1, k2: KArg2, f: F) -> R + fn mutate(k1: &KArg1, k2: &KArg2, f: F) -> R where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, F: FnOnce(&mut Self::Query) -> R { - U::mutate(k1.borrow(), k2.borrow(), f, &mut RuntimeStorage) + U::mutate(k1, k2, f, &mut RuntimeStorage) } fn append( - k1: KArg1, - k2: KArg2, + k1: &KArg1, + k2: &KArg2, items: &[I], ) -> Result<(), &'static str> where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, I: codec::Encode, V: EncodeAppend, { - U::append(k1.borrow(), k2.borrow(), items, &mut RuntimeStorage) + U::append(k1, k2, items, &mut RuntimeStorage) } } diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs index 3c56ae0ac5..26cb4b73e5 100644 --- a/srml/support/src/storage/unhashed/generator.rs +++ b/srml/support/src/storage/unhashed/generator.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::codec; -use crate::rstd::vec::Vec; +use crate::codec::{self, Encode, EncodeAppend}; +use crate::rstd::{borrow::Borrow, vec::Vec}; /// Abstraction around storage with unhashed access. pub trait UnhashedStorage { @@ -38,7 +38,7 @@ pub trait UnhashedStorage { } /// Put a value in under a key. - fn put(&mut self, key: &[u8], val: &T); + fn put(&mut self, key: &[u8], val: &T); /// Remove the bytes of a key from storage. fn kill(&mut self, key: &[u8]); @@ -82,7 +82,7 @@ impl UnhashedStorage for sr_primitives::StorageOverlay { .map(|x| codec::Decode::decode(&mut x.as_slice()).expect("Unable to decode expected type.")) } - fn put(&mut self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { self.insert(key.to_vec(), codec::Encode::encode(val)); } @@ -117,7 +117,7 @@ impl UnhashedStorage for sr_primitives::StorageOverlay { /// is a hash of a `Key2`. /// /// /!\ be careful while choosing the Hash, indeed malicious could craft second keys to lower the trie. -pub trait StorageDoubleMap { +pub trait StorageDoubleMap { /// The type that get/take returns. type Query; @@ -125,50 +125,110 @@ pub trait StorageDoubleMap fn prefix() -> &'static [u8]; /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(k1: &K1, k2: &K2) -> Vec; + fn key_for( + k1: &KArg1, + k2: &KArg2, + ) -> Vec where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; /// Get the storage prefix used to fetch keys corresponding to a specific key1. - fn prefix_for(k1: &K1) -> Vec; + fn prefix_for(k1: &KArg1) -> Vec where KArg1: ?Sized + Encode, K1: Borrow; /// true if the value is defined in storage. - fn exists(k1: &K1, k2: &K2, storage: &S) -> bool { + fn exists( + k1: &KArg1, + k2: &KArg2, + storage: &S, + ) -> bool where K1: Borrow, K2: Borrow, KArg1: ?Sized + Encode, KArg2: ?Sized + Encode { storage.exists(&Self::key_for(k1, k2)) } /// Load the value associated with the given key from the map. - fn get(k1: &K1, k2: &K2, storage: &S) -> Self::Query; + fn get( + k1: &KArg1, + k2: &KArg2, + storage: &S, + ) -> Self::Query where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; /// Take the value under a key. - fn take(k1: &K1, k2: &K2, storage: &mut S) -> Self::Query; + fn take( + k1: &KArg1, + k2: &KArg2, + storage: &mut S, + ) -> Self::Query where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; /// Store a value to be associated with the given key from the map. - fn insert(k1: &K1, k2: &K2, val: &V, storage: &mut S) { + fn insert( + k1: &KArg1, + k2: &KArg2, + val: &VArg, + storage: &mut S, + ) where + K1: Borrow, + K2: Borrow, + V: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + VArg: ?Sized + Encode, + { storage.put(&Self::key_for(k1, k2), val); } /// Remove the value under a key. - fn remove(k1: &K1, k2: &K2, storage: &mut S) { + fn remove( + k1: &KArg1, + k2: &KArg2, + storage: &mut S, + ) where K1: Borrow, K2: Borrow, KArg1: ?Sized + Encode, KArg2: ?Sized + Encode { storage.kill(&Self::key_for(k1, k2)); } /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix(k1: &K1, storage: &mut S) { + fn remove_prefix( + k1: &KArg1, + storage: &mut S, + ) where KArg1: ?Sized + Encode, K1: Borrow { storage.kill_prefix(&Self::prefix_for(k1)); } /// Mutate the value under a key. - fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &mut S) -> R; + fn mutate( + k1: &KArg1, + k2: &KArg2, + f: F, + storage: &mut S, + ) -> R where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + F: FnOnce(&mut Self::Query) -> R; /// Append the given items to the value under the key specified. - fn append( - k1: &K1, - k2: &K2, + fn append( + k1: &KArg1, + k2: &KArg2, items: &[I], storage: &mut S, ) -> Result<(), &'static str> where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, I: codec::Encode, - V: codec::EncodeAppend, + V: EncodeAppend, { let key = Self::key_for(k1, k2); let new_val = ::append( diff --git a/srml/support/src/storage/unhashed/mod.rs b/srml/support/src/storage/unhashed/mod.rs index 40e18d0cd2..77e6c2b37b 100644 --- a/srml/support/src/storage/unhashed/mod.rs +++ b/srml/support/src/storage/unhashed/mod.rs @@ -51,7 +51,7 @@ pub fn get_or_else T>(key: &[u8], default_valu } /// Put `value` in storage under `key`. -pub fn put(key: &[u8], value: &T) { +pub fn put(key: &[u8], value: &T) { value.using_encoded(|slice| runtime_io::set_storage(key, slice)); } diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs index 888ef48cb2..54c08d5e5f 100644 --- a/srml/support/test/tests/final_keys.rs +++ b/srml/support/test/tests/final_keys.rs @@ -29,7 +29,7 @@ srml_support::decl_module! { } srml_support::decl_storage!{ - trait Store for Module as Module { + trait Store for Module as FinalKeys { pub Value config(value): u32; pub Map: map u32 => u32; @@ -60,37 +60,37 @@ fn new_test_ext() -> runtime_io::TestExternalities { fn final_keys() { with_externalities(&mut new_test_ext(), || { Value::put(1); - assert_eq!(unhashed::get::(&runtime_io::twox_128(b"Module Value")), Some(1u32)); + assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeys Value")), Some(1u32)); Map::insert(1, 2); - let mut k = b"Module Map".to_vec(); + let mut k = b"FinalKeys Map".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); Map2::insert(1, 2); - let mut k = b"Module Map2".to_vec(); + let mut k = b"FinalKeys Map2".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); LinkedMap::insert(1, 2); - let mut k = b"Module LinkedMap".to_vec(); + let mut k = b"FinalKeys LinkedMap".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); LinkedMap2::insert(1, 2); - let mut k = b"Module LinkedMap2".to_vec(); + let mut k = b"FinalKeys LinkedMap2".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); - DoubleMap::insert(1, 2, 3); - let mut k = b"Module DoubleMap".to_vec(); + DoubleMap::insert(&1, &2, &3); + let mut k = b"FinalKeys DoubleMap".to_vec(); k.extend(1u32.encode()); let mut k = runtime_io::blake2_256(&k).to_vec(); k.extend(&runtime_io::blake2_256(&2u32.encode())); assert_eq!(unhashed::get::(&k), Some(3u32)); - DoubleMap2::insert(1, 2, 3); - let mut k = b"Module DoubleMap2".to_vec(); + DoubleMap2::insert(&1, &2, &3); + let mut k = b"FinalKeys DoubleMap2".to_vec(); k.extend(1u32.encode()); let mut k = runtime_io::twox_128(&k).to_vec(); k.extend(&runtime_io::blake2_128(&2u32.encode())); diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index a5f40878e0..4702105bba 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -335,14 +335,14 @@ fn storage_instance_independance() { module2::LinkedMap::::key_for(1).to_vec(), module2::LinkedMap::::key_for(1).to_vec(), module2::LinkedMap::::key_for(1).to_vec(), - module2::DoubleMap::::prefix_for(1), - module2::DoubleMap::::prefix_for(1).to_vec(), - module2::DoubleMap::::prefix_for(1).to_vec(), - module2::DoubleMap::::prefix_for(1).to_vec(), - module2::DoubleMap::::key_for(1, 1), - module2::DoubleMap::::key_for(1, 1).to_vec(), - module2::DoubleMap::::key_for(1, 1).to_vec(), - module2::DoubleMap::::key_for(1, 1).to_vec(), + module2::DoubleMap::::prefix_for(&1), + module2::DoubleMap::::prefix_for(&1).to_vec(), + module2::DoubleMap::::prefix_for(&1).to_vec(), + module2::DoubleMap::::prefix_for(&1).to_vec(), + module2::DoubleMap::::key_for(&1, &1), + module2::DoubleMap::::key_for(&1, &1).to_vec(), + module2::DoubleMap::::key_for(&1, &1).to_vec(), + module2::DoubleMap::::key_for(&1, &1).to_vec(), ].iter() { assert!(map.insert(key, ()).is_none()) } @@ -396,15 +396,15 @@ fn storage_with_instance_basic_operation() { let key1 = 1; let key2 = 1; - assert_eq!(DoubleMap::exists(0, 0), true); - assert_eq!(DoubleMap::exists(key1, key2), false); - DoubleMap::insert(key1, key2, 1); - assert_eq!(DoubleMap::get(key1, key2), 1); - assert_eq!(DoubleMap::take(key1, key2), 1); - assert_eq!(DoubleMap::get(key1, key2), 0); - DoubleMap::mutate(key1, key2, |a| *a=2); - assert_eq!(DoubleMap::get(key1, key2), 2); - DoubleMap::remove(key1, key2); - assert_eq!(DoubleMap::get(key1, key2), 0); + assert_eq!(DoubleMap::exists(&0, &0), true); + assert_eq!(DoubleMap::exists(&key1, &key2), false); + DoubleMap::insert(&key1, &key2, &1); + assert_eq!(DoubleMap::get(&key1, &key2), 1); + assert_eq!(DoubleMap::take(&key1, &key2), 1); + assert_eq!(DoubleMap::get(&key1, &key2), 0); + DoubleMap::mutate(&key1, &key2, |a| *a=2); + assert_eq!(DoubleMap::get(&key1, &key2), 2); + DoubleMap::remove(&key1, &key2); + assert_eq!(DoubleMap::get(&key1, &key2), 0); }); } -- GitLab From c8e2574e99b21df786b6e1f646929a6531e3b4f8 Mon Sep 17 00:00:00 2001 From: Roman Borschel Date: Wed, 24 Jul 2019 17:32:25 +0200 Subject: [PATCH 026/151] libp2p-next (#3076) * Changes for the next libp2p release: * Updates to the Kademlia APIs. * Updated imports due to the extracted libp2p-swarm crate. * ... Still pending at least the following: * rust-libp2p/#1189 * rust-libp2p/#1191 * rust-libp2p/#1194 * Use Quorum::One. The previous choice was apparently arbitrary. * Use libp2p-0.11 from crates.io. Address feedback. * Correct imports after merge. --- Cargo.lock | 206 +++++++++++---------- core/consensus/common/Cargo.toml | 2 +- core/network/Cargo.toml | 2 +- core/network/src/behaviour.rs | 8 +- core/network/src/custom_proto/behaviour.rs | 4 +- core/network/src/custom_proto/handler.rs | 15 +- core/network/src/custom_proto/tests.rs | 11 +- core/network/src/debug_info.rs | 7 +- core/network/src/discovery.rs | 196 ++++++++++++-------- core/network/src/lib.rs | 2 +- core/network/src/protocol.rs | 6 +- core/network/src/service.rs | 5 +- core/peerset/Cargo.toml | 2 +- core/telemetry/Cargo.toml | 2 +- 14 files changed, 265 insertions(+), 203 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 48edf4fa28..536a13601d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1582,33 +1582,34 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-deflate 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-wasm-ext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1619,7 +1620,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1634,7 +1635,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1654,7 +1655,7 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1663,30 +1664,29 @@ dependencies = [ [[package]] name = "libp2p-deflate" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1694,27 +1694,25 @@ dependencies = [ "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-identify" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1726,21 +1724,20 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1754,13 +1751,14 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1775,13 +1773,13 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1791,14 +1789,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1811,18 +1809,16 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1830,23 +1826,23 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1854,18 +1850,17 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "asn1_der 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1881,16 +1876,29 @@ dependencies = [ "web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-swarm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-tcp" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1899,23 +1907,23 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-wasm-ext" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1924,12 +1932,12 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "soketto 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1942,11 +1950,11 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2595,7 +2603,7 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2604,10 +2612,11 @@ dependencies = [ [[package]] name = "parity-multihash" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4368,7 +4377,7 @@ version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4543,7 +4552,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4616,7 +4625,7 @@ name = "substrate-peerset" version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4816,7 +4825,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6088,26 +6097,27 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3262021842bf00fe07dbd6cf34ff25c99d7a7ebef8deea84db72be3ea3bb0aff" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29f6b3be5b0cb89f7a072352e2a3bf86991dce0909624181e9e343db0b558568" -"checksum libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c71c33e59899d57ed0a14272984705561abd71788a2b303598ec57dac32130e8" -"checksum libp2p-core-derive 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e6df0fa6933f4be908cfd8c6d627776aa8c909066ba7ce13b017bfe18b9c92b" -"checksum libp2p-deflate 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "448fe9d2231bc21bb308f394346780666a376274ceaf3380e5c7adf3cdbf5a9c" -"checksum libp2p-dns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67ec2cea26aaccd4bdf264075d6a499bc635b90cb23419bcc3b1f2f0d135c451" -"checksum libp2p-floodsub 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c39c17f2b7c994106e00ccd71a9941d8574c01bef5f97e36d9a106cbde14fab" -"checksum libp2p-identify 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9455cc0752fd3e3f35e9464598576c54476772eaa927b773f7fdf5686ae51f" -"checksum libp2p-kad 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1f595983a76012779d6941a9d51fc0b9b95d720315787bf8d73f6672351f6d8" -"checksum libp2p-mdns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e7847e6e13a793d70ee5a5d833ddb13ff277c4c0d4fc65b5bc8543ef37df8cf" -"checksum libp2p-mplex 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29bd0885dd9154d93a1fa83e06a10aba2f0e3a0bf9eb63233c095141fbfaf525" -"checksum libp2p-noise 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f8e0852efc26bfcba11fcc7c4fb593ed00446c19b6d90db39794a3a7ac48e13" -"checksum libp2p-ping 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dfda9d329eacf6a8e875c18b5e5317a47b326cb58372f506fff8b6259c8951a" -"checksum libp2p-plaintext 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "86759777e5441725b60c6e78b23933b03a531b45d1f3e7d1fb430df49e0b151c" -"checksum libp2p-ratelimit 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f965ff88fda7b1fff062b18b25d781b86c17ea335a237958220895f3e3ddfdd8" -"checksum libp2p-secio 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df1d980a61a1423518205f6710e692102c94efb8132b5dcc54ffe5dbac621360" -"checksum libp2p-tcp 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24faf4ebb10b805f2e2221540097f764075edd18ca735cab0430a118382888df" -"checksum libp2p-uds 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f57a4942babd03f582a838238093b08f94521f63c8b12889a914be5c3cc170c2" -"checksum libp2p-wasm-ext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5427b52a8a51460961fadd72bd9fdcd957a2a7706588559423ccb86b58a52a7d" -"checksum libp2p-websocket 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "152dce704e235f47b9460004d7ac09663d43f4ca3cb99ddb8d4e0be54240673e" -"checksum libp2p-yamux 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "907bf1f31d572aa8537595a784f59c86b94162eb03dc51839c32ab4a05a5faad" +"checksum libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18b3404dae1e3110caaae14b2d59bf7254b1e988ed7ed38da59c005bed711e7d" +"checksum libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efa1b75b0b388c0f33bc2e2f5d385885f9ed77f622802895b68ac8397aaef2de" +"checksum libp2p-core-derive 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "954fe45edba727b76196abff0d3894116c32a07e4f8173a8f26caf3484add4c0" +"checksum libp2p-deflate 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "56b77964eaf8ba7019df8de2a02f2241ee240011d6de69f4991baf174ad42d2e" +"checksum libp2p-dns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c2625c6acd4073403f1107e4e038efa02ba5de54de0d08567a2cc338560d63f" +"checksum libp2p-floodsub 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d14e6c61c6e69f291261c8ec001b85a2c6426f2074183a40c337c29ed7939bd1" +"checksum libp2p-identify 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34ba4b8d4e27f4848a6b121604d98818a8527f4269948ba77dfe49f0f1c3dc8f" +"checksum libp2p-kad 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "93384ee24fe137bf3afa8263b8d9e63c6bd6c92aad7cc50949fdba2b90db93a4" +"checksum libp2p-mdns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd24b59da234647e15c34054158b6853a505301d5888719593e6fcd7841c39d9" +"checksum libp2p-mplex 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b101952e8dfdc5c902f1063cd8bfbb80e735857a16d387033ae8180df578009" +"checksum libp2p-noise 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1dd3313a8216b92e3ae5a24034d6fc35bf9671e9f4ad4b2ce445291852508b77" +"checksum libp2p-ping 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c803a4d21c97e14eb8b5019cc32242e296f1d1835de8664e5464d7dc31f068d" +"checksum libp2p-plaintext 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbac75c9683aa5997887420007ea2cf47ab9b68584b4edfa2b20598c9d509273" +"checksum libp2p-ratelimit 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7abef2e38e9d4bb5036724d325dd0518007e32d73d5171334d4d5355995bb4d8" +"checksum libp2p-secio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "33c208e7c74c15c72e7092503d6772ed5b2add2155e08234ae10169769e3135c" +"checksum libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8788a19e54240ba632ec0913bb951e7fd744f4e6151b2dc1a8b44d80b2947830" +"checksum libp2p-tcp 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "180543c45126c4eec42f35594e169a8d7c891253bc127297ca7781c05ad8bce6" +"checksum libp2p-uds 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffaf9dfc24beaf7ad5be01a6eabe67842cd02575da68a08ebe11b5a8821fc4a9" +"checksum libp2p-wasm-ext 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35307568a484cce18eae7516201ecbbfc3fb7e17c7f235d407690aee6adaa046" +"checksum libp2p-websocket 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e6c6d86998e66848f16b65e89896d94fa3825e218d2fc44cbc6b84e8ef97bb9" +"checksum libp2p-yamux 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1c03b89d025c7b01c966348e4d618b1ec4b95f3c09749ca9f2b2c98240aabfe6" "checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" @@ -6158,7 +6168,7 @@ dependencies = [ "checksum parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7902deb39d3b431897f211c1918789938251e67a740f55effd53201e79c0906c" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -"checksum parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb83358a0c05e52c44d658981fec2d146d3516d1adffd9e553684f8c8e9e8fa5" +"checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2005637ccf93dbb60c85081ccaaf3f945f573da48dcc79f27f9646caa3ec1dc" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index c6da0c682e..c44b34baeb 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" -libp2p = { version = "0.10.0", default-features = false } +libp2p = { version = "0.11.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index a94a3a01ba..6fd793a841 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -22,7 +22,7 @@ linked_hash_set = "0.1.3" lru-cache = "0.1.1" rustc-hex = "2.0" rand = "0.6" -libp2p = { version = "0.10.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.11.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } fork-tree = { path = "../../core/utils/fork-tree" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } diff --git a/core/network/src/behaviour.rs b/core/network/src/behaviour.rs index 2550e90660..0fc034edfc 100644 --- a/core/network/src/behaviour.rs +++ b/core/network/src/behaviour.rs @@ -23,7 +23,7 @@ use crate::protocol::{CustomMessageOutcome, Protocol}; use futures::prelude::*; use libp2p::NetworkBehaviour; use libp2p::core::{Multiaddr, PeerId, PublicKey}; -use libp2p::core::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess}; +use libp2p::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess}; use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; use libp2p::multihash::Multihash; use log::warn; @@ -150,6 +150,12 @@ impl, H: ExHashT> NetworkBehaviourEventPr for Behaviour { fn inject_event(&mut self, out: DiscoveryOut) { match out { + DiscoveryOut::UnroutablePeer(_peer_id) => { + // Obtaining and reporting listen addresses for unroutable peers back + // to Kademlia is handled by the `Identify` protocol, part of the + // `DebugInfoBehaviour`. See the `NetworkBehaviourEventProcess` + // implementation for `DebugInfoEvent`. + } DiscoveryOut::Discovered(peer_id) => { self.substrate.add_discovered_nodes(iter::once(peer_id)); } diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs index 50aed1cfca..61fd9c3e7b 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -20,8 +20,8 @@ use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use fnv::FnvHashMap; use futures::prelude::*; use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt as _}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; -use libp2p::core::{Multiaddr, PeerId}; +use libp2p::core::{ConnectedPoint, Multiaddr, PeerId}; +use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use log::{debug, error, trace, warn}; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs index e4832b64b6..6609998242 100644 --- a/core/network/src/custom_proto/handler.rs +++ b/core/network/src/custom_proto/handler.rs @@ -19,13 +19,14 @@ use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSu use futures::prelude::*; use futures03::{compat::Compat, TryFutureExt as _}; use futures_timer::Delay; -use libp2p::core::{ - ConnectedPoint, PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, - protocols_handler::IntoProtocolsHandler, - protocols_handler::KeepAlive, - protocols_handler::ProtocolsHandlerUpgrErr, - protocols_handler::SubstreamProtocol, - upgrade::{InboundUpgrade, OutboundUpgrade} +use libp2p::core::{ConnectedPoint, PeerId, Endpoint}; +use libp2p::core::upgrade::{InboundUpgrade, OutboundUpgrade}; +use libp2p::swarm::{ + ProtocolsHandler, ProtocolsHandlerEvent, + IntoProtocolsHandler, + KeepAlive, + ProtocolsHandlerUpgrErr, + SubstreamProtocol, }; use log::{debug, error}; use smallvec::{smallvec, SmallVec}; diff --git a/core/network/src/custom_proto/tests.rs b/core/network/src/custom_proto/tests.rs index 33ff81be47..b7e72af898 100644 --- a/core/network/src/custom_proto/tests.rs +++ b/core/network/src/custom_proto/tests.rs @@ -17,11 +17,10 @@ #![cfg(test)] use futures::{future, prelude::*, try_ready}; -use libp2p::core::{nodes::Substream, swarm::Swarm}; -use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; -use libp2p::core::{ProtocolsHandler, protocols_handler::IntoProtocolsHandler}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; -use libp2p::core::swarm::PollParameters; +use libp2p::core::nodes::Substream; +use libp2p::core::{ConnectedPoint, transport::boxed::Boxed, muxing::StreamMuxerBox}; +use libp2p::swarm::{Swarm, ProtocolsHandler, IntoProtocolsHandler}; +use libp2p::swarm::{PollParameters, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::{PeerId, Multiaddr, Transport}; use rand::seq::SliceRandom; use std::{io, time::Duration, time::Instant}; @@ -84,7 +83,7 @@ fn build_nodes() .collect(), }; - let mut swarm = libp2p::core::swarm::Swarm::new( + let mut swarm = Swarm::new( transport, behaviour, keypairs[index].public().into_peer_id() diff --git a/core/network/src/debug_info.rs b/core/network/src/debug_info.rs index 2ab93b04b0..3b0d5513ef 100644 --- a/core/network/src/debug_info.rs +++ b/core/network/src/debug_info.rs @@ -18,10 +18,9 @@ use fnv::FnvHashMap; use futures::prelude::*; use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::Multiaddr; -use libp2p::core::{either::EitherOutput, PeerId, PublicKey}; -use libp2p::core::protocols_handler::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; -use libp2p::core::nodes::ConnectedPoint; -use libp2p::core::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::core::{ConnectedPoint, either::EitherOutput, PeerId, PublicKey}; +use libp2p::swarm::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; +use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; use log::{debug, trace, error}; diff --git a/core/network/src/discovery.rs b/core/network/src/discovery.rs index e256f8490d..9fa6b2a80f 100644 --- a/core/network/src/discovery.rs +++ b/core/network/src/discovery.rs @@ -48,18 +48,21 @@ use futures::prelude::*; use futures_timer::Delay; use futures03::{compat::Compat, TryFutureExt as _}; -use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; -use libp2p::core::swarm::PollParameters; +use libp2p::core::{ConnectedPoint, Multiaddr, PeerId, PublicKey}; +use libp2p::swarm::{ProtocolsHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::kad::{Kademlia, KademliaEvent, Quorum, Record}; +use libp2p::kad::GetClosestPeersError; +use libp2p::kad::record::store::MemoryStore; #[cfg(not(target_os = "unknown"))] -use libp2p::core::{swarm::toggle::Toggle, nodes::Substream, muxing::StreamMuxerBox}; -use libp2p::kad::{GetValueResult, Kademlia, KademliaOut, PutValueResult}; +use libp2p::{swarm::toggle::Toggle}; +#[cfg(not(target_os = "unknown"))] +use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; #[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; use libp2p::multihash::Multihash; use libp2p::multiaddr::Protocol; use log::{debug, info, trace, warn}; -use std::{cmp, collections::VecDeque, num::NonZeroU8, time::Duration}; +use std::{cmp, collections::VecDeque, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; /// Implementation of `NetworkBehaviour` that discovers the nodes on the network. @@ -68,7 +71,7 @@ pub struct DiscoveryBehaviour { /// reserved nodes. user_defined: Vec<(PeerId, Multiaddr)>, /// Kademlia requests and answers. - kademlia: Kademlia, + kademlia: Kademlia, /// Discovers nodes on the local network. #[cfg(not(target_os = "unknown"))] mdns: Toggle>>, @@ -98,7 +101,9 @@ impl DiscoveryBehaviour { warn!(target: "sub-libp2p", "mDNS is not available on this platform"); } - let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); + let local_id = local_public_key.clone().into_peer_id(); + let store = MemoryStore::new(local_id.clone()); + let mut kademlia = Kademlia::new(local_id.clone(), store); for (peer_id, addr) in &user_defined { kademlia.add_address(peer_id, addr.clone()); } @@ -155,8 +160,7 @@ impl DiscoveryBehaviour { /// /// A corresponding `ValueFound` or `ValueNotFound` event will later be generated. pub fn get_value(&mut self, key: &Multihash) { - self.kademlia.get_value(key, NonZeroU8::new(10) - .expect("Casting 10 to NonZeroU8 should succeed; qed")); + self.kademlia.get_record(key, Quorum::One) } /// Start putting a record into the DHT. Other nodes can later fetch that value with @@ -164,15 +168,24 @@ impl DiscoveryBehaviour { /// /// A corresponding `ValuePut` or `ValuePutFailed` event will later be generated. pub fn put_value(&mut self, key: Multihash, value: Vec) { - self.kademlia.put_value(key, value); + self.kademlia.put_record(Record::new(key, value), Quorum::All); } } /// Event generated by the `DiscoveryBehaviour`. pub enum DiscoveryOut { - /// We have discovered a node. Can be called multiple times with the same identity. + /// The address of a peer has been added to the Kademlia routing table. + /// + /// Can be called multiple times with the same identity. Discovered(PeerId), + /// A peer connected to this node for whom no listen address is known. + /// + /// In order for the peer to be added to the Kademlia routing table, a known + /// listen address must be added via [`DiscoveryBehaviour::add_self_reported_address`], + /// e.g. obtained through the `identify` protocol. + UnroutablePeer(PeerId), + /// The DHT yeided results for the record request, grouped in (key, value) pairs. ValueFound(Vec<(Multihash, Vec)>), @@ -190,7 +203,7 @@ impl NetworkBehaviour for DiscoveryBehaviour where TSubstream: AsyncRead + AsyncWrite, { - type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; + type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; type OutEvent = DiscoveryOut; fn new_handler(&mut self) -> Self::ProtocolsHandler { @@ -272,9 +285,11 @@ where let random_peer_id = PeerId::random(); debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ {:?}", random_peer_id); - self.kademlia.find_node(random_peer_id); - // Reset the `Delay` to the next random. + self.kademlia.get_closest_peers(random_peer_id); + + // Schedule the next random query with exponentially increasing delay, + // capped at 60 seconds. self.next_kad_random_query = Delay::new(self.duration_to_next_kad).compat(); self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, Duration::from_secs(60)); @@ -290,50 +305,74 @@ where loop { match self.kademlia.poll(params) { Async::NotReady => break, - Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { - match ev { - KademliaOut::Discovered { .. } => {} - KademliaOut::KBucketAdded { peer_id, .. } => { - let ev = DiscoveryOut::Discovered(peer_id); - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); - } - KademliaOut::FindNodeResult { key, closer_peers } => { - trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", - key, closer_peers.len()); - if closer_peers.is_empty() && self.num_connections != 0 { - warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ - results"); - } - } - KademliaOut::GetValueResult(res) => { - let ev = match res { - GetValueResult::Found { results } => { - let results = results - .into_iter() - .map(|r| (r.key, r.value)) - .collect(); - - DiscoveryOut::ValueFound(results) - } - GetValueResult::NotFound { key, .. } => { - DiscoveryOut::ValueNotFound(key) + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => match ev { + KademliaEvent::UnroutablePeer { peer, .. } => { + let ev = DiscoveryOut::UnroutablePeer(peer); + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::RoutingUpdated { peer, .. } => { + let ev = DiscoveryOut::Discovered(peer); + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::GetClosestPeersResult(res) => { + match res { + Err(GetClosestPeersError::Timeout { key, peers }) => { + warn!(target: "sub-libp2p", + "Libp2p => Query for {:?} timed out with {:?} results", + key, peers.len()); + }, + Ok(ok) => { + trace!(target: "sub-libp2p", + "Libp2p => Query for {:?} yielded {:?} results", + ok.key, ok.peers.len()); + if ok.peers.is_empty() && self.num_connections != 0 { + warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ + results"); } - }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } } - KademliaOut::PutValueResult(res) => { - let ev = match res { - PutValueResult::Ok{ key, .. } => { - DiscoveryOut::ValuePut(key) - } - PutValueResult::Err { key, .. } => { - DiscoveryOut::ValuePutFailed(key) - } - }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::GetRecordResult(res) => { + let ev = match res { + Ok(ok) => { + let results = ok.records + .into_iter() + .map(|r| (r.key, r.value)) + .collect(); + + DiscoveryOut::ValueFound(results) + } + Err(e) => { + DiscoveryOut::ValueNotFound(e.into_key()) + } + }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::PutRecordResult(res) => { + let ev = match res { + Ok(ok) => DiscoveryOut::ValuePut(ok.key), + Err(e) => { + DiscoveryOut::ValuePutFailed(e.into_key()) + } + }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::RepublishRecordResult(res) => { + match res { + Ok(ok) => debug!(target: "sub-libp2p", + "Libp2p => Record republished: {:?}", + ok.key), + Err(e) => warn!(target: "sub-libp2p", + "Libp2p => Republishing of record {:?} failed with: {:?}", + e.key(), e) } - // We never start any other type of query. - KademliaOut::GetProvidersResult { .. } => {} + } + KademliaEvent::Discovered { .. } => { + // We are not interested in these events at the moment. + } + // We never start any other type of query. + e => { + warn!(target: "sub-libp2p", "Libp2p => Unhandled Kademlia event: {:?}", e) } }, Async::Ready(NetworkBehaviourAction::DialAddress { address }) => @@ -384,9 +423,10 @@ mod tests { use futures::prelude::*; use libp2p::identity::Keypair; use libp2p::Multiaddr; - use libp2p::core::{upgrade, Swarm}; + use libp2p::core::upgrade; use libp2p::core::transport::{Transport, MemoryTransport}; use libp2p::core::upgrade::{InboundUpgradeExt, OutboundUpgradeExt}; + use libp2p::swarm::Swarm; use std::collections::HashSet; use super::{DiscoveryBehaviour, DiscoveryOut}; @@ -428,28 +468,34 @@ mod tests { .collect::>() }).collect::>(); - let fut = futures::future::poll_fn(move || -> Result<_, ()> { - loop { - let mut keep_polling = false; - + let fut = futures::future::poll_fn::<_, (), _>(move || { + 'polling: loop { for swarm_n in 0..swarms.len() { - if let Async::Ready(Some(DiscoveryOut::Discovered(other))) = - swarms[swarm_n].0.poll().unwrap() { - if to_discover[swarm_n].remove(&other) { - keep_polling = true; - // Call `add_self_reported_address` to simulate identify happening. - let addr = swarms.iter() - .find(|s| *Swarm::local_peer_id(&s.0) == other) - .unwrap() - .1.clone(); - swarms[swarm_n].0.add_self_reported_address(&other, addr); + match swarms[swarm_n].0.poll().unwrap() { + Async::Ready(Some(e)) => { + match e { + DiscoveryOut::UnroutablePeer(other) => { + // Call `add_self_reported_address` to simulate identify happening. + let addr = swarms.iter().find_map(|(s, a)| + if s.local_peer_id == other { + Some(a.clone()) + } else { + None + }) + .unwrap(); + swarms[swarm_n].0.add_self_reported_address(&other, addr); + }, + DiscoveryOut::Discovered(other) => { + to_discover[swarm_n].remove(&other); + } + _ => {} + } + continue 'polling } + _ => {} } } - - if !keep_polling { - break; - } + break } if to_discover.iter().all(|l| l.is_empty()) { diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 7b740976d2..4e2a9c882c 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -204,7 +204,7 @@ pub use on_demand_layer::{OnDemand, RemoteResponse}; #[doc(hidden)] pub use runtime_primitives::traits::Block as BlockT; -use libp2p::core::nodes::ConnectedPoint; +use libp2p::core::ConnectedPoint; use serde::{Deserialize, Serialize}; use slog_derive::SerdeValue; use std::{collections::{HashMap, HashSet}, time::Duration}; diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 97b6c7ac28..dcb4ea35d0 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -19,9 +19,9 @@ use crate::custom_proto::{CustomProto, CustomProtoOut}; use futures::prelude::*; use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::{Multiaddr, PeerId}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; -use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; -use libp2p::core::protocols_handler::{ProtocolsHandler, IntoProtocolsHandler}; +use libp2p::core::{ConnectedPoint, nodes::Substream, muxing::StreamMuxerBox}; +use libp2p::swarm::{ProtocolsHandler, IntoProtocolsHandler}; +use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use primitives::storage::StorageKey; use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 4cbe704eae..c8ae6681de 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -32,8 +32,9 @@ use consensus::import_queue::{ImportQueue, Link}; use consensus::import_queue::{BlockImportResult, BlockImportError}; use futures::{prelude::*, sync::mpsc}; use log::{warn, error, info}; -use libp2p::core::{swarm::NetworkBehaviour, transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::{PeerId, Multiaddr, multihash::Multihash}; +use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; +use libp2p::swarm::NetworkBehaviour; use parking_lot::Mutex; use peerset::PeersetHandle; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -675,7 +676,7 @@ impl, H: ExHashT> Future for Ne } /// The libp2p swarm, customized for our needs. -type Swarm = libp2p::core::Swarm< +type Swarm = libp2p::swarm::Swarm< Boxed<(PeerId, StreamMuxerBox), io::Error>, Behaviour >; diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index 91e9d58e0a..9315ff304f 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] futures-preview = "0.3.0-alpha.17" -libp2p = { version = "0.10.0", default-features = false } +libp2p = { version = "0.11.0", default-features = false } linked-hash-map = "0.5" log = "0.4" lru-cache = "0.1.2" diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index ca95fe94e5..27c94f0656 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -11,7 +11,7 @@ parking_lot = "0.8.0" futures01 = { package = "futures", version = "0.1" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } futures-timer = "0.2.1" -libp2p = { version = "0.10.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.11.0", default-features = false, features = ["libp2p-websocket"] } log = "0.4" rand = "0.6" serde = { version = "1.0.81", features = ["derive"] } -- GitLab From d27e95af0c5a8d796c709309794dd3aea71945f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 24 Jul 2019 18:32:44 +0200 Subject: [PATCH 027/151] Make function `get` of parameter types public (#3191) I missed this while making parameter types more flexible. --- srml/support/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index e1300c5925..474456035d 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -98,7 +98,7 @@ macro_rules! parameter_types { () => (); (IMPL $name:ident , $type:ty , $value:expr) => { impl $name { - fn get() -> $type { + pub fn get() -> $type { $value } } -- GitLab From 15ccaa46e3f0799896157339d16f8289a2fec07a Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 24 Jul 2019 19:25:43 +0200 Subject: [PATCH 028/151] Staking rate targeting and specific rewards. (#2882) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * PNPoS implementation * wip: change staking api * code readibility * fix overflow * comment * license * doc * reorganize a bit * rename to proper english + doc * address comments * refactor unused mock * fix add_point * update tests * add not equalize to ci * Revert "add not equalize to ci" This reverts commit 1c61c25874b04b1cdfadd7d353b75a189a59ad35. * bring test back * update locks * fix genesis config * add authorship event handler + test * uncouple timestamp from staking * use on finalize instead * remove todo * simplify mock * address comment * doc * merge test * fmt * remove todo todo * move add_reward_point to regular function * doc * doc * increase version * doc and fmt * Update srml/staking/src/inflation.rs Co-Authored-By: Bastian Köcher * Fix some doc typos --- Cargo.lock | 1 + node/cli/src/chain_spec.rs | 4 - node/executor/src/lib.rs | 2 - node/runtime/src/lib.rs | 1 + srml/staking/Cargo.toml | 4 +- srml/staking/src/inflation.rs | 331 ++++++++++++++++++++++++++++++++++ srml/staking/src/lib.rs | 177 ++++++++++++++---- srml/staking/src/mock.rs | 53 +++++- srml/staking/src/tests.rs | 328 +++++++++++++++++---------------- srml/support/src/traits.rs | 6 + srml/timestamp/src/lib.rs | 12 +- 11 files changed, 712 insertions(+), 207 deletions(-) create mode 100644 srml/staking/src/inflation.rs diff --git a/Cargo.lock b/Cargo.lock index 536a13601d..d7544dc000 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3928,6 +3928,7 @@ dependencies = [ "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", + "srml-authorship 0.1.0", "srml-balances 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index fc07ae4cea..681be0325e 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -121,8 +121,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig { staking: Some(StakingConfig { current_era: 0, offline_slash: Perbill::from_parts(1_000_000), - session_reward: Perbill::from_parts(2_065), - current_session_reward: 0, validator_count: 7, offline_slash_grace: 4, minimum_validator_count: 4, @@ -259,8 +257,6 @@ pub fn testnet_genesis( minimum_validator_count: 1, validator_count: 2, offline_slash: Perbill::zero(), - session_reward: Perbill::zero(), - current_session_reward: 0, offline_slash_grace: 0, stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index b554614926..975b689919 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -361,8 +361,6 @@ mod tests { validator_count: 3, minimum_validator_count: 0, offline_slash: Perbill::zero(), - session_reward: Perbill::zero(), - current_session_reward: 0, offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], }), diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 2b8750d2de..7cfc184709 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -236,6 +236,7 @@ parameter_types! { impl staking::Trait for Runtime { type Currency = Balances; + type Time = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; type OnRewardMinted = Treasury; type Event = Event; diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index 7438449531..e9a660ebe0 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -15,11 +15,12 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } session = { package = "srml-session", path = "../session", default-features = false, features = ["historical"] } +authorship = { package = "srml-authorship", path = "../authorship", default-features = false } [dev-dependencies] substrate-primitives = { path = "../../core/primitives" } -timestamp = { package = "srml-timestamp", path = "../timestamp" } balances = { package = "srml-balances", path = "../balances" } +timestamp = { package = "srml-timestamp", path = "../timestamp" } rand = "0.6.5" [features] @@ -37,4 +38,5 @@ std = [ "primitives/std", "session/std", "system/std", + "authorship/std", ] diff --git a/srml/staking/src/inflation.rs b/srml/staking/src/inflation.rs new file mode 100644 index 0000000000..503a20a629 --- /dev/null +++ b/srml/staking/src/inflation.rs @@ -0,0 +1,331 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! http://research.web3.foundation/en/latest/polkadot/Token%20Economics/#inflation-model + +use primitives::{Perbill, traits::SimpleArithmetic}; + +/// Linear function truncated to positive part `y = max(0, b [+ or -] a*x)` for PNPoS usage +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +struct Linear { + negative_a: bool, + // Perbill + a: u32, + // Perbill + b: u32, +} + +impl Linear { + fn calculate_for_fraction_times_denominator(&self, n: N, d: N) -> N + where + N: SimpleArithmetic + Clone + { + if self.negative_a { + (Perbill::from_parts(self.b) * d).saturating_sub(Perbill::from_parts(self.a) * n) + } else { + (Perbill::from_parts(self.b) * d).saturating_add(Perbill::from_parts(self.a) * n) + } + } +} + +/// Piecewise Linear function for PNPoS usage +#[derive(Debug, PartialEq, Eq)] +struct PiecewiseLinear { + /// Array of tuple of Abscisse in Perbill and Linear. + /// + /// Each piece start with at the abscisse up to the abscisse of the next piece. + pieces: [(u32, Linear); 20], +} + +impl PiecewiseLinear { + fn calculate_for_fraction_times_denominator(&self, n: N, d: N) -> N + where + N: SimpleArithmetic + Clone + { + let part = self.pieces.iter() + .take_while(|(abscisse, _)| n > Perbill::from_parts(*abscisse) * d.clone()) + .last() + .unwrap_or(&self.pieces[0]); + + part.1.calculate_for_fraction_times_denominator(n, d) + } +} + +// Piecewise linear approximation of I_NPoS. +const I_NPOS: PiecewiseLinear = PiecewiseLinear { + pieces: [ + (0, Linear { negative_a: false, a: 150000000, b: 25000000 }), + (500000000, Linear { negative_a: true, a: 986493987, b: 593246993 }), + (507648979, Linear { negative_a: true, a: 884661327, b: 541551747 }), + (515726279, Linear { negative_a: true, a: 788373842, b: 491893761 }), + (524282719, Linear { negative_a: true, a: 697631517, b: 444319128 }), + (533378749, Linear { negative_a: true, a: 612434341, b: 398876765 }), + (543087019, Linear { negative_a: true, a: 532782338, b: 355618796 }), + (553495919, Linear { negative_a: true, a: 458675508, b: 314600968 }), + (564714479, Linear { negative_a: true, a: 390113843, b: 275883203 }), + (576879339, Linear { negative_a: true, a: 327097341, b: 239530285 }), + (590164929, Linear { negative_a: true, a: 269626004, b: 205612717 }), + (604798839, Linear { negative_a: true, a: 217699848, b: 174207838 }), + (621085859, Linear { negative_a: true, a: 171318873, b: 145401271 }), + (639447429, Linear { negative_a: true, a: 130483080, b: 119288928 }), + (660489879, Linear { negative_a: true, a: 95192479, b: 95979842 }), + (685131379, Linear { negative_a: true, a: 65447076, b: 75600334 }), + (714860569, Linear { negative_a: true, a: 41246910, b: 58300589 }), + (752334749, Linear { negative_a: true, a: 22592084, b: 44265915 }), + (803047659, Linear { negative_a: true, a: 9482996, b: 33738693 }), + (881691659, Linear { negative_a: true, a: 2572702, b: 27645944 }) + ] +}; + +/// Second per year for the Julian year (365.25 days) +const SECOND_PER_YEAR: u32 = 3600*24*36525/100; + +/// The total payout to all validators (and their nominators) per era. +/// +/// Named P_NPoS in the [paper](http://research.web3.foundation/en/latest/polkadot/Token%20Ec +/// onomics/#inflation-model). +/// +/// For x the staking rate in NPoS: `P_NPoS(x) = I_NPoS(x) * current_total_token / era_per_year` +/// i.e. `P_NPoS(x) = I_NPoS(x) * current_total_token * era_duration / year_duration` +/// +/// I_NPoS is the desired yearly inflation rate for nominated proof of stake. +pub fn compute_total_payout(npos_token_staked: N, total_tokens: N, era_duration: N) -> N +where + N: SimpleArithmetic + Clone +{ + let year_duration: N = SECOND_PER_YEAR.into(); + I_NPOS.calculate_for_fraction_times_denominator(npos_token_staked, total_tokens) + * era_duration / year_duration +} + +#[allow(non_upper_case_globals, non_snake_case)] // To stick with paper notations +#[cfg(test)] +mod test_inflation { + use std::convert::TryInto; + + // Function `y = a*x + b` using float used for testing precision of Linear + #[derive(Debug)] + struct LinearFloat { + a: f64, + b: f64, + } + + impl LinearFloat { + fn new(x0: f64, y0: f64, x1: f64, y1: f64) -> Self { + LinearFloat { + a: (y1 - y0) / (x1 - x0), + b: (x0*y1 - x1*y0) / (x0 - x1), + } + } + + fn compute(&self, x: f64) -> f64 { + self.a*x + self.b + } + } + + #[test] + fn linear_float_works() { + assert_eq!(LinearFloat::new(1.0, 2.0, 4.0, 3.0).compute(7.0), 4.0); + } + + // Constants defined in paper + const I_0: f64 = 0.025; + const i_ideal: f64 = 0.2; + const x_ideal: f64 = 0.5; + const d: f64 = 0.05; + + // Part left to 0.5 + fn I_left(x: f64) -> f64 { + I_0 + x * (i_ideal - I_0/x_ideal) + } + + // Part right to 0.5 + fn I_right(x: f64) -> f64 { + I_0 + (i_ideal*x_ideal - I_0) * 2_f64.powf((x_ideal-x)/d) + } + + // Definition of I_NPoS in float + fn I_full(x: f64) -> f64 { + if x <= 0.5 { + I_left(x) + } else { + I_right(x) + } + } + + // Compute approximation of I_NPoS into piecewise linear function + fn I_NPoS_points() -> super::PiecewiseLinear { + let mut points = vec![]; + + // Points for left part + points.push((0.0, I_0)); + points.push((0.5, I_left(0.5))); + + // Approximation for right part. + // + // We start from 0.5 (x0) and we try to find the next point (x1) for which the linear + // approximation of (x0, x1) doesn't deviate from float definition by an error of + // GEN_ERROR. + + // When computing deviation between linear approximation and float definition we iterate + // over all points with this step precision. + const STEP_PRECISION: f64 = 0.000_000_1; + // Max error used for generating points. + const GEN_ERROR: f64 = 0.000_1; + + let mut x0: f64 = 0.5; + let mut x1: f64 = x0; + + // This is just a step used to find next x1: + // if x1 + step result in a not enought precise approximation we reduce step and try again. + // we stop as soon as step is less than STEP_PRECISION. + let mut step: f64 = 0.1; + + loop { + let next_x1 = x1 + step; + + if next_x1 >= 1.0 { + points.push((1.0, I_right(1.0))); + break; + } + + let y0 = I_right(x0); + let next_y1 = I_right(next_x1); + + let mut error_overflowed = false; + + // Test error is not overflowed + + // Quick test on one point + if (I_right((x0 + next_x1)/2.0) - (y0 + next_y1)/2.0).abs() > GEN_ERROR { + error_overflowed = true; + } + + // Long test on all points + if !error_overflowed { + let linear = LinearFloat::new(x0, y0, next_x1, next_y1); + let mut cursor = x0; + while cursor < x1 { + if (I_right(cursor) - linear.compute(cursor)).abs() > GEN_ERROR { + error_overflowed = true; + } + cursor += STEP_PRECISION; + } + } + + if error_overflowed { + if step <= STEP_PRECISION { + points.push((x1, I_right(x1))); + x0 = x1; + step = 0.1; + } else { + step /= 10.0; + } + } else { + x1 = next_x1; + } + } + + // Convert points to piecewise linear definition + let pieces: Vec<(u32, super::Linear)> = (0..points.len()-1) + .map(|i| { + let p0 = points[i]; + let p1 = points[i+1]; + + let linear = LinearFloat::new(p0.0, p0.1, p1.0, p1.1); + + // Needed if we want to use a Perbill later + assert!(linear.a.abs() <= 1.0); + // Needed if we want to use a Perbill later + assert!(linear.b.abs() <= 1.0); + // Needed to stick with our restrictive definition of linear + assert!(linear.b.signum() == 1.0); + + ( + (p0.0 * 1_000_000_000.0) as u32, + super::Linear { + negative_a: linear.a.signum() < 0.0, + a: (linear.a.abs() * 1_000_000_000.0) as u32, + b: (linear.b.abs() * 1_000_000_000.0) as u32, + } + ) + }) + .collect(); + + println!("Generated pieces: {:?}", pieces); + assert_eq!(pieces.len(), 20); + + super::PiecewiseLinear { pieces: (&pieces[..]).try_into().unwrap() } + } + + /// This test is only useful to generate a new set of points for the definition of I_NPoS. + #[test] + fn generate_I_NPOS() { + assert_eq!(super::I_NPOS, I_NPoS_points()); + } + + /// This test ensure that i_npos piecewise linear approximation is close to the actual function. + /// It does compare the result from a computation in integer of different capcity and in f64. + #[test] + fn i_npos_precision() { + const STEP_PRECISION: f64 = 0.000_001; + const ERROR: f64 = 0.000_2; + + macro_rules! test_for_value { + ($($total_token:expr => $type:ty,)*) => { + let mut x = 0.1; + while x <= 1.0 { + let expected = I_full(x); + $({ + let result = super::I_NPOS.calculate_for_fraction_times_denominator( + (x * $total_token as f64) as $type, + $total_token, + ) as f64; + let expected = expected * $total_token as f64; + let error = (ERROR * $total_token as f64).max(2.0); + + let diff = (result - expected).abs(); + if diff >= error { + println!("total_token: {}", $total_token); + println!("x: {}", x); + println!("diff: {}", diff); + println!("error: {}", error); + panic!("error overflowed"); + } + })* + x += STEP_PRECISION + } + } + } + + test_for_value!( + 1_000u32 => u32, + 1_000_000u32 => u32, + 1_000_000_000u32 => u32, + 1_000_000_000_000u64 => u64, + 1_000_000_000_000_000u64 => u64, + 1_000_000_000_000_000_000u64 => u64, + 1_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000_000_000_000_000u128 => u128, + u32::max_value() => u32, + u64::max_value() => u64, + u128::max_value() => u128, + ); + } +} diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index c72aa36e8b..7a2d0dbc08 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -167,20 +167,30 @@ //! //! ### Reward Calculation //! -//! Rewards are recorded **per-session** and paid **per-era**. The value of the reward for each -//! session is calculated at the end of the session based on the timeliness of the session, then -//! accumulated to be paid later. The value of the new _per-session-reward_ is calculated at the end -//! of each era by multiplying `SlotStake` and `SessionReward` (`SessionReward` is the -//! multiplication factor, represented by a number between 0 and 1). Once a new era is triggered, -//! rewards are paid to the validators and their associated nominators. +//! Validators and nominators are rewarded at the end of each era. The total reward of an era is +//! calculated using the era duration and the staking rate (the total amount of tokens staked by +//! nominators and validators, divided by the total token supply). It aims to incentivise toward a +//! defined staking rate. The full specification can be found +//! [here](https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#inflation-model). +//! +//! Total reward is split among validators and their nominators depending on the number of points +//! they received during the era. Points are added to a validator using +//! [`add_reward_points_to_validator`](./enum.Call.html#variant.add_reward_points_to_validator). +//! +//! [`Module`](./struct.Module.html) implements +//! [`authorship::EventHandler`](../srml_authorship/trait.EventHandler.html) to add reward points +//! to block producer and block producer of referenced uncles. +//! +//! The validator and its nominator split their reward as following: //! //! The validator can declare an amount, named //! [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not //! get shared with the nominators at each reward payout through its //! [`ValidatorPrefs`](./struct.ValidatorPrefs.html). This value gets deducted from the total reward -//! that can be paid. The remaining portion is split among the validator and all of the nominators -//! that nominated the validator, proportional to the value staked behind this validator (_i.e._ -//! dividing the [`own`](./struct.Exposure.html#structfield.own) or +//! that is paid to the validator and its nominators. The remaining portion is split among the +//! validator and all of the nominators that nominated the validator, proportional to the value +//! staked behind this validator (_i.e._ dividing the +//! [`own`](./struct.Exposure.html#structfield.own) or //! [`others`](./struct.Exposure.html#structfield.others) by //! [`total`](./struct.Exposure.html#structfield.total) in [`Exposure`](./struct.Exposure.html)). //! @@ -266,6 +276,7 @@ mod mock; mod tests; mod phragmen; +mod inflation; #[cfg(all(feature = "bench", test))] mod benches; @@ -278,13 +289,14 @@ use srml_support::{ StorageValue, StorageMap, EnumerableStorageMap, decl_module, decl_event, decl_storage, ensure, traits::{ Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, - WithdrawReasons, WithdrawReason, OnUnbalanced, Imbalance, Get + WithdrawReasons, WithdrawReason, OnUnbalanced, Imbalance, Get, Time } }; use session::{historical::OnSessionEnding, SelectInitialValidators, SessionIndex}; use primitives::Perbill; use primitives::traits::{ Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded, + SaturatedConversion, SimpleArithmetic }; #[cfg(feature = "std")] use primitives::{Serialize, Deserialize}; @@ -302,6 +314,16 @@ const STAKING_ID: LockIdentifier = *b"staking "; /// Counter for the number of eras that have passed. pub type EraIndex = u32; +/// Reward points of an era. Used to split era total payout between validators. +#[derive(Encode, Decode, Default)] +pub struct EraRewards { + /// Total number of points. Equals the sum of reward points for each validator. + total: u32, + /// Reward at one index correspond to reward for validator in current_elected of this index. + /// Thus this reward vec is only valid for one elected set. + rewards: Vec, +} + /// Indicates the initial status of the staker. #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum StakerStatus { @@ -434,6 +456,7 @@ type PositiveImbalanceOf = <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +type MomentOf= <::Time as Time>::Moment; type RawAssignment = (::AccountId, ExtendedBalance); type Assignment = (::AccountId, ExtendedBalance, BalanceOf); @@ -485,6 +508,9 @@ pub trait Trait: system::Trait { /// The staking balance. type Currency: LockableCurrency; + /// Time used for computing era duration. + type Time: Time; + /// Convert a balance into a number used for election calculation. /// This must fit into a `u64` but is allowed to be sensibly lossy. /// TODO: #1377 @@ -522,8 +548,6 @@ decl_storage! { /// Minimum number of staking participants before emergency conditions are imposed. pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT; - /// Maximum reward, per validator, that is provided per acceptable session. - pub SessionReward get(session_reward) config(): Perbill = Perbill::from_parts(60); /// Slash, per validator that is taken for the first time they are found to be offline. pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); /// Number of instances of offline reports before slashing begins for validators. @@ -561,12 +585,11 @@ decl_storage! { /// The current era index. pub CurrentEra get(current_era) config(): EraIndex; - /// Maximum reward, per validator, that is provided per acceptable session. - pub CurrentSessionReward get(current_session_reward) config(): BalanceOf; + /// The start of the current era. + pub CurrentEraStart get(current_era_start): MomentOf; - /// The accumulated reward for the current era. Reset to zero at the beginning of the era - /// and increased for every successfully finished session. - pub CurrentEraReward get(current_era_reward): BalanceOf; + /// Rewards for the current era. Using indices of current elected set. + pub CurrentEraRewards: EraRewards; /// The amount of balance actively at stake for each validator slot, currently. /// @@ -650,6 +673,13 @@ decl_module! { fn deposit_event() = default; + fn on_finalize() { + // Set the start of the first era. + if !>::exists() { + >::put(T::Time::now()); + } + } + /// Take the origin account as a stash and lock up `value` of its balance. `controller` will /// be the account that controls it. /// @@ -1040,7 +1070,7 @@ impl Module { /// Reward a given validator by a specific amount. Add the reward to the validator's, and its /// nominators' balance, pro-rata based on their exposure, after having removed the validator's /// pre-payout cut. - fn reward_validator(stash: &T::AccountId, reward: BalanceOf) { + fn reward_validator(stash: &T::AccountId, reward: BalanceOf) -> PositiveImbalanceOf { let off_the_table = reward.min(Self::validators(stash).validator_payment); let reward = reward - off_the_table; let mut imbalance = >::zero(); @@ -1058,8 +1088,10 @@ impl Module { let per_u64 = Perbill::from_rational_approximation(exposure.own, total); per_u64 * reward }; + imbalance.maybe_subsume(Self::make_payout(stash, validator_cut + off_the_table)); - T::Reward::on_unbalanced(imbalance); + + imbalance } /// Session has just ended. Provide the validator set for the next session if it's an era-end, along @@ -1067,10 +1099,6 @@ impl Module { fn new_session(session_index: SessionIndex) -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> { - // accumulate good session reward - let reward = Self::current_session_reward(); - >::mutate(|r| *r += reward); - if ForceNewEra::take() || session_index % T::SessionsPerEra::get() == 0 { let validators = T::SessionInterface::validators(); let prior = validators.into_iter() @@ -1089,18 +1117,39 @@ impl Module { /// get a chance to set their session keys. fn new_era(start_session_index: SessionIndex) -> Option> { // Payout - let reward = >::take(); - if !reward.is_zero() { + let rewards = CurrentEraRewards::take(); + let now = T::Time::now(); + let previous_era_start = >::mutate(|v| { + rstd::mem::replace(v, now.clone()) + }); + let era_duration = now - previous_era_start; + if !era_duration.is_zero() { let validators = Self::current_elected(); - for v in validators.iter() { - Self::reward_validator(v, reward); + + let validator_len: BalanceOf = (validators.len() as u32).into(); + let total_rewarded_stake = Self::slot_stake() * validator_len; + + let total_payout = inflation::compute_total_payout( + total_rewarded_stake.clone(), + T::Currency::total_issuance(), + // Era of duration more than u32::MAX is rewarded as u32::MAX. + >::from(era_duration.saturated_into::()), + ); + + let mut total_imbalance = >::zero(); + + let total_points = rewards.total; + for (v, points) in validators.iter().zip(rewards.rewards.into_iter()) { + if points != 0 { + let reward = multiply_by_rational(total_payout, points, total_points); + total_imbalance.subsume(Self::reward_validator(v, reward)); + } } - Self::deposit_event(RawEvent::Reward(reward)); - let len = validators.len() as u32; // validators length can never overflow u64 - let len: BalanceOf = len.into(); - let total_minted = reward * len; - let total_rewarded_stake = Self::slot_stake() * len; - T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake); + + let total_reward = total_imbalance.peek(); + Self::deposit_event(RawEvent::Reward(total_reward)); + T::Reward::on_unbalanced(total_imbalance); + T::OnRewardMinted::on_dilution(total_reward, total_rewarded_stake); } // Increment current era. @@ -1126,10 +1175,7 @@ impl Module { } // Reassign all Stakers. - let (slot_stake, maybe_new_validators) = Self::select_validators(); - - // Update the balances for rewarding according to the stakes. - >::put(Self::session_reward() * slot_stake); + let (_slot_stake, maybe_new_validators) = Self::select_validators(); maybe_new_validators } @@ -1331,6 +1377,24 @@ impl Module { Self::deposit_event(event); } } + + /// Add reward points to validator. + /// + /// At the end of the era each the total payout will be distributed among validator + /// relatively to their points. + fn add_reward_points_to_validator(validator: T::AccountId, points: u32) { + >::current_elected().iter() + .position(|elected| *elected == validator) + .map(|index| { + CurrentEraRewards::mutate(|rewards| { + if let Some(new_total) = rewards.total.checked_add(points) { + rewards.total = new_total; + rewards.rewards.resize((index + 1).max(rewards.rewards.len()), 0); + rewards.rewards[index] += points; // Addition is less than total + } + }); + }); + } } impl session::OnSessionEnding for Module { @@ -1353,6 +1417,45 @@ impl OnFreeBalanceZero for Module { } } +/// Add reward points to block authors: +/// * 20 points to the block producer for producing a (non-uncle) block in the relay chain, +/// * 2 points to the block producer for each reference to a previously unreferenced uncle, and +/// * 1 point to the producer of each referenced uncle block. +impl authorship::EventHandler for Module { + fn note_author(author: T::AccountId) { + Self::add_reward_points_to_validator(author, 20); + } + fn note_uncle(author: T::AccountId, _age: T::BlockNumber) { + Self::add_reward_points_to_validator(>::author(), 2); + Self::add_reward_points_to_validator(author, 1); + } +} + +// This is guarantee not to overflow on whatever values. +// `num` must be inferior to `den` otherwise it will be reduce to `den`. +fn multiply_by_rational(value: N, num: u32, den: u32) -> N + where N: SimpleArithmetic + Clone +{ + let num = num.min(den); + + let result_divisor_part = value.clone() / den.into() * num.into(); + + let result_remainder_part = { + let rem = value % den.into(); + + // Fits into u32 because den is u32 and remainder < den + let rem_u32 = rem.saturated_into::(); + + // Multiplication fits into u64 as both term are u32 + let rem_part = rem_u32 as u64 * num as u64 / den as u64; + + // Result fits into u32 as num < total_points + (rem_part as u32).into() + }; + + result_divisor_part + result_remainder_part +} + /// A `Convert` implementation that finds the stash of the given controller account, /// if any. pub struct StashOf(rstd::marker::PhantomData); diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index f0151bf915..a1548a0080 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -23,9 +23,10 @@ use primitives::testing::{Header, UintAuthorityId}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{assert_ok, impl_outer_origin, parameter_types, EnumerableStorageMap}; -use srml_support::traits::{Currency, Get}; -use crate::{EraIndex, GenesisConfig, Module, Trait, StakerStatus, - ValidatorPrefs, RewardDestination, Nominators +use srml_support::traits::{Currency, Get, FindAuthor}; +use crate::{ + EraIndex, GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination, + Nominators, inflation }; /// The AccountId alias in this test module. @@ -86,6 +87,16 @@ impl_outer_origin!{ pub enum Origin for Test {} } +/// Author of block is always 11 +pub struct Author11; +impl FindAuthor for Author11 { + fn find_author<'a, I>(_digests: I) -> Option + where I: 'a + IntoIterator + { + Some(11) + } +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] pub struct Test; @@ -97,7 +108,7 @@ parameter_types! { impl system::Trait for Test { type Origin = Origin; type Index = u64; - type BlockNumber = u64; + type BlockNumber = BlockNumber; type Hash = H256; type Hashing = ::primitives::traits::BlakeTwo256; type AccountId = AccountId; @@ -132,6 +143,7 @@ impl balances::Trait for Test { parameter_types! { pub const Period: BlockNumber = 1; pub const Offset: BlockNumber = 0; + pub const UncleGenerations: u64 = 0; } impl session::Trait for Test { type OnSessionEnding = session::historical::NoteHistoricalRoot; @@ -148,7 +160,12 @@ impl session::historical::Trait for Test { type FullIdentification = crate::Exposure; type FullIdentificationOf = crate::ExposureOf; } - +impl authorship::Trait for Test { + type FindAuthor = Author11; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = Module; +} parameter_types! { pub const MinimumPeriod: u64 = 5; } @@ -163,6 +180,7 @@ parameter_types! { } impl Trait for Test { type Currency = balances::Module; + type Time = timestamp::Module; type CurrencyToVote = CurrencyToVoteHandler; type OnRewardMinted = (); type Event = (); @@ -175,7 +193,6 @@ impl Trait for Test { pub struct ExtBuilder { existential_deposit: u64, - reward: u64, validator_pool: bool, nominate: bool, validator_count: u32, @@ -188,7 +205,6 @@ impl Default for ExtBuilder { fn default() -> Self { Self { existential_deposit: 0, - reward: 10, validator_pool: false, nominate: true, validator_count: 2, @@ -261,6 +277,8 @@ impl ExtBuilder { (41, balance_factor * 2000), (100, 2000 * balance_factor), (101, 2000 * balance_factor), + // This allow us to have a total_payout different from 0. + (999, 1_000_000_000_000), ], vesting: vec![], }.assimilate_storage(&mut t, &mut c); @@ -285,9 +303,7 @@ impl ExtBuilder { ], validator_count: self.validator_count, minimum_validator_count: self.minimum_validator_count, - session_reward: Perbill::from_millionths((1000000 * self.reward / balance_factor) as u32), offline_slash: Perbill::from_percent(5), - current_session_reward: self.reward, offline_slash_grace: 0, invulnerables: vec![], }.assimilate_storage(&mut t, &mut c); @@ -378,8 +394,9 @@ pub fn bond_nominator(acc: u64, val: u64, target: Vec) { pub fn start_session(session_index: session::SessionIndex) { // Compensate for session delay let session_index = session_index + 1; - for i in 0..(session_index - Session::current_index()) { + for i in Session::current_index()..session_index { System::set_block_number((i + 1).into()); + Timestamp::set_timestamp(System::block_number()); Session::on_initialize(System::block_number()); } @@ -391,6 +408,22 @@ pub fn start_era(era_index: EraIndex) { assert_eq!(Staking::current_era(), era_index); } +pub fn current_total_payout_for_duration(duration: u64) -> u64 { + let res = inflation::compute_total_payout( + >::slot_stake()*2, + Balances::total_issuance(), + duration, + ); + + res +} + +pub fn add_reward_points_to_all_elected() { + for v in >::current_elected() { + >::add_reward_points_to_validator(v, 1); + } +} + pub fn validator_controllers() -> Vec { Session::validators().into_iter().map(|s| Staking::bonded(&s).expect("no controller for validator")).collect() } diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index 5987d9800d..39409c2c39 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -82,11 +82,6 @@ fn basic_setup_works() { // Initial Era and session assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 0); - - // initial rewards - assert_eq!(Staking::current_session_reward(), 10); - // initial slash_count of validators assert_eq!(Staking::slash_count(&11), 0); @@ -301,6 +296,7 @@ fn slashing_does_not_cause_underflow() { assert_eq!(Staking::offline_slash_grace(), 0); // Set validator preference so that 2^unstake_threshold would cause overflow (greater than 64) + // FIXME: that doesn't overflow. >::insert(11, ValidatorPrefs { unstake_threshold: 10, validator_payment: 0, @@ -316,7 +312,6 @@ fn slashing_does_not_cause_underflow() { }); } - #[test] fn rewards_should_work() { // should check that: @@ -324,12 +319,16 @@ fn rewards_should_work() { // * rewards get paid per Era // * Check that nominators are also rewarded with_externalities(&mut ExtBuilder::default() - .build(), + .nominate(false) + .build(), || { + // Init some balances + let _ = Balances::make_free_balance_be(&2, 500); + let delay = 1; - // this test is only in the scope of one era. Since this variable changes - // at the last block/new era, we'll save it. - let session_reward = 10; + let init_balance_2 = Balances::total_balance(&2); + let init_balance_10 = Balances::total_balance(&10); + let init_balance_11 = Balances::total_balance(&11); // Set payee to controller assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); @@ -337,17 +336,13 @@ fn rewards_should_work() { // Initial config should be correct assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 0); - assert_eq!(Staking::current_session_reward(), 10); - // check the balance of a validator accounts. - assert_eq!(Balances::total_balance(&11), 1000); - // and the nominator (to-be) - let _ = Balances::make_free_balance_be(&2, 500); - assert_eq!(Balances::total_balance(&2), 500); - - // add a dummy nominator. + // Add a dummy nominator. + // + // Equal division indicates that the reward will be equally divided among validator and + // nominator. >::insert(&11, Exposure { - own: 500, // equal division indicates that the reward will be equally divided among validator and nominator. + own: 500, total: 1000, others: vec![IndividualExposure {who: 2, value: 500 }] }); @@ -362,10 +357,21 @@ fn rewards_should_work() { Session::on_initialize(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - - // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), session_reward); + >::add_reward_points_to_validator(11, 50); + >::add_reward_points_to_validator(11, 50); + // This is the second validator of the current elected set. + >::add_reward_points_to_validator(21, 50); + // This must be no-op as it is not an elected validator. + >::add_reward_points_to_validator(1001, 10_000); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout = current_total_payout_for_duration(9*5); + assert!(total_payout > 10); // Test is meaningfull if reward something + + // No reward yet + assert_eq!(Balances::total_balance(&2), init_balance_2); + assert_eq!(Balances::total_balance(&10), init_balance_10); + assert_eq!(Balances::total_balance(&11), init_balance_11); block = 6; // Block 6 => Session 2 => Era 0 System::set_block_number(block); @@ -374,11 +380,6 @@ fn rewards_should_work() { assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 2); - // session reward is the same, - assert_eq!(Staking::current_session_reward(), session_reward); - // though 2 will be deducted while stashed in the era reward due to delay - assert_eq!(Staking::current_era_reward(), 2*session_reward); // - delay); - block = 9; // Block 9 => Session 3 => Era 1 System::set_block_number(block); Timestamp::set_timestamp(block*5); // back to being on time. no delays @@ -386,8 +387,10 @@ fn rewards_should_work() { assert_eq!(Staking::current_era(), 1); assert_eq!(Session::current_index(), 3); - assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward)/2); - assert_eq!(Balances::total_balance(&2), 500 + (3*session_reward)/2); + // 11 validator has 2/3 of the total rewards and half half for it and its nominator + assert_eq!(Balances::total_balance(&2), init_balance_2 + total_payout/3); + assert_eq!(Balances::total_balance(&10), init_balance_10 + total_payout/3); + assert_eq!(Balances::total_balance(&11), init_balance_11); }); } @@ -400,49 +403,36 @@ fn multi_era_reward_should_work() { .nominate(false) .build(), || { - let session_reward = 10; - - // This is set by the test config builder. - assert_eq!(Staking::current_session_reward(), session_reward); - - // check the balance of a validator accounts. - assert_eq!(Balances::total_balance(&10), 1); + let init_balance_10 = Balances::total_balance(&10); // Set payee to controller assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); - start_session(0); - - // session triggered: the reward value stashed should be 10 - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), session_reward); + // Compute now as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 10); // Test is meaningfull if reward something + dbg!(>::slot_stake()); + >::add_reward_points_to_validator(11, 1); + start_session(0); start_session(1); - - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), 2*session_reward); - start_session(2); + start_session(3); - // 1 + sum of of the session rewards accumulated - let recorded_balance = 1 + 3*session_reward; - assert_eq!(Balances::total_balance(&10), recorded_balance); - - // the reward for next era will be: session_reward * slot_stake - let new_session_reward = Staking::session_reward() * Staking::slot_stake(); - assert_eq!(Staking::current_session_reward(), new_session_reward); + assert_eq!(Staking::current_era(), 1); + assert_eq!(Balances::total_balance(&10), init_balance_10 + total_payout_0); - // fast forward to next era: start_session(4); - // intermediate test. - assert_eq!(Staking::current_era_reward(), 2*new_session_reward); + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 10); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 101); // new era is triggered here. start_session(5); // pay time - assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance); + assert_eq!(Balances::total_balance(&10), init_balance_10 + total_payout_0 + total_payout_1); }); } @@ -457,6 +447,8 @@ fn staking_should_work() { .fair(false) // to give 20 more staked value .build(), || { + Timestamp::set_timestamp(1); // Initialize time. + // remember + compare this along with the test. assert_eq_uvec!(validator_controllers(), vec![20, 10]); @@ -622,10 +614,6 @@ fn nominating_and_rewards_should_work() { assert_ok!(Staking::set_payee(Origin::signed(30), RewardDestination::Controller)); assert_ok!(Staking::set_payee(Origin::signed(40), RewardDestination::Controller)); - // default reward for the first session. - let session_reward = 10; - assert_eq!(Staking::current_session_reward(), session_reward); - // give the man some money let initial_balance = 1000; for i in [1, 2, 3, 4, 5, 10, 11, 20, 21].iter() { @@ -640,14 +628,22 @@ fn nominating_and_rewards_should_work() { assert_ok!(Staking::bond(Origin::signed(3), 4, 1000, RewardDestination::Controller)); assert_ok!(Staking::nominate(Origin::signed(4), vec![11, 21, 41])); + // the total reward for era 0 + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(41, 1); + >::add_reward_points_to_validator(31, 1); + >::add_reward_points_to_validator(21, 10); // must be no-op + >::add_reward_points_to_validator(11, 10); // must be no-op + start_era(1); // 10 and 20 have more votes, they will be chosen by phragmen. assert_eq_uvec!(validator_controllers(), vec![20, 10]); // OLD validators must have already received some rewards. - assert_eq!(Balances::total_balance(&40), 1 + 3 * session_reward); - assert_eq!(Balances::total_balance(&30), 1 + 3 * session_reward); + assert_eq!(Balances::total_balance(&40), 1 + total_payout_0/2); + assert_eq!(Balances::total_balance(&30), 1 + total_payout_0/2); // ------ check the staked value of all parties. @@ -707,35 +703,41 @@ fn nominating_and_rewards_should_work() { assert_eq!(Staking::stakers(31).total, 0); assert_eq!(Staking::stakers(41).total, 0); + // the total reward for era 1 + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(41, 10); // must be no-op + >::add_reward_points_to_validator(31, 10); // must be no-op + >::add_reward_points_to_validator(21, 2); + >::add_reward_points_to_validator(11, 1); start_era(2); - // next session reward. - let new_session_reward = Staking::session_reward() * 3 * Staking::slot_stake(); - // NOTE: some addition or substraction (-2, -3, +1) are due to arithmetic approximations + // nothing else will happen, era ends and rewards are paid again, + // it is expected that nominators will also be paid. See below + + let payout_for_10 = total_payout_1/3; + let payout_for_20 = 2*total_payout_1/3; if cfg!(feature = "equalize") { - // Both have: has [400/2000 ~ 1/5 from 10] + [600/2000 ~ 3/10 from 20]'s reward. ==> 1/5 + 3/10 = 1/2 - assert_eq!(Balances::total_balance(&2), initial_balance + new_session_reward/2 - 3); - assert_eq!(Balances::total_balance(&4), initial_balance + new_session_reward/2 - 3); - // Rest for validators. - assert_eq!(Balances::total_balance(&10), initial_balance + new_session_reward/2 + 1); - assert_eq!(Balances::total_balance(&20), initial_balance + new_session_reward/2 + 1); + // Nominator 2: has [400/2000 ~ 1/5 from 10] + [600/2000 ~ 3/10 from 20]'s reward. + assert_eq!(Balances::total_balance(&2), initial_balance + payout_for_10/5 + payout_for_20*3/10 - 1); + // Nominator 4: has [400/2000 ~ 1/5 from 20] + [600/2000 ~ 3/10 from 10]'s reward. + assert_eq!(Balances::total_balance(&4), initial_balance + payout_for_20/5 + payout_for_10*3/10); + + // Validator 10: got 1000 / 2000 external stake. + assert_eq!(Balances::total_balance(&10), initial_balance + payout_for_10/2); + // Validator 20: got 1000 / 2000 external stake. + assert_eq!(Balances::total_balance(&20), initial_balance + payout_for_20/2); } else { // Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11 - assert_eq!( - Balances::total_balance(&2), - initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 2 - ); + assert_eq!(Balances::total_balance(&2), initial_balance + (2*payout_for_10/9 + 3*payout_for_20/11) - 2); // Nominator 4: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11 - assert_eq!( - Balances::total_balance(&4), - initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 2 - ); + assert_eq!(Balances::total_balance(&4), initial_balance + (2*payout_for_10/9 + 3*payout_for_20/11) - 2); - // 10 got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 - assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9 - 1); - // 10 got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 - assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11 + 2); + // Validator 10: got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 + assert_eq!(Balances::total_balance(&10), initial_balance + 5*payout_for_10/9 - 1); + // Validator 20: got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 + assert_eq!(Balances::total_balance(&20), initial_balance + 5*payout_for_20/11); } check_exposure_all(); @@ -768,6 +770,10 @@ fn nominators_also_get_slashed() { assert_ok!(Staking::bond(Origin::signed(1), 2, nominator_stake, RewardDestination::default())); assert_ok!(Staking::nominate(Origin::signed(2), vec![20, 10])); + let total_payout = current_total_payout_for_duration(3); + assert!(total_payout > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 1); + // new era, pay rewards, start_era(1); @@ -783,7 +789,7 @@ fn nominators_also_get_slashed() { let nominator_slash = nominator_stake.min(total_slash - validator_slash); // initial + first era reward + slash - assert_eq!(Balances::total_balance(&10), initial_balance + 30 - validator_slash); + assert_eq!(Balances::total_balance(&10), initial_balance + total_payout - validator_slash); assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash); check_exposure_all(); check_nominator_all(); @@ -957,45 +963,47 @@ fn reward_destination_works() { active: 1000, unlocking: vec![], })); - // Check current session reward is 10 - let session_reward0 = 3 * Staking::current_session_reward(); // 10 - // Move forward the system for payment - Timestamp::set_timestamp(5); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 1); + start_era(1); // Check that RewardDestination is Staked (default) assert_eq!(Staking::payee(&11), RewardDestination::Staked); // Check that reward went to the stash account of validator - assert_eq!(Balances::free_balance(&11), 1000 + session_reward0); + assert_eq!(Balances::free_balance(&11), 1000 + total_payout_0); // Check that amount at stake increased accordingly assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, - total: 1000 + session_reward0, - active: 1000 + session_reward0, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, unlocking: vec![], })); - // Update current session reward - let session_reward1 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake) //Change RewardDestination to Stash >::insert(&11, RewardDestination::Stash); - // Move forward the system for payment - Timestamp::set_timestamp(10); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 1); + start_era(2); // Check that RewardDestination is Stash assert_eq!(Staking::payee(&11), RewardDestination::Stash); // Check that reward went to the stash account - assert_eq!(Balances::free_balance(&11), 1000 + session_reward0 + session_reward1); + assert_eq!(Balances::free_balance(&11), 1000 + total_payout_0 + total_payout_1); // Record this value - let recorded_stash_balance = 1000 + session_reward0 + session_reward1; + let recorded_stash_balance = 1000 + total_payout_0 + total_payout_1; // Check that amount at stake is NOT increased assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, - total: 1000 + session_reward0, - active: 1000 + session_reward0, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, unlocking: vec![], })); @@ -1005,20 +1013,22 @@ fn reward_destination_works() { // Check controller balance assert_eq!(Balances::free_balance(&10), 1); - // Move forward the system for payment - Timestamp::set_timestamp(15); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_2 = current_total_payout_for_duration(3); + assert!(total_payout_2 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 1); + start_era(3); - let session_reward2 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake) // Check that RewardDestination is Controller assert_eq!(Staking::payee(&11), RewardDestination::Controller); // Check that reward went to the controller account - assert_eq!(Balances::free_balance(&10), 1 + session_reward2); + assert_eq!(Balances::free_balance(&10), 1 + total_payout_2); // Check that amount at stake is NOT increased assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, - total: 1000 + session_reward0, - active: 1000 + session_reward0, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, unlocking: vec![], })); // Check that amount in staked account is NOT increased. @@ -1035,10 +1045,8 @@ fn validator_payment_prefs_work() { .build(), || { // Initial config - let session_reward = 10; let validator_cut = 5; let stash_initial_balance = Balances::total_balance(&11); - assert_eq!(Staking::current_session_reward(), session_reward); // check the balance of a validator accounts. assert_eq!(Balances::total_balance(&10), 1); @@ -1059,35 +1067,15 @@ fn validator_payment_prefs_work() { validator_payment: validator_cut }); - // ------------ Fast forward - // Block 3 => Session 1 => Era 0 - let mut block = 3; - System::set_block_number(block); - Session::on_initialize(System::block_number()); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 1); - - // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), session_reward); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 1); - block = 6; // Block 6 => Session 2 => Era 0 - System::set_block_number(block); - Session::on_initialize(System::block_number()); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 2); - - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), 2*session_reward); - - block = 9; // Block 9 => Session 3 => Era 1 - System::set_block_number(block); - Session::on_initialize(System::block_number()); - assert_eq!(Staking::current_era(), 1); - assert_eq!(Session::current_index(), 3); + start_era(1); // whats left to be shared is the sum of 3 rounds minus the validator's cut. - let shared_cut = 3 * session_reward - validator_cut; + let shared_cut = total_payout_0 - validator_cut; // Validator's payee is Staked account, 11, reward will be paid here. assert_eq!(Balances::total_balance(&11), stash_initial_balance + shared_cut/2 + validator_cut); // Controller account will not get any reward. @@ -1165,7 +1153,6 @@ fn bond_extra_and_withdraw_unbonded_works() { // Initial config should be correct assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 0); - assert_eq!(Staking::current_session_reward(), 10); // check the balance of a validator accounts. assert_eq!(Balances::total_balance(&10), 1); @@ -1294,22 +1281,31 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment( assert_eq!(Staking::stakers(&21).total, 69); >::insert(&20, StakingLedger { stash: 22, total: 69, active: 69, unlocking: vec![] }); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::add_reward_points_to_validator(11, 1); + >::add_reward_points_to_validator(21, 1); + // New era --> rewards are paid --> stakes are changed start_era(1); // -- new balances + reward - assert_eq!(Staking::stakers(&11).total, 1000 + 30); - assert_eq!(Staking::stakers(&21).total, 69 + 30); + assert_eq!(Staking::stakers(&11).total, 1000 + total_payout_0/2); + assert_eq!(Staking::stakers(&21).total, 69 + total_payout_0/2); + + let _11_balance = Balances::free_balance(&11); + assert_eq!(_11_balance, 1000 + total_payout_0/2); // -- slot stake should also be updated. - assert_eq!(Staking::slot_stake(), 69 + 30); + assert_eq!(Staking::slot_stake(), 69 + total_payout_0/2); // If 10 gets slashed now, it will be slashed by 5% of exposure.total * 2.pow(unstake_thresh) Staking::on_offline_validator(10, 4); // Confirm user has been reported assert_eq!(Staking::slash_count(&11), 4); // check the balance of 10 (slash will be deducted from free balance.) - assert_eq!(Balances::free_balance(&11), 1000 + 30 - 51 /*5% of 1030*/ * 8 /*2**3*/); + assert_eq!(Balances::free_balance(&11), _11_balance - _11_balance*5/100 * 2u64.pow(3)); check_exposure_all(); check_nominator_all(); @@ -1621,6 +1617,8 @@ fn switching_roles() { .nominate(false) .build(), || { + Timestamp::set_timestamp(1); // Initialize time. + // Reset reward destination for i in &[10, 20] { assert_ok!(Staking::set_payee(Origin::signed(*i), RewardDestination::Controller)); } @@ -1718,7 +1716,7 @@ fn bond_with_no_staked_value() { .nominate(false) .minimum_validator_count(1) .build(), || { - // Can't bond with 1 + // Can't bond with 1 assert_noop!( Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller), "can not bond with value less than minimum balance" @@ -1753,7 +1751,6 @@ fn bond_with_no_staked_value() { assert_ok!(Staking::withdraw_unbonded(Origin::signed(2))); assert!(Staking::ledger(2).is_none()); assert_eq!(Balances::locks(&1).len(), 0); - }); } @@ -1771,13 +1768,16 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { // setup assert_ok!(Staking::chill(Origin::signed(30))); assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); - let initial_balance_2 = Balances::free_balance(&2); - let initial_balance_10 = Balances::free_balance(&10); + let init_balance_2 = Balances::free_balance(&2); + let init_balance_10 = Balances::free_balance(&10); // Stingy validator. assert_ok!(Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller)); assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default())); + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + add_reward_points_to_all_elected(); start_era(1); // 2 is elected. @@ -1786,26 +1786,25 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { assert_eq!(Staking::slot_stake(), 1); // Old ones are rewarded. - assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30); + assert_eq!(Balances::free_balance(&10), init_balance_10 + total_payout_0/3); // no rewards paid to 2. This was initial election. - assert_eq!(Balances::free_balance(&2), initial_balance_2); + assert_eq!(Balances::free_balance(&2), init_balance_2); + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 100); // Test is meaningfull if reward something + add_reward_points_to_all_elected(); start_era(2); assert_eq_uvec!(validator_controllers(), vec![20, 10, 2]); assert_eq!(Staking::slot_stake(), 1); - let reward = Staking::current_session_reward(); - // 2 will not get the full reward, practically 1 - assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(3)); - // same for 10 - assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30 + reward.max(3)); + assert_eq!(Balances::free_balance(&2), init_balance_2 + total_payout_1/3); + assert_eq!(Balances::free_balance(&10), init_balance_10 + total_payout_0/3 + total_payout_1/3); check_exposure_all(); check_nominator_all(); }); } - #[cfg(feature = "equalize")] #[test] fn phragmen_linear_worse_case_equalize() { @@ -2060,7 +2059,7 @@ fn reward_validator_slashing_validator_doesnt_overflow() { >::insert(&11, Exposure { total: stake, own: stake, others: vec![] }); // Check reward - Staking::reward_validator(&11, reward_slash); + let _ = Staking::reward_validator(&11, reward_slash); assert_eq!(Balances::total_balance(&11), stake * 2); // Set staker @@ -2076,3 +2075,28 @@ fn reward_validator_slashing_validator_doesnt_overflow() { assert_eq!(Balances::total_balance(&2), 1); }) } + +#[test] +fn reward_from_authorship_event_handler_works() { + with_externalities(&mut ExtBuilder::default() + .build(), + || { + use authorship::EventHandler; + + assert_eq!(>::author(), 11); + + >::note_author(11); + >::note_uncle(21, 1); + // An uncle author that is not currently elected doesn't get rewards, + // but the block producer does get reward for referencing it. + >::note_uncle(31, 1); + + // Not mandatory but must be coherent with rewards + assert_eq!(>::get(), vec![21, 11]); + + // 21 is rewarded as an uncle procuder + // 11 is rewarded as a block procuder and unclde referencer + assert_eq!(CurrentEraRewards::get().rewards, vec![1, 20+2*2]); + assert_eq!(CurrentEraRewards::get().total, 25); + }) +} diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 0b35eca659..aca056eb50 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -615,6 +615,12 @@ bitmask! { } } +pub trait Time { + type Moment: SimpleArithmetic + Codec + Clone + Default; + + fn now() -> Self::Moment; +} + impl WithdrawReasons { /// Choose all variants except for `one`. pub fn except(one: WithdrawReason) -> WithdrawReasons { diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 43aa29e04f..ca7245664e 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -96,7 +96,8 @@ use parity_codec::Encode; use parity_codec::Decode; #[cfg(feature = "std")] use inherents::ProvideInherentData; -use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple, traits::Get}; +use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple}; +use srml_support::traits::{Time, Get}; use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; @@ -321,6 +322,15 @@ impl ProvideInherent for Module { } } +impl Time for Module { + type Moment = T::Moment; + + /// Before the first set of now with inherent the value returned is zero. + fn now() -> Self::Moment { + Self::now() + } +} + #[cfg(test)] mod tests { use super::*; -- GitLab From 7c8bd73cef8c6afd60fec837d8f5e732a39a5615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 24 Jul 2019 21:40:34 +0200 Subject: [PATCH 029/151] Expose instancing in metadata (#3188) * Expose instancing in metadata - Introduces metadata v7 - If a module is using instancing, the storage exposes the instance in metadata - Metadata module name is now the upper case one given to `construct_runtime!` * Remove obsolete macro * Just expose one prefix * Bump spec * Fix prefix generation --- Cargo.lock | 1 + node/runtime/src/lib.rs | 4 +- srml/metadata/src/lib.rs | 27 +- .../procedural/src/storage/transformation.rs | 55 +- srml/support/procedural/tools/src/lib.rs | 4 +- srml/support/src/lib.rs | 219 +++--- srml/support/src/metadata.rs | 315 +++++---- srml/support/src/runtime.rs | 15 +- srml/support/src/storage/storage_items.rs | 637 +++++++++--------- srml/support/test/Cargo.toml | 1 + srml/support/test/tests/instance.rs | 97 +++ 11 files changed, 757 insertions(+), 618 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7544dc000..aac1b6aa26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4009,6 +4009,7 @@ name = "srml-support-test" version = "2.0.0" dependencies = [ "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "srml-support 2.0.0", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 7cfc184709..c6c93c162b 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -75,8 +75,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 118, - impl_version: 118, + spec_version: 119, + impl_version: 119, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index fca2a1cfdc..f518de5057 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -286,6 +286,15 @@ pub enum StorageEntryModifier { Default, } +/// All metadata of the storage. +#[derive(Clone, PartialEq, Eq, Encode)] +#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] +pub struct StorageMetadata { + /// The common prefix used by all storage entries. + pub prefix: DecodeDifferent<&'static str, StringBuf>, + pub entries: DecodeDifferent<&'static [StorageEntryMetadata], Vec>, +} + #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] /// Metadata prefixed by a u32 for reserved usage @@ -309,8 +318,10 @@ pub enum RuntimeMetadata { V4(RuntimeMetadataDeprecated), /// Version 5 for runtime metadata. No longer used. V5(RuntimeMetadataDeprecated), - /// Version 6 for runtime metadata. - V6(RuntimeMetadataV6), + /// Version 6 for runtime metadata. No longer used. + V6(RuntimeMetadataDeprecated), + /// Version 7 for runtime metadata. + V7(RuntimeMetadataV7), } /// Enum that should fail. @@ -332,17 +343,19 @@ impl Decode for RuntimeMetadataDeprecated { /// The metadata of a runtime. #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct RuntimeMetadataV6 { +pub struct RuntimeMetadataV7 { pub modules: DecodeDifferentArray, } +/// The latest version of the metadata. +pub type RuntimeMetadataLastVersion = RuntimeMetadataV7; + /// All metadata about an runtime module. #[derive(Clone, PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] pub struct ModuleMetadata { pub name: DecodeDifferentStr, - pub prefix: DecodeDifferent, StringBuf>, - pub storage: ODFnA, + pub storage: Option, StorageMetadata>>, pub calls: ODFnA, pub event: ODFnA, pub constants: DFnA, @@ -357,8 +370,8 @@ impl Into for RuntimeMetadataPrefixed { } } -impl Into for RuntimeMetadata { +impl Into for RuntimeMetadataLastVersion { fn into(self) -> RuntimeMetadataPrefixed { - RuntimeMetadataPrefixed(META_RESERVED, self) + RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V7(self)) } } diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index ae0531c57d..0977c29665 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -138,13 +138,14 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { &instance_opts.instance, &storage_lines, ); - let (store_default_struct, store_functions_to_metadata) = store_functions_to_metadata( + let (store_default_struct, store_metadata) = store_functions_to_metadata( &scrate, &traitinstance, &traittype, &instance_opts, &storage_lines, &where_clause, + &cratename, ); let InstanceOpts { @@ -153,7 +154,6 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { .. } = instance_opts; - let cratename_string = cratename.to_string(); let expanded = quote! { #scrate_decl #decl_storage_items @@ -171,12 +171,8 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { { #impl_store_fns #[doc(hidden)] - pub fn store_metadata_functions() -> &'static [#scrate::metadata::StorageEntryMetadata] { - #store_functions_to_metadata - } - #[doc(hidden)] - pub fn store_metadata_name() -> &'static str { - #cratename_string + pub fn storage_metadata() -> #scrate::metadata::StorageMetadata { + #store_metadata } } @@ -583,22 +579,25 @@ fn decl_store_extra_genesis( } fn create_and_impl_instance( - prefix: &str, + instance_prefix: &str, ident: &Ident, doc: &TokenStream2, const_names: &[(Ident, String)], scrate: &TokenStream2, instantiable: &Ident, + cratename: &Ident, ) -> TokenStream2 { let mut const_impls = TokenStream2::new(); for (const_name, partial_const_value) in const_names { - let const_value = format!("{}{}", partial_const_value, prefix); + let const_value = format!("{}{}", instance_prefix, partial_const_value); const_impls.extend(quote! { const #const_name: &'static str = #const_value; }); } + let prefix = format!("{}{}", instance_prefix, cratename.to_string()); + quote! { // Those trait are derived because of wrong bounds for generics #[cfg_attr(feature = "std", derive(Debug))] @@ -606,6 +605,7 @@ fn create_and_impl_instance( #doc pub struct #ident; impl #instantiable for #ident { + const PREFIX: &'static str = #prefix; #const_impls } } @@ -620,7 +620,6 @@ fn decl_storage_items( storage_lines: &ext::Punctuated, where_clause: &Option, ) -> TokenStream2 { - let mut impls = TokenStream2::new(); let InstanceOpts { @@ -686,6 +685,8 @@ fn decl_storage_items( /// Defines storage prefixes, they must be unique. #hide pub trait #instantiable: 'static { + /// The prefix used by any storage entry of an instance. + const PREFIX: &'static str; #const_impls } }); @@ -707,9 +708,11 @@ fn decl_storage_items( ); // Impl Instance trait for instances - for (prefix, ident, doc) in instances { + for (instance_prefix, ident, doc) in instances { impls.extend( - create_and_impl_instance(&prefix, &ident, &doc, &const_names, scrate, &instantiable) + create_and_impl_instance( + &instance_prefix, &ident, &doc, &const_names, scrate, &instantiable, cratename + ) ); } } @@ -725,7 +728,13 @@ fn decl_storage_items( } else { impls.extend( create_and_impl_instance( - "", &inherent_instance, "e!(#[doc(hidden)]), &const_names, scrate, &instantiable + "", + &inherent_instance, + "e!(#[doc(hidden)]), + &const_names, + scrate, + &instantiable, + cratename, ) ); } @@ -780,10 +789,7 @@ fn decl_storage_items( impls } - -fn decl_store_items( - storage_lines: &ext::Punctuated, -) -> TokenStream2 { +fn decl_store_items(storage_lines: &ext::Punctuated) -> TokenStream2 { storage_lines.inner.iter().map(|sline| &sline.name) .fold(TokenStream2::new(), |mut items, name| { items.extend(quote!(type #name;)); @@ -933,8 +939,8 @@ fn store_functions_to_metadata ( instance_opts: &InstanceOpts, storage_lines: &ext::Punctuated, where_clause: &Option, + cratename: &Ident, ) -> (TokenStream2, TokenStream2) { - let InstanceOpts { comma_instance, equal_default_instance, @@ -1077,11 +1083,14 @@ fn store_functions_to_metadata ( default_getter_struct_def.extend(def_get); } + + let prefix = cratename.to_string(); + let prefix = instance.as_ref().map_or_else(|| quote!(#prefix), |i| quote!(#i::PREFIX)); + (default_getter_struct_def, quote!{ - { - &[ - #items - ] + #scrate::metadata::StorageMetadata { + prefix: #scrate::metadata::DecodeDifferent::Encode(#prefix), + entries: #scrate::metadata::DecodeDifferent::Encode(&[ #items ][..]), } }) } diff --git a/srml/support/procedural/tools/src/lib.rs b/srml/support/procedural/tools/src/lib.rs index 1b8a580773..2b08104ca7 100644 --- a/srml/support/procedural/tools/src/lib.rs +++ b/srml/support/procedural/tools/src/lib.rs @@ -37,8 +37,8 @@ fn generate_hidden_includes_mod_name(unique_id: &str) -> Ident { /// Generates the access to the `srml-support` crate. pub fn generate_crate_access(unique_id: &str, def_crate: &str) -> TokenStream { - if ::std::env::var("CARGO_PKG_NAME").unwrap() == def_crate { - quote::quote!( crate ) + if std::env::var("CARGO_PKG_NAME").unwrap() == def_crate { + quote::quote!( srml_support ) } else { let mod_name = generate_hidden_includes_mod_name(unique_id); quote::quote!( self::#mod_name::hidden_include ) diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 474456035d..96101c44d7 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -18,6 +18,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +/// Export ourself as `srml_support` to make tests happy. +extern crate self as srml_support; + #[macro_use] extern crate bitmask; @@ -251,9 +254,8 @@ mod tests { use codec::Codec; use runtime_io::{with_externalities, Blake2Hasher}; pub use srml_metadata::{ - DecodeDifferent, StorageEntryMetadata, - StorageEntryType, StorageEntryModifier, - DefaultByte, DefaultByteGetter, StorageHasher + DecodeDifferent, StorageEntryMetadata, StorageMetadata, StorageEntryType, + StorageEntryModifier, DefaultByte, DefaultByteGetter, StorageHasher }; pub use rstd::marker::PhantomData; @@ -431,112 +433,117 @@ mod tests { }); } - const EXPECTED_METADATA: &[StorageEntryMetadata] = &[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("Data"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map{ - hasher: StorageHasher::Twox64Concat, - key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructData(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericData"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map{ - hasher: StorageHasher::Twox128, - key: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - is_linked: true - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericData2"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map{ - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - is_linked: true - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("DataDM"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Twox64Concat, - key1: DecodeDifferent::Encode("u32"), - key2: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("u64"), - key2_hasher: StorageHasher::Blake2_256, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructDataDM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericDataDM"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, - key1: DecodeDifferent::Encode("T::BlockNumber"), - key2: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: StorageHasher::Twox128, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericData2DM"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, - key1: DecodeDifferent::Encode("T::BlockNumber"), - key2: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: StorageHasher::Twox256, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("AppendableDM"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, - key1: DecodeDifferent::Encode("u32"), - key2: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("Vec"), - key2_hasher: StorageHasher::Blake2_256, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - ]; + const EXPECTED_METADATA: StorageMetadata = StorageMetadata { + prefix: DecodeDifferent::Encode("Example"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("Data"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map{ + hasher: StorageHasher::Twox64Concat, + key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructData(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericData"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map{ + hasher: StorageHasher::Twox128, + key: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + is_linked: true + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericData2"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map{ + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + is_linked: true + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("DataDM"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Twox64Concat, + key1: DecodeDifferent::Encode("u32"), + key2: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("u64"), + key2_hasher: StorageHasher::Blake2_256, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructDataDM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericDataDM"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("T::BlockNumber"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + key2_hasher: StorageHasher::Twox128, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericData2DM"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("T::BlockNumber"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + key2_hasher: StorageHasher::Twox256, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("AppendableDM"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("u32"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("Vec"), + key2_hasher: StorageHasher::Blake2_256, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ] + ), + }; #[test] fn store_metadata() { - let metadata = Module::::store_metadata_functions(); + let metadata = Module::::storage_metadata(); assert_eq!(EXPECTED_METADATA, metadata); } } diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index bdb3671e34..8fc4045dba 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -15,16 +15,42 @@ // along with Substrate. If not, see . pub use srml_metadata::{ - DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataV6, - DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata, + DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataLastVersion, + DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata, StorageMetadata, StorageEntryType, StorageEntryModifier, DefaultByte, StorageHasher }; /// Implements the metadata support for the given runtime and all its modules. /// /// Example: -/// ```compile_fail -/// impl_runtime_metadata!(for RUNTIME_NAME with modules MODULE0, MODULE2, MODULE3 with Storage); +/// ``` +///# mod module0 { +///# pub trait Trait { +///# type Origin; +///# type BlockNumber; +///# } +///# srml_support::decl_module! { +///# pub struct Module for enum Call where origin: T::Origin {} +///# } +///# +///# srml_support::decl_storage! { +///# trait Store for Module as TestStorage {} +///# } +///# } +///# use module0 as module1; +///# use module0 as module2; +///# impl module0::Trait for Runtime { +///# type Origin = u32; +///# type BlockNumber = u32; +///# } +/// +/// struct Runtime; +/// srml_support::impl_runtime_metadata! { +/// for Runtime with modules +/// module0::Module as Module0 with, +/// module1::Module as Module1 with, +/// module2::Module as Module2 with Storage, +/// }; /// ``` /// /// In this example, just `MODULE3` implements the `Storage` trait. @@ -36,11 +62,9 @@ macro_rules! impl_runtime_metadata { ) => { impl $runtime { pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed { - $crate::metadata::RuntimeMetadata::V6 ( - $crate::metadata::RuntimeMetadataV6 { + $crate::metadata::RuntimeMetadataLastVersion { modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*), - } - ).into() + }.into() } } } @@ -52,17 +76,22 @@ macro_rules! __runtime_modules_to_metadata { ( $runtime: ident; $( $metadata:expr ),*; - $mod:ident::$module:ident $( < $instance:ident > )? $(with)+ $($kw:ident)*, + $mod:ident::$module:ident $( < $instance:ident > )? as $name:ident $(with)+ $($kw:ident)*, $( $rest:tt )* ) => { $crate::__runtime_modules_to_metadata!( $runtime; $( $metadata, )* $crate::metadata::ModuleMetadata { - name: $crate::metadata::DecodeDifferent::Encode(stringify!($mod)), - prefix: $crate::__runtime_modules_to_metadata_calls_storagename!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), - storage: $crate::__runtime_modules_to_metadata_calls_storage!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), - calls: $crate::__runtime_modules_to_metadata_calls_call!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), - event: $crate::__runtime_modules_to_metadata_calls_event!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), + name: $crate::metadata::DecodeDifferent::Encode(stringify!($name)), + storage: $crate::__runtime_modules_to_metadata_calls_storage!( + $mod, $module $( <$instance> )?, $runtime, $(with $kw)* + ), + calls: $crate::__runtime_modules_to_metadata_calls_call!( + $mod, $module $( <$instance> )?, $runtime, $(with $kw)* + ), + event: $crate::__runtime_modules_to_metadata_calls_event!( + $mod, $module $( <$instance> )?, $runtime, $(with $kw)* + ), constants: $crate::metadata::DecodeDifferent::Encode( $crate::metadata::FnEncode( $mod::$module::<$runtime $(, $mod::$instance )?>::module_constants_metadata @@ -103,7 +132,9 @@ macro_rules! __runtime_modules_to_metadata_calls_call { with $_:ident $(with $kws:ident)* ) => { - $crate::__runtime_modules_to_metadata_calls_call!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* ); + $crate::__runtime_modules_to_metadata_calls_call! { + $mod, $module $( <$instance> )?, $runtime, $(with $kws)* + }; }; ( $mod: ident, @@ -151,42 +182,6 @@ macro_rules! __runtime_modules_to_metadata_calls_event { }; } -#[macro_export] -#[doc(hidden)] -macro_rules! __runtime_modules_to_metadata_calls_storagename { - ( - $mod: ident, - $module: ident $( <$instance:ident> )?, - $runtime: ident, - with Storage - $(with $kws:ident)* - ) => { - $crate::metadata::DecodeDifferent::Encode( - $crate::metadata::FnEncode( - $mod::$module::<$runtime $(, $mod::$instance )?>::store_metadata_name - ) - ) - }; - ( - $mod: ident, - $module: ident $( <$instance:ident> )?, - $runtime: ident, - with $_:ident - $(with $kws:ident)* - ) => { - $crate::__runtime_modules_to_metadata_calls_storagename!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* ); - }; - ( - $mod: ident, - $module: ident $( <$instance:ident> )?, - $runtime: ident, - ) => { - $crate::metadata::DecodeDifferent::Encode( - $crate::metadata::FnEncode(|| "") - ) - }; -} - #[macro_export] #[doc(hidden)] macro_rules! __runtime_modules_to_metadata_calls_storage { @@ -199,7 +194,7 @@ macro_rules! __runtime_modules_to_metadata_calls_storage { ) => { Some($crate::metadata::DecodeDifferent::Encode( $crate::metadata::FnEncode( - $mod::$module::<$runtime $(, $mod::$instance )?>::store_metadata_functions + $mod::$module::<$runtime $(, $mod::$instance )?>::storage_metadata ) )) }; @@ -210,7 +205,9 @@ macro_rules! __runtime_modules_to_metadata_calls_storage { with $_:ident $(with $kws:ident)* ) => { - $crate::__runtime_modules_to_metadata_calls_storage!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* ); + $crate::__runtime_modules_to_metadata_calls_storage! { + $mod, $module $( <$instance> )?, $runtime, $(with $kws)* + }; }; ( $mod: ident, @@ -381,9 +378,9 @@ mod tests { impl_runtime_metadata!( for TestRuntime with modules - system::Module with Event, - event_module::Module with Event Call, - event_module2::Module with Event Storage Call, + system::Module as System with Event, + event_module::Module as Module with Event Call, + event_module2::Module as Module2 with Event Storage Call, ); struct ConstantBlockNumberByteGetter; @@ -407,110 +404,110 @@ mod tests { } } - const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V6( - RuntimeMetadataV6 { - modules: DecodeDifferent::Encode(&[ - ModuleMetadata { - name: DecodeDifferent::Encode("system"), - prefix: DecodeDifferent::Encode(FnEncode(|| "")), - storage: None, - calls: None, - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("SystemEvent"), - arguments: DecodeDifferent::Encode(&[]), - documentation: DecodeDifferent::Encode(&[]) - } - ]) - )), - constants: DecodeDifferent::Encode( - FnEncode(|| &[ - ModuleConstantMetadata { - name: DecodeDifferent::Encode("BlockNumber"), - ty: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantBlockNumberByteGetter) - ), - documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]), - }, - ModuleConstantMetadata { - name: DecodeDifferent::Encode("GetType"), - ty: DecodeDifferent::Encode("T::AccountId"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantGetTypeByteGetter) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - ModuleConstantMetadata { - name: DecodeDifferent::Encode("ASSOCIATED_CONST"), - ty: DecodeDifferent::Encode("u64"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantAssociatedConstByteGetter) - ), - documentation: DecodeDifferent::Encode(&[]), - } - ]) - ), - }, - ModuleMetadata { - name: DecodeDifferent::Encode("event_module"), - prefix: DecodeDifferent::Encode(FnEncode(|| "")), - storage: None, - calls: Some( - DecodeDifferent::Encode(FnEncode(|| &[ - FunctionMetadata { - name: DecodeDifferent::Encode("aux_0"), - arguments: DecodeDifferent::Encode(&[]), - documentation: DecodeDifferent::Encode(&[]), - } - ]))), - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("TestEvent"), - arguments: DecodeDifferent::Encode(&["Balance"]), - documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]) - } - ]) - )), - constants: DecodeDifferent::Encode(FnEncode(|| &[])), - }, - ModuleMetadata { - name: DecodeDifferent::Encode("event_module2"), - prefix: DecodeDifferent::Encode(FnEncode(||"TestStorage")), - storage: Some(DecodeDifferent::Encode( - FnEncode(||&[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("StorageMethod"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter( - &event_module2::__GetByteStructStorageMethod( - std::marker::PhantomData:: + const EXPECTED_METADATA: RuntimeMetadataLastVersion = RuntimeMetadataLastVersion { + modules: DecodeDifferent::Encode(&[ + ModuleMetadata { + name: DecodeDifferent::Encode("System"), + storage: None, + calls: None, + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("SystemEvent"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]) + } + ]) + )), + constants: DecodeDifferent::Encode( + FnEncode(|| &[ + ModuleConstantMetadata { + name: DecodeDifferent::Encode("BlockNumber"), + ty: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantBlockNumberByteGetter) + ), + documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]), + }, + ModuleConstantMetadata { + name: DecodeDifferent::Encode("GetType"), + ty: DecodeDifferent::Encode("T::AccountId"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantGetTypeByteGetter) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ModuleConstantMetadata { + name: DecodeDifferent::Encode("ASSOCIATED_CONST"), + ty: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantAssociatedConstByteGetter) + ), + documentation: DecodeDifferent::Encode(&[]), + } + ]) + ), + }, + ModuleMetadata { + name: DecodeDifferent::Encode("Module"), + storage: None, + calls: Some( + DecodeDifferent::Encode(FnEncode(|| &[ + FunctionMetadata { + name: DecodeDifferent::Encode("aux_0"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]), + } + ]))), + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("TestEvent"), + arguments: DecodeDifferent::Encode(&["Balance"]), + documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]) + } + ]) + )), + constants: DecodeDifferent::Encode(FnEncode(|| &[])), + }, + ModuleMetadata { + name: DecodeDifferent::Encode("Module2"), + storage: Some(DecodeDifferent::Encode( + FnEncode(|| StorageMetadata { + prefix: DecodeDifferent::Encode("TestStorage"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("StorageMethod"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter( + &event_module2::__GetByteStructStorageMethod( + std::marker::PhantomData:: + ) ) - ) - ), - documentation: DecodeDifferent::Encode(&[]), - } - ]) - )), - calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))), - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("TestEvent"), - arguments: DecodeDifferent::Encode(&["Balance"]), - documentation: DecodeDifferent::Encode(&[]) - } - ]) - )), - constants: DecodeDifferent::Encode(FnEncode(|| &[])), - }, - ]) - } - ); + ), + documentation: DecodeDifferent::Encode(&[]), + } + ] + ) + }), + )), + calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))), + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("TestEvent"), + arguments: DecodeDifferent::Encode(&["Balance"]), + documentation: DecodeDifferent::Encode(&[]) + } + ]) + )), + constants: DecodeDifferent::Encode(FnEncode(|| &[])), + }, + ]) + }; #[test] fn runtime_metadata() { diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs index 4461e37518..0897bd153b 100644 --- a/srml/support/src/runtime.rs +++ b/srml/support/src/runtime.rs @@ -576,7 +576,9 @@ macro_rules! __decl_runtime_metadata { $runtime; { $( $parsed )* - $module $( < $module_instance > )? { $( $( $leading_module )* )? $( $modules )* } + $module $( < $module_instance > )? as $name { + $( $( $leading_module )* )? $( $modules )* + } }; $( $rest )* ); @@ -618,11 +620,18 @@ macro_rules! __decl_runtime_metadata { // end of decl ( $runtime:ident; - { $( $parsed_modules:ident $( < $module_instance:ident > )? { $( $withs:ident )* } )* }; + { + $( + $parsed_modules:ident $( < $module_instance:ident > )? as $parsed_name:ident { + $( $withs:ident )* + } + )* + }; ) => { $crate::impl_runtime_metadata!( for $runtime with modules - $( $parsed_modules::Module $( < $module_instance > )? with $( $withs )* , )* + $( $parsed_modules::Module $( < $module_instance > )? as $parsed_name + with $( $withs )* , )* ); } } diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index f67dbf0529..57082c4e99 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -390,325 +390,330 @@ mod tests { type BlockNumber = u32; } - const EXPECTED_METADATA: &[StorageEntryMetadata] = &[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("U32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[ " Hello, this is doc!" ]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("U32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Origin")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32WITHCONFIG"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32WITHCONFIG(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32WITHCONFIG"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIG(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32WITHCONFIGMYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32WITHCONFIGMYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEFOPT"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEFOPT(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - - StorageEntryMetadata { - name: DecodeDifferent::Encode("MAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBMAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("MAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBMAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("LINKEDMAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETLINKEDMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("COMPLEXTYPE1"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("::std::vec::Vec<::Origin>")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructCOMPLEXTYPE1(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("COMPLEXTYPE2"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("(Vec)>>, u32)")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructCOMPLEXTYPE2(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("COMPLEXTYPE3"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - ]; + const EXPECTED_METADATA: StorageMetadata = StorageMetadata { + prefix: DecodeDifferent::Encode("TestStorage"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("U32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[ " Hello, this is doc!" ]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("U32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Origin")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32WITHCONFIG"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32WITHCONFIG(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32WITHCONFIG"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIG(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32WITHCONFIGMYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32WITHCONFIGMYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEFOPT"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEFOPT(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + + StorageEntryMetadata { + name: DecodeDifferent::Encode("MAPU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBMAPU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("MAPU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBMAPU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETMAPU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETMAPU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETMAPU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("LINKEDMAPU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETLINKEDMAPU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("COMPLEXTYPE1"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("::std::vec::Vec<::Origin>")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructCOMPLEXTYPE1(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("COMPLEXTYPE2"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("(Vec)>>, u32)")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructCOMPLEXTYPE2(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("COMPLEXTYPE3"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ] + ), + }; #[test] fn store_metadata() { - let metadata = Module::::store_metadata_functions(); + let metadata = Module::::storage_metadata(); assert_eq!(EXPECTED_METADATA, metadata); } diff --git a/srml/support/test/Cargo.toml b/srml/support/test/Cargo.toml index fa4529d71e..a4152dae2f 100644 --- a/srml/support/test/Cargo.toml +++ b/srml/support/test/Cargo.toml @@ -12,6 +12,7 @@ srml-support = { version = "2", path = "../", default-features = false } inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false } primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false } trybuild = "1" +pretty_assertions = "0.6.1" [features] default = ["std"] diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 4702105bba..30db9c980b 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -19,6 +19,10 @@ use runtime_io::{with_externalities, Blake2Hasher}; use srml_support::{ Parameter, traits::Get, parameter_types, runtime_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}}, + metadata::{ + DecodeDifferent, StorageMetadata, StorageEntryModifier, StorageEntryType, DefaultByteGetter, + StorageEntryMetadata, StorageHasher + }, }; use inherents::{ ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError @@ -408,3 +412,96 @@ fn storage_with_instance_basic_operation() { assert_eq!(DoubleMap::get(&key1, &key2), 0); }); } + +const EXPECTED_METADATA: StorageMetadata = StorageMetadata { + prefix: DecodeDifferent::Encode("Instance2Module2"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("Value"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Amount")), + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructValue( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("Map"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("u64"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructMap( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("LinkedMap"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("u64"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructLinkedMap( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("DoubleMap"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap { + hasher: StorageHasher::Blake2_256, + key2_hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("u64"), + key2: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("u64"), + }, + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructDoubleMap( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + } + ] + ) +}; + +#[test] +fn test_instance_storage_metadata() { + let metadata = Module2_2::storage_metadata(); + pretty_assertions::assert_eq!(EXPECTED_METADATA, metadata); +} + +#[test] +fn instance_prefix_is_prefix_of_entries() { + use module2::Instance; + + let prefix = module2::Instance2::PREFIX; + assert!(module2::Instance2::PREFIX_FOR_Value.starts_with(prefix)); + assert!(module2::Instance2::PREFIX_FOR_Map.starts_with(prefix)); + assert!(module2::Instance2::PREFIX_FOR_LinkedMap.starts_with(prefix)); + assert!(module2::Instance2::PREFIX_FOR_DoubleMap.starts_with(prefix)); +} \ No newline at end of file -- GitLab From 2bf7c5854a1c9d8deef0a3daa1df39582e80170d Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Wed, 24 Jul 2019 20:43:55 +0100 Subject: [PATCH 030/151] wasm-builder: allow default cargo nightly (#3195) * wasm-builder: use default cargo command if nightly is default toolchain * wasm-builder: use get_nightly_cargo in prereq check * wasm-builder: fix check_nightly_installed * wasm-builder: add cargo command builder struct * wasm-builder: remove unnecessary stuff * wasm-builder: just use Strings --- core/utils/wasm-builder/src/lib.rs | 72 ++++++++++++++++---- core/utils/wasm-builder/src/prerequisites.rs | 20 ++---- core/utils/wasm-builder/src/wasm_project.rs | 2 +- 3 files changed, 65 insertions(+), 29 deletions(-) diff --git a/core/utils/wasm-builder/src/lib.rs b/core/utils/wasm-builder/src/lib.rs index 779fa8db09..5bb0342c66 100644 --- a/core/utils/wasm-builder/src/lib.rs +++ b/core/utils/wasm-builder/src/lib.rs @@ -151,18 +151,66 @@ fn create_out_file(file_name: &str, content: String) { } /// Get a cargo command that compiles with nightly -fn get_nightly_cargo() -> Command { - if Command::new("rustup") - .args(&["run", "nightly", "cargo"]) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .status() - .map(|s| s.success()).unwrap_or(false) - { - let mut cmd = Command::new("rustup"); - cmd.args(&["run", "nightly", "cargo"]); - cmd +fn get_nightly_cargo() -> CargoCommand { + let default_cargo = CargoCommand::new("cargo"); + let mut rustup_run_nightly = CargoCommand::new("rustup"); + rustup_run_nightly.args(&["run", "nightly", "cargo"]); + + if default_cargo.is_nightly() { + default_cargo + } else if rustup_run_nightly.works() { + rustup_run_nightly } else { - Command::new("cargo") + default_cargo + } +} + +/// Builder for cargo commands +#[derive(Debug)] +struct CargoCommand { + program: String, + args: Vec, +} + +impl CargoCommand { + fn new(program: &str) -> Self { + CargoCommand { program: program.into(), args: Vec::new() } + } + + fn arg(&mut self, arg: &str) -> &mut Self { + self.args.push(arg.into()); + self + } + + fn args(&mut self, args: &[&str]) -> &mut Self { + for arg in args { + self.arg(arg); + } + self + } + + fn command(&self) -> Command { + let mut cmd = Command::new(&self.program); + cmd.args(&self.args); + cmd + } + + fn works(&self) -> bool { + self.command() + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .map(|s| s.success()).unwrap_or(false) + } + + /// Check if the supplied cargo command is a nightly version + fn is_nightly(&self) -> bool { + self.command() + .arg("--version") + .output() + .map_err(|_| ()) + .and_then(|o| String::from_utf8(o.stdout).map_err(|_| ())) + .unwrap_or_default() + .contains("-nightly") } } diff --git a/core/utils/wasm-builder/src/prerequisites.rs b/core/utils/wasm-builder/src/prerequisites.rs index 5835d322b1..52ff40887c 100644 --- a/core/utils/wasm-builder/src/prerequisites.rs +++ b/core/utils/wasm-builder/src/prerequisites.rs @@ -44,21 +44,8 @@ pub fn check() -> Option<&'static str> { } fn check_nightly_installed() -> bool { - let version = Command::new("cargo") - .arg("--version") - .output() - .map_err(|_| ()) - .and_then(|o| String::from_utf8(o.stdout).map_err(|_| ())) - .unwrap_or_default(); - - let version2 = Command::new("rustup") - .args(&["run", "nightly", "cargo", "--version"]) - .output() - .map_err(|_| ()) - .and_then(|o| String::from_utf8(o.stdout).map_err(|_| ())) - .unwrap_or_default(); - - version.contains("-nightly") || version2.contains("-nightly") + let command = crate::get_nightly_cargo(); + command.is_nightly() } fn check_wasm_toolchain_installed() -> bool { @@ -87,10 +74,11 @@ fn check_wasm_toolchain_installed() -> bool { let manifest_path = manifest_path.display().to_string(); crate::get_nightly_cargo() + .command() .args(&["build", "--target=wasm32-unknown-unknown", "--manifest-path", &manifest_path]) .stdout(Stdio::null()) .stderr(Stdio::null()) .status() .map(|s| s.success()) .unwrap_or(false) -} \ No newline at end of file +} diff --git a/core/utils/wasm-builder/src/wasm_project.rs b/core/utils/wasm-builder/src/wasm_project.rs index 0d348a5cf4..4bc908114c 100644 --- a/core/utils/wasm-builder/src/wasm_project.rs +++ b/core/utils/wasm-builder/src/wasm_project.rs @@ -259,7 +259,7 @@ fn is_release_build() -> bool { /// Build the project to create the WASM binary. fn build_project(project: &Path) { let manifest_path = project.join("Cargo.toml"); - let mut build_cmd = crate::get_nightly_cargo(); + let mut build_cmd = crate::get_nightly_cargo().command(); let rustflags = format!( "-C link-arg=--export-table {}", -- GitLab From 8b7d0fb992698f672a2fa090b6273814776f89fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Wed, 24 Jul 2019 20:53:04 +0100 Subject: [PATCH 031/151] Use BABE instead of AuRa in node (#3171) * babe: add babe module trait * babe: track current slot and epoch start slot * babe: implement ShouldEndSession based on epochs * babe: rename weight type to avoid ambiguities * babe: expose epoch start slot in Epoch digest * babe: use epoch start for validating epoch transitions * babe: make the epoch duration a parameter type * babe: remove unused fields from config * node: update runtime to use babe instead of aura * node: use babe instead of aura * core: generate sr25519 keys from seed and add to keystore * core: remove AuthorityKeyring * node: remove unused primitive types related to babe crypto * uniform babe primitives crate import name * wrap long lines * babe: fix find_epoch_digest * fork-tree: fix find_node_where * node: set babe epoch duration to "10 minutes" * babe: cleanup import key cache if authorities don't change * node: make integration test compile (but fail) * node: bump spec_version * node: fix import * babe: don't use constants in storage fields array sizes * babe: account for first epoch slot way in the past * babe: signal next epoch change (not current) * babe: calculate next epoch randomness with next epoch index * babe: track next epoch in node * babe: cache current epoch and authorities separately * babe: generate valid babe vrf proofs in integration test * babe: cleanup claim_slot * babe: perform threshold calculation according to spec * babe: compute relative weight in threshold * babe: more precise threshold calculation * babe: use floats for threshold exponent calculation * babe: update constant c --- Cargo.lock | 33 +- core/cli/src/params.rs | 8 +- core/client/src/genesis.rs | 8 +- core/consensus/babe/Cargo.toml | 8 +- core/consensus/babe/primitives/src/lib.rs | 44 ++- core/consensus/babe/src/lib.rs | 306 +++++++++++------- core/consensus/babe/src/tests.rs | 18 +- core/consensus/common/src/lib.rs | 3 + core/consensus/rhd/src/lib.rs | 64 ++-- core/consensus/rhd/src/misbehaviour_check.rs | 10 +- .../src/communication/tests.rs | 8 +- core/finality-grandpa/src/import.rs | 2 +- core/finality-grandpa/src/light_import.rs | 2 +- core/finality-grandpa/src/tests.rs | 96 +++--- core/keyring/src/lib.rs | 8 +- core/keyring/src/sr25519.rs | 7 +- core/service/src/lib.rs | 3 +- core/service/test/src/lib.rs | 3 +- core/test-client/src/lib.rs | 6 +- core/test-runtime/Cargo.toml | 8 +- core/test-runtime/client/src/lib.rs | 8 +- core/test-runtime/src/lib.rs | 58 ++-- core/test-runtime/src/system.rs | 8 +- core/utils/fork-tree/src/lib.rs | 54 +++- node/cli/Cargo.toml | 5 +- node/cli/src/chain_spec.rs | 56 ++-- node/cli/src/service.rs | 140 +++++--- node/executor/src/lib.rs | 27 +- node/primitives/src/lib.rs | 10 - node/runtime/Cargo.toml | 8 +- node/runtime/src/lib.rs | 52 +-- srml/babe/src/lib.rs | 135 +++++--- srml/staking/src/lib.rs | 7 +- 33 files changed, 784 insertions(+), 429 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aac1b6aa26..a218c5638e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2274,8 +2274,8 @@ dependencies = [ "substrate-basic-authorship 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-aura 2.0.0", - "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-babe 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-finality-grandpa 2.0.0", "substrate-finality-grandpa-primitives 2.0.0", @@ -2360,8 +2360,8 @@ dependencies = [ "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", - "srml-aura 2.0.0", "srml-authorship 0.1.0", + "srml-babe 2.0.0", "srml-balances 2.0.0", "srml-collective 2.0.0", "srml-contracts 2.0.0", @@ -2380,7 +2380,7 @@ dependencies = [ "srml-timestamp 2.0.0", "srml-treasury 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -2460,6 +2460,15 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-integer" version = "0.1.41" @@ -2469,6 +2478,17 @@ dependencies = [ "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-rational" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.2.8" @@ -4335,6 +4355,9 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6153,7 +6176,9 @@ dependencies = [ "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +"checksum num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "57450397855d951f1a41305e54851b1a7b8f5d2e349543a02a2effe25459f718" "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 78899ccd4c..499c8b9eca 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -431,15 +431,15 @@ struct KeyringTestAccountCliValues { help: String, conflicts_with: Vec, name: String, - variant: keyring::AuthorityKeyring, + variant: keyring::Sr25519Keyring, } lazy_static::lazy_static! { /// The Cli values for all test accounts. static ref TEST_ACCOUNTS_CLI_VALUES: Vec = { - keyring::AuthorityKeyring::iter().map(|a| { + keyring::Sr25519Keyring::iter().map(|a| { let help = format!("Shortcut for `--key //{} --name {}`.", a, a); - let conflicts_with = keyring::AuthorityKeyring::iter() + let conflicts_with = keyring::Sr25519Keyring::iter() .filter(|b| a != *b) .map(|b| b.to_string().to_lowercase()) .chain(["name", "key"].iter().map(ToString::to_string)) @@ -459,7 +459,7 @@ lazy_static::lazy_static! { /// Wrapper for exposing the keyring test accounts into the Cli. #[derive(Debug, Clone)] pub struct Keyring { - pub account: Option, + pub account: Option, } impl StructOpt for Keyring { diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 8843ec84bc..3451e1e9b1 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -47,7 +47,7 @@ mod tests { use test_client::{ runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}, runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, - AccountKeyring, AuthorityKeyring + AccountKeyring, Sr25519Keyring, }; use runtime_primitives::traits::BlakeTwo256; use primitives::Blake2Hasher; @@ -147,7 +147,7 @@ mod tests { #[test] fn construct_genesis_should_work_with_native() { let mut storage = GenesisConfig::new(false, - vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000 ).genesis_map(); @@ -176,7 +176,7 @@ mod tests { #[test] fn construct_genesis_should_work_with_wasm() { let mut storage = GenesisConfig::new(false, - vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000 ).genesis_map(); @@ -205,7 +205,7 @@ mod tests { #[test] fn construct_genesis_with_bad_transaction_should_panic() { let mut storage = GenesisConfig::new(false, - vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 68 ).genesis_map(); diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 8b473932dd..516ac1a40d 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -7,8 +7,11 @@ edition = "2018" [dependencies] parity-codec = { version = "4.1.1", features = ["derive"] } -babe_primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } primitives = { package = "substrate-primitives", path = "../../primitives" } +num-bigint = "0.2" +num-rational = "0.2" +num-traits = "0.2" runtime_support = { package = "srml-support", path = "../../../srml/support" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } @@ -37,3 +40,6 @@ service = { package = "substrate-service", path = "../../service" } test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.18" env_logger = "0.6.1" + +[features] +test-helpers = [] diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index a7b49364f4..b6e964d27f 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -24,16 +24,21 @@ mod digest; use parity_codec::{Encode, Decode}; use rstd::vec::Vec; use runtime_primitives::ConsensusEngineId; -use substrate_primitives::sr25519::Public; +use substrate_primitives::sr25519; use substrate_client::decl_runtime_apis; #[cfg(feature = "std")] pub use digest::{BabePreDigest, CompatibleDigestItem}; pub use digest::{BABE_VRF_PREFIX, RawBabePreDigest}; +/// A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +#[cfg(feature = "std")] +pub type AuthorityPair = sr25519::Pair; + /// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in /// the main Babe module. If that ever changes, then this must, too. -pub type AuthorityId = Public; +pub type AuthorityId = sr25519::Public; /// The `ConsensusEngineId` of BABE. pub const BABE_ENGINE_ID: ConsensusEngineId = *b"BABE"; @@ -54,20 +59,24 @@ pub type AuthorityIndex = u64; pub type SlotNumber = u64; /// The weight of an authority. -pub type Weight = u64; +// NOTE: we use a unique name for the weight to avoid conflicts with other +// `Weight` types, since the metadata isn't able to disambiguate. +pub type BabeWeight = u64; /// BABE epoch information #[derive(Decode, Encode, Default, PartialEq, Eq, Clone)] #[cfg_attr(any(feature = "std", test), derive(Debug))] pub struct Epoch { - /// The authorities and their weights - pub authorities: Vec<(AuthorityId, Weight)>, /// The epoch index pub epoch_index: u64, - /// Randomness for this epoch - pub randomness: [u8; VRF_OUTPUT_LENGTH], + /// The starting slot of the epoch, + pub start_slot: u64, /// The duration of this epoch pub duration: SlotNumber, + /// The authorities and their weights + pub authorities: Vec<(AuthorityId, BabeWeight)>, + /// Randomness for this epoch + pub randomness: [u8; VRF_OUTPUT_LENGTH], } /// An consensus log item for BABE. @@ -93,23 +102,10 @@ pub struct BabeConfiguration { /// Dynamic slot duration may be supported in the future. pub slot_duration: u64, - /// The number of slots per BABE epoch. Currently, only - /// the value provided by this type at genesis will be used. - /// - /// Dynamic slot duration may be supported in the future. - pub slots_per_epoch: u64, - - /// The expected block time in milliseconds for BABE. Currently, - /// only the value provided by this type at genesis will be used. - /// - /// Dynamic expected block time may be supported in the future. - pub expected_block_time: u64, - - /// The maximum permitted VRF output, or *threshold*, for BABE. Currently, - /// only the value provided by this type at genesis will be used. - /// - /// Dynamic thresholds may be supported in the future. - pub threshold: u64, + /// A constant value that is used in the threshold calculation formula. + /// Expressed as a fraction where the first member of the tuple is the + /// numerator and the second is the denominator. + pub c: (u64, u64), /// The minimum number of blocks that must be received before running the /// median algorithm to compute the offset between the on-chain time and the diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index be5b476dd2..4068ff633a 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -27,7 +27,7 @@ use consensus_common::import_queue::{ BoxJustificationImport, BoxFinalityProofImport, }; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use runtime_primitives::{generic, generic::BlockId, Justification}; +use runtime_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; use runtime_primitives::traits::{ Block as BlockT, Header, DigestItemFor, NumberFor, ProvideRuntimeApi, SimpleBitOps, Zero, @@ -114,9 +114,9 @@ impl Config { self.0.slot_duration } - /// Retrieve the threshold for BABE - pub fn threshold(&self) -> u64 { - self.0.threshold + /// Retrieve the threshold calculation constant `c`. + pub fn c(&self) -> (u64, u64) { + self.0.c } } @@ -204,7 +204,7 @@ pub fn start_babe(BabeParams { local_key, sync_oracle: sync_oracle.clone(), force_authoring, - threshold: config.threshold(), + c: config.c(), }; register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; Ok(slots::start_slot_worker( @@ -224,7 +224,7 @@ struct BabeWorker { local_key: Arc, sync_oracle: SO, force_authoring: bool, - threshold: u64, + c: (u64, u64), } impl SlotWorker for BabeWorker where @@ -273,7 +273,7 @@ impl SlotWorker for BabeWorker w } }; - let Epoch { ref authorities, randomness, epoch_index, .. } = epoch; + let Epoch { ref authorities, .. } = epoch; if authorities.is_empty() { error!(target: "babe", "No authorities at block {:?}", chain_head.hash()); @@ -287,14 +287,14 @@ impl SlotWorker for BabeWorker w return Box::new(future::ok(())); } - let proposal_work = if let Some(((inout, vrf_proof, _batchable_proof), authority_index)) = claim_slot( - &randomness, + let proposal_work = if let Some(claim) = claim_slot( slot_info.number, - epoch_index, epoch, &pair, - self.threshold, + self.c, ) { + let ((inout, vrf_proof, _batchable_proof), authority_index) = claim; + debug!( target: "babe", "Starting authorship at slot {}; timestamp = {}", slot_number, @@ -308,7 +308,11 @@ impl SlotWorker for BabeWorker w let proposer = match env.init(&chain_head) { Ok(p) => p, Err(e) => { - warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_number, e); + warn!(target: "babe", + "Unable to author block in slot {:?}: {:?}", + slot_number, + e, + ); telemetry!(CONSENSUS_WARN; "babe.unable_authoring_block"; "slot" => slot_number, "err" => ?e ); @@ -367,11 +371,6 @@ impl SlotWorker for BabeWorker w let signature = pair.sign(header_hash.as_ref()); let signature_digest_item = DigestItemFor::::babe_seal(signature); - let cache = find_epoch_digest::(&header) - .map(|epoch| vec![(well_known_cache_keys::AUTHORITIES, epoch.encode())]) - .map(|keys| keys.into_iter().collect()) - .unwrap_or_default(); - let import_block = BlockImportParams:: { origin: BlockOrigin::Own, header, @@ -396,7 +395,7 @@ impl SlotWorker for BabeWorker w "hash_previously" => ?header_hash, ); - if let Err(e) = block_import.lock().import_block(import_block, cache) { + if let Err(e) = block_import.lock().import_block(import_block, Default::default()) { warn!(target: "babe", "Error with block built on {:?}: {:?}", parent_hash, e); telemetry!(CONSENSUS_WARN; "babe.err_with_block_built_on"; @@ -423,26 +422,34 @@ macro_rules! babe_err { fn find_pre_digest(header: &B::Header) -> Result where DigestItemFor: CompatibleDigestItem, { + let mut pre_digest: Option<_> = None; for log in header.digest().logs() { - if let Some(pre_digest) = log.as_babe_pre_digest() { - return Ok(pre_digest); + trace!(target: "babe", "Checking log {:?}, looking for pre runtime digest", log); + match (log.as_babe_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime digests, rejecting!"))?, + (None, _) => trace!(target: "babe", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, } } - - Err(babe_err!("No BABE pre-runtime digest found")) + pre_digest.ok_or_else(|| babe_err!("No BABE pre-runtime digest found")) } /// Extract the BABE epoch change digest from the given header, if it exists. -fn find_epoch_digest(header: &B::Header) -> Option +fn find_next_epoch_digest(header: &B::Header) -> Result, String> where DigestItemFor: CompatibleDigestItem, { + let mut epoch_digest: Option<_> = None; for log in header.digest().logs() { - if let Some(epoch_digest) = log.as_babe_epoch() { - return Some(epoch_digest); + trace!(target: "babe", "Checking log {:?}, looking for epoch change digest.", log); + let log = log.try_to::(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID)); + match (log, epoch_digest.is_some()) { + (Some(ConsensusLog::NextEpochData(_)), true) => Err(babe_err!("Multiple BABE epoch change digests, rejecting!"))?, + (Some(ConsensusLog::NextEpochData(epoch)), false) => epoch_digest = Some(epoch), + _ => trace!(target: "babe", "Ignoring digest not meant for us"), } } - return None; + Ok(epoch_digest) } /// Check a header has been signed by the right key. If the slot is too far in @@ -459,10 +466,10 @@ fn check_header( slot_now: u64, mut header: B::Header, hash: B::Hash, - authorities: &[AuthorityId], + authorities: &[(AuthorityId, BabeWeight)], randomness: [u8; 32], epoch_index: u64, - threshold: u64, + c: (u64, u64), ) -> Result, DigestItemFor)>, String> where DigestItemFor: CompatibleDigestItem, { @@ -486,7 +493,7 @@ fn check_header( } else if authority_index > authorities.len() as u64 { Err(babe_err!("Slot author not found")) } else { - let (pre_hash, author) = (header.hash(), &authorities[authority_index as usize]); + let (pre_hash, author) = (header.hash(), &authorities[authority_index as usize].0); if sr25519::Pair::verify(&sig, pre_hash, author.clone()) { let (inout, _batchable_proof) = { @@ -503,6 +510,7 @@ fn check_header( })? }; + let threshold = calculate_threshold(c, authorities, authority_index as usize); if !check(&inout, threshold) { return Err(babe_err!("VRF verification of block by author {:?} failed: \ threshold {} exceeded", author, threshold)); @@ -562,7 +570,9 @@ impl BabeVerifier { if !inherent_res.ok() { inherent_res .into_errors() - .try_for_each(|(i, e)| Err(self.inherent_data_providers.error_to_string(&i, &e))) + .try_for_each(|(i, e)| { + Err(self.inherent_data_providers.error_to_string(&i, &e)) + }) } else { Ok(()) } @@ -581,7 +591,9 @@ fn median_algorithm( let mut new_list: Vec<_> = time_source.1.iter().map(|&(t, sl)| { let offset: u128 = u128::from(slot_duration) .checked_mul(1_000_000u128) // self.config.get() returns *milliseconds* - .and_then(|x| x.checked_mul(u128::from(slot_number).saturating_sub(u128::from(sl)))) + .and_then(|x| { + x.checked_mul(u128::from(slot_number).saturating_sub(u128::from(sl))) + }) .expect("we cannot have timespans long enough for this to overflow; qed"); const NANOS_PER_SEC: u32 = 1_000_000_000; @@ -640,8 +652,6 @@ impl Verifier for BabeVerifier where epoch(self.api.as_ref(), &BlockId::Hash(parent_hash)) .map_err(|e| format!("Could not fetch epoch at {:?}: {:?}", parent_hash, e))?; - let authorities: Vec<_> = authorities.into_iter().map(|(s, _)| s).collect(); - // We add one to allow for some small drift. // FIXME #1019 in the future, alter this queue to allow deferring of headers let checked_header = check_header::( @@ -649,10 +659,10 @@ impl Verifier for BabeVerifier where slot_now + 1, header, hash, - &authorities[..], + &authorities, randomness, epoch_index, - self.config.threshold(), + self.config.c(), )?; match checked_header { @@ -683,12 +693,6 @@ impl Verifier for BabeVerifier where "babe.checked_and_importing"; "pre_header" => ?pre_header); - // `Consensus` is the Babe-specific authorities change log. - // It's an encoded `Epoch`, the same format as is stored in the - // cache, so no need to decode/re-encode. - let maybe_keys = find_epoch_digest::(&pre_header) - .map(|epoch| vec![(well_known_cache_keys::AUTHORITIES, epoch.encode())]); - let import_block = BlockImportParams { origin, header: pre_header, @@ -709,8 +713,7 @@ impl Verifier for BabeVerifier where &mut *self.time_source.0.lock(), ); - // FIXME #1019 extract authorities - Ok((import_block, maybe_keys)) + Ok((import_block, Default::default())) } CheckedHeader::Deferred(a, b) => { debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -732,7 +735,7 @@ fn epoch(client: &C, at: &BlockId) -> Result whe { client .cache() - .and_then(|cache| cache.get_at(&well_known_cache_keys::AUTHORITIES, at) + .and_then(|cache| cache.get_at(&well_known_cache_keys::EPOCH, at) .and_then(|v| Decode::decode(&mut &v[..]))) .or_else(|| { if client.runtime_api().has_api::>(at).unwrap_or(false) { @@ -786,8 +789,33 @@ fn make_transcript( transcript } -fn check(inout: &VRFInOut, threshold: u64) -> bool { - u64::from_le_bytes(inout.make_bytes::<[u8; 8]>(BABE_VRF_PREFIX)) < threshold +fn check(inout: &VRFInOut, threshold: u128) -> bool { + u128::from_le_bytes(inout.make_bytes::<[u8; 16]>(BABE_VRF_PREFIX)) < threshold +} + +fn calculate_threshold( + c: (u64, u64), + authorities: &[(AuthorityId, BabeWeight)], + authority_index: usize, +) -> u128 { + use num_bigint::BigUint; + use num_rational::BigRational; + use num_traits::{cast::ToPrimitive, identities::One}; + + let c = c.0 as f64 / c.1 as f64; + + let theta = + authorities[authority_index].1 as f64 / + authorities.iter().map(|(_, weight)| weight).sum::() as f64; + + let calc = || { + let p = BigRational::from_float(1f64 - (1f64 - c).powf(theta))?; + let numer = p.numer().to_biguint()?; + let denom = p.denom().to_biguint()?; + ((BigUint::one() << 128) * numer / denom).to_u128() + }; + + calc().unwrap_or(u128::max_value()) } /// Claim a slot if it is our turn. Returns `None` if it is not our turn. @@ -796,22 +824,20 @@ fn check(inout: &VRFInOut, threshold: u64) -> bool { /// the VRF. If the VRF produces a value less than `threshold`, it is our turn, /// so it returns `Some(_)`. Otherwise, it returns `None`. fn claim_slot( - randomness: &[u8], slot_number: u64, - epoch: u64, - Epoch { ref authorities, .. }: Epoch, + Epoch { ref authorities, ref randomness, epoch_index, .. }: Epoch, key: &sr25519::Pair, - threshold: u64, + c: (u64, u64), ) -> Option<((VRFInOut, VRFProof, VRFProofBatchable), usize)> { let public = &key.public(); let authority_index = authorities.iter().position(|s| &s.0 == public)?; - let transcript = make_transcript(randomness, slot_number, epoch); + let transcript = make_transcript(randomness, slot_number, epoch_index); // Compute the threshold we will use. // // We already checked that authorities contains `key.public()`, so it can't - // be empty. Therefore, this division is safe. - let threshold = threshold / authorities.len() as u64; + // be empty. Therefore, this division in `calculate_threshold` is safe. + let threshold = calculate_threshold(c, authorities, authority_index); get_keypair(key) .vrf_sign_n_check(transcript, |inout| check(inout, threshold)) @@ -832,7 +858,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> // check if we already have initialized the cache let genesis_id = BlockId::Number(Zero::zero()); let genesis_epoch: Option = cache - .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) + .get_at(&well_known_cache_keys::EPOCH, &genesis_id) .and_then(|v| Decode::decode(&mut &v[..])); if genesis_epoch.is_some() { return Ok(()); @@ -845,18 +871,17 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> ))); let genesis_epoch = epoch(client, &genesis_id)?; - cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_epoch.encode()) + cache.initialize(&well_known_cache_keys::EPOCH, genesis_epoch.encode()) .map_err(map_err) } -/// Tree of all epoch changes across all *seen* forks. Data stored in tree is the -/// hash and block number of the block signaling the epoch change, the new epoch -/// index and the minimum *slot number* when the next epoch should start (i.e. -/// slot number begin + duration). +/// Tree of all epoch changes across all *seen* forks. Data stored in tree is +/// the hash and block number of the block signaling the epoch change, and the +/// epoch that was signalled at that block. type EpochChanges = ForkTree< ::Hash, NumberFor, - (u64, SlotNumber), + Epoch, >; /// A shared epoch changes tree. @@ -893,50 +918,56 @@ impl From> for SharedEpochChanges { /// it is missing. /// /// The epoch change tree should be pruned as blocks are finalized. -pub struct BabeBlockImport { +pub struct BabeBlockImport { inner: I, client: Arc>, + api: Arc, epoch_changes: SharedEpochChanges, } -impl Clone for BabeBlockImport { +impl Clone for BabeBlockImport { fn clone(&self) -> Self { BabeBlockImport { inner: self.inner.clone(), client: self.client.clone(), + api: self.api.clone(), epoch_changes: self.epoch_changes.clone(), } } } -impl BabeBlockImport { +impl BabeBlockImport { fn new( client: Arc>, + api: Arc, epoch_changes: SharedEpochChanges, block_import: I, ) -> Self { BabeBlockImport { client, + api, inner: block_import, epoch_changes, } } } -impl BlockImport for BabeBlockImport where +impl BlockImport for BabeBlockImport where Block: BlockT, I: BlockImport + Send + Sync, I::Error: Into, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, + PRA: ProvideRuntimeApi + ProvideCache, + PRA::Api: BabeApi, { type Error = ConsensusError; fn import_block( &mut self, mut block: BlockImportParams, - new_cache: HashMap>, + mut new_cache: HashMap>, ) -> Result { let hash = block.post_header().hash(); let number = block.header.number().clone(); @@ -965,21 +996,22 @@ impl BlockImport for BabeBlockImport Result { - // this can only happen when the chain starts, since there's no epoch change at genesis. - // afterwards every time we expect an epoch change it means we will import another one. + // this can only happen when the chain starts, since there's no + // epoch change at genesis. afterwards every time we expect an epoch + // change it means we will import another one. for (root, _, _) in epoch_changes.roots() { let is_descendent_of = is_descendent_of(root, &hash) - .map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + .map_err(|e| { + ConsensusError::from(ConsensusError::ClientImport(e.to_string())) + })?; if is_descendent_of { return Ok(false); @@ -989,14 +1021,18 @@ impl BlockImport for BabeBlockImport(&block.header) + .map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; - match (expected_epoch_change, new_cache.contains_key(&well_known_cache_keys::AUTHORITIES)) { + match (expected_epoch_change, next_epoch_digest.is_some()) { (true, true) => {}, (false, false) => {}, (true, false) => { return Err( - ConsensusError::ClientImport("Expected epoch change to happen by this block".into()) + ConsensusError::ClientImport( + "Expected epoch change to happen by this block".into(), + ) ); }, (false, true) => { @@ -1010,40 +1046,55 @@ impl BlockImport for BabeBlockImport( - &*epoch_changes, - |insert| block.auxiliary.extend( - insert.iter().map(|(k, v)| (k.to_vec(), Some(v.to_vec()))) - ) - ); - } else { - return Err( - ConsensusError::ClientImport("Failed to decode epoch change digest".into()) + // update the current epoch in the client cache + new_cache.insert( + well_known_cache_keys::EPOCH, + enacted_epoch.encode(), ); + + let current_epoch = epoch(&*self.api, &BlockId::Hash(parent_hash))?; + + // if the authorities have changed then we populate the + // `AUTHORITIES` key with the enacted epoch, so that the inner + // `ImportBlock` can process it (`EPOCH` is specific to BABE). + // e.g. in the case of GRANDPA it would require a justification + // for the block, expecting that the authorities actually + // changed. + if current_epoch.authorities != enacted_epoch.authorities { + new_cache.insert( + well_known_cache_keys::AUTHORITIES, + enacted_epoch.encode(), + ); + } } + + old_epoch_changes = Some(epoch_changes.clone()); + + // track the epoch change in the fork tree + epoch_changes.import( + hash, + number, + next_epoch, + &is_descendent_of, + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + + crate::aux_schema::write_epoch_changes::( + &*epoch_changes, + |insert| block.auxiliary.extend( + insert.iter().map(|(k, v)| (k.to_vec(), Some(v.to_vec()))) + ) + ); } let import_result = self.inner.import_block(block, new_cache); @@ -1085,7 +1136,7 @@ pub fn import_queue, I, RA, PRA>( ) -> ClientResult<( BabeImportQueue, BabeLink, - BabeBlockImport, + BabeBlockImport, impl Future, )> where B: Backend + 'static, @@ -1100,7 +1151,7 @@ pub fn import_queue, I, RA, PRA>( initialize_authorities_cache(&*api)?; let verifier = BabeVerifier { - api, + api: api.clone(), inherent_data_providers, time_source: Default::default(), config, @@ -1111,6 +1162,7 @@ pub fn import_queue, I, RA, PRA>( let block_import = BabeBlockImport::new( client.clone(), + api, epoch_changes.clone(), block_import, ); @@ -1123,7 +1175,9 @@ pub fn import_queue, I, RA, PRA>( ¬ification.hash, *notification.header.number(), &is_descendent_of, - ).map_err(|e| debug!(target: "babe", "Error pruning epoch changes fork tree: {:?}", e))?; + ).map_err(|e| { + debug!(target: "babe", "Error pruning epoch changes fork tree: {:?}", e) + })?; Ok(()) }); @@ -1138,3 +1192,39 @@ pub fn import_queue, I, RA, PRA>( Ok((queue, timestamp_core, block_import, pruning_task)) } + +/// BABE test helpers. Utility methods for manually authoring blocks. +#[cfg(feature = "test-helpers")] +pub mod test_helpers { + use super::*; + + /// Try to claim the given slot and return a `BabePreDigest` if + /// successful. + pub fn claim_slot( + client: &C, + at: &BlockId, + slot_number: u64, + key: &sr25519::Pair, + c: (u64, u64), + ) -> Option where + B: BlockT, + C: ProvideRuntimeApi + ProvideCache, + C::Api: BabeApi, + { + let epoch = epoch(client, at).unwrap(); + + super::claim_slot( + slot_number, + epoch, + key, + c, + ).map(|((inout, vrf_proof, _), authority_index)| { + BabePreDigest { + vrf_proof, + vrf_output: inout.to_output(), + authority_index: authority_index as u64, + slot_number, + } + }) + } +} diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index 17864142db..571951b3b7 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -64,7 +64,12 @@ impl Proposer for DummyProposer { type Error = Error; type Create = Result; - fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { + fn propose( + &self, + _: InherentData, + digests: DigestFor, + _: Duration, + ) -> Result { self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) } } @@ -232,7 +237,10 @@ fn run_one_test() { // wait for all finalized on each. let wait_for = futures::future::join_all(import_notifications); - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); + let drive_to_completion = futures::future::poll_fn(|| { + net.lock().poll(); + Ok(Async::NotReady) + }); let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } @@ -306,17 +314,17 @@ fn sig_is_not_pre_digest() { #[test] fn can_author_block() { let _ = env_logger::try_init(); - let randomness = &[]; let (pair, _) = sr25519::Pair::generate(); let mut i = 0; let epoch = Epoch { - authorities: vec![(pair.public(), 0)], + start_slot: 0, + authorities: vec![(pair.public(), 1)], randomness: [0; 32], epoch_index: 1, duration: 100, }; loop { - match claim_slot(randomness, i, 0, epoch.clone(), &pair, u64::MAX / 10) { + match claim_slot(i, epoch.clone(), &pair, (3, 10)) { None => i += 1, Some(s) => { debug!(target: "babe", "Authored block {:?}", s); diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index e976adb83c..0c968a327d 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -123,4 +123,7 @@ pub mod well_known_cache_keys { /// A list of authorities. pub const AUTHORITIES: Id = *b"auth"; + + /// Current Epoch data. + pub const EPOCH: Id = *b"epch"; } diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 4eb118c853..4670cb5dee 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -1331,7 +1331,7 @@ mod tests { use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; use primitives::H256; - use keyring::AuthorityKeyring; + use keyring::Ed25519Keyring; type TestBlock = GenericTestBlock<()>; @@ -1436,7 +1436,7 @@ mod tests { start_round: 0, })), round_timeout_multiplier: 10, - key: Arc::new(AuthorityKeyring::One.into()), + key: Arc::new(Ed25519Keyring::One.into()), factory: DummyFactory } } @@ -1462,10 +1462,10 @@ mod tests { fn future_gets_preempted() { let client = FakeClient { authorities: vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; @@ -1509,17 +1509,17 @@ mod tests { let hash = [0xff; 32].into(); let authorities = vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let authorities_keys = vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let unchecked = UncheckedJustification(rhododendron::UncheckedJustification { @@ -1570,8 +1570,8 @@ mod tests { let parent_hash = Default::default(); let authorities = vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let block = TestBlock { @@ -1579,7 +1579,11 @@ mod tests { extrinsics: Default::default() }; - let proposal = sign_message(rhododendron::Message::Propose(1, block.clone()), &AuthorityKeyring::Alice.pair(), parent_hash);; + let proposal = sign_message( + rhododendron::Message::Propose(1, block.clone()), + &Ed25519Keyring::Alice.pair(), + parent_hash, + ); if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_ok()); let mut invalid_round = proposal.clone(); @@ -1593,7 +1597,11 @@ mod tests { } // Not an authority - let proposal = sign_message::(rhododendron::Message::Propose(1, block), &AuthorityKeyring::Bob.pair(), parent_hash);; + let proposal = sign_message::( + rhododendron::Message::Propose(1, block), + &Ed25519Keyring::Bob.pair(), + parent_hash, + ); if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_err()); } else { @@ -1607,8 +1615,8 @@ mod tests { let hash: H256 = [0xff; 32].into(); let authorities = vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let vote = sign_message::(rhododendron::Message::Vote(rhododendron::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; @@ -1634,10 +1642,10 @@ mod tests { fn drop_bft_future_does_not_deadlock() { let client = FakeClient { authorities: vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; @@ -1659,10 +1667,10 @@ mod tests { fn bft_can_build_though_skipped() { let client = FakeClient { authorities: vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; diff --git a/core/consensus/rhd/src/misbehaviour_check.rs b/core/consensus/rhd/src/misbehaviour_check.rs index 58b36542f6..a475f5d1ef 100644 --- a/core/consensus/rhd/src/misbehaviour_check.rs +++ b/core/consensus/rhd/src/misbehaviour_check.rs @@ -74,7 +74,7 @@ pub fn evaluate_misbehavior( mod tests { use super::*; - use keyring::AuthorityKeyring; + use keyring::Ed25519Keyring; use rhododendron; use runtime_primitives::testing::{H256, Block as RawBlock}; @@ -109,7 +109,7 @@ mod tests { #[test] fn evaluates_double_prepare() { - let key = AuthorityKeyring::One.pair(); + let key = Ed25519Keyring::One.pair(); let parent_hash = [0xff; 32].into(); let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); @@ -138,7 +138,7 @@ mod tests { // misbehavior has wrong target. assert!(!evaluate_misbehavior::( - &AuthorityKeyring::Two.into(), + &Ed25519Keyring::Two.into(), parent_hash, &MisbehaviorKind::BftDoublePrepare( 1, @@ -150,7 +150,7 @@ mod tests { #[test] fn evaluates_double_commit() { - let key = AuthorityKeyring::One.pair(); + let key = Ed25519Keyring::One.pair(); let parent_hash = [0xff; 32].into(); let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); @@ -179,7 +179,7 @@ mod tests { // misbehavior has wrong target. assert!(!evaluate_misbehavior::( - &AuthorityKeyring::Two.into(), + &Ed25519Keyring::Two.into(), parent_hash, &MisbehaviorKind::BftDoubleCommit( 1, diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 5760b3936c..8b4d28d9f3 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -23,7 +23,7 @@ use network::test::{Block, Hash}; use network_gossip::Validator; use tokio::runtime::current_thread; use std::sync::Arc; -use keyring::AuthorityKeyring; +use keyring::Ed25519Keyring; use parity_codec::Encode; use crate::environment::SharedVoterSetState; @@ -202,7 +202,7 @@ fn make_test_network() -> ( ) } -fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { +fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(AuthorityId, u64)> { keys.iter() .map(|key| AuthorityId(key.to_raw_public())) .map(|id| (id, 1)) @@ -220,7 +220,7 @@ impl network_gossip::ValidatorContext for NoopContext { #[test] fn good_commit_leads_to_relay() { - let private = [AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let private = [Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let public = make_ids(&private[..]); let voter_set = Arc::new(public.iter().cloned().collect::>()); @@ -335,7 +335,7 @@ fn good_commit_leads_to_relay() { #[test] fn bad_commit_leads_to_report() { - let private = [AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let private = [Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let public = make_ids(&private[..]); let voter_set = Arc::new(public.iter().cloned().collect::>()); diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index b16bf83576..2647fb5575 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -425,7 +425,7 @@ impl, RA, PRA, SC> BlockImport // we don't want to finalize on `inner.import_block` let mut justification = block.justification.take(); - let enacts_consensus_change = !new_cache.is_empty(); + let enacts_consensus_change = new_cache.contains_key(&well_known_cache_keys::AUTHORITIES); let import_result = (&*self.inner).import_block(block, new_cache); let mut imported_aux = { diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index affe2828fa..133fbabb05 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -246,7 +246,7 @@ fn do_import_block, RA, J>( // we don't want to finalize on `inner.import_block` let justification = block.justification.take(); - let enacts_consensus_change = !new_cache.is_empty(); + let enacts_consensus_change = new_cache.contains_key(&well_known_cache_keys::AUTHORITIES); let import_result = BlockImport::import_block(&mut client, block, new_cache); let mut imported_aux = match import_result { diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 698996995f..506da2de14 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -23,7 +23,7 @@ use network::config::{ProtocolConfig, Roles, BoxFinalityProofRequestBuilder}; use parking_lot::Mutex; use futures03::{StreamExt as _, TryStreamExt as _}; use tokio::runtime::current_thread; -use keyring::ed25519::{Keyring as AuthorityKeyring}; +use keyring::Ed25519Keyring; use client::{ error::Result, runtime_api::{Core, RuntimeVersion, ApiExt}, @@ -342,7 +342,7 @@ impl AuthoritySetForFinalityChecker for TestApi { const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); -fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { +fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { keys.iter() .map(|key| AuthorityId::from_raw(key.to_raw_public())) .map(|id| (id, 1)) @@ -355,7 +355,7 @@ fn run_to_completion_with( runtime: &mut current_thread::Runtime, blocks: u64, net: Arc>, - peers: &[AuthorityKeyring], + peers: &[Ed25519Keyring], with: F, ) -> u64 where F: FnOnce(current_thread::Handle) -> Option>> @@ -437,7 +437,7 @@ fn run_to_completion( runtime: &mut current_thread::Runtime, blocks: u64, net: Arc>, - peers: &[AuthorityKeyring] + peers: &[Ed25519Keyring] ) -> u64 { run_to_completion_with(runtime, blocks, net, peers, |_| None) } @@ -446,7 +446,7 @@ fn run_to_completion( fn finalize_3_voters_no_observers() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -470,7 +470,7 @@ fn finalize_3_voters_no_observers() { fn finalize_3_voters_1_full_observer() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 4); @@ -533,24 +533,24 @@ fn finalize_3_voters_1_full_observer() { fn transition_3_voters_twice_1_full_observer() { let _ = env_logger::try_init(); let peers_a = &[ - AuthorityKeyring::Alice, - AuthorityKeyring::Bob, - AuthorityKeyring::Charlie, + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, ]; let peers_b = &[ - AuthorityKeyring::Dave, - AuthorityKeyring::Eve, - AuthorityKeyring::Ferdie, + Ed25519Keyring::Dave, + Ed25519Keyring::Eve, + Ed25519Keyring::Ferdie, ]; let peers_c = &[ - AuthorityKeyring::Alice, - AuthorityKeyring::Eve, - AuthorityKeyring::Two, + Ed25519Keyring::Alice, + Ed25519Keyring::Eve, + Ed25519Keyring::Two, ]; - let observer = &[AuthorityKeyring::One]; + let observer = &[Ed25519Keyring::One]; let genesis_voters = make_ids(peers_a); @@ -700,7 +700,7 @@ fn transition_3_voters_twice_1_full_observer() { #[test] fn justification_is_emitted_when_consensus_data_changes() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change @@ -718,7 +718,7 @@ fn justification_is_emitted_when_consensus_data_changes() { #[test] fn justification_is_generated_periodically() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -757,8 +757,8 @@ fn consensus_changes_works() { #[test] fn sync_justifications_on_change_blocks() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_b); // 4 peers, 3 of them are authorities and participate in grandpa @@ -813,13 +813,13 @@ fn finalizes_multiple_pending_changes_in_order() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Dave, AuthorityKeyring::Eve, AuthorityKeyring::Ferdie]; - let peers_c = &[AuthorityKeyring::Dave, AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Dave, Ed25519Keyring::Eve, Ed25519Keyring::Ferdie]; + let peers_c = &[Ed25519Keyring::Dave, Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let all_peers = &[ - AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie, - AuthorityKeyring::Dave, AuthorityKeyring::Eve, AuthorityKeyring::Ferdie, + Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie, + Ed25519Keyring::Dave, Ed25519Keyring::Eve, Ed25519Keyring::Ferdie, ]; let genesis_voters = make_ids(peers_a); @@ -872,7 +872,7 @@ fn finalizes_multiple_pending_changes_in_order() { #[test] fn doesnt_vote_on_the_tip_of_the_chain() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api, 3); @@ -898,8 +898,14 @@ fn force_change_to_new_set() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); // two of these guys are offline. - let genesis_authorities = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie, AuthorityKeyring::One, AuthorityKeyring::Two]; - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let genesis_authorities = &[ + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, + Ed25519Keyring::One, + Ed25519Keyring::Two, + ]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let api = TestApi::new(make_ids(genesis_authorities)); let voters = make_ids(peers_a); @@ -950,8 +956,8 @@ fn force_change_to_new_set() { #[test] fn allows_reimporting_change_blocks() { - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api.clone(), 3); @@ -999,8 +1005,8 @@ fn allows_reimporting_change_blocks() { #[test] fn test_bad_justification() { - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api.clone(), 3); @@ -1058,7 +1064,7 @@ fn voter_persists_its_votes() { // we have two authorities but we'll only be running the voter for alice // we are going to be listening for the prevotes it casts - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers); // alice has a chain with 20 blocks @@ -1264,7 +1270,7 @@ fn voter_persists_its_votes() { fn finalize_3_voters_1_light_observer() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let authorities = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let authorities = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(authorities); let mut net = GrandpaTestNet::new(TestApi::new(voters), 4); @@ -1308,7 +1314,7 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { let _ = ::env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice]; + let peers = &[Ed25519Keyring::Alice]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); net.add_light_peer(&GrandpaTestNet::default_config()); @@ -1341,20 +1347,20 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // two of these guys are offline. let genesis_authorities = if FORCE_CHANGE { vec![ - AuthorityKeyring::Alice, - AuthorityKeyring::Bob, - AuthorityKeyring::Charlie, - AuthorityKeyring::One, - AuthorityKeyring::Two, + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, + Ed25519Keyring::One, + Ed25519Keyring::Two, ] } else { vec![ - AuthorityKeyring::Alice, - AuthorityKeyring::Bob, - AuthorityKeyring::Charlie, + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, ] }; - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let api = TestApi::new(make_ids(&genesis_authorities)); let voters = make_ids(peers_a); @@ -1401,7 +1407,7 @@ fn voter_catches_up_to_latest_round_when_behind() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); diff --git a/core/keyring/src/lib.rs b/core/keyring/src/lib.rs index 5cf38401d0..e4714ad3c4 100644 --- a/core/keyring/src/lib.rs +++ b/core/keyring/src/lib.rs @@ -23,12 +23,12 @@ pub mod sr25519; pub mod ed25519; /// Convenience export: Sr25519's Keyring is exposed as `AccountKeyring`, -/// since it tends to be used for accounts. +/// since it tends to be used for accounts (although it may also be used +/// by authorities). pub use sr25519::Keyring as AccountKeyring; -/// Convenience export: Ed25519's Keyring is exposed as `AuthorityKeyring`, -/// since it tends to be used for authorities (session keys &c.). -pub use ed25519::Keyring as AuthorityKeyring; +pub use ed25519::Keyring as Ed25519Keyring; +pub use sr25519::Keyring as Sr25519Keyring; pub mod test { /// The keyring for use with accounts when using the test runtime. diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 8db66ab5dd..202b954966 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -23,7 +23,7 @@ use substrate_primitives::{sr25519::{Pair, Public, Signature}, Pair as PairT, Pu pub use substrate_primitives::sr25519; /// Set of test accounts. -#[derive(Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum_macros::Display, strum_macros::EnumIter)] pub enum Keyring { Alice, Bob, @@ -79,6 +79,11 @@ impl Keyring { Pair::from_string(&format!("//{}", <&'static str>::from(self)), None) .expect("static values are known good; qed") } + + /// Returns an iterator over all test accounts. + pub fn iter() -> impl Iterator { + ::iter() + } } impl From for &'static str { diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index a38009120f..bd600b81cb 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -41,7 +41,7 @@ use keystore::Store as Keystore; use network::{NetworkState, NetworkStateInfo}; use log::{log, info, warn, debug, error, Level}; use parity_codec::{Encode, Decode}; -use primitives::{Pair, ed25519, crypto}; +use primitives::{Pair, ed25519, sr25519, crypto}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Header, NumberFor, SaturatedConversion, Zero}; use substrate_executor::NativeExecutor; @@ -192,6 +192,7 @@ impl Service { if let Some(keystore) = keystore.as_mut() { for seed in &config.keys { keystore.generate_from_seed::(seed)?; + keystore.generate_from_seed::(seed)?; } public_key = match keystore.contents::()?.get(0) { diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 353b326a91..8375521a70 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -358,7 +358,8 @@ pub fn sync(spec: FactoryChainSpec, mut block_factory: B, mut extrin E: FnMut(&SyncService) -> FactoryExtrinsic, { const NUM_FULL_NODES: usize = 10; - const NUM_LIGHT_NODES: usize = 10; + // FIXME: BABE light client support is currently not working. + const NUM_LIGHT_NODES: usize = 0; const NUM_BLOCKS: usize = 512; let temp = TempDir::new("substrate-sync-test").expect("Error creating test dir"); let mut network = TestNet::::new( diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 509863e4e5..27237e13b6 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -25,7 +25,11 @@ pub use client_db::{Backend, self}; pub use client_ext::ClientExt; pub use consensus; pub use executor::{NativeExecutor, self}; -pub use keyring::{sr25519::Keyring as AuthorityKeyring, AccountKeyring}; +pub use keyring::{ + AccountKeyring, + ed25519::Keyring as Ed25519Keyring, + sr25519::Keyring as Sr25519Keyring, +}; pub use primitives::Blake2Hasher; pub use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; pub use state_machine::ExecutionStrategy; diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 873c1eb624..f2bf974faf 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -13,8 +13,8 @@ keyring = { package = "substrate-keyring", path = "../keyring", optional = true substrate-client = { path = "../client", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } -consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } -consensus_babe = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } +aura-primitives = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } @@ -54,8 +54,8 @@ std = [ "inherents/std", "runtime_primitives/std", "runtime_version/std", - "consensus_aura/std", - "consensus_babe/std", + "aura-primitives/std", + "babe-primitives/std", "primitives/std", "substrate-trie/std", "trie-db/std", diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs index 104ffac820..0f43911168 100644 --- a/core/test-runtime/client/src/lib.rs +++ b/core/test-runtime/client/src/lib.rs @@ -39,7 +39,7 @@ pub mod prelude { Executor, LightExecutor, LocalExecutor, NativeExecutor, }; // Keyring - pub use super::{AccountKeyring, AuthorityKeyring}; + pub use super::{AccountKeyring, Sr25519Keyring}; } mod local_executor { @@ -172,9 +172,9 @@ impl TestClientBuilderExt for TestClientBuilder< fn genesis_config(support_changes_trie: bool) -> GenesisConfig { GenesisConfig::new(support_changes_trie, vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Bob.into(), - AuthorityKeyring::Charlie.into(), + Sr25519Keyring::Alice.into(), + Sr25519Keyring::Bob.into(), + Sr25519Keyring::Charlie.into(), ], vec![ AccountKeyring::Alice.into(), AccountKeyring::Bob.into(), diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 13b8a9eac8..7947d830a3 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -50,11 +50,10 @@ use runtime_version::NativeVersion; use runtime_support::{impl_outer_origin, parameter_types}; use inherents::{CheckInherentsResult, InherentData}; use cfg_if::cfg_if; -pub use consensus_babe::AuthorityId; + // Ensure Babe and Aura use the same crypto to simplify things a bit. +pub use babe_primitives::AuthorityId; pub type AuraId = AuthorityId; -// Ensure Babe and Aura use the same crypto to simplify things a bit. -pub type BabeId = AuthorityId; // Inlucde the WASM binary #[cfg(feature = "std")] @@ -356,6 +355,14 @@ impl srml_timestamp::Trait for Runtime { type MinimumPeriod = MinimumPeriod; } +parameter_types! { + pub const EpochDuration: u64 = 6; +} + +impl srml_babe::Trait for Runtime { + type EpochDuration = EpochDuration; +} + /// Adds one to the given input and returns the final result. #[inline(never)] fn benchmark_add_one(i: u64) -> u64 { @@ -514,29 +521,30 @@ cfg_if! { } } - impl consensus_aura::AuraApi for Runtime { + impl aura_primitives::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } fn authorities() -> Vec { system::authorities() } } - impl consensus_babe::BabeApi for Runtime { - fn startup_data() -> consensus_babe::BabeConfiguration { - consensus_babe::BabeConfiguration { + impl babe_primitives::BabeApi for Runtime { + fn startup_data() -> babe_primitives::BabeConfiguration { + babe_primitives::BabeConfiguration { median_required_blocks: 0, slot_duration: 3, - expected_block_time: 1, - threshold: core::u64::MAX, - slots_per_epoch: 6, + c: (3, 10), } } - fn epoch() -> consensus_babe::Epoch { + + fn epoch() -> babe_primitives::Epoch { let authorities = system::authorities(); let authorities: Vec<_> = authorities.into_iter().map(|x|(x, 1)).collect(); - consensus_babe::Epoch { + + babe_primitives::Epoch { + start_slot: >::epoch_start_slot(), authorities, randomness: >::randomness(), - epoch_index: 1, - duration: 6, + epoch_index: >::epoch_index(), + duration: EpochDuration::get(), } } } @@ -669,30 +677,30 @@ cfg_if! { } } - impl consensus_aura::AuraApi for Runtime { + impl aura_primitives::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } fn authorities() -> Vec { system::authorities() } } - impl consensus_babe::BabeApi for Runtime { - fn startup_data() -> consensus_babe::BabeConfiguration { - consensus_babe::BabeConfiguration { + impl babe_primitives::BabeApi for Runtime { + fn startup_data() -> babe_primitives::BabeConfiguration { + babe_primitives::BabeConfiguration { median_required_blocks: 0, slot_duration: 1, - expected_block_time: 1, - threshold: core::u64::MAX, - slots_per_epoch: 6, + c: (3, 10), } } - fn epoch() -> consensus_babe::Epoch { + fn epoch() -> babe_primitives::Epoch { let authorities = system::authorities(); let authorities: Vec<_> = authorities.into_iter().map(|x|(x, 1)).collect(); - consensus_babe::Epoch { + + babe_primitives::Epoch { + start_slot: >::epoch_start_slot(), authorities, randomness: >::randomness(), - epoch_index: 1, - duration: 6, + epoch_index: >::epoch_index(), + duration: EpochDuration::get(), } } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 01b032f599..926f2f5410 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -313,16 +313,16 @@ mod tests { use super::*; use runtime_io::{with_externalities, TestExternalities}; - use substrate_test_runtime_client::{AuthorityKeyring, AccountKeyring}; + use substrate_test_runtime_client::{AccountKeyring, Sr25519Keyring}; use crate::{Header, Transfer, WASM_BINARY}; use primitives::{Blake2Hasher, map}; use substrate_executor::WasmExecutor; fn new_test_ext() -> TestExternalities { let authorities = vec![ - AuthorityKeyring::Alice.to_raw_public(), - AuthorityKeyring::Bob.to_raw_public(), - AuthorityKeyring::Charlie.to_raw_public() + Sr25519Keyring::Alice.to_raw_public(), + Sr25519Keyring::Bob.to_raw_public(), + Sr25519Keyring::Charlie.to_raw_public() ]; TestExternalities::new(map![ twox_128(b"latest").to_vec() => vec![69u8; 32], diff --git a/core/utils/fork-tree/src/lib.rs b/core/utils/fork-tree/src/lib.rs index d202ba6c84..c6debe859a 100644 --- a/core/utils/fork-tree/src/lib.rs +++ b/core/utils/fork-tree/src/lib.rs @@ -228,7 +228,7 @@ impl ForkTree where let node = root.find_node_where(hash, number, is_descendent_of, predicate)?; // found the node, early exit - if node.is_some() { + if let Some(node) = node { return Ok(node); } } @@ -498,7 +498,7 @@ mod node_implementation { number: &N, is_descendent_of: &F, predicate: &P, - ) -> Result>, Error> + ) -> Result>>, Error> where E: std::error::Error, F: Fn(&H, &H) -> Result, P: Fn(&V) -> bool, @@ -519,10 +519,18 @@ mod node_implementation { } // node not found in any of the descendents, if the node we're - // searching for is a descendent of this node and it passes the - // predicate, then it is this one. - if predicate(&self.data) && is_descendent_of(&self.hash, hash)? { - Ok(Some(self)) + // searching for is a descendent of this node then we will stop the + // search here, since there aren't any more children and we found + // the correct node so we don't want to backtrack. + if is_descendent_of(&self.hash, hash)? { + // if the predicate passes we return the node + if predicate(&self.data) { + Ok(Some(Some(self))) + + // otherwise we stop the search returning `None` + } else { + Ok(Some(None)) + } } else { Ok(None) } @@ -1033,4 +1041,38 @@ mod test { vec!["C", "D", "E"], ); } + + #[test] + fn find_node_doesnt_backtrack_after_finding_highest_descending_node() { + let mut tree = ForkTree::new(); + + // + // A - B + // \ + // — C + // + let is_descendent_of = |base: &&str, block: &&str| -> Result { + match (*base, *block) { + ("A", b) => Ok(b == "B" || b == "C" || b == "D"), + ("B", b) | ("C", b) => Ok(b == "D"), + ("0", _) => Ok(true), + _ => Ok(false), + } + }; + + tree.import("A", 1, 1, &is_descendent_of).unwrap(); + tree.import("B", 2, 4, &is_descendent_of).unwrap(); + tree.import("C", 2, 4, &is_descendent_of).unwrap(); + + // when searching the tree we reach both node `B` and `C`, but the + // predicate doesn't pass. still, we should not backtrack to node `A`. + let node = tree.find_node_where( + &"D", + &3, + &is_descendent_of, + &|data| *data < 3, + ).unwrap(); + + assert_eq!(node, None); + } } diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index 17efcc400f..a9f3efdaa5 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -24,8 +24,8 @@ substrate-basic-authorship = { path = "../../core/basic-authorship" } substrate-service = { path = "../../core/service" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } network = { package = "substrate-network", path = "../../core/network" } -aura = { package = "substrate-consensus-aura", path = "../../core/consensus/aura" } -aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives" } +babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe" } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives" } grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } grandpa_primitives = { package = "substrate-finality-grandpa-primitives", path = "../../core/finality-grandpa/primitives" } sr-primitives = { path = "../../core/sr-primitives" } @@ -44,6 +44,7 @@ system = { package = "srml-system", path = "../../srml/system" } balances = { package = "srml-balances", path = "../../srml/balances" } [dev-dependencies] +babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 681be0325e..781495780d 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,13 +16,14 @@ //! Substrate chain configurations. +use babe_primitives::AuthorityId as BabeId; use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto}; -use node_primitives::{AccountId, AuraId, Balance}; +use node_primitives::{AccountId, Balance}; use node_runtime::{ - GrandpaConfig, BalancesConfig, ContractsConfig, ElectionsConfig, DemocracyConfig, - CouncilConfig, AuraConfig, ImOnlineConfig, IndicesConfig, SessionConfig, StakingConfig, - SudoConfig, TechnicalCommitteeConfig, SystemConfig, WASM_BINARY, Perbill, SessionKeys, - StakerStatus, DAYS, DOLLARS, MILLICENTS, + BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig, DemocracyConfig, + ElectionsConfig, GrandpaConfig, ImOnlineConfig, IndicesConfig, Perbill, + SessionConfig, SessionKeys, StakerStatus, StakingConfig, SudoConfig, SystemConfig, + TechnicalCommitteeConfig, DAYS, DOLLARS, MILLICENTS, WASM_BINARY, }; pub use node_runtime::GenesisConfig; use substrate_service; @@ -40,8 +41,11 @@ pub fn flaming_fir_config() -> Result { ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) } -fn session_keys(key: ed25519::Public) -> SessionKeys { - SessionKeys { ed25519: key } +fn session_keys(ed_key: ed25519::Public, sr_key: sr25519::Public) -> SessionKeys { + SessionKeys { + ed25519: ed_key, + sr25519: sr_key, + } } fn staging_testnet_config_genesis() -> GenesisConfig { @@ -51,7 +55,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { // and // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done - let initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)> = vec![( + let initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId)> = vec![( // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq @@ -116,7 +120,9 @@ fn staging_testnet_config_genesis() -> GenesisConfig { .collect::>(), }), session: Some(SessionConfig { - keys: initial_authorities.iter().map(|x| (x.0.clone(), session_keys(x.2.clone()))).collect::>(), + keys: initial_authorities.iter().map(|x| { + (x.0.clone(), session_keys(x.3.clone(), x.2.clone())) + }).collect::>(), }), staking: Some(StakingConfig { current_era: 0, @@ -124,7 +130,9 @@ fn staging_testnet_config_genesis() -> GenesisConfig { validator_count: 7, offline_slash_grace: 4, minimum_validator_count: 4, - stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), + stakers: initial_authorities.iter().map(|x| { + (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) + }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), }), democracy: Some(DemocracyConfig::default()), @@ -149,8 +157,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { sudo: Some(SudoConfig { key: endowed_accounts[0].clone(), }), - aura: Some(AuraConfig { - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + babe: Some(BabeConfig { + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), im_online: Some(ImOnlineConfig { gossip_at: 0, @@ -184,9 +192,9 @@ pub fn get_account_id_from_seed(seed: &str) -> AccountId { .public() } -/// Helper function to generate AuraId from seed -pub fn get_aura_id_from_seed(seed: &str) -> AuraId { - ed25519::Pair::from_string(&format!("//{}", seed), None) +/// Helper function to generate BabeId from seed +pub fn get_babe_id_from_seed(seed: &str) -> BabeId { + sr25519::Pair::from_string(&format!("//{}", seed), None) .expect("static values are valid; qed") .public() } @@ -199,18 +207,18 @@ pub fn get_grandpa_id_from_seed(seed: &str) -> GrandpaId { } /// Helper function to generate stash, controller and session key from seed -pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuraId, GrandpaId) { +pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, BabeId, GrandpaId) { ( get_account_id_from_seed(&format!("{}//stash", seed)), get_account_id_from_seed(seed), - get_aura_id_from_seed(seed), + get_babe_id_from_seed(seed), get_grandpa_id_from_seed(seed) ) } /// Helper function to create GenesisConfig for testing pub fn testnet_genesis( - initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)>, + initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId)>, root_key: AccountId, endowed_accounts: Option>, enable_println: bool, @@ -250,7 +258,9 @@ pub fn testnet_genesis( vesting: vec![], }), session: Some(SessionConfig { - keys: initial_authorities.iter().map(|x| (x.0.clone(), session_keys(x.2.clone()))).collect::>(), + keys: initial_authorities.iter().map(|x| { + (x.0.clone(), session_keys(x.3.clone(), x.2.clone())) + }).collect::>(), }), staking: Some(StakingConfig { current_era: 0, @@ -258,7 +268,9 @@ pub fn testnet_genesis( validator_count: 2, offline_slash: Perbill::zero(), offline_slash_grace: 0, - stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), + stakers: initial_authorities.iter().map(|x| { + (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) + }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), }), democracy: Some(DemocracyConfig::default()), @@ -288,8 +300,8 @@ pub fn testnet_genesis( sudo: Some(SudoConfig { key: root_key, }), - aura: Some(AuraConfig { - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + babe: Some(BabeConfig { + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), im_online: Some(ImOnlineConfig{ gossip_at: 0, diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 53d6f927b4..f75e97a8fe 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -21,14 +21,15 @@ use std::sync::Arc; use std::time::Duration; -use aura::{import_queue, start_aura, AuraImportQueue, SlotDuration}; +use babe::{import_queue, start_babe, BabeImportQueue, Config}; +use babe_primitives::AuthorityPair as BabePair; use client::{self, LongestChain}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::Pair; use grandpa_primitives::AuthorityPair as GrandpaPair; use futures::prelude::*; -use node_primitives::{AuraPair, Block}; +use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, @@ -47,19 +48,40 @@ construct_simple_protocol! { pub struct NodeProtocol where Block = Block { } } +type BabeBlockImportForService = babe::BabeBlockImport< + FullBackend, + FullExecutor, + ::Block, + grandpa::BlockImportForService, + ::RuntimeApi, + client::Client< + FullBackend, + FullExecutor, + ::Block, + ::RuntimeApi + >, +>; + /// Node specific configuration pub struct NodeConfig { - /// grandpa connection to import block + /// GRANDPA and BABE connection to import block. // FIXME #1134 rather than putting this on the config, let's have an actual intermediate setup state - pub grandpa_import_setup: Option<(grandpa::BlockImportForService, grandpa::LinkHalfForService)>, + pub import_setup: Option<( + BabeBlockImportForService, + grandpa::LinkHalfForService, + babe::BabeLink, + )>, + /// Tasks that were created by previous setup steps and should be spawned. + pub tasks_to_spawn: Option + Send>>>, inherent_data_providers: InherentDataProviders, } impl Default for NodeConfig where F: substrate_service::ServiceFactory { fn default() -> NodeConfig { NodeConfig { - grandpa_import_setup: None, + import_setup: None, inherent_data_providers: InherentDataProviders::new(), + tasks_to_spawn: None, } } } @@ -67,7 +89,7 @@ impl Default for NodeConfig where F: substrate_service::ServiceFactory { construct_service_factory! { struct Factory { Block = Block, - ConsensusPair = AuraPair, + ConsensusPair = BabePair, FinalityPair = GrandpaPair, RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, @@ -83,11 +105,22 @@ construct_service_factory! { FullComponents::::new(config) }, AuthoritySetup = { |mut service: Self::FullService| { - let (block_import, link_half) = service.config.custom.grandpa_import_setup.take() + let (block_import, link_half, babe_link) = service.config.custom.import_setup.take() .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); - if let Some(aura_key) = service.authority_key() { - info!("Using aura key {}", aura_key.public()); + // spawn any futures that were created in the previous setup steps + if let Some(tasks) = service.config.custom.tasks_to_spawn.take() { + for task in tasks { + service.spawn_task( + task.select(service.on_exit()) + .map(|_| ()) + .map_err(|_| ()) + ); + } + } + + if let Some(babe_key) = service.authority_key() { + info!("Using BABE key {}", babe_key.public()); let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { client: service.client(), @@ -98,18 +131,21 @@ construct_service_factory! { let select_chain = service.select_chain() .ok_or(ServiceError::SelectChainRequired)?; - let aura = start_aura( - SlotDuration::get_or_compute(&*client)?, - Arc::new(aura_key), + let babe_config = babe::BabeParams { + config: Config::get_or_compute(&*client)?, + local_key: Arc::new(babe_key), client, select_chain, block_import, - proposer, - service.network(), - service.config.custom.inherent_data_providers.clone(), - service.config.force_authoring, - )?; - let select = aura.select(service.on_exit()).then(|_| Ok(())); + env: proposer, + sync_oracle: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + force_authoring: service.config.force_authoring, + time_source: babe_link, + }; + + let babe = start_babe(babe_config)?; + let select = babe.select(service.on_exit()).then(|_| Ok(())); service.spawn_task(Box::new(select)); } @@ -158,27 +194,30 @@ construct_service_factory! { }, LightService = LightComponents { |config| >::new(config) }, - FullImportQueue = AuraImportQueue + FullImportQueue = BabeImportQueue { |config: &mut FactoryFullConfiguration , client: Arc>, select_chain: Self::SelectChain| { - let slot_duration = SlotDuration::get_or_compute(&*client)?; let (block_import, link_half) = grandpa::block_import::<_, _, _, RuntimeApi, FullClient, _>( client.clone(), client.clone(), select_chain )?; let justification_import = block_import.clone(); - config.custom.grandpa_import_setup = Some((block_import.clone(), link_half)); - - import_queue::<_, _, AuraPair>( - slot_duration, - Box::new(block_import), + let (import_queue, babe_link, babe_block_import, pruning_task) = import_queue( + Config::get_or_compute(&*client)?, + block_import, Some(Box::new(justification_import)), None, + client.clone(), client, config.custom.inherent_data_providers.clone(), - ).map_err(Into::into) + )?; + + config.custom.import_setup = Some((babe_block_import.clone(), link_half, babe_link)); + config.custom.tasks_to_spawn = Some(vec![Box::new(pruning_task)]); + + Ok(import_queue) }}, - LightImportQueue = AuraImportQueue + LightImportQueue = BabeImportQueue { |config: &FactoryFullConfiguration, client: Arc>| { #[allow(deprecated)] let fetch_checker = client.backend().blockchain().fetcher() @@ -188,17 +227,22 @@ construct_service_factory! { let block_import = grandpa::light_block_import::<_, _, _, RuntimeApi, LightClient>( client.clone(), Arc::new(fetch_checker), client.clone() )?; + let finality_proof_import = block_import.clone(); let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); - import_queue::<_, _, AuraPair>( - SlotDuration::get_or_compute(&*client)?, - Box::new(block_import), + // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. + let (import_queue, ..) = import_queue( + Config::get_or_compute(&*client)?, + block_import, None, Some(Box::new(finality_proof_import)), + client.clone(), client, config.custom.inherent_data_providers.clone(), - ).map(|q| (q, finality_proof_request_builder)).map_err(Into::into) + )?; + + Ok((import_queue, finality_proof_request_builder)) }}, SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { @@ -216,25 +260,27 @@ construct_service_factory! { #[cfg(test)] mod tests { use std::sync::Arc; - use aura::CompatibleDigestItem; + use babe::CompatibleDigestItem; use consensus_common::{Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy}; use node_primitives::DigestItem; use node_runtime::{BalancesCall, Call, CENTS, SECS_PER_BLOCK, UncheckedExtrinsic}; use parity_codec::{Encode, Decode}; use primitives::{ - crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, + crypto::Pair as CryptoPair, blake2_256, sr25519::Public as AddressPublic, H256, }; use sr_primitives::{generic::{BlockId, Era, Digest}, traits::Block, OpaqueExtrinsic}; use timestamp; use finality_tracker; - use keyring::{ed25519::Keyring as AuthorityKeyring, sr25519::Keyring as AccountKeyring}; + use keyring::{AccountKeyring, Sr25519Keyring}; use substrate_service::ServiceFactory; use service_test::SyncService; use crate::service::Factory; #[cfg(feature = "rhd")] fn test_sync() { + use primitives::ed25519::Pair; + use {service_test, Factory}; use client::{BlockImportParams, BlockOrigin}; @@ -294,7 +340,7 @@ mod tests { fn test_sync() { let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); - let alice = Arc::new(AuthorityKeyring::Alice.pair()); + let alice = Arc::new(Sr25519Keyring::Alice.pair()); let mut slot_num = 1u64; let block_factory = |service: &SyncService<::FullService>| { let service = service.get(); @@ -305,7 +351,6 @@ mod tests { .create_inherent_data() .expect("Creates inherent data."); inherent_data.replace_data(finality_tracker::INHERENT_IDENTIFIER, &1u64); - inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * SECS_PER_BLOCK)); let parent_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); @@ -315,7 +360,26 @@ mod tests { }); let mut digest = Digest::::default(); - digest.push(>::aura_pre_digest(slot_num)); + + // even though there's only one authority some slots might be empty, + // so we must keep trying the next slots until we can claim one. + let babe_pre_digest = loop { + inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * SECS_PER_BLOCK)); + if let Some(babe_pre_digest) = babe::test_helpers::claim_slot( + &*service.client(), + &parent_id, + slot_num, + &alice, + (3, 10), + ) { + break babe_pre_digest; + } + + slot_num += 1; + }; + + digest.push(::babe_pre_digest(babe_pre_digest)); + let proposer = proposer_factory.init(&parent_header).unwrap(); let new_block = proposer.propose( inherent_data, @@ -329,7 +393,7 @@ mod tests { // add it to a digest item. let to_sign = pre_hash.encode(); let signature = alice.sign(&to_sign[..]); - let item = >::aura_seal( + let item = ::babe_seal( signature, ); slot_num += 1; diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 975b689919..7d806735a1 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -39,7 +39,7 @@ mod tests { use super::Executor; use substrate_executor::{WasmExecutor, NativeExecutionDispatch}; use parity_codec::{Encode, Decode, Joiner}; - use keyring::{AuthorityKeyring, AccountKeyring}; + use keyring::{AccountKeyring, Ed25519Keyring, Sr25519Keyring}; use runtime_support::{Hashable, StorageValue, StorageMap, traits::{Currency, Get}}; use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; use primitives::{ @@ -314,15 +314,19 @@ mod tests { }); } - fn to_session_keys(ring: &AuthorityKeyring) -> SessionKeys { + fn to_session_keys( + ed25519_keyring: &Ed25519Keyring, + sr25519_keyring: &Sr25519Keyring, + ) -> SessionKeys { SessionKeys { - ed25519: ring.to_owned().into(), + ed25519: ed25519_keyring.to_owned().into(), + sr25519: sr25519_keyring.to_owned().into(), } } fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { let mut ext = TestExternalities::new_with_code_with_children(code, GenesisConfig { - aura: Some(Default::default()), + babe: Some(Default::default()), system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { digest_interval: 2, @@ -346,9 +350,18 @@ mod tests { }), session: Some(SessionConfig { keys: vec![ - (alice(), to_session_keys(&AuthorityKeyring::Alice)), - (bob(), to_session_keys(&AuthorityKeyring::Bob)), - (charlie(), to_session_keys(&AuthorityKeyring::Charlie)), + (alice(), to_session_keys( + &Ed25519Keyring::Alice, + &Sr25519Keyring::Alice, + )), + (bob(), to_session_keys( + &Ed25519Keyring::Bob, + &Sr25519Keyring::Bob, + )), + (charlie(), to_session_keys( + &Ed25519Keyring::Charlie, + &Sr25519Keyring::Charlie, + )), ] }), staking: Some(StakingConfig { diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 351bb4fa12..c8a0b1a25e 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -44,16 +44,6 @@ pub type Balance = u128; /// Type used for expressing timestamp. pub type Moment = u64; -/// The aura crypto scheme defined via the keypair type. -#[cfg(feature = "std")] -pub type AuraPair = primitives::ed25519::Pair; - -/// Identity of an Aura authority. -pub type AuraId = primitives::ed25519::Public; - -/// Signature for an Aura authority. -pub type AuraSignature = primitives::ed25519::Signature; - /// Index of a transaction in the chain. pub type Index = u64; diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 17c666dbdc..eca7c9ebb7 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -16,8 +16,9 @@ runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitiv offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } version = { package = "sr-version", path = "../../core/sr-version", default-features = false } support = { package = "srml-support", path = "../../srml/support", default-features = false } -aura = { package = "srml-aura", path = "../../srml/aura", default-features = false } authorship = { package = "srml-authorship", path = "../../srml/authorship", default-features = false } +babe = { package = "srml-babe", path = "../../srml/babe", default-features = false } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default-features = false } contracts = { package = "srml-contracts", path = "../../srml/contracts", default-features = false } collective = { package = "srml-collective", path = "../../srml/collective", default-features = false } @@ -35,7 +36,6 @@ treasury = { package = "srml-treasury", path = "../../srml/treasury", default-fe sudo = { package = "srml-sudo", path = "../../srml/sudo", default-features = false } im-online = { package = "srml-im-online", path = "../../srml/im-online", default-features = false } node-primitives = { path = "../primitives", default-features = false } -consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default-features = false } rustc-hex = { version = "2.0", optional = true } serde = { version = "1.0", optional = true } substrate-keyring = { path = "../../core/keyring", optional = true } @@ -54,8 +54,9 @@ std = [ "rstd/std", "runtime_primitives/std", "support/std", - "aura/std", "authorship/std", + "babe/std", + "babe-primitives/std", "balances/std", "contracts/std", "collective/std", @@ -76,7 +77,6 @@ std = [ "serde", "safe-mix/std", "client/std", - "consensus_aura/std", "rustc-hex", "substrate-keyring", "offchain-primitives/std", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c6c93c162b..28c89a6943 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -26,9 +26,10 @@ use support::{ }; use substrate_primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ - AccountId, AccountIndex, AuraId, Balance, BlockNumber, Hash, Index, + AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Moment, Signature, }; +use babe::{AuthorityId as BabeId}; use grandpa::fg_primitives::{self, ScheduledChange}; use client::{ block_builder::api::{self as block_builder_api, InherentData, CheckInherentsResult}, @@ -137,9 +138,12 @@ impl system::Trait for Runtime { type MaximumBlockLength = MaximumBlockLength; } -impl aura::Trait for Runtime { - type HandleReport = aura::StakingSlasher; - type AuthorityId = AuraId; +parameter_types! { + pub const EpochDuration: u64 = 10 * MINUTES; +} + +impl babe::Trait for Runtime { + type EpochDuration = EpochDuration; } impl indices::Trait for Runtime { @@ -177,7 +181,7 @@ parameter_types! { } impl timestamp::Trait for Runtime { type Moment = Moment; - type OnTimestampSet = Aura; + type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; } @@ -193,17 +197,14 @@ impl authorship::Trait for Runtime { type EventHandler = (); } -parameter_types! { - pub const Period: BlockNumber = 10 * MINUTES; - pub const Offset: BlockNumber = 0; -} - -type SessionHandlers = (Grandpa, Aura, ImOnline); +type SessionHandlers = (Grandpa, Babe, ImOnline); impl_opaque_keys! { pub struct SessionKeys { #[id(key_types::ED25519)] pub ed25519: GrandpaId, + #[id(key_types::SR25519)] + pub sr25519: BabeId, } } @@ -216,7 +217,7 @@ impl_opaque_keys! { impl session::Trait for Runtime { type OnSessionEnding = Staking; type SessionHandler = SessionHandlers; - type ShouldEndSession = session::PeriodicSessions; + type ShouldEndSession = Babe; type Event = Event; type Keys = SessionKeys; type ValidatorId = AccountId; @@ -378,12 +379,12 @@ impl sudo::Trait for Runtime { } impl im_online::Trait for Runtime { - type AuthorityId = AuraId; + type AuthorityId = BabeId; type Call = Call; type Event = Event; type SessionsPerEra = SessionsPerEra; type UncheckedExtrinsic = UncheckedExtrinsic; - type IsValidAuthorityId = Aura; + type IsValidAuthorityId = Babe; } impl grandpa::Trait for Runtime { @@ -408,7 +409,7 @@ construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{Module, Call, Storage, Config, Event}, - Aura: aura::{Module, Call, Storage, Config, Inherent(Timestamp)}, + Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Authorship: authorship::{Module, Call, Storage}, Indices: indices, @@ -525,12 +526,23 @@ impl_runtime_apis! { } } - impl consensus_aura::AuraApi for Runtime { - fn slot_duration() -> u64 { - Aura::slot_duration() + impl babe_primitives::BabeApi for Runtime { + fn startup_data() -> babe_primitives::BabeConfiguration { + babe_primitives::BabeConfiguration { + median_required_blocks: 1000, + slot_duration: Babe::slot_duration(), + c: (3, 10), + } } - fn authorities() -> Vec { - Aura::authorities() + + fn epoch() -> babe_primitives::Epoch { + babe_primitives::Epoch { + start_slot: Babe::epoch_start_slot(), + authorities: Babe::authorities(), + epoch_index: Babe::epoch_index(), + randomness: Babe::randomness(), + duration: EpochDuration::get(), + } } } } diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index 577bda8c01..c75869ab57 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -18,11 +18,12 @@ #![cfg_attr(not(feature = "std"), no_std)] #![forbid(unused_must_use, unsafe_code, unused_variables, dead_code)] + pub use timestamp; use rstd::{result, prelude::*}; use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get}; -use timestamp::{OnTimestampSet, Trait}; +use timestamp::{OnTimestampSet}; use primitives::{generic::DigestItem, ConsensusEngineId}; use primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; #[cfg(feature = "std")] @@ -31,7 +32,7 @@ use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; -use babe_primitives::{BABE_ENGINE_ID, ConsensusLog, Weight, Epoch, RawBabePreDigest}; +use babe_primitives::{BABE_ENGINE_ID, ConsensusLog, BabeWeight, Epoch, RawBabePreDigest}; pub use babe_primitives::{AuthorityId, VRF_OUTPUT_LENGTH, PUBLIC_KEY_LENGTH}; /// The BABE inherent identifier. @@ -106,18 +107,28 @@ impl ProvideInherentData for InherentDataProvider { } } +pub trait Trait: timestamp::Trait { + type EpochDuration: Get; +} + /// The length of the BABE randomness pub const RANDOMNESS_LENGTH: usize = 32; decl_storage! { trait Store for Module as Babe { - NextRandomness: [u8; RANDOMNESS_LENGTH]; + /// Current epoch index. + pub EpochIndex get(epoch_index): u64; + + /// Current epoch authorities. + pub Authorities get(authorities) config(): Vec<(AuthorityId, BabeWeight)>; - /// Randomness under construction - UnderConstruction: [u8; VRF_OUTPUT_LENGTH]; + /// Slot at which the current epoch started. It is possible that no + /// block was authored at the given slot and the epoch change was + /// signalled later than this. + pub EpochStartSlot get(epoch_start_slot): u64; - /// Current epoch - pub Authorities get(authorities) config(): Vec<(AuthorityId, Weight)>; + /// Current slot number. + pub CurrentSlot get(current_slot): u64; /// The epoch randomness for the *current* epoch. /// @@ -129,10 +140,16 @@ decl_storage! { /// (like everything else on-chain) it is public. For example, it can be /// used where a number is needed that cannot have been chosen by an /// adversary, for purposes such as public-coin zero-knowledge proofs. - pub Randomness get(randomness): [u8; RANDOMNESS_LENGTH]; + // NOTE: the following fields don't use the constants to define the + // array size because the metadata API currently doesn't resolve the + // variable to its underlying value. + pub Randomness get(randomness): [u8; 32 /* RANDOMNESS_LENGTH */]; - /// Current epoch index - EpochIndex: u64; + /// Next epoch randomness. + NextRandomness: [u8; 32 /* RANDOMNESS_LENGTH */]; + + /// Randomness under construction. + UnderConstruction: [u8; 32 /* VRF_OUTPUT_LENGTH */]; } } @@ -141,7 +158,7 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { /// Initialization fn on_initialize() { - for i in Self::get_inherent_digests() + for digest in Self::get_inherent_digests() .logs .iter() .filter_map(|s| s.as_pre_runtime()) @@ -149,9 +166,15 @@ decl_module! { RawBabePreDigest::decode(&mut data) } else { None - }) { + }) + { + if EpochStartSlot::get() == 0 { + EpochStartSlot::put(digest.slot_number); + } + + CurrentSlot::put(digest.slot_number); + Self::deposit_vrf_output(&digest.vrf_output); - Self::deposit_vrf_output(&i.vrf_output); return; } } @@ -180,7 +203,7 @@ impl FindAuthor for Module { } } -impl IsMember for Module { +impl IsMember for Module { fn is_member(authority_id: &AuthorityId) -> bool { >::authorities() .iter() @@ -188,6 +211,13 @@ impl IsMember for Module { } } +impl session::ShouldEndSession for Module { + fn should_end_session(_: T::BlockNumber) -> bool { + let diff = CurrentSlot::get().saturating_sub(EpochStartSlot::get()); + diff >= T::EpochDuration::get() + } +} + impl Module { /// Determine the BABE slot duration based on the Timestamp module configuration. pub fn slot_duration() -> T::Moment { @@ -205,23 +235,17 @@ impl Module { >::digest() } - fn change_epoch(new: Epoch) { - Authorities::put(&new.authorities); - Randomness::put(&new.randomness); - Self::deposit_consensus(ConsensusLog::NextEpochData(new)) - } - fn deposit_vrf_output(vrf_output: &[u8; VRF_OUTPUT_LENGTH]) { UnderConstruction::mutate(|z| z.iter_mut().zip(vrf_output).for_each(|(x, y)| *x^=y)) } /// Call this function exactly once when an epoch changes, to update the /// randomness. Returns the new randomness. - fn randomness_change_epoch(epoch_index: u64) -> [u8; RANDOMNESS_LENGTH] { + fn randomness_change_epoch(next_epoch_index: u64) -> [u8; RANDOMNESS_LENGTH] { let this_randomness = NextRandomness::get(); let next_randomness = compute_randomness( this_randomness, - epoch_index, + next_epoch_index, UnderConstruction::get(), ); UnderConstruction::put(&[0; RANDOMNESS_LENGTH]); @@ -235,13 +259,9 @@ impl OnTimestampSet for Module { fn on_timestamp_set(_moment: T::Moment) { } } -pub trait Duration { - fn babe_epoch_duration() -> u64; -} - -impl session::OneSessionHandler for Module { +impl session::OneSessionHandler for Module { type Key = AuthorityId; - fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I, queued_validators: I) + fn on_new_session<'a, I: 'a>(_changed: bool, validators: I, queued_validators: I) where I: Iterator { use staking::BalanceOf; @@ -249,25 +269,63 @@ impl session::OneSessionHandler, u64>>::convert(b) }; + // Update epoch index let epoch_index = EpochIndex::get() .checked_add(1) .expect("epoch indices will never reach 2^64 before the death of the universe; qed"); EpochIndex::put(epoch_index); - // *Next* epoch's authorities. - let authorities = queued_validators.map(|(account, k)| { + // Update authorities. + let authorities = validators.map(|(account, k)| { + (k, to_votes(staking::Module::::stakers(account).total)) + }).collect::>(); + + Authorities::put(authorities); + + // Update epoch start slot. + let now = CurrentSlot::get(); + EpochStartSlot::mutate(|previous| { + loop { + // on the first epoch we must account for skipping at least one + // whole epoch, in case the first block is authored with a slot + // number far in the past. + if now.saturating_sub(*previous) < T::EpochDuration::get() { + break; + } + + *previous = previous.saturating_add(T::EpochDuration::get()); + } + }); + + // Update epoch randomness. + let next_epoch_index = epoch_index + .checked_add(1) + .expect("epoch indices will never reach 2^64 before the death of the universe; qed"); + + // Returns randomness for the current epoch and computes the *next* + // epoch randomness. + let randomness = Self::randomness_change_epoch(next_epoch_index); + Randomness::put(randomness); + + // After we update the current epoch, we signal the *next* epoch change + // so that nodes can track changes. + let next_authorities = queued_validators.map(|(account, k)| { (k, to_votes(staking::Module::::stakers(account).total)) }).collect::>(); - // What was the next epoch is now the current epoch - let randomness = Self::randomness_change_epoch(epoch_index); - Self::change_epoch(Epoch { - randomness, - authorities, - epoch_index, - duration: T::babe_epoch_duration(), - }) + let next_epoch_start_slot = EpochStartSlot::get().saturating_add(T::EpochDuration::get()); + let next_randomness = NextRandomness::get(); + + let next = Epoch { + epoch_index: next_epoch_index, + start_slot: next_epoch_start_slot, + duration: T::EpochDuration::get(), + authorities: next_authorities, + randomness: next_randomness, + }; + + Self::deposit_consensus(ConsensusLog::NextEpochData(next)) } fn on_disabled(i: usize) { @@ -304,6 +362,7 @@ impl ProvideInherent for Module { let timestamp_based_slot = (timestamp / Self::slot_duration()).saturated_into::(); let seal_slot = data.babe_inherent_data()?; + if timestamp_based_slot == seal_slot { Ok(()) } else { diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 7a2d0dbc08..cd3c8d7862 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -451,11 +451,12 @@ pub struct Exposure { pub others: Vec>, } -pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; type PositiveImbalanceOf = -<::Currency as Currency<::AccountId>>::PositiveImbalance; + <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = -<::Currency as Currency<::AccountId>>::NegativeImbalance; + <::Currency as Currency<::AccountId>>::NegativeImbalance; type MomentOf= <::Time as Time>::Moment; type RawAssignment = (::AccountId, ExtendedBalance); -- GitLab From c7eef50ac440320b7fcf7f17fa154483d5a24805 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 25 Jul 2019 04:51:38 +0200 Subject: [PATCH 032/151] Informant cleanup (#3194) * Split informant in two * Clean up imports * Don't rely on saturated_into * Add some documentation to the informant display --- core/cli/src/informant.rs | 83 ++--------------- core/cli/src/informant/display.rs | 149 ++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 75 deletions(-) create mode 100644 core/cli/src/informant/display.rs diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index d6bbf4831d..ca4be4bd1b 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -16,19 +16,16 @@ //! Console informant. Prints sync progress and block events. Runs on the calling thread. -use ansi_term::Colour; -use std::fmt; -use std::time; +use client::{backend::Backend, BlockchainEvents}; use futures::{Future, Stream}; use futures03::{StreamExt as _, TryStreamExt as _}; +use log::{info, warn}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Header; use service::{Service, Components}; use tokio::runtime::TaskExecutor; -use network::SyncState; -use client::{backend::Backend, BlockchainEvents}; -use log::{info, warn}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, SaturatedConversion}; +mod display; /// Spawn informant on the event loop #[deprecated(note = "Please use informant::build instead, and then create the task manually")] @@ -42,37 +39,12 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe pub fn build(service: &Service) -> impl Future where C: Components { let client = service.client(); - let mut last_number = None; - let mut last_update = time::Instant::now(); - let display_notifications = service.network_status().for_each(move |(net_status, _)| { + let mut display = display::InformantDisplay::new(); + let display_notifications = service.network_status().for_each(move |(net_status, _)| { let info = client.info(); - let best_number = info.chain.best_number.saturated_into::(); - let best_hash = info.chain.best_hash; - let speed = move || speed(best_number, last_number, last_update); - last_update = time::Instant::now(); - let (status, target) = match (net_status.sync_state, net_status.best_seen_block) { - (SyncState::Idle, _) => ("Idle".into(), "".into()), - (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), - (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), - }; - last_number = Some(best_number); - let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); - info!( - target: "substrate", - "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", - Colour::White.bold().paint(&status), - target, - Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), - Colour::White.paint(format!("{}", best_number)), - best_hash, - Colour::White.paint(format!("{}", finalized_number)), - info.chain.finalized_hash, - TransferRateFormat(net_status.average_download_per_sec), - TransferRateFormat(net_status.average_upload_per_sec), - ); - + display.display(&info, net_status); Ok(()) }); @@ -115,42 +87,3 @@ where C: Components { display_notifications.join(display_block_import) .map(|((), ())| ()) } - -fn speed(best_number: u64, last_number: Option, last_update: time::Instant) -> String { - let since_last_millis = last_update.elapsed().as_secs() * 1000; - let since_last_subsec_millis = last_update.elapsed().subsec_millis() as u64; - let speed = last_number - .and_then(|num| - (best_number.saturating_sub(num) * 10_000).checked_div(since_last_millis + since_last_subsec_millis)) - .map_or(0.0, |s| s as f64); - - if speed < 1.0 { - "".into() - } else { - format!(" {:4.1} bps", speed / 10.0) - } -} - -/// Contains a number of bytes per second. Implements `fmt::Display` and shows this number of bytes -/// per second in a nice way. -struct TransferRateFormat(u64); -impl fmt::Display for TransferRateFormat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // Special case 0. - if self.0 == 0 { - return write!(f, "0") - } - - // Under 0.1 kiB, display plain bytes. - if self.0 < 100 { - return write!(f, "{} B/s", self.0) - } - - // Under 1.0 MiB/sec, display the value in kiB/sec. - if self.0 < 1024 * 1024 { - return write!(f, "{:.1}kiB/s", self.0 as f64 / 1024.0) - } - - write!(f, "{:.1}MiB/s", self.0 as f64 / (1024.0 * 1024.0)) - } -} diff --git a/core/cli/src/informant/display.rs b/core/cli/src/informant/display.rs new file mode 100644 index 0000000000..481bff0cde --- /dev/null +++ b/core/cli/src/informant/display.rs @@ -0,0 +1,149 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use ansi_term::Colour; +use client::ClientInfo; +use log::info; +use network::SyncState; +use runtime_primitives::traits::{Block as BlockT, SaturatedConversion, CheckedDiv, NumberFor, One, Zero, Saturating}; +use service::NetworkStatus; +use std::{convert::TryInto, fmt, time}; + +/// State of the informant display system. +/// +/// This is the system that handles the line that gets regularly printed and that looks something +/// like: +/// +/// > Syncing 5.4 bps, target=#531028 (4 peers), best: #90683 (0x4ca8…51b8), +/// > finalized #360 (0x6f24…a38b), ⬇ 5.5kiB/s ⬆ 0.9kiB/s +/// +/// # Usage +/// +/// Call `InformantDisplay::new` to initialize the state, then regularly call `display` with the +/// information to display. +/// +pub struct InformantDisplay { + /// Head of chain block number from the last time `display` has been called. + /// `None` if `display` has never been called. + last_number: Option>, + /// The last time `display` or `new` has been called. + last_update: time::Instant, +} + +impl InformantDisplay { + /// Builds a new informant display system. + pub fn new() -> InformantDisplay { + InformantDisplay { + last_number: None, + last_update: time::Instant::now(), + } + } + + /// Displays the informant by calling `info!`. + pub fn display(&mut self, info: &ClientInfo, net_status: NetworkStatus) { + let best_number = info.chain.best_number; + let best_hash = info.chain.best_hash; + let speed = speed::(best_number, self.last_number, self.last_update); + self.last_update = time::Instant::now(); + self.last_number = Some(best_number); + + let (status, target) = match (net_status.sync_state, net_status.best_seen_block) { + (SyncState::Idle, _) => ("Idle".into(), "".into()), + (SyncState::Downloading, None) => (format!("Syncing{}", speed), "".into()), + (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed), format!(", target=#{}", n)), + }; + + let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); + + info!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + Colour::White.bold().paint(&status), + target, + Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), + Colour::White.paint(format!("{}", best_number)), + best_hash, + Colour::White.paint(format!("{}", finalized_number)), + info.chain.finalized_hash, + TransferRateFormat(net_status.average_download_per_sec), + TransferRateFormat(net_status.average_upload_per_sec), + ); + } +} + +/// Calculates `(best_number - last_number) / (now - last_update)` and returns a `String` +/// representing the speed of import. +fn speed( + best_number: NumberFor, + last_number: Option>, + last_update: time::Instant +) -> String { + let elapsed = last_update.elapsed(); + let since_last_millis = elapsed.as_secs() * 1000; + let since_last_subsec_millis = elapsed.subsec_millis() as u64; + let elapsed_ms = since_last_millis + since_last_subsec_millis; + + // Number of blocks that have been imported since last time. + let diff = match last_number { + None => return String::new(), + Some(n) => best_number.saturating_sub(n) + }; + + if let Ok(diff) = TryInto::::try_into(diff) { + // If the number of blocks can be converted to a regular integer, then it's easy: just + // do the math and turn it into a `f64`. + let speed = diff.saturating_mul(10_000).checked_div(u128::from(elapsed_ms)) + .map_or(0.0, |s| s as f64) / 10.0; + format!(" {:4.1} bps", speed) + + } else { + // If the number of blocks can't be converted to a regular integer, then we need a more + // algebraic approach and we stay within the realm of integers. + let ten = (0..10) + .fold( as Zero>::zero(), |a, _| a.saturating_add(One::one())); + let one_thousand = ten * ten * ten; + let elapsed = (0..elapsed_ms) + .fold( as Zero>::zero(), |a, _| a.saturating_add(One::one())); + + let speed = diff.saturating_mul(one_thousand).checked_div(&elapsed) + .unwrap_or_else(Zero::zero); + format!(" {} bps", speed) + } +} + +/// Contains a number of bytes per second. Implements `fmt::Display` and shows this number of bytes +/// per second in a nice way. +struct TransferRateFormat(u64); +impl fmt::Display for TransferRateFormat { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Special case 0. + if self.0 == 0 { + return write!(f, "0") + } + + // Under 0.1 kiB, display plain bytes. + if self.0 < 100 { + return write!(f, "{} B/s", self.0) + } + + // Under 1.0 MiB/sec, display the value in kiB/sec. + if self.0 < 1024 * 1024 { + return write!(f, "{:.1}kiB/s", self.0 as f64 / 1024.0) + } + + write!(f, "{:.1}MiB/s", self.0 as f64 / (1024.0 * 1024.0)) + } +} -- GitLab From 31942f4f2b4e8dd47bc8894967ac3e727ae5c13e Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 25 Jul 2019 04:55:50 +0200 Subject: [PATCH 033/151] Switch consensus crates to new futures (#3146) * Switch consensus-common to new futures * Fix tests * More tests fixing * Fix Babe tests * Fix Babe tests --- Cargo.lock | 15 ++-- core/basic-authorship/Cargo.toml | 1 + core/basic-authorship/src/basic_authorship.rs | 10 +-- core/consensus/aura/Cargo.toml | 6 +- core/consensus/aura/src/lib.rs | 72 ++++++++++--------- core/consensus/babe/Cargo.toml | 6 +- core/consensus/babe/src/lib.rs | 47 ++++++------ core/consensus/babe/src/tests.rs | 25 +++---- core/consensus/common/Cargo.toml | 5 +- core/consensus/common/src/error.rs | 2 +- core/consensus/common/src/import_queue.rs | 4 +- .../common/src/import_queue/basic_queue.rs | 61 ++++++++-------- .../common/src/import_queue/buffered_link.rs | 18 +++-- core/consensus/common/src/lib.rs | 2 +- core/consensus/slots/Cargo.toml | 4 +- core/consensus/slots/src/lib.rs | 42 +++++------ core/consensus/slots/src/slots.rs | 51 ++++++------- core/network/src/service.rs | 10 ++- core/service/src/chain_ops.rs | 6 +- node/cli/Cargo.toml | 1 + node/cli/src/service.rs | 4 +- 21 files changed, 208 insertions(+), 184 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a218c5638e..865dc1c2cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2255,6 +2255,7 @@ version = "2.0.0" dependencies = [ "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", @@ -4190,6 +4191,7 @@ dependencies = [ name = "substrate-basic-authorship" version = "2.0.0" dependencies = [ + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4310,6 +4312,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4331,7 +4334,6 @@ dependencies = [ "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4353,6 +4355,7 @@ dependencies = [ "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4380,7 +4383,6 @@ dependencies = [ "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4401,7 +4403,8 @@ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4412,8 +4415,6 @@ dependencies = [ "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", - "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4444,7 +4445,8 @@ dependencies = [ name = "substrate-consensus-slots" version = "2.0.0" dependencies = [ - "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4454,7 +4456,6 @@ dependencies = [ "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index fa409f1b74..ca6e4f0b8a 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" [dependencies] log = "0.4" +futures-preview = "0.3.0-alpha.17" codec = { package = "parity-codec", version = "4.1.1" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } client = { package = "substrate-client", path = "../../core/client" } diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 56a959ccbc..00408a1545 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -171,7 +171,7 @@ impl consensus_common::Proposer<::Block> for Pro A: txpool::ChainApi, client::error::Error: From<::Error> { - type Create = Result<::Block, error::Error>; + type Create = futures::future::Ready::Block, error::Error>>; type Error = error::Error; fn propose( @@ -179,11 +179,10 @@ impl consensus_common::Proposer<::Block> for Pro inherent_data: InherentData, inherent_digests: DigestFor, max_duration: time::Duration, - ) -> Result<::Block, error::Error> - { + ) -> Self::Create { // leave some time for evaluation and block finalization (33%) let deadline = (self.now)() + max_duration - max_duration / 3; - self.propose_with(inherent_data, inherent_digests, deadline) + futures::future::ready(self.propose_with(inherent_data, inherent_digests, deadline)) } } @@ -328,7 +327,8 @@ mod tests { cell.replace(new) }); let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); + let block = futures::executor::block_on(proposer.propose(Default::default(), Default::default(), deadline)) + .unwrap(); // then // block should have some extrinsics although we have some more in the pool. diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 03ddf79be3..add7d8b217 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -19,13 +19,13 @@ client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } consensus_common = { package = "substrate-consensus-common", path = "../common" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -futures = "0.1.17" -tokio-timer = "0.2.11" +futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } +futures01 = { package = "futures", version = "0.1" } +futures-timer = "0.2.1" parking_lot = "0.8.0" log = "0.4" [dev-dependencies] -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } keyring = { package = "substrate-keyring", path = "../../keyring" } substrate-executor = { path = "../../executor" } network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 2bfd907646..964f7231b1 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -28,7 +28,7 @@ //! //! NOTE: Aura itself is designed to be generic over the crypto used. #![forbid(missing_docs, unsafe_code)] -use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug}; +use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug, pin::Pin}; use parity_codec::{Encode, Decode, Codec}; use consensus_common::{self, BlockImport, Environment, Proposer, @@ -52,9 +52,9 @@ use runtime_primitives::traits::{Block as BlockT, Header, DigestItemFor, Provide use primitives::Pair; use inherents::{InherentDataProviders, InherentData}; -use futures::{Future, IntoFuture, future}; +use futures::{prelude::*, future}; use parking_lot::Mutex; -use tokio_timer::Timeout; +use futures_timer::Delay; use log::{error, warn, debug, info, trace}; use srml_aura::{ @@ -128,7 +128,7 @@ impl SlotCompatible for AuraSlotCompatible { } } -/// Start the aura worker. The returned future should be run in a tokio runtime. +/// Start the aura worker. The returned future should be run in a futures executor. pub fn start_aura( slot_duration: SlotDuration, local_key: Arc

, @@ -139,13 +139,13 @@ pub fn start_aura( sync_oracle: SO, inherent_data_providers: InherentDataProviders, force_authoring: bool, -) -> Result, consensus_common::Error> where +) -> Result, consensus_common::Error> where B: BlockT, C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, C::Api: AuraApi>, SC: SelectChain, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, P: Pair + Send + Sync + 'static, P::Public: Hash + Member + Encode + Decode, P::Signature: Hash + Member + Encode + Decode, @@ -174,7 +174,7 @@ pub fn start_aura( sync_oracle, inherent_data_providers, AuraSlotCompatible, - )) + ).map(|()| Ok::<(), ()>(())).compat()) } struct AuraWorker { @@ -192,7 +192,7 @@ impl SlotWorker for AuraWorker w C::Api: AuraApi>, E: Environment, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, H: Header, I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, @@ -201,7 +201,7 @@ impl SlotWorker for AuraWorker w SO: SyncOracle + Send + Clone, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; + type OnSlot = Pin> + Send>>; fn on_slot( &self, @@ -228,7 +228,7 @@ impl SlotWorker for AuraWorker w telemetry!(CONSENSUS_WARN; "aura.unable_fetching_authorities"; "slot" => ?chain_head.hash(), "err" => ?e ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } }; @@ -237,11 +237,11 @@ impl SlotWorker for AuraWorker w telemetry!(CONSENSUS_DEBUG; "aura.skipping_proposal_slot"; "authorities_len" => authorities.len() ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } let maybe_author = slot_author::

(slot_num, &authorities); let proposal_work = match maybe_author { - None => return Box::new(future::ok(())), + None => return Box::pin(future::ready(Ok(()))), Some(author) => if author == &public_key { debug!( target: "aura", "Starting authorship at slot {}; timestamp = {}", @@ -260,14 +260,14 @@ impl SlotWorker for AuraWorker w telemetry!(CONSENSUS_WARN; "aura.unable_authoring_block"; "slot" => slot_num, "err" => ?e ); - return Box::new(future::ok(())) + return Box::pin(future::ready(Ok(()))) } }; let remaining_duration = slot_info.remaining_duration(); // deadline our production to approx. the end of the // slot - Timeout::new( + futures::future::select( proposer.propose( slot_info.inherent_data, generic::Digest { @@ -276,15 +276,21 @@ impl SlotWorker for AuraWorker w ], }, remaining_duration, - ).into_future(), - remaining_duration, - ) + ).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into()), + Delay::new(remaining_duration) + .map_err(|err| consensus_common::Error::FaultyTimer(err).into()) + ).map(|v| match v { + futures::future::Either::Left((v, _)) => v, + futures::future::Either::Right((Ok(_), _)) => + Err(consensus_common::Error::ClientImport("Timeout in the AuRa proposer".into())), + futures::future::Either::Right((Err(err), _)) => Err(err), + }) } else { - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } }; - Box::new(proposal_work.map(move |b| { + Box::pin(proposal_work.map_ok(move |b| { // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); @@ -346,7 +352,7 @@ impl SlotWorker for AuraWorker w "hash" => ?parent_hash, "err" => ?e ); } - }).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into())) + })) } } @@ -708,8 +714,6 @@ pub fn import_queue( #[cfg(test)] mod tests { use super::*; - use futures::{Async, stream::Stream as _}; - use futures03::{StreamExt as _, TryStreamExt as _}; use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; @@ -747,15 +751,16 @@ mod tests { impl Proposer for DummyProposer { type Error = Error; - type Create = Result; + type Create = future::Ready>; fn propose( &self, _: InherentData, digests: DigestFor, _: Duration, - ) -> Result { - self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) + ) -> Self::Create { + let r = self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()); + future::ready(r) } } @@ -839,9 +844,8 @@ mod tests { let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( client.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) - .for_each(move |_| Ok(())) + .take_while(|n| future::ready(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) + .for_each(move |_| future::ready(())) ); let slot_duration = SlotDuration::get_or_compute(&*client) @@ -867,13 +871,13 @@ mod tests { runtime.spawn(aura); } - // wait for all finalized on each. - let wait_for = ::futures::future::join_all(import_notifications) - .map(|_| ()) - .map_err(|_| ()); + runtime.spawn(futures01::future::poll_fn(move || { + net.lock().poll(); + Ok::<_, ()>(futures01::Async::NotReady::<()>) + })); - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + runtime.block_on(future::join_all(import_notifications) + .map(|_| Ok::<(), ()>(())).compat()).unwrap(); } #[test] diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 516ac1a40d..deb716a7ff 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -23,9 +23,9 @@ consensus_common = { package = "substrate-consensus-common", path = "../common" slots = { package = "substrate-consensus-slots", path = "../slots" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } fork-tree = { path = "../../utils/fork-tree" } -futures = "0.1.26" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } -tokio-timer = "0.2.11" +futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } +futures01 = { package = "futures", version = "0.1" } +futures-timer = "0.2.1" parking_lot = "0.8.0" log = "0.4.6" schnorrkel = "0.1.1" diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 4068ff633a..38b6257c8a 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -32,7 +32,7 @@ use runtime_primitives::traits::{ Block as BlockT, Header, DigestItemFor, NumberFor, ProvideRuntimeApi, SimpleBitOps, Zero, }; -use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, time::{Instant, Duration}}; +use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, pin::Pin, time::{Instant, Duration}}; use runtime_support::serde::{Serialize, Deserialize}; use parity_codec::{Decode, Encode}; use parking_lot::{Mutex, MutexGuard}; @@ -74,9 +74,9 @@ use client::{ }; use fork_tree::ForkTree; use slots::{CheckedHeader, check_equivocation}; -use futures::{Future, IntoFuture, future, stream::Stream}; -use futures03::{StreamExt as _, TryStreamExt as _}; -use tokio_timer::Timeout; +use futures::{prelude::*, future}; +use futures01::Stream as _; +use futures_timer::Delay; use log::{error, warn, debug, info, trace}; use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, SignedDuration}; @@ -182,7 +182,7 @@ pub fn start_babe(BabeParams { force_authoring, time_source, }: BabeParams) -> Result< - impl Future, + impl futures01::Future, consensus_common::Error, > where B: BlockT, @@ -190,7 +190,7 @@ pub fn start_babe(BabeParams { C::Api: BabeApi, SC: SelectChain, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, H: Header, E: Environment, I: BlockImport + Send + Sync + 'static, @@ -214,7 +214,7 @@ pub fn start_babe(BabeParams { sync_oracle, inherent_data_providers, time_source, - )) + ).map(|()| Ok::<(), ()>(())).compat()) } struct BabeWorker { @@ -233,7 +233,7 @@ impl SlotWorker for BabeWorker w C::Api: BabeApi, E: Environment, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, Hash: Debug + Eq + Copy + SimpleBitOps + Encode + Decode + Serialize + for<'de> Deserialize<'de> + Debug + Default + AsRef<[u8]> + AsMut<[u8]> + std::hash::Hash + Display + Send + Sync + 'static, @@ -242,7 +242,7 @@ impl SlotWorker for BabeWorker w SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; + type OnSlot = Pin> + Send>>; fn on_slot( &self, @@ -269,7 +269,7 @@ impl SlotWorker for BabeWorker w telemetry!(CONSENSUS_WARN; "babe.unable_fetching_authorities"; "slot" => ?chain_head.hash(), "err" => ?e ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } }; @@ -284,7 +284,7 @@ impl SlotWorker for BabeWorker w telemetry!(CONSENSUS_DEBUG; "babe.skipping_proposal_slot"; "authorities_len" => authorities.len() ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } let proposal_work = if let Some(claim) = claim_slot( @@ -316,7 +316,7 @@ impl SlotWorker for BabeWorker w telemetry!(CONSENSUS_WARN; "babe.unable_authoring_block"; "slot" => slot_number, "err" => ?e ); - return Box::new(future::ok(())) + return Box::pin(future::ready(Ok(()))) } }; @@ -329,7 +329,7 @@ impl SlotWorker for BabeWorker w // deadline our production to approx. the end of the slot let remaining_duration = slot_info.remaining_duration(); - Timeout::new( + futures::future::select( proposer.propose( slot_info.inherent_data, generic::Digest { @@ -338,14 +338,20 @@ impl SlotWorker for BabeWorker w ], }, remaining_duration, - ).into_future(), - remaining_duration, - ) + ).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into()), + Delay::new(remaining_duration) + .map_err(|err| consensus_common::Error::FaultyTimer(err).into()) + ).map(|v| match v { + futures::future::Either::Left((v, _)) => v, + futures::future::Either::Right((Ok(_), _)) => + Err(consensus_common::Error::ClientImport("Timeout in the BaBe proposer".into())), + futures::future::Either::Right((Err(err), _)) => Err(err), + }) } else { - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); }; - Box::new(proposal_work.map(move |b| { + Box::pin(proposal_work.map_ok(move |b| { // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); @@ -402,9 +408,6 @@ impl SlotWorker for BabeWorker w "hash" => ?parent_hash, "err" => ?e ); } - }).map_err(|e| { - warn!("Client import failed: {:?}", e); - consensus_common::Error::ClientImport(format!("{:?}", e)).into() })) } } @@ -1137,7 +1140,7 @@ pub fn import_queue, I, RA, PRA>( BabeImportQueue, BabeLink, BabeBlockImport, - impl Future, + impl futures01::Future, )> where B: Backend + 'static, I: BlockImport + Clone + Send + Sync + 'static, diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index 571951b3b7..1a68c35dbe 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -32,7 +32,6 @@ use keyring::sr25519::Keyring; use super::generic::DigestItem; use client::BlockchainEvents; use test_client; -use futures::Async; use log::debug; use std::{time::Duration, borrow::Borrow, cell::RefCell}; type Item = generic::DigestItem; @@ -62,15 +61,15 @@ impl Environment for DummyFactory { impl Proposer for DummyProposer { type Error = Error; - type Create = Result; + type Create = future::Ready>; fn propose( &self, _: InherentData, digests: DigestFor, _: Duration, - ) -> Result { - self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) + ) -> Self::Create { + future::ready(self.1.new_block(digests).unwrap().bake().map_err(|e| e.into())) } } @@ -203,9 +202,8 @@ fn run_one_test() { let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( client.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &5)) - .for_each(move |_| Ok(())) + .take_while(|n| future::ready(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) + .for_each(move |_| future::ready(())) ); let config = Config::get_or_compute(&*client) @@ -234,14 +232,13 @@ fn run_one_test() { }).expect("Starts babe")); } - // wait for all finalized on each. - let wait_for = futures::future::join_all(import_notifications); - - let drive_to_completion = futures::future::poll_fn(|| { + runtime.spawn(futures01::future::poll_fn(move || { net.lock().poll(); - Ok(Async::NotReady) - }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + Ok::<_, ()>(futures01::Async::NotReady::<()>) + })); + + runtime.block_on(future::join_all(import_notifications) + .map(|_| Ok::<(), ()>(())).compat()).unwrap(); } #[test] diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index c44b34baeb..bb0970f8a2 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -11,12 +11,11 @@ libp2p = { version = "0.11.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -futures = "0.1" +futures-preview = "0.3.0-alpha.17" +futures-timer = "0.2.1" rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -tokio-executor = "0.1.6" -tokio-timer = "0.2" parity-codec = { version = "4.1.1", features = ["derive"] } parking_lot = "0.8.0" diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index d8683d0b68..cb57bb915e 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -33,7 +33,7 @@ pub enum Error { IoTerminated, /// Unable to schedule wakeup. #[display(fmt="Timer error: {}", _0)] - FaultyTimer(tokio_timer::Error), + FaultyTimer(std::io::Error), /// Error while working with inherent data. #[display(fmt="InherentData error: {}", _0)] InherentData(String), diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 5e7969cc02..085f1e4177 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -106,8 +106,8 @@ pub trait ImportQueue: Send { /// /// This method should behave in a way similar to `Future::poll`. It can register the current /// task and notify later when more actions are ready to be polled. To continue the comparison, - /// it is as if this method always returned `Ok(Async::NotReady)`. - fn poll_actions(&mut self, link: &mut dyn Link); + /// it is as if this method always returned `Poll::Pending`. + fn poll_actions(&mut self, cx: &mut futures::task::Context, link: &mut dyn Link); } /// Hooks that the verification queue can use to influence the synchronization diff --git a/core/consensus/common/src/import_queue/basic_queue.rs b/core/consensus/common/src/import_queue/basic_queue.rs index 51d30cddbb..082006ae5d 100644 --- a/core/consensus/common/src/import_queue/basic_queue.rs +++ b/core/consensus/common/src/import_queue/basic_queue.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::sync::Arc; -use futures::{prelude::*, future::Executor, sync::mpsc}; +use std::{pin::Pin, sync::Arc}; +use futures::{prelude::*, channel::mpsc, task::SpawnExt as _, task::Context, task::Poll}; use runtime_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; use crate::error::Error as ConsensusError; @@ -34,15 +34,12 @@ pub struct BasicQueue { sender: mpsc::UnboundedSender>, /// Results coming from the worker task. result_port: BufferedLinkReceiver, - /// Since we have to be in a tokio context in order to spawn background tasks, we first store - /// the task to spawn here, then extract it as soon as we are in a tokio context. - /// If `Some`, contains the task to spawn in the background. If `None`, the future has already - /// been spawned. - future_to_spawn: Option + Send>>, /// If it isn't possible to spawn the future in `future_to_spawn` (which is notably the case in /// "no std" environment), we instead put it in `manual_poll`. It is then polled manually from /// `poll_actions`. - manual_poll: Option + Send>>, + manual_poll: Option + Send>>>, + /// A thread pool where the background worker is being run. + pool: Option, } impl BasicQueue { @@ -65,11 +62,27 @@ impl BasicQueue { finality_proof_import, ); + let mut pool = futures::executor::ThreadPool::builder() + .name_prefix("import-queue-worker-") + .pool_size(1) + .create() + .ok(); + + let manual_poll; + if let Some(pool) = &mut pool { + // TODO: this expect() can be removed once + // https://github.com/rust-lang-nursery/futures-rs/pull/1750 is merged and deployed + pool.spawn(future).expect("ThreadPool can never fail to spawn tasks; QED"); + manual_poll = None; + } else { + manual_poll = Some(Box::pin(future) as Pin>); + } + Self { sender: worker_sender, result_port, - future_to_spawn: Some(Box::new(future)), - manual_poll: None, + manual_poll, + pool, } } } @@ -99,25 +112,17 @@ impl ImportQueue for BasicQueue { let _ = self.sender.unbounded_send(ToWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)); } - fn poll_actions(&mut self, link: &mut dyn Link) { - // Try to spawn the future in `future_to_spawn`. - if let Some(future) = self.future_to_spawn.take() { - if let Err(err) = tokio_executor::DefaultExecutor::current().execute(future) { - debug_assert!(self.manual_poll.is_none()); - self.manual_poll = Some(err.into_future()); - } - } - + fn poll_actions(&mut self, cx: &mut Context, link: &mut dyn Link) { // As a backup mechanism, if we failed to spawn the `future_to_spawn`, we instead poll // manually here. if let Some(manual_poll) = self.manual_poll.as_mut() { - match manual_poll.poll() { - Ok(Async::NotReady) => {} + match Future::poll(Pin::new(manual_poll), cx) { + Poll::Pending => {} _ => self.manual_poll = None, } } - self.result_port.poll_actions(link); + self.result_port.poll_actions(cx, link); } } @@ -144,7 +149,7 @@ impl> BlockImportWorker { block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, - ) -> (impl Future + Send, mpsc::UnboundedSender>) { + ) -> (impl Future + Send, mpsc::UnboundedSender>) { let (sender, mut port) = mpsc::unbounded(); let mut worker = BlockImportWorker { @@ -167,12 +172,12 @@ impl> BlockImportWorker { } } - let future = futures::future::poll_fn(move || { + let future = futures::future::poll_fn(move |cx| { loop { - let msg = match port.poll() { - Ok(Async::Ready(Some(msg))) => msg, - Err(_) | Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => return Ok(Async::NotReady), + let msg = match Stream::poll_next(Pin::new(&mut port), cx) { + Poll::Ready(Some(msg)) => msg, + Poll::Ready(None) => return Poll::Ready(()), + Poll::Pending => return Poll::Pending, }; match msg { diff --git a/core/consensus/common/src/import_queue/buffered_link.rs b/core/consensus/common/src/import_queue/buffered_link.rs index 9c555ba9d9..ffd08e690a 100644 --- a/core/consensus/common/src/import_queue/buffered_link.rs +++ b/core/consensus/common/src/import_queue/buffered_link.rs @@ -20,7 +20,7 @@ //! //! # Example //! -//! ```no_run +//! ``` //! use substrate_consensus_common::import_queue::Link; //! # use substrate_consensus_common::import_queue::buffered_link::buffered_link; //! # use test_client::runtime::Block; @@ -28,12 +28,18 @@ //! # let mut my_link = DummyLink; //! let (mut tx, mut rx) = buffered_link::(); //! tx.blocks_processed(0, 0, vec![]); -//! rx.poll_actions(&mut my_link); // Calls `my_link.blocks_processed(0, 0, vec![])` +//! +//! // Calls `my_link.blocks_processed(0, 0, vec![])` when polled. +//! let _fut = futures::future::poll_fn(move |cx| { +//! rx.poll_actions(cx, &mut my_link); +//! std::task::Poll::Pending::<()> +//! }); //! ``` //! -use futures::{prelude::*, sync::mpsc}; +use futures::{prelude::*, channel::mpsc}; use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use std::{pin::Pin, task::Context, task::Poll}; use crate::import_queue::{Origin, Link, BlockImportResult, BlockImportError}; /// Wraps around an unbounded channel from the `futures` crate. The sender implements `Link` and @@ -120,10 +126,10 @@ impl BufferedLinkReceiver { /// /// This method should behave in a way similar to `Future::poll`. It can register the current /// task and notify later when more actions are ready to be polled. To continue the comparison, - /// it is as if this method always returned `Ok(Async::NotReady)`. - pub fn poll_actions(&mut self, link: &mut dyn Link) { + /// it is as if this method always returned `Poll::Pending`. + pub fn poll_actions(&mut self, cx: &mut Context, link: &mut dyn Link) { loop { - let msg = if let Ok(Async::Ready(Some(msg))) = self.rx.poll() { + let msg = if let Poll::Ready(Some(msg)) = Stream::poll_next(Pin::new(&mut self.rx), cx) { msg } else { break diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 0c968a327d..d901610df9 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -75,7 +75,7 @@ pub trait Proposer { /// Error type which can occur when proposing or evaluating. type Error: From + ::std::fmt::Debug + 'static; /// Future that resolves to a committed proposal. - type Create: IntoFuture; + type Create: Future>; /// Create a proposal. fn propose( &self, diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index fa856bbfbb..29c11f7533 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -12,8 +12,8 @@ primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../common" } inherents = { package = "substrate-inherents", path = "../../inherents" } -futures = "0.1.17" -tokio-timer = "0.2.11" +futures-preview = "0.3.0-alpha.17" +futures-timer = "0.2.1" parking_lot = "0.8.0" log = "0.4" diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 816a61babd..7e39d49651 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -32,23 +32,18 @@ pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; use codec::{Decode, Encode}; use consensus_common::{SyncOracle, SelectChain}; -use futures::prelude::*; -use futures::{ - future::{self, Either}, - Future, IntoFuture, -}; +use futures::{prelude::*, future::{self, Either}, task::Poll}; use inherents::{InherentData, InherentDataProviders}; use log::{debug, error, info, warn}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ApiRef, Block as BlockT, ProvideRuntimeApi}; -use std::fmt::Debug; -use std::ops::Deref; +use std::{fmt::Debug, ops::Deref, panic, pin::Pin}; /// A worker that should be invoked at every new slot. pub trait SlotWorker { /// The type of the future that will be returned when a new slot is /// triggered. - type OnSlot: IntoFuture; + type OnSlot: Future>; /// Called when a new slot is triggered. fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; @@ -78,13 +73,14 @@ pub fn start_slot_worker( sync_oracle: SO, inherent_data_providers: InherentDataProviders, timestamp_extractor: SC, -) -> impl Future +) -> impl Future where B: BlockT, C: SelectChain + Clone, W: SlotWorker, + W::OnSlot: Unpin, SO: SyncOracle + Send + Clone, - SC: SlotCompatible, + SC: SlotCompatible + Unpin, T: SlotData + Clone, { let SlotDuration(slot_duration) = slot_duration; @@ -94,12 +90,12 @@ where slot_duration.slot_duration(), inherent_data_providers, timestamp_extractor, - ).map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) - .for_each(move |slot_info| { + ).inspect_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) + .try_for_each(move |slot_info| { // only propose when we are not syncing. if sync_oracle.is_major_syncing() { debug!(target: "slots", "Skipping proposal slot due to sync."); - return Either::B(future::ok(())); + return Either::Right(future::ready(Ok(()))); } let slot_num = slot_info.number; @@ -108,23 +104,23 @@ where Err(e) => { warn!(target: "slots", "Unable to author block in slot {}. \ no best block header: {:?}", slot_num, e); - return Either::B(future::ok(())); + return Either::Right(future::ready(Ok(()))); } }; - Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( - |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), + Either::Left(worker.on_slot(chain_head, slot_info).map_err( + |e| { warn!(target: "slots", "Encountered consensus error: {:?}", e); e } )) }); - future::poll_fn(move || + future::poll_fn(move |cx| { loop { - let mut authorship = std::panic::AssertUnwindSafe(&mut authorship); - match std::panic::catch_unwind(move || authorship.poll()) { - Ok(Ok(Async::Ready(()))) => + match panic::catch_unwind(panic::AssertUnwindSafe(|| Future::poll(Pin::new(&mut authorship), cx))) { + Ok(Poll::Ready(Ok(()))) => warn!(target: "slots", "Slots stream has terminated unexpectedly."), - Ok(Ok(Async::NotReady)) => break Ok(Async::NotReady), - Ok(Err(())) => warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), + Ok(Poll::Pending) => break Poll::Pending, + Ok(Poll::Ready(Err(_err))) => + warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), Err(e) => { if let Some(s) = e.downcast_ref::<&'static str>() { warn!(target: "slots", "Authorship task panicked at {:?}", s); @@ -134,7 +130,7 @@ where } } } - ) + }) } /// A header which has been checked diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index 0142f32b82..4e51cf0d84 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -16,16 +16,15 @@ //! Utility stream for yielding slots in a loop. //! -//! This is used instead of `tokio_timer::Interval` because it was unreliable. +//! This is used instead of `futures_timer::Interval` because it was unreliable. use super::SlotCompatible; use consensus_common::Error; -use futures::prelude::*; -use futures::try_ready; +use futures::{prelude::*, task::Context, task::Poll}; use inherents::{InherentData, InherentDataProviders}; -use std::time::{Duration, Instant}; -use tokio_timer::Delay; +use std::{pin::Pin, time::{Duration, Instant}}; +use futures_timer::Delay; /// Returns current duration since unix epoch. pub fn duration_now() -> Duration { @@ -121,47 +120,51 @@ impl Slots { } } -impl Stream for Slots { - type Item = SlotInfo; - type Error = Error; +impl Stream for Slots { + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { loop { let slot_duration = self.slot_duration; self.inner_delay = match self.inner_delay.take() { None => { // schedule wait. - let wait_until = Instant::now() + time_until_next(duration_now(), slot_duration); - Some(Delay::new(wait_until)) + let wait_dur = time_until_next(duration_now(), slot_duration); + Some(Delay::new(wait_dur)) } Some(d) => Some(d), }; if let Some(ref mut inner_delay) = self.inner_delay { - try_ready!(inner_delay - .poll() - .map_err(Error::FaultyTimer)); + match Future::poll(Pin::new(inner_delay), cx) { + Poll::Pending => return Poll::Pending, + Poll::Ready(Err(err)) => return Poll::Ready(Some(Err(Error::FaultyTimer(err)))), + Poll::Ready(Ok(())) => {} + } } // timeout has fired. - let inherent_data = self - .inherent_data_providers - .create_inherent_data() - .map_err(|s| consensus_common::Error::InherentData(s.into_owned()))?; - let (timestamp, slot_num, offset) = self - .timestamp_extractor - .extract_timestamp_and_slot(&inherent_data)?; + let inherent_data = match self.inherent_data_providers.create_inherent_data() { + Ok(id) => id, + Err(err) => return Poll::Ready(Some(Err(consensus_common::Error::InherentData(err.into_owned())))), + }; + let result = self.timestamp_extractor.extract_timestamp_and_slot(&inherent_data); + let (timestamp, slot_num, offset) = match result { + Ok(v) => v, + Err(err) => return Poll::Ready(Some(Err(err))), + }; // reschedule delay for next slot. - let ends_at = Instant::now() + offset + + let ends_in = offset + time_until_next(Duration::from_secs(timestamp), slot_duration); - self.inner_delay = Some(Delay::new(ends_at)); + let ends_at = Instant::now() + ends_in; + self.inner_delay = Some(Delay::new(ends_in)); // never yield the same slot twice. if slot_num > self.last_slot { self.last_slot = slot_num; - break Ok(Async::Ready(Some(SlotInfo { + break Poll::Ready(Some(Ok(SlotInfo { number: slot_num, duration: self.slot_duration, timestamp, diff --git a/core/network/src/service.rs b/core/network/src/service.rs index c8ae6681de..5b4c880c89 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -31,6 +31,7 @@ use std::sync::{Arc, atomic::{AtomicBool, AtomicUsize, Ordering}}; use consensus::import_queue::{ImportQueue, Link}; use consensus::import_queue::{BlockImportResult, BlockImportError}; use futures::{prelude::*, sync::mpsc}; +use futures03::TryFutureExt as _; use log::{warn, error, info}; use libp2p::{PeerId, Multiaddr, multihash::Multihash}; use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; @@ -583,9 +584,12 @@ impl, H: ExHashT> Future for Ne fn poll(&mut self) -> Poll { // Poll the import queue for actions to perform. - self.import_queue.poll_actions(&mut NetworkLink { - protocol: &mut self.network_service, - }); + let _ = futures03::future::poll_fn(|cx| { + self.import_queue.poll_actions(cx, &mut NetworkLink { + protocol: &mut self.network_service, + }); + std::task::Poll::Pending::> + }).compat().poll(); // Check for new incoming on-demand requests. if let Some(on_demand_in) = self.on_demand_in.as_mut() { diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index dd2d26f8a3..6e7151ee0a 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -18,6 +18,7 @@ use std::{self, io::{Read, Write}}; use futures::prelude::*; +use futures03::TryFutureExt as _; use log::{info, warn}; use runtime_primitives::generic::{SignedBlock, BlockId}; @@ -193,7 +194,10 @@ pub fn import_blocks( } let blocks_before = link.imported_blocks; - queue.poll_actions(&mut link); + let _ = futures03::future::poll_fn(|cx| { + queue.poll_actions(cx, &mut link); + std::task::Poll::Pending::> + }).compat().poll(); if link.imported_blocks / 1000 != blocks_before / 1000 { info!( "#{} blocks were imported (#{} left)", diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index a9f3efdaa5..d3d48ebe01 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -47,6 +47,7 @@ balances = { package = "srml-balances", path = "../../srml/balances" } babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } +futures03 = { package = "futures-preview", version = "0.3.0-alpha.17" } [build-dependencies] cli = { package = "substrate-cli", path = "../../core/cli" } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index f75e97a8fe..8938d36ddf 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -381,11 +381,11 @@ mod tests { digest.push(::babe_pre_digest(babe_pre_digest)); let proposer = proposer_factory.init(&parent_header).unwrap(); - let new_block = proposer.propose( + let new_block = futures03::executor::block_on(proposer.propose( inherent_data, digest, std::time::Duration::from_secs(1), - ).expect("Error making test block"); + )).expect("Error making test block"); let (new_header, new_body) = new_block.deconstruct(); let pre_hash = new_header.hash(); -- GitLab From d3aad62349347318d7d9c824f07d2a14dba59558 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 25 Jul 2019 10:09:39 +0200 Subject: [PATCH 034/151] Really fix #2652 this time (#3199) * Really fix #2652 this time * Other fixes * Minor style fix --- core/cli/src/informant/display.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core/cli/src/informant/display.rs b/core/cli/src/informant/display.rs index 481bff0cde..82bae3358d 100644 --- a/core/cli/src/informant/display.rs +++ b/core/cli/src/informant/display.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2019 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -18,9 +18,9 @@ use ansi_term::Colour; use client::ClientInfo; use log::info; use network::SyncState; -use runtime_primitives::traits::{Block as BlockT, SaturatedConversion, CheckedDiv, NumberFor, One, Zero, Saturating}; +use runtime_primitives::traits::{Block as BlockT, CheckedDiv, NumberFor, Zero, Saturating}; use service::NetworkStatus; -use std::{convert::TryInto, fmt, time}; +use std::{convert::{TryFrom, TryInto}, fmt, time}; /// State of the informant display system. /// @@ -66,8 +66,6 @@ impl InformantDisplay { (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed), format!(", target=#{}", n)), }; - let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); - info!( target: "substrate", "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", @@ -76,7 +74,7 @@ impl InformantDisplay { Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), Colour::White.paint(format!("{}", best_number)), best_hash, - Colour::White.paint(format!("{}", finalized_number)), + Colour::White.paint(format!("{}", info.chain.finalized_number)), info.chain.finalized_hash, TransferRateFormat(net_status.average_download_per_sec), TransferRateFormat(net_status.average_upload_per_sec), @@ -91,10 +89,13 @@ fn speed( last_number: Option>, last_update: time::Instant ) -> String { - let elapsed = last_update.elapsed(); - let since_last_millis = elapsed.as_secs() * 1000; - let since_last_subsec_millis = elapsed.subsec_millis() as u64; - let elapsed_ms = since_last_millis + since_last_subsec_millis; + // Number of milliseconds elapsed since last time. + let elapsed_ms = { + let elapsed = last_update.elapsed(); + let since_last_millis = elapsed.as_secs() * 1000; + let since_last_subsec_millis = elapsed.subsec_millis() as u64; + since_last_millis + since_last_subsec_millis + }; // Number of blocks that have been imported since last time. let diff = match last_number { @@ -112,11 +113,10 @@ fn speed( } else { // If the number of blocks can't be converted to a regular integer, then we need a more // algebraic approach and we stay within the realm of integers. - let ten = (0..10) - .fold( as Zero>::zero(), |a, _| a.saturating_add(One::one())); - let one_thousand = ten * ten * ten; - let elapsed = (0..elapsed_ms) - .fold( as Zero>::zero(), |a, _| a.saturating_add(One::one())); + let one_thousand = NumberFor::::from(1_000); + let elapsed = NumberFor::::from( + >::try_from(elapsed_ms).unwrap_or(u32::max_value()) + ); let speed = diff.saturating_mul(one_thousand).checked_div(&elapsed) .unwrap_or_else(Zero::zero); -- GitLab From c161dc57e39b570da22e303cb3d34fdb0bb6b211 Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Thu, 25 Jul 2019 04:36:11 -0400 Subject: [PATCH 035/151] Include padding in heap size calculation (#3197) Closes #3005 --- core/executor/src/allocator.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs index 9e61a2c6ef..504b96987f 100644 --- a/core/executor/src/allocator.rs +++ b/core/executor/src/allocator.rs @@ -67,7 +67,6 @@ impl FreeingBumpHeapAllocator { let current_size: Bytes = mem.current_size().into(); let current_size = current_size.0 as u32; let used_size = mem.used_size().0 as u32; - let heap_size = current_size - used_size; let mut ptr_offset = used_size; let padding = ptr_offset % ALIGNMENT; @@ -75,6 +74,8 @@ impl FreeingBumpHeapAllocator { ptr_offset += ALIGNMENT - padding; } + let heap_size = current_size - ptr_offset; + FreeingBumpHeapAllocator { bumper: 0, heads: [0; N], -- GitLab From 7702f1d70d17d532c25596af976cce30e3379ee9 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 25 Jul 2019 12:49:30 +0300 Subject: [PATCH 036/151] fixed on_demand test (#3200) --- core/network/src/protocol/on_demand.rs | 62 +++++--------------------- 1 file changed, 12 insertions(+), 50 deletions(-) diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/on_demand.rs index 76c926df10..7f07ab96f9 100644 --- a/core/network/src/protocol/on_demand.rs +++ b/core/network/src/protocol/on_demand.rs @@ -898,8 +898,6 @@ pub mod tests { #[test] fn receives_remote_failure_after_retry_count_failures() { - use parking_lot::{Condvar, Mutex}; - let retry_count = 2; let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); let mut on_demand = dummy(false); @@ -908,10 +906,7 @@ pub mod tests { on_demand.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); } - let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); - let thread_sync = sync.clone(); - - let (tx, response) = oneshot::channel(); + let (tx, mut response) = oneshot::channel(); on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), @@ -919,25 +914,13 @@ pub mod tests { call_data: vec![], retry_count: Some(retry_count) }, tx)); - let thread = ::std::thread::spawn(move || { - let &(ref current, ref finished_at, ref finished) = &*thread_sync; - let _ = response.wait().unwrap().unwrap_err(); - *finished_at.lock() = *current.lock(); - finished.notify_one(); - }); - let &(ref current, ref finished_at, ref finished) = &*sync; - for i in 0..retry_count+1 { - let mut current = current.lock(); - *current = *current + 1; + for i in 0..retry_count { + assert!(response.try_recv().unwrap().is_none()); receive_call_response(&mut network_interface, &mut on_demand, peer_ids[i].clone(), i as u64); } - let mut finished_at = finished_at.lock(); - assert!(!finished.wait_for(&mut finished_at, ::std::time::Duration::from_millis(1000)).timed_out()); - assert_eq!(*finished_at, retry_count + 1); - - thread.join().unwrap(); + assert!(response.try_recv().unwrap().unwrap().is_err()); } #[test] @@ -955,13 +938,9 @@ pub mod tests { call_data: vec![], retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, vec![42]); - }); receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), vec![42]); } #[test] @@ -978,16 +957,12 @@ pub mod tests { key: b":key".to_vec(), retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, Some(vec![42])); - }); on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), Some(vec![42])); } #[test] @@ -1005,17 +980,13 @@ pub mod tests { key: b":key".to_vec(), retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, Some(vec![42])); - }); on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), Some(vec![42])); } #[test] @@ -1031,14 +1002,6 @@ pub mod tests { block: 1, retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!( - result.hash(), - "6443a0b46e0412e626363028115a9f2c\ - f963eeed526b8b33e5316f08b50d0dc3".parse().unwrap() - ); - }); on_demand.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { id: 0, @@ -1051,7 +1014,10 @@ pub mod tests { }), proof: vec![vec![2]], }); - thread.join().unwrap(); + assert_eq!( + response.wait().unwrap().unwrap().hash(), + "6443a0b46e0412e626363028115a9f2cf963eeed526b8b33e5316f08b50d0dc3".parse().unwrap(), + ); } #[test] @@ -1071,10 +1037,6 @@ pub mod tests { key: vec![], retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, vec![(100, 2)]); - }); on_demand.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { id: 0, @@ -1083,7 +1045,7 @@ pub mod tests { roots: vec![], roots_proof: vec![], }); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), vec![(100, 2)]); } #[test] -- GitLab From f9e5a3742cfecb7f8f89c7c961ae900cca645b65 Mon Sep 17 00:00:00 2001 From: Kian Peymani Date: Thu, 25 Jul 2019 11:58:47 +0200 Subject: [PATCH 037/151] Weight annotation. (#3157) * Make extrinsics extensible. Also Remove old extrinsic types. * Rest of mockup. Add tips. * Fix some build issues * Runtiem builds :) * Substrate builds. * Fix a doc test * Compact encoding * Extract out the era logic into an extension * Weight Check signed extension. (#3115) * Weight signed extension. * Revert a bit + test for check era. * Update Cargo.toml * Update node/cli/src/factory_impl.rs * Update node/executor/src/lib.rs * Update node/executor/src/lib.rs * Don't use len for weight - use data. * Operational Transaction; second attempt (#3138) * working poc added. * some fixes. * Update doc. * Fix all tests + final logic. * more refactoring. * nits. * System block limit in bytes. * Silent the storage macro warnings. * More logic more tests. * Fix import. * Refactor names. * Fix build. * Update srml/balances/src/lib.rs * Final refactor. * Bump transaction version * Fix weight mult test. * Fix more tests and improve doc. * Bump. * Make some tests work again. * Fix subkey. * Remove todos + bump. * First draft of annotating weights. * Refactor weight to u64. * More refactoring and tests. * New convert for weight to fee * more tests. * remove merge redundancy. * Fix system test. * Bring back subkey stuff. * a few stress tests. * fix some of the grumbles. * Final nits. * Update srml/system/src/lib.rs Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * Scale weights by 1000. * Bump. * Fix decl_storage test. --- core/sr-primitives/src/lib.rs | 31 ++- core/sr-primitives/src/testing.rs | 2 +- core/sr-primitives/src/traits.rs | 15 +- core/sr-primitives/src/weights.rs | 6 +- core/test-runtime/src/lib.rs | 5 +- node-template/runtime/src/lib.rs | 24 +- node-template/runtime/src/template.rs | 3 + node/cli/src/chain_spec.rs | 3 +- node/cli/src/service.rs | 3 +- node/executor/Cargo.toml | 1 + node/executor/src/lib.rs | 331 +++++++++++++++++++++----- node/runtime/src/constants.rs | 52 ++++ node/runtime/src/impls.rs | 162 +++++++++---- node/runtime/src/lib.rs | 39 ++- srml/assets/src/lib.rs | 4 +- srml/aura/src/mock.rs | 4 +- srml/authorship/src/lib.rs | 5 + srml/balances/src/lib.rs | 31 ++- srml/balances/src/mock.rs | 20 +- srml/balances/src/tests.rs | 32 ++- srml/collective/src/lib.rs | 34 ++- srml/contracts/src/tests.rs | 5 +- srml/council/src/lib.rs | 4 + srml/democracy/src/lib.rs | 22 ++ srml/elections/src/lib.rs | 16 +- srml/example/src/lib.rs | 5 +- srml/executive/src/lib.rs | 24 +- srml/finality-tracker/src/lib.rs | 3 + srml/generic-asset/src/lib.rs | 1 + srml/generic-asset/src/mock.rs | 9 +- srml/grandpa/src/mock.rs | 4 +- srml/indices/src/mock.rs | 3 + srml/session/src/lib.rs | 2 + srml/session/src/mock.rs | 3 + srml/staking/src/lib.rs | 14 ++ srml/staking/src/mock.rs | 3 + srml/sudo/src/lib.rs | 2 + srml/support/src/dispatch.rs | 8 +- srml/support/src/lib.rs | 31 +++ srml/system/benches/bench.rs | 7 +- srml/system/src/lib.rs | 91 +++++-- srml/timestamp/src/lib.rs | 6 +- srml/treasury/src/lib.rs | 9 +- subkey/src/main.rs | 24 +- 44 files changed, 844 insertions(+), 259 deletions(-) create mode 100644 node/runtime/src/constants.rs diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 0b6321034c..922fe7f9de 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -182,11 +182,16 @@ impl Permill { /// Everything. pub fn one() -> Self { Self(1_000_000) } + /// create a new raw instance. This can be called at compile time. + pub const fn from_const_parts(parts: u32) -> Self { + Self([parts, 1_000_000][(parts > 1_000_000) as usize]) + } + /// From an explicitly defined number of parts per maximum of the type. - pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000)) } + pub fn from_parts(parts: u32) -> Self { Self::from_const_parts(parts) } /// Converts from a percent. Equal to `x / 100`. - pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000) } + pub const fn from_percent(x: u32) -> Self { Self([x, 100][(x > 100) as usize] * 10_000) } /// Converts a fraction into `Permill`. #[cfg(feature = "std")] @@ -286,11 +291,16 @@ impl Perbill { /// Everything. pub fn one() -> Self { Self(1_000_000_000) } + /// create a new raw instance. This can be called at compile time. + pub const fn from_const_parts(parts: u32) -> Self { + Self([parts, 1_000_000_000][(parts > 1_000_000_000) as usize]) + } + /// From an explicitly defined number of parts per maximum of the type. - pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000_000)) } + pub fn from_parts(parts: u32) -> Self { Self::from_const_parts(parts) } /// Converts from a percent. Equal to `x / 100`. - pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000_000) } + pub const fn from_percent(x: u32) -> Self { Self([x, 100][(x > 100) as usize] * 10_000_000) } /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. pub fn from_millionths(x: u32) -> Self { Self(x.min(1_000_000) * 1000) } @@ -411,11 +421,12 @@ impl Fixed64 { /// Performs a saturated multiply and accumulate. /// - /// Returns `n + (self * n)`. + /// Returns a saturated `n + (self * n)`. + /// TODO: generalize this to any weight type. #3189 pub fn saturated_multiply_accumulate(&self, int: u32) -> u32 { let parts = self.0; - let positive = parts > 0; + // natural parts might overflow. let natural_parts = self.clone().saturated_into::(); // fractional parts can always fit into u32. @@ -459,8 +470,8 @@ impl Saturating for Fixed64 { } } -/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait for -/// safe addition. +/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait +/// for safe addition. impl ops::Add for Fixed64 { type Output = Self; @@ -469,8 +480,8 @@ impl ops::Add for Fixed64 { } } -/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait for -/// safe subtraction. +/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait +/// for safe subtraction. impl ops::Sub for Fixed64 { type Output = Self; diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index fcafe6dad9..6ef7844fc9 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -282,7 +282,7 @@ impl GetDispatchInfo for TestXt { fn get_dispatch_info(&self) -> DispatchInfo { // for testing: weight == size. DispatchInfo { - weight: self.encode().len() as u32, + weight: self.encode().len() as _, ..Default::default() } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index eccf975132..670f8d181d 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -166,7 +166,6 @@ impl Convert for Identity { /// A structure that performs standard conversion using the standard Rust conversion traits. pub struct ConvertInto; - impl> Convert for ConvertInto { fn convert(a: A) -> B { a.into() } } @@ -771,6 +770,9 @@ pub enum DispatchError { /// General error to do with the inability to pay some fees (e.g. account balance too low). Payment, + /// General error to do with the exhaustion of block resources. + Resource, + /// General error to do with the permissions of the sender. NoPermission, @@ -794,11 +796,12 @@ impl From for i8 { fn from(e: DispatchError) -> i8 { match e { DispatchError::Payment => -64, - DispatchError::NoPermission => -65, - DispatchError::BadState => -66, - DispatchError::Stale => -67, - DispatchError::Future => -68, - DispatchError::BadProof => -69, + DispatchError::Resource => -65, + DispatchError::NoPermission => -66, + DispatchError::BadState => -67, + DispatchError::Stale => -68, + DispatchError::Future => -69, + DispatchError::BadProof => -70, } } } diff --git a/core/sr-primitives/src/weights.rs b/core/sr-primitives/src/weights.rs index c592d9e195..45ac59e0d5 100644 --- a/core/sr-primitives/src/weights.rs +++ b/core/sr-primitives/src/weights.rs @@ -163,10 +163,8 @@ impl ClassifyDispatch for SimpleDispatchInfo { impl Default for SimpleDispatchInfo { fn default() -> Self { - // This implies that the weight is currently equal to 100, nothing more - // for all substrate transactions that do NOT explicitly annotate weight. - // TODO #2431 needs to be updated with proper max values. - SimpleDispatchInfo::FixedNormal(100) + // Default weight of all transactions. + SimpleDispatchInfo::FixedNormal(10_000) } } diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 7947d830a3..ceb9ed737b 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -34,8 +34,7 @@ use substrate_client::{ impl_runtime_apis, }; use runtime_primitives::{ - ApplyResult, - create_runtime_str, + ApplyResult, create_runtime_str, Perbill, transaction_validity::{TransactionValidity, ValidTransaction}, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, @@ -330,6 +329,7 @@ parameter_types! { pub const MinimumPeriod: u64 = 5; pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } impl srml_system::Trait for Runtime { @@ -346,6 +346,7 @@ impl srml_system::Trait for Runtime { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl srml_timestamp::Trait for Runtime { diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 332df0ec0d..eedcda4d14 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -8,17 +8,11 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -#[cfg(feature = "std")] -use serde::{Serialize, Deserialize}; -use parity_codec::{Encode, Decode}; use rstd::prelude::*; -#[cfg(feature = "std")] -use primitives::bytes; use primitives::{ed25519, sr25519, OpaqueMetadata}; -use sr_primitives::{ - ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, - traits::{self, NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify}, weights::Weight, -}; +use sr_primitives::{ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str}; +use sr_primitives::traits::{NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto}; +use sr_primitives::weights::Weight; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, runtime_api, impl_runtime_apis @@ -102,8 +96,9 @@ pub fn native_version() -> NativeVersion { parameter_types! { pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const MaximumBlockWeight: Weight = 1_000_000; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; } impl system::Trait for Runtime { @@ -133,6 +128,8 @@ impl system::Trait for Runtime { type MaximumBlockWeight = MaximumBlockWeight; /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. type MaximumBlockLength = MaximumBlockLength; + /// Portion of the block weight that is available to all normal transactions. + type AvailableBlockRatio = AvailableBlockRatio; } impl aura::Trait for Runtime { @@ -166,8 +163,8 @@ parameter_types! { pub const ExistentialDeposit: u128 = 500; pub const TransferFee: u128 = 0; pub const CreationFee: u128 = 0; - pub const TransactionBaseFee: u128 = 1; - pub const TransactionByteFee: u128 = 0; + pub const TransactionBaseFee: u128 = 0; + pub const TransactionByteFee: u128 = 1; } impl balances::Trait for Runtime { @@ -188,6 +185,7 @@ impl balances::Trait for Runtime { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = ConvertInto; } impl sudo::Trait for Runtime { diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index 63b5e27b96..d0c5144390 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -74,6 +74,7 @@ mod tests { use support::{impl_outer_origin, assert_ok, parameter_types}; use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; use sr_primitives::weights::Weight; + use sr_primitives::Perbill; impl_outer_origin! { pub enum Origin for Test {} @@ -88,6 +89,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: Weight = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } impl system::Trait for Test { type Origin = Origin; @@ -103,6 +105,7 @@ mod tests { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Test { type Event = (); diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 781495780d..26e54f6ee6 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -23,8 +23,9 @@ use node_runtime::{ BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig, DemocracyConfig, ElectionsConfig, GrandpaConfig, ImOnlineConfig, IndicesConfig, Perbill, SessionConfig, SessionKeys, StakerStatus, StakingConfig, SudoConfig, SystemConfig, - TechnicalCommitteeConfig, DAYS, DOLLARS, MILLICENTS, WASM_BINARY, + TechnicalCommitteeConfig, WASM_BINARY, }; +use node_runtime::constants::{time::*, currency::*}; pub use node_runtime::GenesisConfig; use substrate_service; use hex_literal::hex; diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 8938d36ddf..29af557a3f 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -263,7 +263,8 @@ mod tests { use babe::CompatibleDigestItem; use consensus_common::{Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy}; use node_primitives::DigestItem; - use node_runtime::{BalancesCall, Call, CENTS, SECS_PER_BLOCK, UncheckedExtrinsic}; + use node_runtime::{BalancesCall, Call, UncheckedExtrinsic}; + use node_runtime::constants::{currency::CENTS, time::SECS_PER_BLOCK}; use parity_codec::{Encode, Decode}; use primitives::{ crypto::Pair as CryptoPair, blake2_256, diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 3454011419..2e3ba49d98 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -34,3 +34,4 @@ wabt = "~0.7.4" [features] benchmarks = [] +stress-test = [] diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 7d806735a1..9b9352090e 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -35,31 +35,29 @@ native_executor_instance!( #[cfg(test)] mod tests { - use runtime_io; use super::Executor; + use {balances, contracts, indices, staking, system, timestamp}; + use runtime_io; use substrate_executor::{WasmExecutor, NativeExecutionDispatch}; use parity_codec::{Encode, Decode, Joiner}; use keyring::{AccountKeyring, Ed25519Keyring, Sr25519Keyring}; - use runtime_support::{Hashable, StorageValue, StorageMap, traits::{Currency, Get}}; + use runtime_support::{Hashable, StorageValue, StorageMap, assert_eq_error_rate, traits::Currency}; use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; - use primitives::{ - twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, - NativeOrEncoded - }; + use primitives::{ twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId, Balance, Index}; - use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; + use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Convert}; use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; - use runtime_primitives::weights::{WeightMultiplier, SimpleDispatchInfo, WeighData}; - use {balances, contracts, indices, staking, system, timestamp}; + use runtime_primitives::weights::{WeightMultiplier, GetDispatchInfo}; use contracts::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{ Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, SystemConfig, - GrandpaConfig, IndicesConfig, ContractsConfig, Event, SessionKeys, CreationFee, - CENTS, DOLLARS, MILLICENTS, SignedExtra, TransactionBaseFee, TransactionByteFee, - MaximumBlockWeight, + GrandpaConfig, IndicesConfig, ContractsConfig, Event, SessionKeys, SignedExtra, + TransferFee, TransactionBaseFee, TransactionByteFee, }; + use node_runtime::constants::currency::*; + use node_runtime::impls::WeightToFee; use wabt; use primitives::map; @@ -82,20 +80,18 @@ mod tests { type TestExternalities = CoreTestExternalities; + /// Default transfer fee fn transfer_fee(extrinsic: &E) -> Balance { - let length_fee = >::get() + - >::get() * + let length_fee = TransactionBaseFee::get() + + TransactionByteFee::get() * (extrinsic.encode().len() as Balance); - let weight_fee = SimpleDispatchInfo::default().weigh_data(()) as Balance; - length_fee + weight_fee - } - - fn multiplier_ideal() -> u32 { - >::get() / 4 / 4 - } - fn creation_fee() -> Balance { - >::get() + let weight = default_transfer_call().get_dispatch_info().weight; + // NOTE: this is really hard to apply, since the multiplier of each block needs to be fetched + // before the block, while we compute this after the block. + // weight = >::next_weight_multiplier().apply_to(weight); + let weight_fee = ::WeightToFee::convert(weight); + length_fee + weight_fee + TransferFee::get() } fn alice() -> AccountId { @@ -155,10 +151,14 @@ mod tests { ) } + fn default_transfer_call() -> balances::Call { + balances::Call::transfer::(bob().into(), 69 * DOLLARS) + } + fn xt() -> UncheckedExtrinsic { sign(CheckedExtrinsic { signed: Some((alice(), signed_extra(0, 0))), - function: Call::Balances(balances::Call::transfer::(bob().into(), 69 * DOLLARS)), + function: Call::Balances(default_transfer_call()), }) } @@ -273,7 +273,7 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -309,7 +309,7 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -552,7 +552,7 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); let events = vec![ EventRecord { @@ -587,9 +587,18 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - // TODO TODO: this needs investigating: why are we deducting creation fee twice here? and why bob also pays it? - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * transfer_fee(&xt()) - 2 * creation_fee()); - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - transfer_fee(&xt()) - creation_fee()); + // NOTE: fees differ slightly in tests that execute more than one block due to the + // weight update. Hence, using `assert_eq_error_rate`. + assert_eq_error_rate!( + Balances::total_balance(&alice()), + 32 * DOLLARS - 2 * transfer_fee(&xt()), + 10_000 + ); + assert_eq_error_rate!( + Balances::total_balance(&bob()), + 179 * DOLLARS - transfer_fee(&xt()), + 10_000 + ); let events = vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), @@ -644,15 +653,23 @@ mod tests { WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt()) - creation_fee()); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); }); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block2.0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * transfer_fee(&xt()) - 2 * creation_fee()); - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - 1 * transfer_fee(&xt()) - creation_fee()); + assert_eq_error_rate!( + Balances::total_balance(&alice()), + 32 * DOLLARS - 2 * transfer_fee(&xt()), + 10_000 + ); + assert_eq_error_rate!( + Balances::total_balance(&bob()), + 179 * DOLLARS - 1 * transfer_fee(&xt()), + 10_000 + ); }); } @@ -814,15 +831,14 @@ mod tests { fn wasm_big_block_import_fails() { let mut t = new_test_ext(COMPACT_CODE, false); - assert!( - WasmExecutor::new().call( - &mut t, - 4, - COMPACT_CODE, - "Core_execute_block", - &block_with_size(42, 0, 120_000).0 - ).is_err() + let result = WasmExecutor::new().call( + &mut t, + 4, + COMPACT_CODE, + "Core_execute_block", + &block_with_size(42, 0, 120_000).0 ); + assert!(result.is_err()); // Err(Wasmi(Trap(Trap { kind: Host(AllocatorOutOfSpace) }))) } #[test] @@ -897,7 +913,7 @@ mod tests { assert_eq!(r, Ok(ApplyOutcome::Success)); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt()) - creation_fee()); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -947,7 +963,6 @@ mod tests { #[test] - #[ignore] fn weight_multiplier_increases_and_decreases_on_big_weight() { let mut t = new_test_ext(COMPACT_CODE, false); @@ -958,25 +973,22 @@ mod tests { }); let mut tt = new_test_ext(COMPACT_CODE, false); - // NOTE: This assumes that system::remark has the default. - let num_to_exhaust = multiplier_ideal() * 2 / SimpleDispatchInfo::default().weigh_data(()); - println!("++ Generating {} transactions to fill {} weight units", num_to_exhaust, multiplier_ideal() * 2); - - let mut xts = (0..num_to_exhaust).map(|i| CheckedExtrinsic { - signed: Some((charlie(), signed_extra(i.into(), 0))), - function: Call::System(system::Call::remark(vec![0; 1])), - }).collect::>(); - xts.insert(0, CheckedExtrinsic { - signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), - }); // big one in terms of weight. let block1 = construct_block( &mut tt, 1, GENESIS_HASH.into(), - xts + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(42)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(0, 0))), + function: Call::System(system::Call::fill_block()), + } + ] ); // small one in terms of weight. @@ -990,12 +1002,14 @@ mod tests { function: Call::Timestamp(timestamp::Call::set(52)), }, CheckedExtrinsic { - signed: Some((charlie(), signed_extra(num_to_exhaust.into(), 0))), + signed: Some((charlie(), signed_extra(1, 0))), function: Call::System(system::Call::remark(vec![0; 1])), } ] ); + println!("++ Block 1 size: {} / Block 2 size {}", block1.0.encode().len(), block2.0.encode().len()); + // execute a big block. executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, @@ -1030,6 +1044,209 @@ mod tests { }); } + #[test] + fn transaction_fee_is_correct_ultimate() { + // This uses the exact values of substrate-node. + // + // weight of transfer call as of now: 1_000_000 + // if weight of the cheapest weight would be 10^7, this would be 10^9, which is: + // - 1 MILLICENTS in substrate node. + // - 1 milldot based on current polkadot runtime. + // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + blake2_256(&>::key_for(alice())).to_vec() => { + (100 * DOLLARS).encode() + }, + blake2_256(&>::key_for(bob())).to_vec() => { + (10 * DOLLARS).encode() + }, + twox_128(>::key()).to_vec() => { + (110 * DOLLARS).encode() + }, + twox_128(>::key()).to_vec() => vec![0u8; 16], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] + ]); + + let tip = 1_000_000; + let xt = sign(CheckedExtrinsic { + signed: Some((alice(), signed_extra(0, tip))), + function: Call::Balances(default_transfer_call()), + }); + + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u64)), + true, + None, + ).0; + + assert!(r.is_ok()); + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt.clone()), + true, + None, + ).0; + assert!(r.is_ok()); + + runtime_io::with_externalities(&mut t, || { + assert_eq!(Balances::total_balance(&bob()), (10 + 69) * DOLLARS); + // Components deducted from alice's balances: + // - Weight fee + // - Length fee + // - Tip + // - Creation-fee of bob's account. + let mut balance_alice = (100 - 69) * DOLLARS; + + let length_fee = TransactionBaseFee::get() + + TransactionByteFee::get() * + (xt.clone().encode().len() as Balance); + balance_alice -= length_fee; + + let weight = default_transfer_call().get_dispatch_info().weight; + let weight_fee = WeightToFee::convert(weight); + + // we know that weight to fee multiplier is effect-less in block 1. + assert_eq!(weight_fee as Balance, MILLICENTS); + balance_alice -= weight_fee; + + balance_alice -= tip; + balance_alice -= TransferFee::get(); + + assert_eq!(Balances::total_balance(&alice()), balance_alice); + }); + } + + #[test] + #[should_panic] + #[cfg(feature = "stress-test")] + fn block_weight_capacity_report() { + // Just report how many transfer calls you could fit into a block. The number should at least + // be a few hundred (250 at the time of writing but can change over time). Runs until panic. + + // execution ext. + let mut t = new_test_ext(COMPACT_CODE, false); + // setup ext. + let mut tt = new_test_ext(COMPACT_CODE, false); + + let factor = 50; + let mut time = 10; + let mut nonce: Index = 0; + let mut block_number = 1; + let mut previous_hash: Hash = GENESIS_HASH.into(); + + loop { + let num_transfers = block_number * factor; + let mut xts = (0..num_transfers).map(|i| CheckedExtrinsic { + signed: Some((charlie(), signed_extra(nonce + i as Index, 0))), + function: Call::Balances(balances::Call::transfer(bob().into(), 0)), + }).collect::>(); + + xts.insert(0, CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(time)), + }); + + // NOTE: this is super slow. Can probably be improved. + let block = construct_block( + &mut tt, + block_number, + previous_hash, + xts + ); + + let len = block.0.len(); + print!( + "++ Executing block with {} transfers. Block size = {} bytes / {} kb / {} mb", + num_transfers, + len, + len / 1024, + len / 1024 / 1024, + ); + + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block.0, + true, + None, + ).0; + + println!(" || Result = {:?}", r); + assert!(r.is_ok()); + + previous_hash = block.1; + nonce += num_transfers; + time += 10; + block_number += 1; + } + } + + #[test] + #[should_panic] + #[cfg(feature = "stress-test")] + fn block_length_capacity_report() { + // Just report how big a block can get. Executes until panic. Should be ignored unless if + // manually inspected. The number should at least be a few megabytes (5 at the time of + // writing but can change over time). + + // execution ext. + let mut t = new_test_ext(COMPACT_CODE, false); + // setup ext. + let mut tt = new_test_ext(COMPACT_CODE, false); + + let factor = 256 * 1024; + let mut time = 10; + let mut nonce: Index = 0; + let mut block_number = 1; + let mut previous_hash: Hash = GENESIS_HASH.into(); + + loop { + // NOTE: this is super slow. Can probably be improved. + let block = construct_block( + &mut tt, + block_number, + previous_hash, + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(time)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(nonce, 0))), + function: Call::System(system::Call::remark(vec![0u8; (block_number * factor) as usize])), + }, + ] + ); + + let len = block.0.len(); + print!( + "++ Executing block with big remark. Block size = {} bytes / {} kb / {} mb", + len, + len / 1024, + len / 1024 / 1024, + ); + + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block.0, + true, + None, + ).0; + + println!(" || Result = {:?}", r); + assert!(r.is_ok()); + + previous_hash = block.1; + nonce += 1; + time += 10; + block_number += 1; + } + } + #[cfg(feature = "benchmarks")] mod benches { use super::*; diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs new file mode 100644 index 0000000000..c030f57121 --- /dev/null +++ b/node/runtime/src/constants.rs @@ -0,0 +1,52 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! A set of constant values used in substrate runtime. + +/// Money matters. +pub mod currency { + use node_primitives::Balance; + + pub const MILLICENTS: Balance = 1_000_000_000; + pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. + pub const DOLLARS: Balance = 100 * CENTS; +} + +/// Time. +pub mod time { + use node_primitives::Moment; + + pub const SECS_PER_BLOCK: Moment = 6; + pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; + pub const HOURS: Moment = MINUTES * 60; + pub const DAYS: Moment = HOURS * 24; +} + +// CRITICAL NOTE: The system module maintains two constants: a _maximum_ block weight and a +// _ratio_ of it yielding the portion which is accessible to normal transactions (reserving the rest +// for operational ones). `TARGET_BLOCK_FULLNESS` is entirely independent and the system module is +// not aware of if, nor should it care about it. This constant simply denotes on which ratio of the +// _maximum_ block weight we tweak the fees. It does NOT care about the type of the dispatch. +// +// For the system to be configured in a sane way, `TARGET_BLOCK_FULLNESS` should always be less than +// the ratio that `system` module uses to find normal transaction quota. +/// Fee-related. +pub mod fee { + pub use runtime_primitives::Perbill; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); +} \ No newline at end of file diff --git a/node/runtime/src/impls.rs b/node/runtime/src/impls.rs index 85365b6a7e..464f1a424b 100644 --- a/node/runtime/src/impls.rs +++ b/node/runtime/src/impls.rs @@ -20,8 +20,16 @@ use node_primitives::Balance; use runtime_primitives::weights::{Weight, WeightMultiplier}; use runtime_primitives::traits::{Convert, Saturating}; use runtime_primitives::Fixed64; -use support::traits::Get; -use crate::{Balances, MaximumBlockWeight}; +use support::traits::{OnUnbalanced, Currency}; +use crate::{Balances, Authorship, MaximumBlockWeight, NegativeImbalance}; +use crate::constants::fee::TARGET_BLOCK_FULLNESS; + +pub struct Author; +impl OnUnbalanced for Author { + fn on_unbalanced(amount: NegativeImbalance) { + Balances::resolve_creating(&Authorship::author(), amount); + } +} /// Struct that handles the conversion of Balance -> `u64`. This is used for staking's election /// calculation. @@ -39,32 +47,53 @@ impl Convert for CurrencyToVoteHandler { fn convert(x: u128) -> Balance { x * Self::factor() } } +/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the +/// node's balance type. +/// +/// This should typically create a mapping between the following ranges: +/// - [0, system::MaximumBlockWeight] +/// - [Balance::min, Balance::max] +/// +/// Yet, it can be used for any other sort of change to weight-fee. Some examples being: +/// - Setting it to `0` will essentially disable the weight fee. +/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. +/// +/// By default, substrate node will have a weight range of [0, 1_000_000_000]. +pub struct WeightToFee; +impl Convert for WeightToFee { + fn convert(x: Weight) -> Balance { + // substrate-node a weight of 10_000 (smallest non-zero weight) to be mapped to 10^7 units of + // fees, hence: + Balance::from(x).saturating_mul(1_000) + } +} + /// A struct that updates the weight multiplier based on the saturation level of the previous block. /// This should typically be called once per-block. /// /// This assumes that weight is a numeric value in the u32 range. /// +/// Given `TARGET_BLOCK_FULLNESS = 1/2`, a block saturation greater than 1/2 will cause the system +/// fees to slightly grow and the opposite for block saturations less than 1/2. +/// /// Formula: -/// diff = (ideal_weight - current_block_weight) +/// diff = (target_weight - current_block_weight) /// v = 0.00004 /// next_weight = weight * (1 + (v . diff) + (v . diff)^2 / 2) /// /// https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#relay-chain-transaction-fees pub struct WeightMultiplierUpdateHandler; + impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierUpdateHandler { fn convert(previous_state: (Weight, WeightMultiplier)) -> WeightMultiplier { let (block_weight, multiplier) = previous_state; - // CRITICAL NOTE: what the system module interprets as maximum block weight, and a portion - // of it (1/4 usually) as ideal weight demonstrate the gap in block weights for operational - // transactions. What this weight multiplier interprets as the maximum, is actually the - // maximum that is available to normal transactions. Hence, - let max_weight = >::get() / 4; - let ideal_weight = (max_weight / 4) as u128; + let max_weight = MaximumBlockWeight::get(); + let target_weight = (TARGET_BLOCK_FULLNESS * max_weight) as u128; let block_weight = block_weight as u128; // determines if the first_term is positive - let positive = block_weight >= ideal_weight; - let diff_abs = block_weight.max(ideal_weight) - block_weight.min(ideal_weight); + let positive = block_weight >= target_weight; + let diff_abs = block_weight.max(target_weight) - block_weight.min(target_weight); // diff is within u32, safe. let diff = Fixed64::from_rational(diff_abs as i64, max_weight as u64); let diff_squared = diff.saturating_mul(diff); @@ -81,6 +110,8 @@ impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierU let second_term = v_squared_2.saturating_mul(diff_squared); if positive { + // Note: this is merely bounded by how big the multiplier and the inner value can go, + // not by any economical reasoning. let excess = first_term.saturating_add(second_term); multiplier.saturating_add(WeightMultiplier::from_fixed(excess)) } else { @@ -90,7 +121,7 @@ impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierU // despite the fact that apply_to saturates weight (final fee cannot go below 0) // it is crucially important to stop here and don't further reduce the weight fee // multiplier. While at -1, it means that the network is so un-congested that all - // transactions are practically free. We stop here and only increase if the network + // transactions have no weight fee. We stop here and only increase if the network // became more busy. .max(WeightMultiplier::from_rational(-1, 1)) } @@ -102,13 +133,15 @@ mod tests { use super::*; use runtime_primitives::weights::Weight; use runtime_primitives::Perbill; + use crate::{MaximumBlockWeight, AvailableBlockRatio, Runtime}; + use crate::constants::currency::*; fn max() -> Weight { - >::get() + MaximumBlockWeight::get() } - fn ideal() -> Weight { - max() / 4 / 4 + fn target() -> Weight { + TARGET_BLOCK_FULLNESS * max() } // poc reference implementation. @@ -120,7 +153,7 @@ mod tests { // maximum tx weight let m = max() as f32; // Ideal saturation in terms of weight - let ss = ideal() as f32; + let ss = target() as f32; // Current saturation in terms of weight let s = block_weight; @@ -130,52 +163,93 @@ mod tests { Perbill::from_parts((fm * 1_000_000_000_f32) as u32) } - fn fm(parts: i64) -> WeightMultiplier { + fn wm(parts: i64) -> WeightMultiplier { WeightMultiplier::from_parts(parts) } + #[test] + fn empty_chain_simulation() { + // just a few txs per_block. + let block_weight = 1000; + let mut wm = WeightMultiplier::default(); + let mut iterations: u64 = 0; + loop { + let next = WeightMultiplierUpdateHandler::convert((block_weight, wm)); + wm = next; + if wm == WeightMultiplier::from_rational(-1, 1) { break; } + iterations += 1; + } + println!("iteration {}, new wm = {:?}. Weight fee is now zero", iterations, wm); + } + + #[test] + #[ignore] + fn congested_chain_simulation() { + // `cargo test congested_chain_simulation -- --nocapture` to get some insight. + // almost full. The entire quota of normal transactions is taken. + let block_weight = AvailableBlockRatio::get() * max(); + let tx_weight = 1000; + let mut wm = WeightMultiplier::default(); + let mut iterations: u64 = 0; + loop { + let next = WeightMultiplierUpdateHandler::convert((block_weight, wm)); + if wm == next { break; } + wm = next; + iterations += 1; + let fee = ::WeightToFee::convert(wm.apply_to(tx_weight)); + println!( + "iteration {}, new wm = {:?}. Fee at this point is: {} millicents, {} cents, {} dollars", + iterations, + wm, + fee / MILLICENTS, + fee / CENTS, + fee / DOLLARS + ); + } + } + #[test] fn stateless_weight_mul() { // Light block. Fee is reduced a little. assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() / 4, WeightMultiplier::default())), - fm(-7500) + WeightMultiplierUpdateHandler::convert((target() / 4, WeightMultiplier::default())), + wm(-7500) ); // a bit more. Fee is decreased less, meaning that the fee increases as the block grows. assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() / 2, WeightMultiplier::default())), - fm(-5000) + WeightMultiplierUpdateHandler::convert((target() / 2, WeightMultiplier::default())), + wm(-5000) ); // ideal. Original fee. No changes. assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() as u32, WeightMultiplier::default())), - fm(0) + WeightMultiplierUpdateHandler::convert((target(), WeightMultiplier::default())), + wm(0) ); // // More than ideal. Fee is increased. assert_eq!( - WeightMultiplierUpdateHandler::convert(((ideal() * 2) as u32, WeightMultiplier::default())), - fm(10000) + WeightMultiplierUpdateHandler::convert(((target() * 2), WeightMultiplier::default())), + wm(10000) ); } #[test] fn stateful_weight_mul_grow_to_infinity() { assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() * 2, WeightMultiplier::default())), - fm(10000) + WeightMultiplierUpdateHandler::convert((target() * 2, WeightMultiplier::default())), + wm(10000) ); assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() * 2, fm(10000))), - fm(20000) + WeightMultiplierUpdateHandler::convert((target() * 2, wm(10000))), + wm(20000) ); assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() * 2, fm(20000))), - fm(30000) + WeightMultiplierUpdateHandler::convert((target() * 2, wm(20000))), + wm(30000) ); // ... assert_eq!( - WeightMultiplierUpdateHandler::convert((ideal() * 2, fm(1_000_000_000))), - fm(1_000_000_000 + 10000) + WeightMultiplierUpdateHandler::convert((target() * 2, wm(1_000_000_000))), + wm(1_000_000_000 + 10000) ); } @@ -183,28 +257,26 @@ mod tests { fn stateful_weight_mil_collapse_to_minus_one() { assert_eq!( WeightMultiplierUpdateHandler::convert((0, WeightMultiplier::default())), - fm(-10000) + wm(-10000) ); assert_eq!( - WeightMultiplierUpdateHandler::convert((0, fm(-10000))), - fm(-20000) + WeightMultiplierUpdateHandler::convert((0, wm(-10000))), + wm(-20000) ); assert_eq!( - WeightMultiplierUpdateHandler::convert((0, fm(-20000))), - fm(-30000) + WeightMultiplierUpdateHandler::convert((0, wm(-20000))), + wm(-30000) ); // ... assert_eq!( - WeightMultiplierUpdateHandler::convert((0, fm(1_000_000_000 * -1))), - fm(-1_000_000_000) + WeightMultiplierUpdateHandler::convert((0, wm(1_000_000_000 * -1))), + wm(-1_000_000_000) ); } #[test] fn weight_to_fee_should_not_overflow_on_large_weights() { - // defensive-only test. at the moment we are not allowing any weight more than - // 4 * 1024 * 1024 in a block. - let kb = 1024_u32; + let kb = 1024 as Weight; let mb = kb * kb; let max_fm = WeightMultiplier::from_fixed(Fixed64::from_natural(i64::max_value())); @@ -214,7 +286,9 @@ mod tests { WeightMultiplierUpdateHandler::convert((i, WeightMultiplier::default())); }); - vec![10 * mb, Weight::max_value() / 2, Weight::max_value()] + // Some values that are all above the target and will cause an increase. + let t = target(); + vec![t + 100, t * 2, t * 4] .into_iter() .for_each(|i| { let fm = WeightMultiplierUpdateHandler::convert(( diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 28c89a6943..834635a312 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -22,7 +22,7 @@ use rstd::prelude::*; use support::{ - construct_runtime, parameter_types, traits::{SplitTwoWays, Currency, OnUnbalanced} + construct_runtime, parameter_types, traits::{SplitTwoWays, Currency} }; use substrate_primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ @@ -58,10 +58,13 @@ pub use runtime_primitives::{Permill, Perbill}; pub use support::StorageValue; pub use staking::StakerStatus; -/// Implementations for `Convert` and other helper structs passed into runtime modules as associated -/// types. +/// Implementations of some helper traits passed into runtime modules as associated types. pub mod impls; -use impls::{CurrencyToVoteHandler, WeightMultiplierUpdateHandler}; +use impls::{CurrencyToVoteHandler, WeightMultiplierUpdateHandler, Author, WeightToFee}; + +/// Constant values used within the runtime. +pub mod constants; +use constants::{time::*, currency::*}; // Make the WASM binary available. #[cfg(feature = "std")] @@ -76,8 +79,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 119, - impl_version: 119, + spec_version: 120, + impl_version: 120, apis: RUNTIME_API_VERSIONS, }; @@ -90,20 +93,8 @@ pub fn native_version() -> NativeVersion { } } -pub const MILLICENTS: Balance = 1_000_000_000; -pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. -pub const DOLLARS: Balance = 100 * CENTS; - type NegativeImbalance = >::NegativeImbalance; -pub struct Author; - -impl OnUnbalanced for Author { - fn on_unbalanced(amount: NegativeImbalance) { - Balances::resolve_creating(&Authorship::author(), amount); - } -} - pub type DealWithFees = SplitTwoWays< Balance, NegativeImbalance, @@ -111,15 +102,11 @@ pub type DealWithFees = SplitTwoWays< _1, Author, // 1 part (20%) goes to the block author. >; -pub const SECS_PER_BLOCK: Moment = 6; -pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; -pub const HOURS: Moment = MINUTES * 60; -pub const DAYS: Moment = HOURS * 24; - parameter_types! { pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const MaximumBlockWeight: Weight = 1_000_000_000; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; } impl system::Trait for Runtime { @@ -136,6 +123,7 @@ impl system::Trait for Runtime { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { @@ -174,6 +162,7 @@ impl balances::Trait for Runtime { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; } parameter_types! { diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 940f7cdf3f..6dc5f321e4 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -244,7 +244,7 @@ mod tests { use substrate_primitives::{H256, Blake2Hasher}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. - use primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -259,6 +259,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -273,6 +274,7 @@ mod tests { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } impl Trait for Test { diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index 4348f6af2d..42f06b564f 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -19,7 +19,7 @@ #![cfg(test)] use primitives::{ - traits::IdentityLookup, + traits::IdentityLookup, Perbill, testing::{Header, UintAuthorityId}, }; use srml_support::{impl_outer_origin, parameter_types}; @@ -39,6 +39,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); pub const MinimumPeriod: u64 = 1; } @@ -55,6 +56,7 @@ impl system::Trait for Test { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 50b27f83f6..39a3e8000a 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -28,6 +28,7 @@ use srml_support::dispatch::Result as DispatchResult; use parity_codec::{Encode, Decode}; use system::ensure_none; use primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; +use primitives::weights::SimpleDispatchInfo; pub trait Trait: system::Trait { /// Find the author of a block. @@ -217,6 +218,7 @@ decl_module! { } /// Provide a set of uncles. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_uncles(origin, new_uncles: Vec) -> DispatchResult { ensure_none(origin)?; @@ -326,6 +328,7 @@ mod tests { use primitives::traits::{BlakeTwo256, IdentityLookup}; use primitives::testing::Header; use primitives::generic::DigestItem; + use primitives::Perbill; use srml_support::{parameter_types, impl_outer_origin, ConsensusEngineId}; impl_outer_origin!{ @@ -339,6 +342,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { @@ -354,6 +358,7 @@ mod tests { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 48960f1e54..cde3fa2d16 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -161,10 +161,10 @@ use srml_support::traits::{ use srml_support::dispatch::Result; use primitives::traits::{ Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, - Saturating, Bounded, SignedExtension, SaturatedConversion, DispatchError + Saturating, Bounded, SignedExtension, SaturatedConversion, DispatchError, Convert, }; use primitives::transaction_validity::{TransactionPriority, ValidTransaction}; -use primitives::weights::DispatchInfo; +use primitives::weights::{DispatchInfo, SimpleDispatchInfo, Weight}; use system::{IsDeadAccount, OnNewAccount, ensure_signed, ensure_root}; mod mock; @@ -206,6 +206,9 @@ pub trait Subtrait: system::Trait { /// The fee to be paid for making a transaction; the per-byte portion. type TransactionByteFee: Get; + + /// Convert a weight value into a deductible fee based on the currency type. + type WeightToFee: Convert; } pub trait Trait: system::Trait { @@ -249,6 +252,9 @@ pub trait Trait: system::Trait { /// The fee to be paid for making a transaction; the per-byte portion. type TransactionByteFee: Get; + + /// Convert a weight value into a deductible fee based on the currency type. + type WeightToFee: Convert; } impl, I: Instance> Subtrait for T { @@ -260,6 +266,7 @@ impl, I: Instance> Subtrait for T { type CreationFee = T::CreationFee; type TransactionBaseFee = T::TransactionBaseFee; type TransactionByteFee = T::TransactionByteFee; + type WeightToFee = T::WeightToFee; } decl_event!( @@ -428,6 +435,7 @@ decl_module! { /// `T::DustRemoval::on_unbalanced` and `T::OnFreeBalanceZero::on_free_balance_zero`. /// /// # + #[weight = SimpleDispatchInfo::FixedNormal(1_000_000)] pub fn transfer( origin, dest: ::Source, @@ -451,6 +459,7 @@ decl_module! { /// - Independent of the arguments. /// - Contains a limited number of reads and writes. /// # + #[weight = SimpleDispatchInfo::FixedOperational(500_000)] fn set_balance( origin, who: ::Source, @@ -766,6 +775,7 @@ impl, I: Instance> system::Trait for ElevatedTrait { type BlockHashCount = T::BlockHashCount; type MaximumBlockWeight = T::MaximumBlockWeight; type MaximumBlockLength = T::MaximumBlockLength; + type AvailableBlockRatio = T::AvailableBlockRatio; } impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; @@ -780,6 +790,7 @@ impl, I: Instance> Trait for ElevatedTrait { type CreationFee = T::CreationFee; type TransactionBaseFee = T::TransactionBaseFee; type TransactionByteFee = T::TransactionByteFee; + type WeightToFee = T::WeightToFee; } impl, I: Instance> Currency for Module @@ -1171,19 +1182,23 @@ impl, I: Instance> TakeFees { /// - (optional) _tip_: if included in the transaction, it will be added on top. Only signed /// transactions can have a tip. fn compute_fee(len: usize, info: DispatchInfo, tip: T::Balance) -> T::Balance { - // length fee let len_fee = if info.pay_length_fee() { let len = T::Balance::from(len as u32); let base = T::TransactionBaseFee::get(); - let byte = T::TransactionByteFee::get(); - base.saturating_add(byte.saturating_mul(len)) + let per_byte = T::TransactionByteFee::get(); + base.saturating_add(per_byte.saturating_mul(len)) } else { Zero::zero() }; - // weight fee - let weight = info.weight; - let weight_fee: T::Balance = >::next_weight_multiplier().apply_to(weight).into(); + let weight_fee = { + // cap the weight to the maximum defined in runtime, otherwise it will be the `Bounded` + // maximum of its data type, which is not desired. + let capped_weight = info.weight.min(::MaximumBlockWeight::get()); + let weight_update = >::next_weight_multiplier(); + let adjusted_weight = weight_update.apply_to(capped_weight); + T::WeightToFee::convert(adjusted_weight) + }; len_fee.saturating_add(weight_fee).saturating_add(tip) } diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index fecec82180..116515c368 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -18,7 +18,7 @@ #![cfg(test)] -use primitives::{traits::IdentityLookup, testing::Header, weights::{DispatchInfo, Weight}}; +use primitives::{Perbill, traits::{Convert, IdentityLookup}, testing::Header, weights::{DispatchInfo, Weight}}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{impl_outer_origin, parameter_types}; @@ -36,6 +36,8 @@ thread_local! { static CREATION_FEE: RefCell = RefCell::new(0); static TRANSACTION_BASE_FEE: RefCell = RefCell::new(0); static TRANSACTION_BYTE_FEE: RefCell = RefCell::new(1); + static TRANSACTION_WEIGHT_FEE: RefCell = RefCell::new(1); + static WEIGHT_TO_FEE: RefCell = RefCell::new(1); } pub struct ExistentialDeposit; @@ -63,6 +65,13 @@ impl Get for TransactionByteFee { fn get() -> u64 { TRANSACTION_BYTE_FEE.with(|v| *v.borrow()) } } +pub struct WeightToFee(u64); +impl Convert for WeightToFee { + fn convert(t: Weight) -> u64 { + WEIGHT_TO_FEE.with(|v| *v.borrow() * (t as u64)) + } +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] pub struct Runtime; @@ -70,6 +79,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Runtime { type Origin = Origin; @@ -85,6 +95,7 @@ impl system::Trait for Runtime { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Runtime { type Balance = u64; @@ -99,11 +110,13 @@ impl Trait for Runtime { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; } pub struct ExtBuilder { transaction_base_fee: u64, transaction_byte_fee: u64, + weight_to_fee: u64, existential_deposit: u64, transfer_fee: u64, creation_fee: u64, @@ -115,6 +128,7 @@ impl Default for ExtBuilder { Self { transaction_base_fee: 0, transaction_byte_fee: 0, + weight_to_fee: 0, existential_deposit: 0, transfer_fee: 0, creation_fee: 0, @@ -124,9 +138,10 @@ impl Default for ExtBuilder { } } impl ExtBuilder { - pub fn transaction_fees(mut self, base_fee: u64, byte_fee: u64) -> Self { + pub fn transaction_fees(mut self, base_fee: u64, byte_fee: u64, weight_fee: u64) -> Self { self.transaction_base_fee = base_fee; self.transaction_byte_fee = byte_fee; + self.weight_to_fee = weight_fee; self } pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { @@ -159,6 +174,7 @@ impl ExtBuilder { CREATION_FEE.with(|v| *v.borrow_mut() = self.creation_fee); TRANSACTION_BASE_FEE.with(|v| *v.borrow_mut() = self.transaction_base_fee); TRANSACTION_BYTE_FEE.with(|v| *v.borrow_mut() = self.transaction_byte_fee); + WEIGHT_TO_FEE.with(|v| *v.borrow_mut() = self.weight_to_fee); } pub fn build(self) -> runtime_io::TestExternalities { self.set_associated_consts(); diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 2828d40e63..595be0e1ca 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -114,7 +114,7 @@ fn lock_reasons_should_work() { with_externalities( &mut ExtBuilder::default() .existential_deposit(1) - .monied(true).transaction_fees(0, 1) + .monied(true).transaction_fees(0, 1, 0) .build(), || { Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Transfer.into()); @@ -752,15 +752,37 @@ fn signed_extension_take_fees_work() { with_externalities( &mut ExtBuilder::default() .existential_deposit(10) - .transaction_fees(10, 1) + .transaction_fees(10, 1, 5) .monied(true) .build(), || { let len = 10; - assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(0), len).is_ok()); - assert_eq!(Balances::free_balance(&1), 100 - 20); - assert!(TakeFees::::from(5 /* tipped */).pre_dispatch(&1, info_from_weight(0), len).is_ok()); + assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(5), len).is_ok()); assert_eq!(Balances::free_balance(&1), 100 - 20 - 25); + assert!(TakeFees::::from(5 /* tipped */).pre_dispatch(&1, info_from_weight(3), len).is_ok()); + assert_eq!(Balances::free_balance(&1), 100 - 20 - 25 - 20 - 5 - 15); + } + ); +} + +#[test] +fn signed_extension_take_fees_is_bounded() { + with_externalities( + &mut ExtBuilder::default() + .existential_deposit(1000) + .transaction_fees(0, 0, 1) + .monied(true) + .build(), + || { + use primitives::weights::Weight; + + // maximum weight possible + assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(Weight::max_value()), 10).is_ok()); + // fee will be proportional to what is the actual maximum weight in the runtime. + assert_eq!( + Balances::free_balance(&1), + (10000 - ::MaximumBlockWeight::get()) as u64 + ); } ); } diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index d729b8a300..b05b69db77 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -23,6 +23,7 @@ use rstd::{prelude::*, result}; use substrate_primitives::u32_trait::Value as U32; use primitives::traits::{Hash, EnsureOrigin}; +use primitives::weights::SimpleDispatchInfo; use srml_support::{ dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, traits::ChangeMembers, StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure @@ -118,6 +119,9 @@ decl_event!( } ); +// Note: this module is not benchmarked. The weights are obtained based on the similarity fo the +// executed logic with other democracy function. Note that councillor operations are assigned to the +// operational class. decl_module! { pub struct Module, I: Instance=DefaultInstance> for enum Call where origin: ::Origin { fn deposit_event() = default; @@ -126,6 +130,7 @@ decl_module! { /// provide it pre-sorted. /// /// Requires root origin. + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn set_members(origin, new_members: Vec) { ensure_root(origin)?; @@ -168,6 +173,7 @@ decl_module! { /// Dispatch a proposal from a member using the `Member` origin. /// /// Origin must be a member of the collective. + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn execute(origin, proposal: Box<>::Proposal>) { let who = ensure_signed(origin)?; ensure!(Self::is_member(&who), "proposer not a member"); @@ -181,9 +187,9 @@ decl_module! { /// - Bounded storage reads and writes. /// - Argument `threshold` has bearing on weight. /// # + #[weight = SimpleDispatchInfo::FixedOperational(5_000_000)] fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<>::Proposal>) { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), "proposer not a member"); let proposal_hash = T::Hashing::hash_of(&proposal); @@ -210,9 +216,9 @@ decl_module! { /// - Bounded storage read and writes. /// - Will be slightly heavier if the proposal is approved / disapproved after the vote. /// # + #[weight = SimpleDispatchInfo::FixedOperational(200_000)] fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), "voter not a member"); let mut voting = Self::voting(&proposal).ok_or("proposal must exist")?; @@ -393,7 +399,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::{H256, Blake2Hasher}; use primitives::{ - traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage + Perbill, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage }; use crate as collective; @@ -401,6 +407,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -416,6 +423,7 @@ mod tests { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Test { type Origin = Origin; @@ -554,7 +562,7 @@ mod tests { event: Event::collective_Instance1(RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 3, )), topics: vec![], @@ -622,7 +630,7 @@ mod tests { event: Event::collective_Instance1(RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 2, )), topics: vec![], @@ -631,7 +639,7 @@ mod tests { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Voted( 1, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), false, 0, 1, @@ -658,7 +666,7 @@ mod tests { RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 3, )), topics: vec![], @@ -667,7 +675,7 @@ mod tests { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Voted( 2, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), false, 1, 1, @@ -677,7 +685,7 @@ mod tests { EventRecord { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Disapproved( - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), )), topics: vec![], } @@ -700,7 +708,7 @@ mod tests { event: Event::collective_Instance1(RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 2, )), topics: vec![], @@ -709,7 +717,7 @@ mod tests { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Voted( 2, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), true, 2, 0, @@ -719,14 +727,14 @@ mod tests { EventRecord { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Approved( - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), )), topics: vec![], }, EventRecord { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Executed( - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), false, )), topics: vec![], diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index 3af81d8d84..db196ef7fe 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -31,7 +31,7 @@ use runtime_io; use runtime_io::with_externalities; use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; use runtime_primitives::traits::{BlakeTwo256, Hash, IdentityLookup}; -use runtime_primitives::BuildStorage; +use runtime_primitives::{Perbill, BuildStorage}; use srml_support::{ assert_ok, assert_err, impl_outer_dispatch, impl_outer_event, impl_outer_origin, parameter_types, storage::child, StorageMap, StorageValue, traits::{Currency, Get}, @@ -100,6 +100,7 @@ parameter_types! { pub const MaximumBlockLength: u32 = 2 * 1024; pub const BalancesTransactionBaseFee: u64 = 0; pub const BalancesTransactionByteFee: u64 = 0; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -114,6 +115,7 @@ impl system::Trait for Test { type Event = MetaEvent; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } impl balances::Trait for Test { @@ -129,6 +131,7 @@ impl balances::Trait for Test { type CreationFee = CreationFee; type TransactionBaseFee = BalancesTransactionBaseFee; type TransactionByteFee = BalancesTransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const MinimumPeriod: u64 = 1; diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 0ebf50ce16..3fc9926942 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -44,6 +44,7 @@ mod tests { pub use substrate_primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; pub use primitives::traits::{BlakeTwo256, IdentityLookup}; pub use primitives::testing::{Digest, DigestItem, Header}; + pub use primitives::Perbill; pub use {seats, motions}; use std::cell::RefCell; @@ -100,6 +101,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -115,6 +117,7 @@ mod tests { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -136,6 +139,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const LaunchPeriod: u64 = 1; diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index cb7f665b30..1736d8a97e 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -21,6 +21,7 @@ use rstd::prelude::*; use rstd::{result, convert::TryFrom}; use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; +use primitives::weights::SimpleDispatchInfo; use parity_codec::{Encode, Decode, Input, Output}; use srml_support::{ decl_module, decl_storage, decl_event, ensure, @@ -359,6 +360,7 @@ decl_module! { /// - O(1). /// - Two DB changes, one DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn propose(origin, proposal: Box, #[compact] value: BalanceOf @@ -386,6 +388,7 @@ decl_module! { /// - O(1). /// - One DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn second(origin, #[compact] proposal: PropIndex) { let who = ensure_signed(origin)?; let mut deposit = Self::deposit_of(proposal) @@ -403,6 +406,7 @@ decl_module! { /// - O(1). /// - One DB change, one DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -418,6 +422,7 @@ decl_module! { /// - O(1). /// - One DB change, one DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -432,6 +437,7 @@ decl_module! { /// exceed `threshold` and, if approved, enacted after the given `delay`. /// /// It may be called from either the Root or the Emergency origin. + #[weight = SimpleDispatchInfo::FixedOperational(500_000)] fn emergency_propose(origin, proposal: Box, threshold: VoteThreshold, @@ -453,6 +459,7 @@ decl_module! { /// Schedule an emergency cancellation of a referendum. Cannot happen twice to the same /// referendum. + #[weight = SimpleDispatchInfo::FixedOperational(500_000)] fn emergency_cancel(origin, ref_index: ReferendumIndex) { T::CancellationOrigin::ensure_origin(origin)?; @@ -466,6 +473,7 @@ decl_module! { /// Schedule a referendum to be tabled once it is legal to schedule an external /// referendum. + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn external_propose(origin, proposal: Box) { T::ExternalOrigin::ensure_origin(origin)?; ensure!(!>::exists(), "proposal already made"); @@ -478,6 +486,7 @@ decl_module! { /// Schedule a majority-carries referendum to be tabled next once it is legal to schedule /// an external referendum. + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn external_propose_majority(origin, proposal: Box) { T::ExternalMajorityOrigin::ensure_origin(origin)?; ensure!(!>::exists(), "proposal already made"); @@ -496,6 +505,7 @@ decl_module! { /// - `voting_period`: The period that is allowed for voting on this proposal. /// - `delay`: The number of block after voting has ended in approval and this should be /// enacted. Increased to `EmergencyVotingPeriod` if too low. + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn external_push(origin, proposal_hash: T::Hash, voting_period: T::BlockNumber, @@ -514,6 +524,7 @@ decl_module! { } /// Veto and blacklist the external proposal hash. + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn veto_external(origin, proposal_hash: T::Hash) { let who = T::VetoOrigin::ensure_origin(origin)?; @@ -538,12 +549,14 @@ decl_module! { } /// Remove a referendum. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn cancel_referendum(origin, #[compact] ref_index: ReferendumIndex) { ensure_root(origin)?; Self::clear_referendum(ref_index); } /// Cancel a proposal queued for enactment. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn cancel_queued( origin, #[compact] when: T::BlockNumber, @@ -572,6 +585,7 @@ decl_module! { /// # /// - One extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn set_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(!>::exists(&proxy), "already a proxy"); @@ -583,6 +597,7 @@ decl_module! { /// # /// - One DB clear. /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn resign_proxy(origin) { let who = ensure_signed(origin)?; >::remove(who); @@ -593,6 +608,7 @@ decl_module! { /// # /// - One DB clear. /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn remove_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(&Self::proxy(&proxy).ok_or("not a proxy")? == &who, "wrong proxy"); @@ -604,6 +620,7 @@ decl_module! { /// # /// - One extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] pub fn delegate(origin, to: T::AccountId, conviction: Conviction) { let who = ensure_signed(origin)?; >::insert(who.clone(), (to.clone(), conviction)); @@ -623,6 +640,7 @@ decl_module! { /// # /// - O(1). /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn undelegate(origin) { let who = ensure_signed(origin)?; ensure!(>::exists(&who), "not delegated"); @@ -974,6 +992,7 @@ mod tests { }; use substrate_primitives::{H256, Blake2Hasher}; use primitives::{traits::{BlakeTwo256, IdentityLookup, Bounded}, testing::Header}; + use primitives::Perbill; use balances::BalanceLock; use system::EnsureSignedBy; @@ -1000,6 +1019,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -1015,6 +1035,7 @@ mod tests { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -1036,6 +1057,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const LaunchPeriod: u64 = 2; diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 9960ef22b7..8a681fa145 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -25,6 +25,7 @@ use rstd::prelude::*; use primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; +use primitives::weights::SimpleDispatchInfo; use runtime_io::print; use srml_support::{ StorageValue, StorageMap, @@ -331,6 +332,7 @@ decl_module! { /// - Two extra DB entries, one DB change. /// - Argument `votes` is limited in length to number of candidates. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = ensure_signed(origin)?; Self::do_set_approvals(who, votes, index, hint) @@ -342,6 +344,7 @@ decl_module! { /// # /// - Same as `set_approvals` with one additional storage read. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, @@ -363,6 +366,7 @@ decl_module! { /// - O(1). /// - Two fewer DB entries, one DB change. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn reap_inactive_voter( origin, #[compact] reporter_index: u32, @@ -436,6 +440,7 @@ decl_module! { /// - O(1). /// - Two fewer DB entries, one DB change. /// # + #[weight = SimpleDispatchInfo::FixedNormal(1_250_000)] fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; @@ -463,6 +468,7 @@ decl_module! { /// - Independent of input. /// - Three DB changes. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; @@ -498,6 +504,7 @@ decl_module! { /// - O(voters) compute. /// - One DB change. /// # + #[weight = SimpleDispatchInfo::FixedNormal(10_000_000)] fn present_winner( origin, candidate: ::Source, @@ -566,6 +573,7 @@ decl_module! { /// Set the desired member count; if lower than the current count, then seats will not be up /// election when they expire. If more, then a new vote will be started if one is not /// already in progress. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_desired_seats(origin, #[compact] count: u32) { ensure_root(origin)?; DesiredSeats::put(count); @@ -575,6 +583,7 @@ decl_module! { /// /// Note: A tally should happen instantly (if not already in a presentation /// period) to fill the seat if removal means that the desired members are not met. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn remove_member(origin, who: ::Source) { ensure_root(origin)?; let who = T::Lookup::lookup(who)?; @@ -589,6 +598,7 @@ decl_module! { /// Set the presentation duration. If there is currently a vote being presented for, will /// invoke `finalize_vote`. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_presentation_duration(origin, #[compact] count: T::BlockNumber) { ensure_root(origin)?; >::put(count); @@ -596,6 +606,7 @@ decl_module! { /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalize_vote`. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_term_duration(origin, #[compact] count: T::BlockNumber) { ensure_root(origin)?; >::put(count); @@ -1107,7 +1118,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::{H256, Blake2Hasher}; use primitives::{ - traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage + Perbill, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage }; use crate as elections; @@ -1115,6 +1126,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -1130,6 +1142,7 @@ mod tests { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -1151,6 +1164,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const CandidacyBond: u64 = 3; diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index a64cfc0af0..68b52425ed 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -510,7 +510,7 @@ mod tests { // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. use sr_primitives::{ - traits::{BlakeTwo256, OnInitialize, OnFinalize, IdentityLookup}, testing::Header + Perbill, traits::{BlakeTwo256, OnInitialize, OnFinalize, IdentityLookup}, testing::Header }; impl_outer_origin! { @@ -526,6 +526,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -541,6 +542,7 @@ mod tests { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -562,6 +564,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } impl Trait for Test { type Event = (); diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 326c3d7ab9..9ae794d698 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -108,6 +108,7 @@ mod internal { fn from(d: DispatchError) -> Self { match d { DispatchError::Payment => ApplyError::CantPay, + DispatchError::Resource => ApplyError::FullBlock, DispatchError::NoPermission => ApplyError::CantPay, DispatchError::BadState => ApplyError::CantPay, DispatchError::Stale => ApplyError::Stale, @@ -357,10 +358,12 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::{H256, Blake2Hasher}; use primitives::generic::Era; - use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup}; + use primitives::Perbill; + use primitives::weights::Weight; + use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup, ConvertInto}; use primitives::testing::{Digest, Header, Block}; use srml_support::{impl_outer_event, impl_outer_origin, parameter_types}; - use srml_support::traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason, Get}; + use srml_support::traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason}; use system; use hex_literal::hex; @@ -382,6 +385,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Runtime { type Origin = Origin; @@ -396,6 +400,7 @@ mod tests { type BlockHashCount = BlockHashCount; type WeightMultiplierUpdate = (); type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } parameter_types! { @@ -418,6 +423,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = ConvertInto; } impl ValidateUnsigned for Runtime { @@ -457,7 +463,7 @@ mod tests { fn balance_transfer_dispatch_works() { let mut t = system::GenesisConfig::default().build_storage::().unwrap(); balances::GenesisConfig:: { - balances: vec![(1, 111)], + balances: vec![(1, 211)], vesting: vec![], }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 69)); @@ -473,7 +479,7 @@ mod tests { )); let r = Executive::apply_extrinsic(xt); assert_eq!(r, Ok(ApplyOutcome::Success)); - assert_eq!(>::total_balance(&1), 42 - 10 - weight); + assert_eq!(>::total_balance(&1), 142 - 10 - weight); assert_eq!(>::total_balance(&2), 69); }); } @@ -561,8 +567,8 @@ mod tests { // given: TestXt uses the encoded len as fixed Len: let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer::(33, 0)); let encoded = xt.encode(); - let encoded_len = encoded.len() as u32; - let limit = >::get() / 4; + let encoded_len = encoded.len() as Weight; + let limit = AvailableBlockRatio::get() * MaximumBlockWeight::get(); let num_to_exhaust_block = limit / encoded_len; with_externalities(&mut t, || { Executive::initialize_block(&Header::new( @@ -580,9 +586,9 @@ mod tests { if nonce != num_to_exhaust_block { assert_eq!(res.unwrap(), ApplyOutcome::Success); assert_eq!(>::all_extrinsics_weight(), encoded_len * (nonce + 1)); - assert_eq!(>::extrinsic_index(), Some(nonce + 1)); + assert_eq!(>::extrinsic_index(), Some(nonce as u32 + 1)); } else { - assert_eq!(res, Err(ApplyError::CantPay)); + assert_eq!(res, Err(ApplyError::FullBlock)); } } }); @@ -604,7 +610,7 @@ mod tests { assert_eq!(Executive::apply_extrinsic(x2.clone()).unwrap(), ApplyOutcome::Success); // default weight for `TestXt` == encoded length. - assert_eq!( >::all_extrinsics_weight(), 3 * len); + assert_eq!(>::all_extrinsics_weight(), (3 * len).into()); assert_eq!(>::all_extrinsics_len(), 3 * len); let _ = >::finalize(); diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 38377f3500..d59183a166 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -268,6 +268,7 @@ mod tests { use substrate_primitives::H256; use primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT}; use primitives::testing::Header; + use primitives::Perbill; use srml_support::{assert_ok, impl_outer_origin, parameter_types}; use srml_system as system; use std::cell::RefCell; @@ -301,6 +302,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -315,6 +317,7 @@ mod tests { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } parameter_types! { diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 60947e68eb..8a4e47180c 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -1058,6 +1058,7 @@ impl system::Trait for ElevatedTrait { type Event = (); type MaximumBlockWeight = T::MaximumBlockWeight; type MaximumBlockLength = T::MaximumBlockLength; + type AvailableBlockRatio = T::AvailableBlockRatio; type WeightMultiplierUpdate = (); type BlockHashCount = T::BlockHashCount; } diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index fb7fc04caa..9437b06d20 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -20,10 +20,7 @@ #![cfg(test)] -use primitives::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, -}; +use primitives::{Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}}; use substrate_primitives::{Blake2Hasher, H256}; use support::{parameter_types, impl_outer_event, impl_outer_origin}; @@ -42,6 +39,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -53,9 +51,10 @@ impl system::Trait for Test { type Lookup = IdentityLookup; type Header = Header; type Event = TestEvent; + type WeightMultiplierUpdate = (); type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; - type WeightMultiplierUpdate = (); + type AvailableBlockRatio = AvailableBlockRatio; type BlockHashCount = BlockHashCount; } diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 87845a7a4d..9abb12b15b 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -18,7 +18,7 @@ #![cfg(test)] -use primitives::{DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; +use primitives::{Perbill, DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; use runtime_io; use srml_support::{impl_outer_origin, impl_outer_event, parameter_types}; use substrate_primitives::{H256, Blake2Hasher}; @@ -45,6 +45,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -60,6 +61,7 @@ impl system::Trait for Test { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } mod grandpa { diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index 151a5186f7..d1ce8dbe2a 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -21,6 +21,7 @@ use std::collections::HashSet; use ref_thread_local::{ref_thread_local, RefThreadLocal}; use primitives::testing::Header; +use primitives::Perbill; use substrate_primitives::{H256, Blake2Hasher}; use srml_support::{impl_outer_origin, parameter_types}; use {runtime_io, system}; @@ -68,6 +69,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Runtime { type Origin = Origin; @@ -83,6 +85,7 @@ impl system::Trait for Runtime { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Runtime { type AccountIndex = u64; diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index d425c44e2e..8589f92006 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -122,6 +122,7 @@ use rstd::{prelude::*, marker::PhantomData, ops::{Sub, Rem}}; use parity_codec::Decode; use primitives::KeyTypeId; +use primitives::weights::SimpleDispatchInfo; use primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey}; use srml_support::{ dispatch::Result, ConsensusEngineId, StorageValue, StorageDoubleMap, for_each_tuple, @@ -378,6 +379,7 @@ decl_module! { /// - O(log n) in number of accounts. /// - One extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(150_000)] fn set_keys(origin, keys: T::Keys, proof: Vec) -> Result { let who = ensure_signed(origin)?; diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index b5cb7e4278..5c2711e971 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -21,6 +21,7 @@ use std::cell::RefCell; use srml_support::{impl_outer_origin, parameter_types}; use substrate_primitives::H256; use primitives::{ + Perbill, traits::{BlakeTwo256, IdentityLookup, ConvertInto}, testing::{Header, UintAuthorityId} }; @@ -116,6 +117,7 @@ parameter_types! { pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; pub const MinimumPeriod: u64 = 5; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -130,6 +132,7 @@ impl system::Trait for Test { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } impl timestamp::Trait for Test { diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index cd3c8d7862..dbf32ca5bd 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -294,6 +294,7 @@ use srml_support::{ }; use session::{historical::OnSessionEnding, SelectInitialValidators, SessionIndex}; use primitives::Perbill; +use primitives::weights::SimpleDispatchInfo; use primitives::traits::{ Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded, SaturatedConversion, SimpleArithmetic @@ -696,6 +697,7 @@ decl_module! { /// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned unless /// the `origin` falls below _existential deposit_ and gets removed as dust. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, @@ -743,6 +745,7 @@ decl_module! { /// - O(1). /// - One DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn bond_extra(origin, #[compact] max_additional: BalanceOf) { let stash = ensure_signed(origin)?; @@ -782,6 +785,7 @@ decl_module! { /// The only way to clean the aforementioned storage item is also user-controlled via `withdraw_unbonded`. /// - One DB entry. /// + #[weight = SimpleDispatchInfo::FixedNormal(400_000)] fn unbond(origin, #[compact] value: BalanceOf) { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -823,6 +827,7 @@ decl_module! { /// - Contains a limited number of reads, yet the size of which could be large based on `ledger`. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(400_000)] fn withdraw_unbonded(origin) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -854,6 +859,7 @@ decl_module! { /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(750_000)] fn validate(origin, prefs: ValidatorPrefs>) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -877,6 +883,7 @@ decl_module! { /// which is capped at `MAX_NOMINATIONS`. /// - Both the reads and writes follow a similar pattern. /// # + #[weight = SimpleDispatchInfo::FixedNormal(750_000)] fn nominate(origin, targets: Vec<::Source>) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -902,6 +909,7 @@ decl_module! { /// - Contains one read. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn chill(origin) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -921,6 +929,7 @@ decl_module! { /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn set_payee(origin, payee: RewardDestination) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -939,6 +948,7 @@ decl_module! { /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(750_000)] fn set_controller(origin, controller: ::Source) { let stash = ensure_signed(origin)?; let old_controller = Self::bonded(&stash).ok_or("not a stash")?; @@ -955,6 +965,7 @@ decl_module! { } /// The ideal number of validators. + #[weight = SimpleDispatchInfo::FixedOperational(150_000)] fn set_validator_count(origin, #[compact] new: u32) { ensure_root(origin)?; ValidatorCount::put(new); @@ -970,18 +981,21 @@ decl_module! { /// - Triggers the Phragmen election. Expensive but not user-controlled. /// - Depends on state: `O(|edges| * |validators|)`. /// # + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn force_new_era(origin) { ensure_root(origin)?; Self::apply_force_new_era() } /// Set the offline slash grace period. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_offline_slash_grace(origin, #[compact] new: u32) { ensure_root(origin)?; OfflineSlashGrace::put(new); } /// Set the validators who cannot be slashed (if any). + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_invulnerables(origin, validators: Vec) { ensure_root(origin)?; >::put(validators); diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index a1548a0080..426ba680a9 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -104,6 +104,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -118,6 +119,7 @@ impl system::Trait for Test { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } parameter_types! { @@ -139,6 +141,7 @@ impl balances::Trait for Test { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const Period: BlockNumber = 1; diff --git a/srml/sudo/src/lib.rs b/srml/sudo/src/lib.rs index a421bdae68..65a15b4abf 100644 --- a/srml/sudo/src/lib.rs +++ b/srml/sudo/src/lib.rs @@ -88,6 +88,7 @@ use sr_std::prelude::*; use sr_primitives::traits::StaticLookup; +use sr_primitives::weights::SimpleDispatchInfo; use srml_support::{ StorageValue, Parameter, Dispatchable, decl_module, decl_event, decl_storage, ensure @@ -116,6 +117,7 @@ decl_module! { /// - Limited storage reads. /// - No DB writes. /// # + #[weight = SimpleDispatchInfo::FixedOperational(1_000_000)] fn sudo(origin, proposal: Box) { // This is a public call, so we ensure that the origin is some signed account. let sender = ensure_signed(origin)?; diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index 7afbd11cd1..1e0556731e 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -1622,7 +1622,7 @@ mod tests { fn aux_0(_origin) -> Result { unreachable!() } fn aux_1(_origin, #[compact] _data: u32) -> Result { unreachable!() } fn aux_2(_origin, _data: i32, _data2: String) -> Result { unreachable!() } - #[weight = SimpleDispatchInfo::FixedNormal(10)] + #[weight = SimpleDispatchInfo::FixedNormal(3)] fn aux_3(_origin) -> Result { unreachable!() } fn aux_4(_origin, _data: i32) -> Result { unreachable!() } fn aux_5(_origin, _data: i32, #[compact] _data2: u32) -> Result { unreachable!() } @@ -1772,7 +1772,7 @@ mod tests { #[test] fn weight_should_attach_to_call_enum() { - // max weight. not dependent on input. + // operational. assert_eq!( Call::::operational().get_dispatch_info(), DispatchInfo { weight: 5, class: DispatchClass::Operational }, @@ -1780,12 +1780,12 @@ mod tests { // default weight. assert_eq!( Call::::aux_0().get_dispatch_info(), - DispatchInfo { weight: 100, class: DispatchClass::Normal }, + DispatchInfo { weight: 10_000, class: DispatchClass::Normal }, ); // custom basic assert_eq!( Call::::aux_3().get_dispatch_info(), - DispatchInfo { weight: 10, class: DispatchClass::Normal }, + DispatchInfo { weight: 3, class: DispatchClass::Normal }, ); } } diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 96101c44d7..e504726703 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -223,6 +223,37 @@ macro_rules! __assert_eq_uvec { } } +/// Checks that `$x` is equal to `$y` with an error rate of `$error`. +/// +/// # Example +/// +/// ```rust +/// # fn main() { +/// srml_support::assert_eq_error_rate!(10, 10, 0); +/// srml_support::assert_eq_error_rate!(10, 11, 1); +/// srml_support::assert_eq_error_rate!(12, 10, 2); +/// # } +/// ``` +/// +/// ```rust,should_panic +/// # fn main() { +/// srml_support::assert_eq_error_rate!(12, 10, 1); +/// # } +/// ``` +#[macro_export] +#[cfg(feature = "std")] +macro_rules! assert_eq_error_rate { + ($x:expr, $y:expr, $error:expr) => { + assert!( + ($x) >= (($y) - ($error)) && ($x) <= (($y) + ($error)), + "{:?} != {:?} (with error rate {:?})", + $x, + $y, + $error, + ); + }; +} + /// The void type - it cannot exist. // Oh rust, you crack me up... #[derive(Clone, Eq, PartialEq)] diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index 5ff63baa1c..071446ea35 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -19,10 +19,7 @@ use srml_system as system; use srml_support::{decl_module, decl_event, impl_outer_origin, impl_outer_event}; use runtime_io::{with_externalities, Blake2Hasher}; use substrate_primitives::H256; -use primitives::{ - traits::{BlakeTwo256, IdentityLookup}, - testing::Header, -}; +use primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; mod module { use super::*; @@ -58,6 +55,7 @@ srml_support::parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } #[derive(Clone, Eq, PartialEq)] pub struct Runtime; @@ -75,6 +73,7 @@ impl system::Trait for Runtime { type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl module::Trait for Runtime { diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index bd1f76299e..e98c53bf1d 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -78,7 +78,8 @@ use rstd::prelude::*; use rstd::map; use rstd::marker::PhantomData; use primitives::generic::{self, Era}; -use primitives::weights::{Weight, DispatchInfo, DispatchClass, WeightMultiplier}; +use primitives::Perbill; +use primitives::weights::{Weight, DispatchInfo, DispatchClass, WeightMultiplier, SimpleDispatchInfo}; use primitives::transaction_validity::{ValidTransaction, TransactionPriority, TransactionLongevity}; use primitives::traits::{self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Convert, SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash, @@ -203,6 +204,12 @@ pub trait Trait: 'static + Eq + Clone { /// The maximum length of a block (in bytes). type MaximumBlockLength: Get; + + /// The portion of the block that is available to normal transaction. The rest can only be used + /// by operational transactions. This can be applied to any resource limit managed by the system + /// module, including weight and length. + type AvailableBlockRatio: Get; + } pub type DigestOf = generic::Digest<::Hash>; @@ -218,24 +225,35 @@ decl_module! { Self::deposit_event_indexed(&[], event); } + /// A big dispatch that will disallow any other transaction to be included. + // TODO: this must be preferable available for testing really (not possible at the moment). + #[weight = SimpleDispatchInfo::MaxOperational] + fn fill_block(origin) { + ensure_root(origin)?; + } + /// Make some on-chain remark. + #[weight = SimpleDispatchInfo::FixedNormal(1_000_000)] fn remark(origin, _remark: Vec) { ensure_signed(origin)?; } /// Set the number of pages in the WebAssembly environment's heap. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_heap_pages(origin, pages: u64) { ensure_root(origin)?; storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode()); } /// Set the new code. + #[weight = SimpleDispatchInfo::FixedOperational(200_000)] pub fn set_code(origin, new: Vec) { ensure_root(origin)?; storage::unhashed::put_raw(well_known_keys::CODE, &new); } /// Set some items of storage. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_storage(origin, items: Vec) { ensure_root(origin)?; for i in &items { @@ -244,6 +262,7 @@ decl_module! { } /// Kill some items from storage. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn kill_storage(origin, keys: Vec) { ensure_root(origin)?; for key in &keys { @@ -792,26 +811,28 @@ pub struct CheckWeight(PhantomData); impl CheckWeight { - /// Get the quota divisor of each dispatch class type. This indicates that all operational + /// Get the quota ratio of each dispatch class type. This indicates that all operational /// dispatches can use the full capacity of any resource, while user-triggered ones can consume - /// a quarter. - fn get_dispatch_limit_divisor(class: DispatchClass) -> Weight { + /// a portion. + fn get_dispatch_limit_ratio(class: DispatchClass) -> Perbill { match class { - DispatchClass::Operational => 1, - DispatchClass::Normal => 4, + DispatchClass::Operational => Perbill::one(), + // TODO: this must be some sort of a constant. + DispatchClass::Normal => T::AvailableBlockRatio::get(), } } + /// Checks if the current extrinsic can fit into the block with respect to block weight limits. /// /// Upon successes, it returns the new block weight as a `Result`. fn check_weight(info: DispatchInfo) -> Result { let current_weight = Module::::all_extrinsics_weight(); let maximum_weight = T::MaximumBlockWeight::get(); - let limit = maximum_weight / Self::get_dispatch_limit_divisor(info.class); + let limit = Self::get_dispatch_limit_ratio(info.class) * maximum_weight; let added_weight = info.weight.min(limit); let next_weight = current_weight.saturating_add(added_weight); if next_weight > limit { - return Err(DispatchError::BadState) + return Err(DispatchError::Resource) } Ok(next_weight) } @@ -822,11 +843,11 @@ impl CheckWeight { fn check_block_length(info: DispatchInfo, len: usize) -> Result { let current_len = Module::::all_extrinsics_len(); let maximum_len = T::MaximumBlockLength::get(); - let limit = maximum_len / Self::get_dispatch_limit_divisor(info.class); + let limit = Self::get_dispatch_limit_ratio(info.class) * maximum_len; let added_len = len as u32; let next_len = current_len.saturating_add(added_len); if next_len > limit { - return Err(DispatchError::BadState) + return Err(DispatchError::Resource) } Ok(next_len) } @@ -872,8 +893,8 @@ impl SignedExtension for CheckWeight { len: usize, ) -> Result { // There is no point in writing to storage here since changes are discarded. This basically - // discards any transaction which is bigger than the length or weight limit alone, which is - // a guarantee that it will fail in the pre-dispatch phase. + // discards any transaction which is bigger than the length or weight limit **alone**,which + // is a guarantee that it will fail in the pre-dispatch phase. let _ = Self::check_block_length(info, len)?; let _ = Self::check_weight(info)?; Ok(ValidTransaction { priority: Self::get_priority(info), ..Default::default() }) @@ -1035,7 +1056,8 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 10; pub const MaximumBlockWeight: Weight = 1024; - pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub const MaximumBlockLength: u32 = 1024; } impl Trait for Test { @@ -1051,6 +1073,7 @@ mod tests { type Event = u16; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } @@ -1069,6 +1092,14 @@ mod tests { GenesisConfig::default().build_storage::().unwrap().0.into() } + fn normal_weight_limit() -> Weight { + ::AvailableBlockRatio::get() * ::MaximumBlockWeight::get() + } + + fn normal_length_limit() -> u32 { + ::AvailableBlockRatio::get() * ::MaximumBlockLength::get() + } + #[test] fn origin_works() { let o = Origin::from(RawOrigin::::Signed(1u64)); @@ -1222,15 +1253,16 @@ mod tests { } #[test] - fn signed_ext_check_weight_works_user_tx() { + fn signed_ext_check_weight_works_normal_tx() { with_externalities(&mut new_test_ext(), || { + let normal_limit = normal_weight_limit(); let small = DispatchInfo { weight: 100, ..Default::default() }; let medium = DispatchInfo { - weight: >::get() / 4 - 1, + weight: normal_limit - 1, ..Default::default() }; let big = DispatchInfo { - weight: >::get() / 4 + 1, + weight: normal_limit + 1, ..Default::default() }; let len = 0_usize; @@ -1265,11 +1297,12 @@ mod tests { with_externalities(&mut new_test_ext(), || { let max = DispatchInfo { weight: Weight::max_value(), ..Default::default() }; let len = 0_usize; + let normal_limit = normal_weight_limit(); assert_eq!(System::all_extrinsics_weight(), 0); let r = CheckWeight::(PhantomData).pre_dispatch(&1, max, len); assert!(r.is_ok()); - assert_eq!(System::all_extrinsics_weight(), >::get() / 4); + assert_eq!(System::all_extrinsics_weight(), normal_limit); }) } @@ -1279,9 +1312,10 @@ mod tests { let normal = DispatchInfo { weight: 100, ..Default::default() }; let op = DispatchInfo { weight: 100, class: DispatchClass::Operational }; let len = 0_usize; + let normal_limit = normal_weight_limit(); // given almost full block - AllExtrinsicsWeight::put(>::get() / 4); + AllExtrinsicsWeight::put(normal_limit); // will not fit. assert!(CheckWeight::(PhantomData).pre_dispatch(&1, normal, len).is_err()); // will fit. @@ -1289,7 +1323,7 @@ mod tests { // likewise for length limit. let len = 100_usize; - AllExtrinsicsLen::put(>::get() / 4); + AllExtrinsicsLen::put(normal_length_limit()); assert!(CheckWeight::(PhantomData).pre_dispatch(&1, normal, len).is_err()); assert!(CheckWeight::(PhantomData).pre_dispatch(&1, op, len).is_ok()); }) @@ -1316,17 +1350,24 @@ mod tests { #[test] fn signed_ext_check_weight_block_size_works() { with_externalities(&mut new_test_ext(), || { - let tx = DispatchInfo::default(); - - let reset_check_weight = |s, f| { + let normal = DispatchInfo::default(); + let normal_limit = normal_weight_limit() as usize; + let reset_check_weight = |tx, s, f| { AllExtrinsicsLen::put(0); let r = CheckWeight::(PhantomData).pre_dispatch(&1, tx, s); if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } }; - reset_check_weight(128, false); - reset_check_weight(512, false); - reset_check_weight(513, true); + reset_check_weight(normal, normal_limit - 1, false); + reset_check_weight(normal, normal_limit, false); + reset_check_weight(normal, normal_limit + 1, true); + + // Operational ones don't have this limit. + let op = DispatchInfo { weight: 0, class: DispatchClass::Operational }; + reset_check_weight(op, normal_limit, false); + reset_check_weight(op, normal_limit + 100, false); + reset_check_weight(op, 1024, false); + reset_check_weight(op, 1025, true); }) } diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index ca7245664e..030f825dba 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -99,6 +99,7 @@ use inherents::ProvideInherentData; use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple}; use srml_support::traits::{Time, Get}; use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; +use runtime_primitives::weights::SimpleDispatchInfo; use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; @@ -236,6 +237,7 @@ decl_module! { /// `MinimumPeriod`. /// /// The dispatch origin for this call must be `Inherent`. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set(origin, #[compact] now: T::Moment) { ensure_none(origin)?; assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); @@ -338,7 +340,7 @@ mod tests { use srml_support::{impl_outer_origin, assert_ok, parameter_types}; use runtime_io::{with_externalities, TestExternalities}; use substrate_primitives::H256; - use runtime_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use runtime_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -350,6 +352,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -364,6 +367,7 @@ mod tests { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } parameter_types! { diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index c8cf84355a..f86a8271a2 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -79,6 +79,7 @@ use runtime_primitives::{Permill, ModuleId}; use runtime_primitives::traits::{ Zero, EnsureOrigin, StaticLookup, CheckedSub, CheckedMul, AccountIdConversion }; +use runtime_primitives::weights::SimpleDispatchInfo; use parity_codec::{Encode, Decode}; use system::ensure_signed; @@ -153,6 +154,7 @@ decl_module! { /// - Limited storage reads. /// - One DB change, one extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn propose_spend( origin, #[compact] value: BalanceOf, @@ -179,6 +181,7 @@ decl_module! { /// - Limited storage reads. /// - One DB clear. /// # + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::RejectOrigin::ensure_origin(origin)?; let proposal = >::take(proposal_id).ok_or("No proposal at that index")?; @@ -196,6 +199,7 @@ decl_module! { /// - Limited storage reads. /// - One DB change. /// # + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::ApproveOrigin::ensure_origin(origin)?; @@ -360,7 +364,7 @@ mod tests { use runtime_io::with_externalities; use srml_support::{assert_noop, assert_ok, impl_outer_origin, parameter_types}; use substrate_primitives::{H256, Blake2Hasher}; - use runtime_primitives::{traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header}; + use runtime_primitives::{Perbill, traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -372,6 +376,7 @@ mod tests { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; @@ -386,6 +391,7 @@ mod tests { type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } parameter_types! { @@ -408,6 +414,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); diff --git a/subkey/src/main.rs b/subkey/src/main.rs index f9432b42c1..16abc8723a 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -26,10 +26,10 @@ use substrate_primitives::{ ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, blake2_256, crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat} }; -use parity_codec::{Encode, Decode, Compact}; +use parity_codec::{Encode, Decode}; use sr_primitives::generic::Era; use node_primitives::{Balance, Index, Hash}; -use node_runtime::{Call, UncheckedExtrinsic, /*CheckNonce, TakeFees, */BalancesCall}; +use node_runtime::{Call, UncheckedExtrinsic, BalancesCall, Runtime}; mod vanity; @@ -90,14 +90,14 @@ fn execute(matches: clap::ArgMatches) where <::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default, <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, { - // let extra = |i: Index, f: Balance| { - // ( - // system::CheckEra::::from(Era::Immortal), - // system::CheckNonce::::from(i), - // system::CheckWeight::::from(), - // balances::TakeFees::::from(f), - // ) - // }; + let extra = |i: Index, f: Balance| { + ( + system::CheckEra::::from(Era::Immortal), + system::CheckNonce::::from(i), + system::CheckWeight::::from(), + balances::TakeFees::::from(f), + ) + }; let password = matches.value_of("password"); let maybe_network = matches.value_of("network"); if let Some(network) = maybe_network { @@ -138,7 +138,7 @@ fn execute(matches: clap::ArgMatches) where let sig = pair.sign(&message); println!("{}", hex::encode(&sig)); } - /*("transfer", Some(matches)) => { + ("transfer", Some(matches)) => { let signer = matches.value_of("from") .expect("parameter is required; thus it can't be None; qed"); let signer = Sr25519::pair_from_suri(signer, password); @@ -225,7 +225,7 @@ fn execute(matches: clap::ArgMatches) where ); println!("0x{}", hex::encode(&extrinsic.encode())); - }*/ + } ("verify", Some(matches)) => { let sig_data = matches.value_of("sig") .expect("signature parameter is required; thus it can't be None; qed"); -- GitLab From d4554b37054019d4537e5d11b9139929e9e5ee7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 25 Jul 2019 13:22:46 +0100 Subject: [PATCH 038/151] srml: staking: track session index of current era start (#3203) * srml: staking: track session index of current era start * node: bump spec_version --- node/runtime/src/lib.rs | 4 ++-- srml/staking/src/lib.rs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 834635a312..4e8ff401b8 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,8 +79,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 120, - impl_version: 120, + spec_version: 121, + impl_version: 121, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index dbf32ca5bd..a1a555bcf5 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -590,6 +590,9 @@ decl_storage! { /// The start of the current era. pub CurrentEraStart get(current_era_start): MomentOf; + /// The session index at which the current era started. + pub CurrentEraStartSessionIndex get(current_era_start_session_index): SessionIndex; + /// Rewards for the current era. Using indices of current elected set. pub CurrentEraRewards: EraRewards; @@ -1169,6 +1172,9 @@ impl Module { // Increment current era. let current_era = CurrentEra::mutate(|s| { *s += 1; *s }); + CurrentEraStartSessionIndex::mutate(|v| { + *v = start_session_index; + }); let bonding_duration = T::BondingDuration::get(); if current_era > bonding_duration { -- GitLab From f2571e8e584d3f7707ef742634893e1753bac18b Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Thu, 25 Jul 2019 16:01:08 +0300 Subject: [PATCH 039/151] Fair reusing of wasm runtime instances (#3011) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add test from original bug report Original is from @pepyakin in 3d7b27f3421818e8d6de568e02fbc2947a06246b. I adapted it to work with the latest master. * No longer cleanup module instance * Replace runtime cache with synchronous clone * Fix test * Preserve initial runtime memory and restore it on fetch * Remove leftover comment * Fix style * Improve variable naming * Replace get_into() with get() * Handle missing memory export better * Return earlier when creating runtime first time * Improve comments * fmt * Fix #2967. * Eradicate `code` from `Error::InvalidCode` * tidy * A state snapshot doc. * Store multiple runtimes by hash. * Get rid of deref. * Docs * Use Self for instantiate_module * REVERT ME * Should be ok * Commit * Remove dbg * Use fast-memory's erase * Clean and undo hacks. * Introduce a dedicated error for heap_base * Ban the start function. * Clean, docs and refactor * Add rustflags. * Update Cargo.lock * Apply Basti's suggestions Co-Authored-By: Bastian Köcher * Rename allocates_huge_stack_array * Extend TestClientBuilder with set_heap_pages * Update the test. * Update core/executor/src/wasm_executor.rs Co-Authored-By: Bastian Köcher * Update core/executor/src/wasm_runtimes_cache.rs Co-Authored-By: Bastian Köcher * Update core/executor/src/error.rs Co-Authored-By: Bastian Köcher * Update core/executor/src/error.rs Co-Authored-By: Bastian Köcher * Fix tests. * Update cargo-lock * Use wasmi master * Use master wasmi * Move tests. * Use wasmi crates.io * Update Cargo.lock * Fix build.rs * Bump runtime version * Revert initial_heap_pages renaming * Bump wasmi up to 0.5.0 * Bump runtime version * Don't restore an instance every now and then * Update core/executor/src/wasm_runtimes_cache.rs Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * Propagate error in CacheError * Clarify the get_heap_base call in instantiation * Supply --export=__heap_base See https://reviews.llvm.org/D62744 Co-authored-by: Jim Posen * Bump version. * Use combinators for segments. * Fix build.rs * Fix build.rs for runtime-test --- Cargo.lock | 15 +- core/client/src/genesis.rs | 9 +- core/executor/Cargo.toml | 3 +- core/executor/runtime-test/build.rs | 7 +- core/executor/src/allocator.rs | 54 ++-- core/executor/src/error.rs | 11 +- core/executor/src/lib.rs | 2 + core/executor/src/native_executor.rs | 117 ++------ core/executor/src/wasm_executor.rs | 62 ++-- core/executor/src/wasm_runtimes_cache.rs | 331 ++++++++++++++++++++++ core/primitives/Cargo.toml | 2 +- core/sr-api-macros/tests/runtime_calls.rs | 1 + core/sr-sandbox/Cargo.toml | 2 +- core/test-runtime/Cargo.toml | 1 + core/test-runtime/build.rs | 12 +- core/test-runtime/client/src/lib.rs | 36 ++- core/test-runtime/src/genesismap.rs | 10 +- core/test-runtime/src/lib.rs | 113 ++++++++ node-template/runtime/build.rs | 10 +- node/executor/src/lib.rs | 1 + node/runtime/build.rs | 7 +- 21 files changed, 618 insertions(+), 188 deletions(-) create mode 100644 core/executor/src/wasm_runtimes_cache.rs diff --git a/Cargo.lock b/Cargo.lock index 865dc1c2cf..515c2e01ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3620,7 +3620,7 @@ dependencies = [ "sr-std 2.0.0", "substrate-primitives 2.0.0", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4470,6 +4470,7 @@ dependencies = [ "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", @@ -4483,7 +4484,7 @@ dependencies = [ "substrate-trie 2.0.0", "tiny-keccak 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4690,7 +4691,7 @@ dependencies = [ "substrate-serializer 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4905,6 +4906,7 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", "substrate-wasm-builder-runner 1.0.2", @@ -5731,10 +5733,13 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6387,7 +6392,7 @@ dependencies = [ "checksum wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "15de16ddb30cfd424a87598b30021491bae1607d32e52056979865c98b7913b4" "checksum wasm-bindgen-webidl 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "21724123084234fff2f986018b790afc5d6f45c9a3903025e6c55d0068cb7d15" "checksum wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6101df9a5987df809216bdda7289f52b58128e6b6a6546e9ee3e6b632b4921" -"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48437c526d40a6a593c50c5367dac825b8d6a04411013e866eca66123fb56faa" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" "checksum web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "22306ce642c58266cb5c5938150194911322bc179aa895146076217410ddbc82" "checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 3451e1e9b1..de2563045e 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -149,7 +149,8 @@ mod tests { let mut storage = GenesisConfig::new(false, vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], - 1000 + 1000, + None, ).genesis_map(); let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); let block = construct_genesis_block::(state_root); @@ -178,7 +179,8 @@ mod tests { let mut storage = GenesisConfig::new(false, vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], - 1000 + 1000, + None, ).genesis_map(); let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); let block = construct_genesis_block::(state_root); @@ -207,7 +209,8 @@ mod tests { let mut storage = GenesisConfig::new(false, vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], - 68 + 68, + None, ).genesis_map(); let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); let block = construct_genesis_block::(state_root); diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 50afe391db..23205e1e40 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -14,7 +14,8 @@ serializer = { package = "substrate-serializer", path = "../serializer" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } runtime_version = { package = "sr-version", path = "../sr-version" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } -wasmi = { version = "0.4.3" } +wasmi = "0.5.0" +parity-wasm = "0.31" byteorder = "1.3" lazy_static = "1.3" parking_lot = "0.8.0" diff --git a/core/executor/runtime-test/build.rs b/core/executor/runtime-test/build.rs index a8a5e1cba5..86bc3ad7fa 100644 --- a/core/executor/runtime-test/build.rs +++ b/core/executor/runtime-test/build.rs @@ -14,14 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project( + build_current_project_with_rustflags( "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../utils/wasm-builder", version: "1.0.4", }, + // This instructs LLD to export __heap_base as a global variable, which is used by the + // external memory allocator. + "-Clink-arg=--export=__heap_base", ); } diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs index 504b96987f..4cc8174f70 100644 --- a/core/executor/src/allocator.rs +++ b/core/executor/src/allocator.rs @@ -53,22 +53,13 @@ impl FreeingBumpHeapAllocator { /// /// # Arguments /// - /// * `ptr_offset` - The pointers returned by `allocate()` start from this - /// offset on. The pointer offset needs to be aligned to a multiple of 8, - /// hence a padding might be added to align `ptr_offset` properly. - /// - /// * `heap_size` - The size available to this heap instance (in bytes) for - /// allocating memory. - /// - /// * `heap` - A `MemoryRef` to the available `MemoryInstance` which is - /// used as the heap. - /// - pub fn new(mem: MemoryRef) -> Self { + /// - `mem` - reference to the linear memory instance on which this allocator operates. + /// - `heap_base` - the offset from the beginning of the linear memory where the heap starts. + pub fn new(mem: MemoryRef, heap_base: u32) -> Self { let current_size: Bytes = mem.current_size().into(); let current_size = current_size.0 as u32; - let used_size = mem.used_size().0 as u32; - let mut ptr_offset = used_size; + let mut ptr_offset = heap_base; let padding = ptr_offset % ALIGNMENT; if padding != 0 { ptr_offset += ALIGNMENT - padding; @@ -195,16 +186,11 @@ mod tests { const PAGE_SIZE: u32 = 65536; - fn set_offset(mem: MemoryRef, offset: usize) { - let offset: Vec = vec![255; offset]; - mem.set(0, &offset).unwrap(); - } - #[test] fn should_allocate_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr = heap.allocate(1).unwrap(); @@ -217,8 +203,7 @@ mod tests { fn should_always_align_pointers_to_multiples_of_8() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 13); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); // when let ptr = heap.allocate(1).unwrap(); @@ -233,7 +218,7 @@ mod tests { fn should_increment_pointers_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr1 = heap.allocate(1).unwrap(); @@ -256,7 +241,7 @@ mod tests { fn should_free_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); let ptr1 = heap.allocate(1).unwrap(); // the prefix of 8 bytes is prepended to the pointer assert_eq!(ptr1, 8); @@ -278,9 +263,8 @@ mod tests { fn should_deallocate_and_reallocate_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 13); let padded_offset = 16; - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); let ptr1 = heap.allocate(1).unwrap(); // the prefix of 8 bytes is prepended to the pointer @@ -306,7 +290,7 @@ mod tests { fn should_build_linked_list_of_free_areas_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); let ptr1 = heap.allocate(8).unwrap(); let ptr2 = heap.allocate(8).unwrap(); @@ -333,8 +317,7 @@ mod tests { fn should_not_allocate_if_too_large() { // given let mem = MemoryInstance::alloc(Pages(1), Some(Pages(1))).unwrap(); - set_offset(mem.clone(), 13); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); // when let ptr = heap.allocate(PAGE_SIZE - 13); @@ -353,7 +336,7 @@ mod tests { fn should_not_allocate_if_full() { // given let mem = MemoryInstance::alloc(Pages(1), Some(Pages(1))).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); let ptr1 = heap.allocate((PAGE_SIZE / 2) - 8).unwrap(); assert_eq!(ptr1, 8); @@ -376,7 +359,7 @@ mod tests { // given let pages_needed = (MAX_POSSIBLE_ALLOCATION as usize / PAGE_SIZE as usize) + 1; let mem = MemoryInstance::alloc(Pages(pages_needed), Some(Pages(pages_needed))).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr = heap.allocate(MAX_POSSIBLE_ALLOCATION).unwrap(); @@ -389,7 +372,7 @@ mod tests { fn should_not_allocate_if_requested_size_too_large() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr = heap.allocate(MAX_POSSIBLE_ALLOCATION + 1); @@ -408,8 +391,7 @@ mod tests { fn should_include_prefixes_in_total_heap_size() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 1); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 1); // when // an item size of 16 must be used then @@ -423,8 +405,7 @@ mod tests { fn should_calculate_total_heap_size_to_zero() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 13); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); // when let ptr = heap.allocate(42).unwrap(); @@ -439,8 +420,7 @@ mod tests { fn should_calculate_total_size_of_zero() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 19); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 19); // when for _ in 1..10 { diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index a81fc1b148..7b8926d8e9 100644 --- a/core/executor/src/error.rs +++ b/core/executor/src/error.rs @@ -38,8 +38,8 @@ pub enum Error { #[display(fmt="Method not found: '{}'", _0)] MethodNotFound(String), /// Code is invalid (expected single byte) - #[display(fmt="Invalid Code: {:?}", _0)] - InvalidCode(Vec), + #[display(fmt="Invalid Code")] + InvalidCode, /// Could not get runtime version. #[display(fmt="On-chain runtime does not specify version")] VersionInvalid, @@ -58,6 +58,13 @@ pub enum Error { /// Invalid memory reference. #[display(fmt="Invalid memory reference")] InvalidMemoryReference, + /// The runtime must provide a global named `__heap_base` of type i32 for specifying where the + /// allocator is allowed to place its data. + #[display(fmt="The runtime doesn't provide a global named `__heap_base`")] + HeapBaseNotFoundOrInvalid, + /// The runtime WebAssembly module is not allowed to have the `start` function. + #[display(fmt="The runtime has the `start` function")] + RuntimeHasStartFn, /// Some other error occurred Other(&'static str), /// Some error occurred in the allocator diff --git a/core/executor/src/lib.rs b/core/executor/src/lib.rs index fa7cc71eea..a6147a320a 100644 --- a/core/executor/src/lib.rs +++ b/core/executor/src/lib.rs @@ -35,11 +35,13 @@ mod wasm_executor; mod native_executor; mod sandbox; mod allocator; +mod wasm_runtimes_cache; pub mod error; pub use wasmi; pub use wasm_executor::WasmExecutor; pub use native_executor::{with_native_environment, NativeExecutor, NativeExecutionDispatch}; +pub use wasm_runtimes_cache::RuntimesCache; pub use state_machine::Externalities; pub use runtime_version::{RuntimeVersion, NativeVersion}; pub use parity_codec::Codec; diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index e4a65c811b..f295671209 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -14,86 +14,20 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{borrow::BorrowMut, result, cell::{RefMut, RefCell}}; +use std::{result, cell::RefCell, panic::UnwindSafe}; use crate::error::{Error, Result}; use state_machine::{CodeExecutor, Externalities}; use crate::wasm_executor::WasmExecutor; -use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef}; use runtime_version::{NativeVersion, RuntimeVersion}; -use std::{collections::HashMap, panic::UnwindSafe}; use parity_codec::{Decode, Encode}; use crate::RuntimeInfo; use primitives::{Blake2Hasher, NativeOrEncoded}; -use primitives::storage::well_known_keys; use log::trace; -/// Default num of pages for the heap -const DEFAULT_HEAP_PAGES: u64 = 1024; - -// For the internal Runtime Cache: -// Is it compatible enough to run this natively or do we need to fall back on the WasmModule - -enum RuntimePreproc { - InvalidCode, - ValidCode(WasmModuleInstanceRef, Option), -} - -type CacheType = HashMap<[u8; 32], RuntimePreproc>; +use crate::RuntimesCache; thread_local! { - static RUNTIMES_CACHE: RefCell = RefCell::new(HashMap::new()); -} - -/// fetch a runtime version from the cache or if there is no cached version yet, create -/// the runtime version entry for `code`, determines whether `Compatibility::IsCompatible` -/// can be used by comparing returned RuntimeVersion to `ref_version` -fn fetch_cached_runtime_version<'a, E: Externalities>( - wasm_executor: &WasmExecutor, - cache: &'a mut RefMut, - ext: &mut E, - default_heap_pages: Option, -) -> Result<(&'a WasmModuleInstanceRef, &'a Option)> { - let code_hash = match ext.original_storage_hash(well_known_keys::CODE) { - Some(code_hash) => code_hash, - None => return Err(Error::InvalidCode(vec![])), - }; - - let maybe_runtime_preproc = cache.borrow_mut().entry(code_hash.into()) - .or_insert_with(|| { - let code = match ext.original_storage(well_known_keys::CODE) { - Some(code) => code, - None => return RuntimePreproc::InvalidCode, - }; - let heap_pages = ext.storage(well_known_keys::HEAP_PAGES) - .and_then(|pages| u64::decode(&mut &pages[..])) - .or(default_heap_pages) - .unwrap_or(DEFAULT_HEAP_PAGES); - match WasmModule::from_buffer(code) - .map_err(|_| Error::InvalidCode(vec![])) - .and_then(|module| wasm_executor.prepare_module(ext, heap_pages as usize, &module)) - { - Ok(module) => { - let version = wasm_executor.call_in_wasm_module(ext, &module, "Core_version", &[]) - .ok() - .and_then(|v| RuntimeVersion::decode(&mut v.as_slice())); - RuntimePreproc::ValidCode(module, version) - } - Err(e) => { - trace!(target: "executor", "Invalid code presented to executor ({:?})", e); - RuntimePreproc::InvalidCode - } - } - }); - - match maybe_runtime_preproc { - RuntimePreproc::InvalidCode => { - let code = ext.original_storage(well_known_keys::CODE).unwrap_or(vec![]); - Err(Error::InvalidCode(code)) - }, - RuntimePreproc::ValidCode(m, v) => { - Ok((m, v)) - } - } + static RUNTIMES_CACHE: RefCell = RefCell::new(RuntimesCache::new()); } fn safe_call(f: F) -> Result @@ -140,7 +74,7 @@ pub struct NativeExecutor { fallback: WasmExecutor, /// Native runtime version info. native_version: NativeVersion, - /// The default number of 64KB pages to allocate for Wasm execution. + /// The number of 64KB pages to allocate for Wasm execution. default_heap_pages: Option, } @@ -151,7 +85,7 @@ impl NativeExecutor { _dummy: Default::default(), fallback: WasmExecutor::new(), native_version: D::native_version(), - default_heap_pages, + default_heap_pages: default_heap_pages, } } } @@ -176,10 +110,11 @@ impl RuntimeInfo for NativeExecutor { &self, ext: &mut E, ) -> Option { - RUNTIMES_CACHE.with(|c| - fetch_cached_runtime_version(&self.fallback, &mut c.borrow_mut(), ext, self.default_heap_pages) - .ok()?.1.clone() - ) + RUNTIMES_CACHE.with(|cache| { + let cache = &mut cache.borrow_mut(); + cache.fetch_runtime(&self.fallback, ext, self.default_heap_pages) + .ok()?.version().clone() + }) } } @@ -198,14 +133,16 @@ impl CodeExecutor for NativeExecutor, - ) -> (Result>, bool) { - RUNTIMES_CACHE.with(|c| { - let mut c = c.borrow_mut(); - let (module, onchain_version) = match fetch_cached_runtime_version( - &self.fallback, &mut c, ext, self.default_heap_pages) { - Ok((module, onchain_version)) => (module, onchain_version), - Err(e) => return (Err(e), false), + ) -> (Result>, bool){ + RUNTIMES_CACHE.with(|cache| { + let cache = &mut cache.borrow_mut(); + let cached_runtime = match cache.fetch_runtime( + &self.fallback, ext, self.default_heap_pages, + ) { + Ok(cached_runtime) => cached_runtime, + Err(e) => return (Err(e), false), }; + let onchain_version = cached_runtime.version(); match ( use_native, onchain_version @@ -223,17 +160,21 @@ impl CodeExecutor for NativeExecutor".into(), |v| format!("{}", v)) ); ( - self.fallback - .call_in_wasm_module(ext, module, method, data) - .map(NativeOrEncoded::Encoded), + cached_runtime.with(|module| + self.fallback + .call_in_wasm_module(ext, module, method, data) + .map(NativeOrEncoded::Encoded) + ), false ) } (false, _, _) => { ( - self.fallback - .call_in_wasm_module(ext, module, method, data) - .map(NativeOrEncoded::Encoded), + cached_runtime.with(|module| + self.fallback + .call_in_wasm_module(ext, module, method, data) + .map(NativeOrEncoded::Encoded) + ), false ) } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 30d5ccd542..1575447dbb 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -56,10 +56,10 @@ struct FunctionExecutor<'e, E: Externalities + 'e> { } impl<'e, E: Externalities> FunctionExecutor<'e, E> { - fn new(m: MemoryRef, t: Option, e: &'e mut E) -> Result { + fn new(m: MemoryRef, heap_base: u32, t: Option, e: &'e mut E) -> Result { Ok(FunctionExecutor { sandbox_store: sandbox::Store::new(), - heap: allocator::FreeingBumpHeapAllocator::new(m.clone()), + heap: allocator::FreeingBumpHeapAllocator::new(m.clone(), heap_base), memory: m, table: t, ext: e, @@ -1270,7 +1270,7 @@ impl WasmExecutor { data: &[u8], ) -> Result> { let module = ::wasmi::Module::from_buffer(code)?; - let module = self.prepare_module(ext, heap_pages, &module)?; + let module = Self::instantiate_module::(heap_pages, &module)?; self.call_in_wasm_module(ext, &module, method, data) } @@ -1292,7 +1292,7 @@ impl WasmExecutor { filter_result: FR, ) -> Result { let module = wasmi::Module::from_buffer(code)?; - let module = self.prepare_module(ext, heap_pages, &module)?; + let module = Self::instantiate_module::(heap_pages, &module)?; self.call_in_wasm_module_with_custom_signature( ext, &module, @@ -1311,6 +1311,22 @@ impl WasmExecutor { .clone()) } + /// Find the global named `__heap_base` in the given wasm module instance and + /// tries to get its value. + fn get_heap_base(module: &ModuleRef) -> Result { + let heap_base_val = module + .export_by_name("__heap_base") + .ok_or_else(|| Error::HeapBaseNotFoundOrInvalid)? + .as_global() + .ok_or_else(|| Error::HeapBaseNotFoundOrInvalid)? + .get(); + + Ok(match heap_base_val { + wasmi::RuntimeValue::I32(v) => v as u32, + _ => return Err(Error::HeapBaseNotFoundOrInvalid), + }) + } + /// Call a given method in the given wasm-module runtime. pub fn call_in_wasm_module>( &self, @@ -1359,10 +1375,9 @@ impl WasmExecutor { let table: Option = module_instance .export_by_name("__indirect_function_table") .and_then(|e| e.as_table().cloned()); + let heap_base = Self::get_heap_base(module_instance)?; - let low = memory.lowest_used(); - let used_mem = memory.used_size(); - let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; + let mut fec = FunctionExecutor::new(memory.clone(), heap_base, table, ext)?; let parameters = create_parameters(&mut |data: &[u8]| { let offset = fec.heap.allocate(data.len() as u32)?; memory.set(offset, &data)?; @@ -1385,24 +1400,14 @@ impl WasmExecutor { }, }; - // cleanup module instance for next use - let new_low = memory.lowest_used(); - if new_low < low { - memory.zero(new_low as usize, (low - new_low) as usize)?; - memory.reset_lowest_used(low); - } - memory.with_direct_access_mut(|buf| buf.resize(used_mem.0, 0)); result } /// Prepare module instance - pub fn prepare_module>( - &self, - ext: &mut E, + pub fn instantiate_module>( heap_pages: usize, module: &Module, - ) -> Result - { + ) -> Result { // start module instantiation. Don't run 'start' function yet. let intermediate_instance = ModuleInstance::new( module, @@ -1410,18 +1415,19 @@ impl WasmExecutor { .with_resolver("env", FunctionExecutor::::resolver()) )?; - // extract a reference to a linear memory, optional reference to a table - // and then initialize FunctionExecutor. + // Verify that the module has the heap base global variable. + let _ = Self::get_heap_base(intermediate_instance.not_started_instance())?; + + // Extract a reference to a linear memory. let memory = Self::get_mem_instance(intermediate_instance.not_started_instance())?; memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; - let table: Option = intermediate_instance - .not_started_instance() - .export_by_name("__indirect_function_table") - .and_then(|e| e.as_table().cloned()); - let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; - // finish instantiation by running 'start' function (if any). - Ok(intermediate_instance.run_start(&mut fec)?) + if intermediate_instance.has_start() { + // Runtime is not allowed to have the `start` function. + Err(Error::RuntimeHasStartFn) + } else { + Ok(intermediate_instance.assert_no_start()) + } } } diff --git a/core/executor/src/wasm_runtimes_cache.rs b/core/executor/src/wasm_runtimes_cache.rs new file mode 100644 index 0000000000..a1540204c7 --- /dev/null +++ b/core/executor/src/wasm_runtimes_cache.rs @@ -0,0 +1,331 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Implements a cache for pre-created Wasm runtime module instances. + +use crate::error::Error; +use crate::wasm_executor::WasmExecutor; +use log::{trace, warn}; +use parity_codec::Decode; +use parity_wasm::elements::{deserialize_buffer, DataSegment, Instruction, Module as RawModule}; +use primitives::storage::well_known_keys; +use primitives::Blake2Hasher; +use runtime_version::RuntimeVersion; +use state_machine::Externalities; +use std::collections::hash_map::{Entry, HashMap}; +use std::mem; +use std::rc::Rc; +use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef, RuntimeValue}; + +#[derive(Debug)] +enum CacheError { + CodeNotFound, + ApplySnapshotFailed, + InvalidModule, + CantDeserializeWasm, + Instantiation(Error), +} + +/// A runtime along with its version and initial state snapshot. +#[derive(Clone)] +pub struct CachedRuntime { + /// A wasm module instance. + instance: WasmModuleInstanceRef, + /// Runtime version according to `Core_version`. + /// + /// Can be `None` if the runtime doesn't expose this function. + version: Option, + /// The snapshot of the instance's state taken just after the instantiation. + state_snapshot: StateSnapshot, +} + +impl CachedRuntime { + /// Perform an operation with the clean version of the runtime wasm instance. + pub fn with(&self, f: F) -> R + where + F: FnOnce(&WasmModuleInstanceRef) -> R, + { + self.state_snapshot.apply(&self.instance).expect( + "applying the snapshot can only fail if the passed instance is different + from the one that was used for creation of the snapshot; + we use the snapshot that is directly associated with the instance; + thus the snapshot was created using the instance; + qed", + ); + f(&self.instance) + } + + /// Returns the version of this cached runtime. + /// + /// Returns `None` if the runtime doesn't provide the information or there was an error + /// while fetching it. + pub fn version(&self) -> Option { + self.version.clone() + } +} + +/// A state snapshot of an instance taken just after instantiation. +/// +/// It is used for restoring the state of the module after execution. +#[derive(Clone)] +struct StateSnapshot { + /// The offset and the content of the memory segments that should be used to restore the snapshot + data_segments: Vec<(u32, Vec)>, + /// The list of all global mutable variables of the module in their sequential order. + global_mut_values: Vec, + heap_pages: u32, +} + +impl StateSnapshot { + // Returns `None` if instance is not valid. + fn take( + module_instance: &WasmModuleInstanceRef, + data_segments: Vec, + heap_pages: u32, + ) -> Option { + let prepared_segments = data_segments + .into_iter() + .map(|mut segment| { + // Just replace contents of the segment since the segments will be discarded later + // anyway. + let contents = mem::replace(segment.value_mut(), vec![]); + + let init_expr = segment.offset().code(); + // [op, End] + if init_expr.len() != 2 { + return None; + } + let offset = match init_expr[0] { + Instruction::I32Const(v) => v as u32, + Instruction::GetGlobal(idx) => { + let global_val = module_instance.globals().get(idx as usize)?.get(); + match global_val { + RuntimeValue::I32(v) => v as u32, + _ => return None, + } + } + _ => return None, + }; + + Some((offset, contents)) + }) + .collect::>>()?; + + // Collect all values of mutable globals. + let global_mut_values = module_instance + .globals() + .iter() + .filter(|g| g.is_mutable()) + .map(|g| g.get()) + .collect(); + + Some(Self { + data_segments: prepared_segments, + global_mut_values, + heap_pages, + }) + } + + /// Reset the runtime instance to the initial version by restoring + /// the preserved memory and globals. + /// + /// Returns `Err` if applying the snapshot is failed. + fn apply(&self, instance: &WasmModuleInstanceRef) -> Result<(), CacheError> { + let memory = instance + .export_by_name("memory") + .ok_or(CacheError::ApplySnapshotFailed)? + .as_memory() + .cloned() + .ok_or(CacheError::ApplySnapshotFailed)?; + + // First, erase the memory and copy the data segments into it. + memory + .erase() + .map_err(|_| CacheError::ApplySnapshotFailed)?; + for (offset, contents) in &self.data_segments { + memory + .set(*offset, contents) + .map_err(|_| CacheError::ApplySnapshotFailed)?; + } + + // Second, restore the values of mutable globals. + for (global_ref, global_val) in instance + .globals() + .iter() + .filter(|g| g.is_mutable()) + .zip(self.global_mut_values.iter()) + { + // the instance should be the same as used for preserving and + // we iterate the same way it as we do it for preserving values that means that the + // types should be the same and all the values are mutable. So no error is expected/ + global_ref + .set(*global_val) + .map_err(|_| CacheError::ApplySnapshotFailed)?; + } + Ok(()) + } +} + +/// Default num of pages for the heap +const DEFAULT_HEAP_PAGES: u64 = 1024; + +/// Cache for the runtimes. +/// +/// When an instance is requested for the first time it is added to this +/// cache. Furthermore its initial memory and values of mutable globals are preserved here. Follow-up +/// requests to fetch a runtime return this one instance with the memory +/// reset to the initial memory. So, one runtime instance is reused for +/// every fetch request. +/// +/// For now the cache grows indefinitely, but that should be fine for now since runtimes can only be +/// upgraded rarely and there are no other ways to make the node to execute some other runtime. +pub struct RuntimesCache { + /// A cache of runtime instances along with metadata, ready to be reused. + /// + /// Instances are keyed by the hash of their code. + instances: HashMap<[u8; 32], Result, CacheError>>, +} + +impl RuntimesCache { + /// Creates a new instance of a runtimes cache. + pub fn new() -> RuntimesCache { + RuntimesCache { + instances: HashMap::new(), + } + } + + /// Fetches an instance of the runtime. + /// + /// On first use we create a new runtime instance, save it to the cache + /// and persist its initial memory. + /// + /// Each subsequent request will return this instance, with its memory restored + /// to the persisted initial memory. Thus, we reuse one single runtime instance + /// for every `fetch_runtime` invocation. + /// + /// # Parameters + /// + /// `wasm_executor`- Rust wasm executor. Executes the provided code in a + /// sandboxed Wasm runtime. + /// + /// `ext` - Externalities to use for the runtime. This is used for setting + /// up an initial runtime instance. The parameter is only needed for calling + /// into the Wasm module to find out the `Core_version`. + /// + /// `default_heap_pages` - Number of 64KB pages to allocate for Wasm execution. + /// Defaults to `DEFAULT_HEAP_PAGES` if `None` is provided. + /// + /// # Return value + /// + /// If no error occurred a tuple `(wasmi::ModuleRef, Option)` is + /// returned. `RuntimeVersion` is contained if the call to `Core_version` returned + /// a version. + /// + /// In case of failure one of two errors can be returned: + /// + /// `Err::InvalidCode` is returned for runtime code issues. + /// + /// `Error::InvalidMemoryReference` is returned if no memory export with the + /// identifier `memory` can be found in the runtime. + pub fn fetch_runtime>( + &mut self, + wasm_executor: &WasmExecutor, + ext: &mut E, + default_heap_pages: Option, + ) -> Result, Error> { + let code_hash = ext + .original_storage_hash(well_known_keys::CODE) + .ok_or(Error::InvalidCode)?; + + // This is direct result from fighting with borrowck. + let handle_result = + |cached_result: &Result, CacheError>| match *cached_result { + Err(_) => Err(Error::InvalidCode), + Ok(ref cached_runtime) => Ok(Rc::clone(cached_runtime)), + }; + + match self.instances.entry(code_hash.into()) { + Entry::Occupied(o) => handle_result(o.get()), + Entry::Vacant(v) => { + trace!(target: "runtimes_cache", "no instance found in cache, creating now."); + let result = Self::create_wasm_instance(wasm_executor, ext, default_heap_pages); + if let Err(ref err) = result { + warn!(target: "runtimes_cache", "cannot create a runtime: {:?}", err); + } + handle_result(v.insert(result)) + } + } + } + + fn create_wasm_instance>( + wasm_executor: &WasmExecutor, + ext: &mut E, + default_heap_pages: Option, + ) -> Result, CacheError> { + let code = ext + .original_storage(well_known_keys::CODE) + .ok_or(CacheError::CodeNotFound)?; + let module = WasmModule::from_buffer(&code).map_err(|_| CacheError::InvalidModule)?; + + // Extract the data segments from the wasm code. + // + // A return of this error actually indicates that there is a problem in logic, since + // we just loaded and validated the `module` above. + let data_segments = extract_data_segments(&code).ok_or(CacheError::CantDeserializeWasm)?; + + let heap_pages = ext + .storage(well_known_keys::HEAP_PAGES) + .and_then(|pages| u64::decode(&mut &pages[..])) + .or(default_heap_pages) + .unwrap_or(DEFAULT_HEAP_PAGES); + + // Instantiate this module. + let instance = WasmExecutor::instantiate_module::(heap_pages as usize, &module) + .map_err(CacheError::Instantiation)?; + + // Take state snapshot before executing anything. + let state_snapshot = StateSnapshot::take(&instance, data_segments, heap_pages as u32) + .expect( + "`take` returns `Err` if the module is not valid; + we already loaded module above, thus the `Module` is proven to be valid at this point; + qed + ", + ); + + let version = wasm_executor + .call_in_wasm_module(ext, &instance, "Core_version", &[]) + .ok() + .and_then(|v| RuntimeVersion::decode(&mut v.as_slice())); + Ok(Rc::new(CachedRuntime { + instance, + version, + state_snapshot, + })) + } +} + +/// Extract the data segments from the given wasm code. +/// +/// Returns `Err` if the given wasm code cannot be deserialized. +fn extract_data_segments(wasm_code: &[u8]) -> Option> { + let raw_module: RawModule = deserialize_buffer(wasm_code).ok()?; + let segments = raw_module + .data_section() + .map(|ds| ds.entries()) + .unwrap_or(&[]) + .to_vec(); + Some(segments) +} diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 1d55f82fab..fc18251f40 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -13,7 +13,7 @@ twox-hash = { version = "1.2.0", optional = true } byteorder = { version = "1.3.1", default-features = false } primitive-types = { version = "0.4.0", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } -wasmi = { version = "0.4.3", optional = true } +wasmi = { version = "0.5.0", optional = true } hash-db = { version = "0.14.0", default-features = false } hash256-std-hasher = { version = "0.14.0", default-features = false } ed25519-dalek = { version = "1.0.0-pre.1", optional = true } diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index fec6015835..83a4f58095 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -16,6 +16,7 @@ use test_client::{ prelude::*, + DefaultTestClientBuilderExt, TestClientBuilder, runtime::{TestAPI, DecodeFails, Transfer, Header}, }; use runtime_primitives::{ diff --git a/core/sr-sandbox/Cargo.toml b/core/sr-sandbox/Cargo.toml index 748bc54362..5e3aabfd23 100755 --- a/core/sr-sandbox/Cargo.toml +++ b/core/sr-sandbox/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" rustc_version = "0.2" [dependencies] -wasmi = { version = "0.4.3", optional = true } +wasmi = { version = "0.5.0", optional = true } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } codec = { package = "parity-codec", version = "4.1.1", default-features = false } diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index f2bf974faf..6302753950 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -32,6 +32,7 @@ srml-system = { path = "../../srml/system", default-features = false } [dev-dependencies] substrate-executor = { path = "../executor" } substrate-test-runtime-client = { path = "./client" } +state_machine = { package = "substrate-state-machine", path = "../state-machine" } [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.2", path = "../utils/wasm-builder-runner" } diff --git a/core/test-runtime/build.rs b/core/test-runtime/build.rs index f543f68ccd..e412123b94 100644 --- a/core/test-runtime/build.rs +++ b/core/test-runtime/build.rs @@ -14,14 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project( + build_current_project_with_rustflags( "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../utils/wasm-builder", version: "1.0.4", }, + // Note that we set the stack-size to 1MB explicitly even though it is set + // to this value by default. This is because some of our tests (`restoration_of_globals`) + // depend on the stack-size. + // + // The --export=__heap_base instructs LLD to export __heap_base as a global variable, which + // is used by the external memory allocator. + "-Clink-arg=-zstack-size=1048576 \ + -Clink-arg=--export=__heap_base", ); } diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs index 0f43911168..4383a80e68 100644 --- a/core/test-runtime/client/src/lib.rs +++ b/core/test-runtime/client/src/lib.rs @@ -95,11 +95,12 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor #[derive(Default)] pub struct GenesisParameters { support_changes_trie: bool, + heap_pages_override: Option, } impl generic_test_client::GenesisInit for GenesisParameters { fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { - let mut storage = genesis_config(self.support_changes_trie).genesis_map(); + let mut storage = genesis_config(self.support_changes_trie, self.heap_pages_override).genesis_map(); let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( storage.clone().into_iter() @@ -145,6 +146,9 @@ pub trait TestClientBuilderExt: Sized { /// Enable or disable support for changes trie in genesis. fn set_support_changes_trie(self, support_changes_trie: bool) -> Self; + /// Override the default value for Wasm heap pages. + fn set_heap_pages(self, heap_pages: u64) -> Self; + /// Build the test client. fn build(self) -> Client { self.build_with_longest_chain().0 @@ -160,6 +164,11 @@ impl TestClientBuilderExt for TestClientBuilder< > where B: client::backend::Backend, { + fn set_heap_pages(mut self, heap_pages: u64) -> Self { + self.genesis_init_mut().heap_pages_override = Some(heap_pages); + self + } + fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { self.genesis_init_mut().support_changes_trie = support_changes_trie; self @@ -170,17 +179,20 @@ impl TestClientBuilderExt for TestClientBuilder< } } -fn genesis_config(support_changes_trie: bool) -> GenesisConfig { - GenesisConfig::new(support_changes_trie, vec![ - Sr25519Keyring::Alice.into(), - Sr25519Keyring::Bob.into(), - Sr25519Keyring::Charlie.into(), - ], vec![ - AccountKeyring::Alice.into(), - AccountKeyring::Bob.into(), - AccountKeyring::Charlie.into(), - ], - 1000 +fn genesis_config(support_changes_trie: bool, heap_pages_override: Option) -> GenesisConfig { + GenesisConfig::new( + support_changes_trie, + vec![ + Sr25519Keyring::Alice.into(), + Sr25519Keyring::Bob.into(), + Sr25519Keyring::Charlie.into(), + ], vec![ + AccountKeyring::Alice.into(), + AccountKeyring::Bob.into(), + AccountKeyring::Charlie.into(), + ], + 1000, + heap_pages_override, ) } diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index 21d7aae0a1..8e0a423c92 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -28,6 +28,7 @@ pub struct GenesisConfig { pub changes_trie_config: Option, pub authorities: Vec, pub balances: Vec<(AccountId, u64)>, + pub heap_pages_override: Option, } impl GenesisConfig { @@ -35,7 +36,8 @@ impl GenesisConfig { support_changes_trie: bool, authorities: Vec, endowed_accounts: Vec, - balance: u64 + balance: u64, + heap_pages_override: Option, ) -> Self { GenesisConfig { changes_trie_config: match support_changes_trie { @@ -44,6 +46,7 @@ impl GenesisConfig { }, authorities: authorities.clone(), balances: endowed_accounts.into_iter().map(|a| (a, balance)).collect(), + heap_pages_override, } } @@ -54,7 +57,10 @@ impl GenesisConfig { .map(|(k, v)| (blake2_256(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ (well_known_keys::CODE.into(), wasm_runtime), - (well_known_keys::HEAP_PAGES.into(), vec![].and(&(16 as u64))), + ( + well_known_keys::HEAP_PAGES.into(), + vec![].and(&(self.heap_pages_override.unwrap_or(16 as u64))), + ), ].into_iter()) .collect(); if let Some(ref changes_trie_config) = self.changes_trie_config { diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index ceb9ed737b..cf3ac363c0 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -256,6 +256,8 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + fn returns_mutable_static() -> u64; + fn allocates_huge_stack_array(trap: bool) -> Vec; /// Returns the initialized block number. fn get_block_number() -> u64; /// Takes and returns the initialized block number. @@ -287,6 +289,8 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + fn returns_mutable_static() -> u64; + fn allocates_huge_stack_array(trap: bool) -> Vec; /// Returns the initialized block number. fn get_block_number() -> u64; /// Takes and returns the initialized block number. @@ -404,6 +408,11 @@ fn code_using_trie() -> u64 { iter_pairs.len() as u64 } +#[cfg(not(feature = "std"))] +/// Mutable static variables should be always observed to have +/// the initialized value at the start of a runtime call. +static mut MUTABLE_STATIC: u64 = 32; + cfg_if! { if #[cfg(feature = "std")] { impl_runtime_apis! { @@ -509,6 +518,14 @@ cfg_if! { (0..1000).fold(0, |p, i| p + benchmark_add_one(i)) } + fn returns_mutable_static() -> u64 { + unimplemented!("is not expected to be invoked from non-wasm builds"); + } + + fn allocates_huge_stack_array(_trap: bool) -> Vec { + unimplemented!("is not expected to be invoked from non-wasm builds"); + } + fn get_block_number() -> u64 { system::get_block_number().expect("Block number is initialized") } @@ -665,6 +682,41 @@ cfg_if! { (0..10000).fold(0, |p, i| p + benchmark_add_one(i)) } + fn returns_mutable_static() -> u64 { + unsafe { + MUTABLE_STATIC += 1; + MUTABLE_STATIC + } + } + + fn allocates_huge_stack_array(trap: bool) -> Vec { + // Allocate a stack frame that is approx. 75% of the stack (assuming it is 1MB). + // This will just decrease (stacks in wasm32-u-u grow downwards) the stack + // pointer. This won't trap on the current compilers. + let mut data = [0u8; 1024 * 768]; + + // Then make sure we actually write something to it. + // + // If: + // 1. the stack area is placed at the beginning of the linear memory space, and + // 2. the stack pointer points to out-of-bounds area, and + // 3. a write is performed around the current stack pointer. + // + // then a trap should happen. + // + for (i, v) in data.iter_mut().enumerate() { + *v = i as u8; // deliberate truncation + } + + if trap { + // There is a small chance of this to be pulled up in theory. In practice + // the probability of that is rather low. + panic!() + } + + data.to_vec() + } + fn get_block_number() -> u64 { system::get_block_number().expect("Block number is initialized") } @@ -715,3 +767,64 @@ cfg_if! { } } } + +#[cfg(test)] +mod tests { + use substrate_test_runtime_client::{ + prelude::*, + DefaultTestClientBuilderExt, TestClientBuilder, + runtime::TestAPI, + }; + use runtime_primitives::{ + generic::BlockId, + traits::ProvideRuntimeApi, + }; + use state_machine::ExecutionStrategy; + + #[test] + fn returns_mutable_static() { + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + + let ret = runtime_api.returns_mutable_static(&block_id).unwrap(); + assert_eq!(ret, 33); + + // We expect that every invocation will need to return the initial + // value plus one. If the value increases more than that then it is + // a sign that the wasm runtime preserves the memory content. + let ret = runtime_api.returns_mutable_static(&block_id).unwrap(); + assert_eq!(ret, 33); + } + + // If we didn't restore the wasm instance properly, on a trap the stack pointer would not be + // returned to its initial value and thus the stack space is going to be leaked. + // + // See https://github.com/paritytech/substrate/issues/2967 for details + #[test] + fn restoration_of_globals() { + // Allocate 32 pages (of 65536 bytes) which gives the runtime 2048KB of heap to operate on + // (plus some additional space unused from the initial pages requested by the wasm runtime + // module). + // + // The fixture performs 2 allocations of 768KB and this theoretically gives 1536KB, however, due + // to our allocator algorithm there are inefficiencies. + const REQUIRED_MEMORY_PAGES: u64 = 32; + + let client = TestClientBuilder::new() + .set_execution_strategy(ExecutionStrategy::AlwaysWasm) + .set_heap_pages(REQUIRED_MEMORY_PAGES) + .build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + + // On the first invocation we allocate approx. 768KB (75%) of stack and then trap. + let ret = runtime_api.allocates_huge_stack_array(&block_id, true); + assert!(ret.is_err()); + + // On the second invocation we allocate yet another 768KB (75%) of stack + let ret = runtime_api.allocates_huge_stack_array(&block_id, false); + assert!(ret.is_ok()); + } + +} diff --git a/node-template/runtime/build.rs b/node-template/runtime/build.rs index ccf58b138f..7000c602e8 100644 --- a/node-template/runtime/build.rs +++ b/node-template/runtime/build.rs @@ -14,8 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project("wasm_binary.rs", WasmBuilderSource::Crates("1.0.4")); + build_current_project_with_rustflags( + "wasm_binary.rs", + WasmBuilderSource::Crates("1.0.4"), + // This instructs LLD to export __heap_base as a global variable, which is used by the + // external memory allocator. + "-Clink-arg=--export=__heap_base", + ); } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 9b9352090e..f858f4e2a8 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -22,6 +22,7 @@ #[cfg(feature = "benchmarks")] extern crate test; pub use substrate_executor::NativeExecutor; +pub use substrate_executor::RuntimesCache; use substrate_executor::native_executor_instance; // Declare an instance of the native executor named `Executor`. Include the wasm binary as the diff --git a/node/runtime/build.rs b/node/runtime/build.rs index 39aecacb20..a5f22fd017 100644 --- a/node/runtime/build.rs +++ b/node/runtime/build.rs @@ -14,14 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project( + build_current_project_with_rustflags( "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../core/utils/wasm-builder", version: "1.0.4", }, + // This instructs LLD to export __heap_base as a global variable, which is used by the + // external memory allocator. + "-Clink-arg=--export=__heap_base", ); } -- GitLab From 81c7f8556aacd8c57de662936f9ee261363182cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Fri, 26 Jul 2019 01:42:40 +0200 Subject: [PATCH 040/151] Handle local storage race conditions better (#3177) * Make local_storage_compare_and_set take Option for old_value * Adapt srml/im-online to API changes * Bump version * Bump version again * Replace match --- core/executor/runtime-test/src/lib.rs | 12 +++++- core/executor/src/wasm_executor.rs | 19 ++++++--- core/offchain/src/api.rs | 23 +++++++++-- core/offchain/src/testing.rs | 4 +- core/primitives/src/offchain.rs | 4 +- core/sr-io/src/lib.rs | 7 +++- core/sr-io/with_std.rs | 2 +- core/sr-io/without_std.rs | 19 +++++++-- core/state-machine/src/lib.rs | 2 +- node/runtime/src/lib.rs | 2 +- srml/im-online/src/lib.rs | 57 +++++++++++++++++++++------ 11 files changed, 118 insertions(+), 33 deletions(-) diff --git a/core/executor/runtime-test/src/lib.rs b/core/executor/runtime-test/src/lib.rs index bca2202646..6d4e5ccb55 100644 --- a/core/executor/runtime-test/src/lib.rs +++ b/core/executor/runtime-test/src/lib.rs @@ -143,12 +143,22 @@ impl_stubs!( runtime_io::local_storage_set(kind, b"test", b"asd"); assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"asd".to_vec())); - let res = runtime_io::local_storage_compare_and_set(kind, b"test", b"asd", b""); + let res = runtime_io::local_storage_compare_and_set(kind, b"test", Some(b"asd"), b""); assert_eq!(res, true); assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"".to_vec())); [0].to_vec() }, + test_offchain_local_storage_with_none => |_| { + let kind = substrate_primitives::offchain::StorageKind::PERSISTENT; + assert_eq!(runtime_io::local_storage_get(kind, b"test"), None); + + let res = runtime_io::local_storage_compare_and_set(kind, b"test", None, b"value"); + assert_eq!(res, true); + assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"value".to_vec())); + + [0].to_vec() + }, test_offchain_http => |_| { use substrate_primitives::offchain::HttpRequestStatus; let run = || -> Option<()> { diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 1575447dbb..1b82b97d76 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -949,17 +949,24 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, .map_err(|_| "storage kind OOB while ext_local_storage_compare_and_set: wasm")?; let key = this.memory.get(key, key_len as usize) .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; - let old_value = this.memory.get(old_value, old_value_len as usize) - .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; let new_value = this.memory.get(new_value, new_value_len as usize) .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; - let res = this.ext.offchain() - .map(|api| api.local_storage_compare_and_set(kind, &key, &old_value, &new_value)) - .ok_or_else(|| "Calling unavailable API ext_local_storage_compare_andset: wasm")?; + let res = { + if old_value == u32::max_value() { + this.ext.offchain() + .map(|api| api.local_storage_compare_and_set(kind, &key, None, &new_value)) + .ok_or_else(|| "Calling unavailable API ext_local_storage_compare_and_set: wasm")? + } else { + let v = this.memory.get(old_value, old_value_len as usize) + .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; + this.ext.offchain() + .map(|api| api.local_storage_compare_and_set(kind, &key, Some(v.as_slice()), &new_value)) + .ok_or_else(|| "Calling unavailable API ext_local_storage_compare_and_set: wasm")? + } + }; Ok(if res { 0 } else { 1 }) - }, ext_http_request_start( method: *const u8, diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 949602f3f7..711611ada5 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -355,12 +355,12 @@ where &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool { match kind { StorageKind::PERSISTENT => { - self.db.compare_and_set(STORAGE_PREFIX, key, Some(old_value), new_value) + self.db.compare_and_set(STORAGE_PREFIX, key, old_value, new_value) }, StorageKind::LOCAL => unavailable_yet(LOCAL_DB), } @@ -657,14 +657,29 @@ mod tests { api.local_storage_set(kind, key, b"value"); // when - assert_eq!(api.local_storage_compare_and_set(kind, key, b"val", b"xxx"), false); + assert_eq!(api.local_storage_compare_and_set(kind, key, Some(b"val"), b"xxx"), false); assert_eq!(api.local_storage_get(kind, key), Some(b"value".to_vec())); // when - assert_eq!(api.local_storage_compare_and_set(kind, key, b"value", b"xxx"), true); + assert_eq!(api.local_storage_compare_and_set(kind, key, Some(b"value"), b"xxx"), true); assert_eq!(api.local_storage_get(kind, key), Some(b"xxx".to_vec())); } + #[test] + fn should_compare_and_set_local_storage_with_none() { + // given + let kind = StorageKind::PERSISTENT; + let mut api = offchain_api().0; + let key = b"test"; + + // when + let res = api.local_storage_compare_and_set(kind, key, None, b"value"); + + // then + assert_eq!(res, true); + assert_eq!(api.local_storage_get(kind, key), Some(b"value".to_vec())); + } + #[test] fn should_create_a_new_key_and_sign_and_verify_stuff() { let test = |kind: CryptoKind| { diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs index 6f473a9cd4..f1c38007ea 100644 --- a/core/offchain/src/testing.rs +++ b/core/offchain/src/testing.rs @@ -209,14 +209,14 @@ impl offchain::Externalities for TestOffchainExt { &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8] ) -> bool { let mut state = self.0.write(); match kind { StorageKind::LOCAL => &mut state.local_storage, StorageKind::PERSISTENT => &mut state.persistent_storage, - }.compare_and_set(b"", key, Some(old_value), new_value) + }.compare_and_set(b"", key, old_value, new_value) } fn local_storage_get(&mut self, kind: StorageKind, key: &[u8]) -> Option> { diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index fc1d4f0bda..5b6f8f5c22 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -384,7 +384,7 @@ pub trait Externalities { &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool; @@ -514,7 +514,7 @@ impl Externalities for Box { &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool { (&mut **self).local_storage_compare_and_set(kind, key, old_value, new_value) diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 6ffb15ffdf..4a65ecfefe 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -306,7 +306,12 @@ export_api! { /// /// Note this storage is not part of the consensus, it's only accessible by /// offchain worker tasks running on the same machine. It IS persisted between runs. - fn local_storage_compare_and_set(kind: StorageKind, key: &[u8], old_value: &[u8], new_value: &[u8]) -> bool; + fn local_storage_compare_and_set( + kind: StorageKind, + key: &[u8], + old_value: Option<&[u8]>, + new_value: &[u8] + ) -> bool; /// Gets a value from the local storage. /// diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 18cb2fd2df..8c70efdcd8 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -351,7 +351,7 @@ impl OffchainApi for () { fn local_storage_compare_and_set( kind: offchain::StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool { with_offchain(|ext| { diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 001b697934..861f94ced5 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -1055,14 +1055,27 @@ impl OffchainApi for () { } } - fn local_storage_compare_and_set(kind: offchain::StorageKind, key: &[u8], old_value: &[u8], new_value: &[u8]) -> bool { + fn local_storage_compare_and_set( + kind: offchain::StorageKind, + key: &[u8], + old_value: Option<&[u8]>, + new_value: &[u8], + ) -> bool { + let (ptr, len) = match old_value { + Some(old_value) => ( + old_value.as_ptr(), + old_value.len() as u32, + ), + None => (0 as *const u8, u32::max_value()), + }; + unsafe { ext_local_storage_compare_and_set.get()( kind.into(), key.as_ptr(), key.len() as u32, - old_value.as_ptr(), - old_value.len() as u32, + ptr, + len, new_value.as_ptr(), new_value.len() as u32, ) == 0 diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index f2275cc41f..7b2eb07819 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -313,7 +313,7 @@ impl offchain::Externalities for NeverOffchainExt { &mut self, _kind: offchain::StorageKind, _key: &[u8], - _old_value: &[u8], + _old_value: Option<&[u8]>, _new_value: &[u8], ) -> bool { unreachable!() diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 4e8ff401b8..9ea7bf3c9e 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 121, - impl_version: 121, + impl_version: 122, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index e2b23f1dbd..7898fea8eb 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -233,27 +233,55 @@ decl_module! { .ok_or(OffchainErr::ExtrinsicCreation)?; sr_io::submit_transaction(&ex) .map_err(|_| OffchainErr::SubmitTransaction)?; + + // once finished we set the worker status without comparing + // if the existing value changed in the meantime. this is + // because at this point the heartbeat was definitely submitted. set_worker_status::(block_number, true); } Ok(()) } - fn set_worker_status(gossipping_at: T::BlockNumber, done: bool) { + fn compare_and_set_worker_status( + gossipping_at: T::BlockNumber, + done: bool, + curr_worker_status: Option>, + ) -> bool { let enc = WorkerStatus { done, gossipping_at, }; - sr_io::local_storage_set(StorageKind::PERSISTENT, DB_KEY, &enc.encode()); + sr_io::local_storage_compare_and_set( + StorageKind::PERSISTENT, + DB_KEY, + curr_worker_status.as_ref().map(Vec::as_slice), + &enc.encode() + ) } - fn was_not_yet_gossipped( + fn set_worker_status( + gossipping_at: T::BlockNumber, + done: bool, + ) { + let enc = WorkerStatus { + done, + gossipping_at, + }; + sr_io::local_storage_set( + StorageKind::PERSISTENT, DB_KEY, &enc.encode()); + } + + // Checks if a heartbeat gossip already occurred at this block number. + // Returns a tuple of `(current worker status, bool)`, whereby the bool + // is true if not yet gossipped. + fn check_not_yet_gossipped( now: T::BlockNumber, next_gossip: T::BlockNumber, - ) -> Result { + ) -> Result<(Option>, bool), OffchainErr> { let last_gossip = sr_io::local_storage_get(StorageKind::PERSISTENT, DB_KEY); match last_gossip { - Some(l) => { - let worker_status: WorkerStatus = Decode::decode(&mut &l[..]) + Some(last) => { + let worker_status: WorkerStatus = Decode::decode(&mut &last[..]) .ok_or(OffchainErr::DecodeWorkerStatus)?; let was_aborted = !worker_status.done && worker_status.gossipping_at < now; @@ -266,22 +294,29 @@ decl_module! { worker_status.done && worker_status.gossipping_at < next_gossip; let ret = (was_aborted && !already_submitting) || not_yet_gossipped; - Ok(ret) + Ok((Some(last), ret)) }, - None => Ok(true), + None => Ok((None, true)), } } let next_gossip = >::get(); - let not_yet_gossipped = match was_not_yet_gossipped::(now, next_gossip) { - Ok(v) => v, + let check = check_not_yet_gossipped::(now, next_gossip); + let (curr_worker_status, not_yet_gossipped) = match check { + Ok((s, v)) => (s, v), Err(err) => { print(err); return; }, }; if next_gossip < now && not_yet_gossipped { - set_worker_status::(now, false); + let value_set = compare_and_set_worker_status::(now, false, curr_worker_status); + if !value_set { + // value could not be set in local storage, since the value was + // different from `curr_worker_status`. this indicates that + // another worker was running in parallel. + return; + } match gossip_at::(now) { Ok(_) => {}, -- GitLab From 3138dd6cb9e071853e2c95db51110e6e925190ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 26 Jul 2019 01:40:15 +0100 Subject: [PATCH 041/151] Use milliseconds for timestamp resolution (#3210) * node: tabify constants file * node: define minimum period and slot duration in milliseconds * core: srml: use milliseconds for timestamp resolution * core: update slot_duration to millis in tests * node: bump spec_version * node: fix integration test * node: fix executor test * Update node/runtime/src/lib.rs Co-Authored-By: Kian Peymani * node: fix docs on timestamp resolution * node: add docs on u64 for millis --- core/consensus/aura/src/lib.rs | 2 +- core/consensus/slots/src/slots.rs | 11 +++++------ core/test-runtime/src/lib.rs | 10 +++++----- node-template/runtime/src/lib.rs | 4 ++-- node/cli/src/service.rs | 4 ++-- node/executor/src/lib.rs | 18 +++++++++--------- node/primitives/src/lib.rs | 4 +++- node/runtime/src/constants.rs | 30 +++++++++++++++++------------- node/runtime/src/lib.rs | 4 ++-- srml/timestamp/src/lib.rs | 2 +- 10 files changed, 47 insertions(+), 42 deletions(-) diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 964f7231b1..485d4c78d0 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -764,7 +764,7 @@ mod tests { } } - const SLOT_DURATION: u64 = 1; + const SLOT_DURATION: u64 = 1000; pub struct AuraTestNet { peers: Vec>, diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index 4e51cf0d84..98310bbf2e 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -57,15 +57,14 @@ impl SignedDuration { duration_now() + self.offset } else { duration_now() - self.offset - }.as_secs()) / slot_duration + }.as_millis() as u64) / slot_duration } } /// Returns the duration until the next slot, based on current duration since pub fn time_until_next(now: Duration, slot_duration: u64) -> Duration { - let remaining_full_secs = slot_duration - (now.as_secs() % slot_duration) - 1; - let remaining_nanos = 1_000_000_000 - now.subsec_nanos(); - Duration::new(remaining_full_secs, remaining_nanos) + let remaining_full_millis = slot_duration - (now.as_millis() as u64 % slot_duration) - 1; + Duration::from_millis(remaining_full_millis) } /// Information about a slot. @@ -89,7 +88,7 @@ impl SlotInfo { if now < self.ends_at { self.ends_at.duration_since(now) } else { - Duration::from_secs(0) + Duration::from_millis(0) } } } @@ -156,7 +155,7 @@ impl Stream for Slots { }; // reschedule delay for next slot. let ends_in = offset + - time_until_next(Duration::from_secs(timestamp), slot_duration); + time_until_next(Duration::from_millis(timestamp), slot_duration); let ends_at = Instant::now() + ends_in; self.inner_delay = Some(Delay::new(ends_in)); diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index cf3ac363c0..d4c1620863 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -354,7 +354,7 @@ impl srml_system::Trait for Runtime { } impl srml_timestamp::Trait for Runtime { - /// A timestamp: seconds since the unix epoch. + /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; @@ -540,7 +540,7 @@ cfg_if! { } impl aura_primitives::AuraApi for Runtime { - fn slot_duration() -> u64 { 1 } + fn slot_duration() -> u64 { 1000 } fn authorities() -> Vec { system::authorities() } } @@ -548,7 +548,7 @@ cfg_if! { fn startup_data() -> babe_primitives::BabeConfiguration { babe_primitives::BabeConfiguration { median_required_blocks: 0, - slot_duration: 3, + slot_duration: 3000, c: (3, 10), } } @@ -731,7 +731,7 @@ cfg_if! { } impl aura_primitives::AuraApi for Runtime { - fn slot_duration() -> u64 { 1 } + fn slot_duration() -> u64 { 1000 } fn authorities() -> Vec { system::authorities() } } @@ -739,7 +739,7 @@ cfg_if! { fn startup_data() -> babe_primitives::BabeConfiguration { babe_primitives::BabeConfiguration { median_required_blocks: 0, - slot_duration: 1, + slot_duration: 1000, c: (3, 10), } } diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index eedcda4d14..7b2201c8ef 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -150,10 +150,10 @@ impl indices::Trait for Runtime { } parameter_types! { - pub const MinimumPeriod: u64 = 5; + pub const MinimumPeriod: u64 = 5000; } impl timestamp::Trait for Runtime { - /// A timestamp: seconds since the unix epoch. + /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; type MinimumPeriod = MinimumPeriod; diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 29af557a3f..57d986cb05 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -264,7 +264,7 @@ mod tests { use consensus_common::{Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy}; use node_primitives::DigestItem; use node_runtime::{BalancesCall, Call, UncheckedExtrinsic}; - use node_runtime::constants::{currency::CENTS, time::SECS_PER_BLOCK}; + use node_runtime::constants::{currency::CENTS, time::SLOT_DURATION}; use parity_codec::{Encode, Decode}; use primitives::{ crypto::Pair as CryptoPair, blake2_256, @@ -365,7 +365,7 @@ mod tests { // even though there's only one authority some slots might be empty, // so we must keep trying the next slots until we can claim one. let babe_pre_digest = loop { - inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * SECS_PER_BLOCK)); + inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * SLOT_DURATION)); if let Some(babe_pre_digest) = babe::test_helpers::claim_slot( &*service.client(), &parent_id, diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index f858f4e2a8..93e31ef6fc 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -463,7 +463,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { signed: Some((alice(), signed_extra(0, 0))), @@ -485,7 +485,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { signed: Some((alice(), signed_extra(0, 0))), @@ -500,7 +500,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(52)), + function: Call::Timestamp(timestamp::Call::set(52 * 1000)), }, CheckedExtrinsic { signed: Some((bob(), signed_extra(0, 0))), @@ -528,7 +528,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(time)), + function: Call::Timestamp(timestamp::Call::set(time * 1000)), }, CheckedExtrinsic { signed: Some((alice(), signed_extra(nonce, 0))), @@ -784,7 +784,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { signed: Some((charlie(), signed_extra(0, 0))), @@ -983,7 +983,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { signed: Some((charlie(), signed_extra(0, 0))), @@ -1000,7 +1000,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(52)), + function: Call::Timestamp(timestamp::Call::set(52 * 1000)), }, CheckedExtrinsic { signed: Some((charlie(), signed_extra(1, 0))), @@ -1147,7 +1147,7 @@ mod tests { xts.insert(0, CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(time)), + function: Call::Timestamp(timestamp::Call::set(time * 1000)), }); // NOTE: this is super slow. Can probably be improved. @@ -1213,7 +1213,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(time)), + function: Call::Timestamp(timestamp::Call::set(time * 1000)), }, CheckedExtrinsic { signed: Some((charlie(), signed_extra(nonce, 0))), diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index c8a0b1a25e..96085cf60f 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -50,7 +50,9 @@ pub type Index = u64; /// A hash of some data used by the chain. pub type Hash = primitives::H256; -/// A timestamp: seconds since the unix epoch. +/// A timestamp: milliseconds since the unix epoch. +/// `u64` is enough to represent a duration of half a billion years, when the +/// time scale is milliseconds. pub type Timestamp = u64; /// Digest item type. diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs index c030f57121..c32709adf6 100644 --- a/node/runtime/src/constants.rs +++ b/node/runtime/src/constants.rs @@ -18,21 +18,25 @@ /// Money matters. pub mod currency { - use node_primitives::Balance; + use node_primitives::Balance; - pub const MILLICENTS: Balance = 1_000_000_000; - pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. - pub const DOLLARS: Balance = 100 * CENTS; + pub const MILLICENTS: Balance = 1_000_000_000; + pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. + pub const DOLLARS: Balance = 100 * CENTS; } /// Time. pub mod time { - use node_primitives::Moment; + use node_primitives::Moment; - pub const SECS_PER_BLOCK: Moment = 6; - pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; - pub const HOURS: Moment = MINUTES * 60; - pub const DAYS: Moment = HOURS * 24; + pub const MILLISECS_PER_BLOCK: Moment = 6000; + pub const SECS_PER_BLOCK: Moment = MILLISECS_PER_BLOCK / 1000; + pub const SLOT_DURATION: Moment = 6000; + + // These time units are defined in number of blocks. + pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; + pub const HOURS: Moment = MINUTES * 60; + pub const DAYS: Moment = HOURS * 24; } // CRITICAL NOTE: The system module maintains two constants: a _maximum_ block weight and a @@ -45,8 +49,8 @@ pub mod time { // the ratio that `system` module uses to find normal transaction quota. /// Fee-related. pub mod fee { - pub use runtime_primitives::Perbill; + pub use runtime_primitives::Perbill; - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); -} \ No newline at end of file + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); +} diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 9ea7bf3c9e..02d2a91851 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 121, + spec_version: 122, impl_version: 122, apis: RUNTIME_API_VERSIONS, }; @@ -166,7 +166,7 @@ impl balances::Trait for Runtime { } parameter_types! { - pub const MinimumPeriod: u64 = SECS_PER_BLOCK / 2; + pub const MinimumPeriod: Moment = SLOT_DURATION / 2; } impl timestamp::Trait for Runtime { type Moment = Moment; diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 030f825dba..46ffb6ed22 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -170,7 +170,7 @@ impl ProvideInherentData for InherentDataProvider { .map_err(|_| { "Current time is before unix epoch".into() }).and_then(|d| { - let duration: InherentType = d.as_secs(); + let duration: InherentType = d.as_millis() as u64; inherent_data.put_data(INHERENT_IDENTIFIER, &duration) }) } -- GitLab From 4b18dafc95a83faa88aa7de8d92dfe43cfb51b21 Mon Sep 17 00:00:00 2001 From: TriplEight Date: Fri, 26 Jul 2019 02:40:53 +0200 Subject: [PATCH 042/151] WIP: Subkey docker image (#3183) * WIP to release subkey im docker * debug run with publishing * debug build * debug build 2 * easier sync * fix the template * fix typo --- .gitlab-ci.yml | 118 ++++++++++++------ scripts/docker/subkey.Dockerfile | 31 +++++ .../{Dockerfile => substrate.Dockerfile} | 0 3 files changed, 114 insertions(+), 35 deletions(-) create mode 100644 scripts/docker/subkey.Dockerfile rename scripts/docker/{Dockerfile => substrate.Dockerfile} (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 832b754162..f7d668b9b9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -106,7 +106,7 @@ cargo-check-subkey: - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 script: - cd ./subkey - - BUILD_DUMMY_WASM_BINARY=1 time cargo check --release # makes sense to save artifacts for building it + - BUILD_DUMMY_WASM_BINARY=1 time cargo check --release - sccache -s @@ -172,11 +172,13 @@ test-linux-stable-int: expire_in: 24 hrs paths: - ${CI_COMMIT_SHORT_SHA}_int_failure.log + allow_failure: true check-web-wasm: stage: test <<: *docker-env + allow_failure: true except: - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 script: @@ -218,33 +220,33 @@ build-linux-release: stage: build <<: *collect-artifacts <<: *docker-env - <<: *build-only + # debug <<: *build-only except: variables: - $DEPLOY_TAG script: - time cargo build --release --verbose - - mkdir -p ./artifacts - - mv ./target/release/substrate ./artifacts/. + - mkdir -p ./artifacts/substrate/ + - mv ./target/release/substrate ./artifacts/substrate/. - echo -n "Substrate version = " - if [ "${CI_COMMIT_TAG}" ]; then - echo "${CI_COMMIT_TAG}" | tee ./artifacts/VERSION; + echo "${CI_COMMIT_TAG}" | tee ./artifacts/substrate/VERSION; else - ./artifacts/substrate --version | + ./artifacts/substrate/substrate --version | sed -n -r 's/^substrate ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p' | - tee ./artifacts/VERSION; + tee ./artifacts/substrate/VERSION; fi - - sha256sum ./artifacts/substrate | tee ./artifacts/substrate.sha256 + - sha256sum ./artifacts/substrate/substrate | tee ./artifacts/substrate/substrate.sha256 - printf '\n# building node-template\n\n' - - ./scripts/node-template-release.sh ./artifacts/substrate-node-template.tar.gz - - cp -r scripts/docker/* ./artifacts + - ./scripts/node-template-release.sh ./artifacts/substrate/substrate-node-template.tar.gz + - cp -r scripts/docker/substrate.Dockerfile ./artifacts/substrate/ - sccache -s build-linux-subkey: stage: build <<: *collect-artifacts <<: *docker-env - # <<: *build-only + # debug <<: *build-only except: variables: - $DEPLOY_TAG @@ -252,19 +254,21 @@ build-linux-subkey: - cd ./subkey - BUILD_DUMMY_WASM_BINARY=1 time cargo build --release --verbose - cd .. - # - time cargo build --release - sccache -s - - mkdir -p ./artifacts - - mv ./target/release/subkey ./artifacts/. + - mkdir -p ./artifacts/subkey + - mv ./target/release/subkey ./artifacts/subkey/. - echo -n "Subkey version = " - - ./artifacts/subkey --version | + - ./artifacts/subkey/subkey --version | sed -n -r 's/^subkey ([0-9.]+.*)/\1/p' | - tee ./artifacts/SUBKEY-VERSION; - - sha256sum ./artifacts/subkey | tee ./artifacts/subkey.sha256 + tee ./artifacts/subkey/VERSION; + - sha256sum ./artifacts/subkey/subkey | tee ./artifacts/subkey/subkey.sha256 + - cp -r scripts/docker/subkey.Dockerfile ./artifacts/subkey/ + - sccache -s build-rust-doc-release: stage: build <<: *docker-env + allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" @@ -290,8 +294,13 @@ build-rust-doc-release: <<: *build-only <<: *kubernetes-build -publish-docker-release: - <<: *publish-build +publish-docker-substrate: &publish-docker-release + # debug <<: *publish-build + stage: publish + dependencies: + - build-linux-release + <<: *kubernetes-build + # debug image: docker:stable services: - docker:dind @@ -301,7 +310,7 @@ publish-docker-release: DOCKER_HOST: tcp://localhost:2375 DOCKER_DRIVER: overlay2 GIT_STRATEGY: none - # DOCKERFILE: scripts/docker/Dockerfile + # DOCKERFILE: scripts/docker/substrate.Dockerfile CONTAINER_IMAGE: parity/substrate before_script: - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" @@ -309,38 +318,77 @@ publish-docker-release: - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" - docker info script: - - VERSION="$(cat ./artifacts/VERSION)" + - cd ./artifacts/substrate/ + - VERSION="$(cat ./VERSION)" - echo "Substrate version = ${VERSION}" - test -z "${VERSION}" && exit 1 - - cd ./artifacts - docker build --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --tag $CONTAINER_IMAGE:$VERSION - --tag $CONTAINER_IMAGE:latest . + --tag $CONTAINER_IMAGE:latest + --file substrate.Dockerfile . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest after_script: - docker logout # only VERSION information is needed for the deployment - - find ./artifacts/ -depth -not -name VERSION -not -name artifacts -delete + - find ./artifacts/ -depth -not -name VERSION -type f -delete + +publish-docker-subkey: + # debug <<: *publish-docker-release + stage: publish + dependencies: + - build-linux-subkey + # debug <<: *build-only + <<: *kubernetes-build + image: docker:stable + services: + - docker:dind + variables: + DOCKER_HOST: tcp://localhost:2375 + DOCKER_DRIVER: overlay2 + GIT_STRATEGY: none + # DOCKERFILE: scripts/docker/subkey.Dockerfile + CONTAINER_IMAGE: parity/subkey + before_script: + - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" + || ( echo "no docker credentials provided"; exit 1 ) + - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" + - docker info + script: + - cd ./artifacts/subkey/ + - VERSION="$(cat ./VERSION)" + - echo "Subkey version = ${VERSION}" + - test -z "${VERSION}" && exit 1 + - docker build + --build-arg VCS_REF="${CI_COMMIT_SHA}" + --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + --tag $CONTAINER_IMAGE:$VERSION + --tag $CONTAINER_IMAGE:latest + --file subkey.Dockerfile . + - docker push $CONTAINER_IMAGE:$VERSION + - docker push $CONTAINER_IMAGE:latest + after_script: + - docker logout publish-s3-release: - <<: *publish-build + # debug <<: *publish-build + stage: publish + dependencies: + - build-linux-release + - build-linux-subkey + <<: *kubernetes-build + # debug image: parity/awscli:latest variables: GIT_STRATEGY: none BUCKET: "releases.parity.io" PREFIX: "substrate/${ARCH}-${DOCKER_OS}" script: - - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/ + - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/substrate/VERSION)/ - echo "update objects in latest path" - - for file in ./artifacts/*; do - name="$(basename ${file})"; - aws s3api copy-object - --copy-source ${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/${name} - --bucket ${BUCKET} --key ${PREFIX}/latest/${name}; - done + - aws s3 sync s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/substrate/VERSION)/ s3://${BUCKET}/${PREFIX}/latest/ after_script: - aws s3 ls s3://${BUCKET}/${PREFIX}/latest/ --recursive --human-readable --summarize @@ -423,8 +471,8 @@ publish-gh-doc: - kubernetes-parity-build before_script: - test -z "${DEPLOY_TAG}" && - test -f ./artifacts/VERSION && - DEPLOY_TAG="$(cat ./artifacts/VERSION)" + test -f ./artifacts/substrate/VERSION && + DEPLOY_TAG="$(cat ./artifacts/substrate/VERSION)" - test "${DEPLOY_TAG}" || ( echo "Neither DEPLOY_TAG nor VERSION information available"; exit 1 ) script: - echo "Substrate version = ${DEPLOY_TAG}" @@ -450,7 +498,7 @@ publish-gh-doc: .deploy-cibuild: &deploy-cibuild <<: *deploy dependencies: - - publish-docker-release + - publish-docker-substrate .deploy-tag: &deploy-tag <<: *deploy diff --git a/scripts/docker/subkey.Dockerfile b/scripts/docker/subkey.Dockerfile new file mode 100644 index 0000000000..6d5c559ea0 --- /dev/null +++ b/scripts/docker/subkey.Dockerfile @@ -0,0 +1,31 @@ +FROM debian:stretch-slim + +# metadata +ARG VCS_REF +ARG BUILD_DATE + +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/subkey" \ + io.parity.image.description="Subkey: key generating utility for Substrate." \ + io.parity.image.source="https://github.com/paritytech/substrate/blob/${VCS_REF}/scripts/docker/subkey.Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://github.com/paritytech/substrate/tree/${VCS_REF}/subkey" + +# show backtraces +ENV RUST_BACKTRACE 1 + +# add user +RUN useradd -m -u 1000 -U -s /bin/sh -d /subkey subkey + +# add subkey binary to docker image +COPY ./subkey /usr/local/bin + +USER subkey + +# check if executable works in this container +RUN /usr/local/bin/subkey --version + +ENTRYPOINT ["/usr/local/bin/subkey"] + diff --git a/scripts/docker/Dockerfile b/scripts/docker/substrate.Dockerfile similarity index 100% rename from scripts/docker/Dockerfile rename to scripts/docker/substrate.Dockerfile -- GitLab From 855ad098501e560600a76b81fa3251dab2af228b Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 26 Jul 2019 02:42:03 +0200 Subject: [PATCH 043/151] Import queue steps (#3159) * Switch consensus-common to new futures * Fix tests * More tests fixing * Pass the block_import by value when importing * Rewrite the multi-blocks import as a future * Add some comments * Add a delay between each block * Fix Babe tests * Reverse white space change --- .../common/src/import_queue/basic_queue.rs | 147 +++++++++++++----- .../common/src/import_queue/buffered_link.rs | 8 + 2 files changed, 120 insertions(+), 35 deletions(-) diff --git a/core/consensus/common/src/import_queue/basic_queue.rs b/core/consensus/common/src/import_queue/basic_queue.rs index 082006ae5d..d94c3a383c 100644 --- a/core/consensus/common/src/import_queue/basic_queue.rs +++ b/core/consensus/common/src/import_queue/basic_queue.rs @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{pin::Pin, sync::Arc}; +use std::{mem, pin::Pin, sync::Arc, time::Duration}; use futures::{prelude::*, channel::mpsc, task::SpawnExt as _, task::Context, task::Poll}; +use futures_timer::Delay; use runtime_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; -use crate::error::Error as ConsensusError; -use crate::block_import::{BlockImport, BlockOrigin}; +use crate::block_import::BlockOrigin; use crate::import_queue::{ BlockImportResult, BlockImportError, Verifier, BoxBlockImport, BoxFinalityProofImport, BoxJustificationImport, ImportQueue, Link, Origin, @@ -136,10 +136,10 @@ enum ToWorkerMsg { struct BlockImportWorker> { result_sender: BufferedLinkSender, - block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, verifier: Arc, + delay_between_blocks: Duration, } impl> BlockImportWorker { @@ -156,24 +156,55 @@ impl> BlockImportWorker { result_sender, verifier, justification_import, - block_import, finality_proof_import, + delay_between_blocks: Duration::new(0, 0), }; + // Let's initialize `justification_import` and `finality_proof_import`. if let Some(justification_import) = worker.justification_import.as_mut() { for (hash, number) in justification_import.on_start() { worker.result_sender.request_justification(&hash, number); } } - if let Some(finality_proof_import) = worker.finality_proof_import.as_mut() { for (hash, number) in finality_proof_import.on_start() { worker.result_sender.request_finality_proof(&hash, number); } } + // The future below has two possible states: + // + // - Currently importing many blocks, in which case `importing` is `Some` and contains a + // `Future`, and `block_import` is `None`. + // - Something else, in which case `block_import` is `Some` and `importing` is None. + // + let mut block_import = Some(block_import); + let mut importing = None; + let future = futures::future::poll_fn(move |cx| { loop { + // If the results sender is closed, that means that the import queue is shutting + // down and we should end this future. + if worker.result_sender.is_closed() { + return Poll::Ready(()) + } + + // If we are in the process of importing a bunch of block, let's resume this + // process before doing anything more. + if let Some(imp_fut) = importing.as_mut() { + match Future::poll(Pin::new(imp_fut), cx) { + Poll::Pending => return Poll::Pending, + Poll::Ready(bi) => { + block_import = Some(bi); + importing = None; + }, + } + } + + debug_assert!(importing.is_none()); + debug_assert!(block_import.is_some()); + + // Grab the next action request sent to the import queue. let msg = match Stream::poll_next(Pin::new(&mut port), cx) { Poll::Ready(Some(msg)) => msg, Poll::Ready(None) => return Poll::Ready(()), @@ -182,7 +213,10 @@ impl> BlockImportWorker { match msg { ToWorkerMsg::ImportBlocks(origin, blocks) => { - worker.import_a_batch_of_blocks(origin, blocks); + // On blocks import request, we merely *start* the process and store + // a `Future` into `importing`. + let bi = block_import.take().expect("block_import is always Some; qed"); + importing = Some(worker.import_a_batch_of_blocks(bi, origin, blocks)); }, ToWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { worker.import_finality_proof(who, hash, number, proof); @@ -197,17 +231,24 @@ impl> BlockImportWorker { (future, sender) } - fn import_a_batch_of_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { - let result_sender = &self.result_sender; - let (imported, count, results) = import_many_blocks( - &mut *self.block_import, - origin, - blocks, - self.verifier.clone(), - || !result_sender.is_closed(), - ); - - self.result_sender.blocks_processed(imported, count, results); + /// Returns a `Future` that imports the given blocks and sends the results on + /// `self.result_sender`. + /// + /// For lifetime reasons, the `BlockImport` implementation must be passed by value, and is + /// yielded back in the output once the import is finished. + fn import_a_batch_of_blocks( + &mut self, + block_import: BoxBlockImport, + origin: BlockOrigin, + blocks: Vec> + ) -> impl Future> { + let mut result_sender = self.result_sender.clone(); + + import_many_blocks(block_import, origin, blocks, self.verifier.clone(), self.delay_between_blocks) + .then(move |(imported, count, results, block_import)| { + result_sender.blocks_processed(imported, count, results); + future::ready(block_import) + }) } fn import_finality_proof(&mut self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { @@ -257,20 +298,22 @@ impl> BlockImportWorker { /// Import several blocks at once, returning import result for each block. /// -/// The `keep_going` closure will be called regularly. If it returns false, then the function will -/// end prematurely. +/// For lifetime reasons, the `BlockImport` implementation must be passed by value, and is yielded +/// back in the output once the import is finished. +/// +/// The returned `Future` yields at every imported block, which makes the execution more +/// fine-grained and making it possible to interrupt the process. fn import_many_blocks>( - import_handle: &mut dyn BlockImport, + import_handle: BoxBlockImport, blocks_origin: BlockOrigin, blocks: Vec>, verifier: Arc, - keep_going: impl Fn() -> bool, -) -> (usize, usize, Vec<( + delay_between_blocks: Duration, +) -> impl Future>, BlockImportError>, B::Hash, -)>) { +)>, BoxBlockImport)> { let count = blocks.len(); - let mut imported = 0; let blocks_range = match ( blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), @@ -283,38 +326,72 @@ fn import_many_blocks>( trace!(target: "sync", "Starting import of {} blocks {}", count, blocks_range); + let mut imported = 0; let mut results = vec![]; - let mut has_error = false; + let mut blocks = blocks.into_iter(); + let mut import_handle = Some(import_handle); + let mut waiting = None; // Blocks in the response/drain should be in ascending order. - for block in blocks { - if !keep_going() { - // Setting `has_error` to true cancels the rest of the import. - has_error = true; + + future::poll_fn(move |cx| { + // Handle the optional timer that makes us wait before the next import. + if let Some(waiting) = &mut waiting { + match Future::poll(Pin::new(waiting), cx) { + Poll::Ready(_) => {}, + Poll::Pending => return Poll::Pending, + } } + waiting = None; + + // Is there any block left to import? + let block = match blocks.next() { + Some(b) => b, + None => { + // No block left to import, success! + let import_handle = import_handle.take() + .expect("Future polled again after it has finished"); + let results = mem::replace(&mut results, Vec::new()); + return Poll::Ready((imported, count, results, import_handle)); + }, + }; + + // We extract the content of `import_handle` only when the future ends, therefore + // `import_handle` is always `Some` here. It is illegal to poll a `Future` again after it + // has ended. + let import_handle = import_handle.as_mut() + .expect("Future polled again after it has finished"); let block_number = block.header.as_ref().map(|h| h.number().clone()); let block_hash = block.hash; let import_result = if has_error { Err(BlockImportError::Cancelled) } else { + // The actual import. import_single_block( - import_handle, + &mut **import_handle, blocks_origin.clone(), block, verifier.clone(), ) }; - let was_ok = import_result.is_ok(); - if was_ok { + + if import_result.is_ok() { trace!(target: "sync", "Block imported successfully {:?} ({})", block_number, block_hash); imported += 1; } else { has_error = true; } + results.push((import_result, block_hash)); - } - (imported, count, results) + // Notifies the current task again so that we re-execute this closure again for the next + // block. + if delay_between_blocks != Duration::new(0, 0) { + waiting = Some(Delay::new(delay_between_blocks)); + } + cx.waker().wake_by_ref(); + Poll::Pending + }) } diff --git a/core/consensus/common/src/import_queue/buffered_link.rs b/core/consensus/common/src/import_queue/buffered_link.rs index ffd08e690a..90921bd1ea 100644 --- a/core/consensus/common/src/import_queue/buffered_link.rs +++ b/core/consensus/common/src/import_queue/buffered_link.rs @@ -66,6 +66,14 @@ impl BufferedLinkSender { } } +impl Clone for BufferedLinkSender { + fn clone(&self) -> Self { + BufferedLinkSender { + tx: self.tx.clone(), + } + } +} + /// Internal buffered message. enum BlockImportWorkerMsg { BlocksProcessed(usize, usize, Vec<(Result>, BlockImportError>, B::Hash)>), -- GitLab From cae6983683a2848dddec182c3b0442d8be06593d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 26 Jul 2019 13:19:04 +0100 Subject: [PATCH 044/151] node: Update BABE protocol parameters (#3211) * node: update babe parameters to target 6 second block time * node: add comment on MILLISECS_PER_BLOCK constant --- node/cli/src/service.rs | 2 +- node/runtime/src/constants.rs | 21 ++++++++++++++++++++- node/runtime/src/lib.rs | 8 ++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 57d986cb05..aeeb8e2061 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -371,7 +371,7 @@ mod tests { &parent_id, slot_num, &alice, - (3, 10), + (278, 1000), ) { break babe_pre_digest; } diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs index c32709adf6..5c149b6d14 100644 --- a/node/runtime/src/constants.rs +++ b/node/runtime/src/constants.rs @@ -29,9 +29,28 @@ pub mod currency { pub mod time { use node_primitives::Moment; + /// Since BABE is probabilistic this is the average expected block time that + /// we are targetting. Blocks will be produced at a minimum duration defined + /// by `SLOT_DURATION`, but some slots will not be allocated to any + /// authority and hence no block will be produced. We expect to have this + /// block time on average following the defined slot duration and the value + /// of `c` configured for BABE. + /// This value is only used indirectly to define the unit constants below + /// that are expressed in blocks. The rest of the code should use + /// `SLOT_DURATION` instead (like the timestamp module for calculating the + /// minimum period). + /// pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const SECS_PER_BLOCK: Moment = MILLISECS_PER_BLOCK / 1000; - pub const SLOT_DURATION: Moment = 6000; + + pub const SLOT_DURATION: Moment = 1650; + + pub const EPOCH_DURATION_IN_BLOCKS: Moment = 10 * MINUTES; + pub const EPOCH_DURATION_IN_SLOTS: Moment = { + const SLOT_FILL_RATE: f64 = MILLISECS_PER_BLOCK as f64 / SLOT_DURATION as f64; + + (EPOCH_DURATION_IN_BLOCKS as f64 * SLOT_FILL_RATE) as Moment + }; // These time units are defined in number of blocks. pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 02d2a91851..700f3b20c7 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -127,7 +127,7 @@ impl system::Trait for Runtime { } parameter_types! { - pub const EpochDuration: u64 = 10 * MINUTES; + pub const EpochDuration: u64 = EPOCH_DURATION_IN_SLOTS; } impl babe::Trait for Runtime { @@ -517,10 +517,14 @@ impl_runtime_apis! { impl babe_primitives::BabeApi for Runtime { fn startup_data() -> babe_primitives::BabeConfiguration { + // The choice of `c` parameter is done in accordance to + // the slot duration and expected target block time, for + // safely resisting network delays of maximum two seconds. + // babe_primitives::BabeConfiguration { median_required_blocks: 1000, slot_duration: Babe::slot_duration(), - c: (3, 10), + c: (278, 1000), } } -- GitLab From 2acacb94068b612edb2a998a7439df652bc2b388 Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Fri, 26 Jul 2019 10:04:07 -0400 Subject: [PATCH 045/151] Update dependencies (#3140) --- Cargo.lock | 1118 +++++++++++++++++++++++++--------------------------- 1 file changed, 536 insertions(+), 582 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 515c2e01ef..5f77a7f38f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,7 +50,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -76,6 +76,11 @@ dependencies = [ "xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "arc-swap" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "arrayref" version = "0.3.5" @@ -83,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "arrayvec" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -102,8 +107,8 @@ name = "asn1_der_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -113,37 +118,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "atty" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -190,11 +194,11 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -229,7 +233,7 @@ name = "blake2-rfc" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -276,13 +280,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" -version = "0.2.1" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-automata 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -344,13 +348,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cargo_metadata" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -361,7 +365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -395,7 +399,7 @@ name = "chrono" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -407,7 +411,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -417,7 +421,7 @@ version = "2.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -431,7 +435,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -447,7 +451,7 @@ name = "cmake" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -461,7 +465,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,25 +486,25 @@ name = "criterion" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -513,37 +517,13 @@ dependencies = [ "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crossbeam" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-channel" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-deque" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -551,21 +531,21 @@ name = "crossbeam-deque" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-epoch" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -573,12 +553,12 @@ name = "crossbeam-queue" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-utils" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -618,11 +598,11 @@ name = "csv" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -638,8 +618,8 @@ name = "ctor" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,9 +672,9 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -704,10 +684,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -775,10 +755,10 @@ name = "env_logger" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -792,7 +772,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -800,7 +780,7 @@ name = "error-chain" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -818,7 +798,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -828,8 +808,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -843,7 +823,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -853,9 +833,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -865,7 +845,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -878,10 +858,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide_c_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -907,7 +887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "fork-tree" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -916,7 +896,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -926,7 +906,7 @@ name = "fs2" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1067,7 +1047,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1077,7 +1057,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1086,7 +1066,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1105,15 +1085,15 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "h2" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1122,7 +1102,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1205,7 +1185,7 @@ dependencies = [ [[package]] name = "hmac" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1276,19 +1256,19 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.31" +version = "0.12.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1318,7 +1298,7 @@ name = "impl-codec" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1327,7 +1307,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1335,7 +1315,7 @@ name = "impl-serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1358,7 +1338,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1382,10 +1362,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1395,11 +1375,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1411,9 +1391,9 @@ version = "12.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1432,8 +1412,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1441,10 +1421,10 @@ name = "jsonrpc-http-server" version = "12.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1456,9 +1436,9 @@ version = "12.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1470,7 +1450,7 @@ dependencies = [ "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1484,7 +1464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1541,10 +1521,10 @@ dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1568,7 +1548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1576,7 +1556,7 @@ name = "libloading" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1632,12 +1612,12 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1658,8 +1638,8 @@ name = "libp2p-core-derive" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1680,7 +1660,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1696,7 +1676,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1711,9 +1691,9 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1727,7 +1707,7 @@ name = "libp2p-kad" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1735,10 +1715,10 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1759,7 +1739,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1780,7 +1760,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1797,8 +1777,8 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1816,7 +1796,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1843,7 +1823,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1857,13 +1837,13 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1871,9 +1851,9 @@ dependencies = [ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1899,7 +1879,7 @@ dependencies = [ "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1912,7 +1892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1922,12 +1902,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1938,12 +1918,12 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "soketto 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1955,7 +1935,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1966,9 +1946,9 @@ version = "5.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1989,9 +1969,9 @@ name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2030,12 +2010,12 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2055,7 +2035,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2069,13 +2049,16 @@ name = "memchr" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memoffset" -version = "0.2.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "memory-db" @@ -2094,13 +2077,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2116,13 +2099,13 @@ name = "miniz-sys" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "miniz_oxide" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2130,13 +2113,13 @@ dependencies = [ [[package]] name = "miniz_oxide_c_api" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2148,8 +2131,8 @@ dependencies = [ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2162,7 +2145,7 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2173,7 +2156,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2195,7 +2178,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2216,11 +2199,11 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2233,7 +2216,7 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2243,9 +2226,9 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2257,11 +2240,11 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -2299,7 +2282,7 @@ version = "2.0.0" dependencies = [ "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -2326,9 +2309,9 @@ dependencies = [ name = "node-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2341,9 +2324,9 @@ version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -2354,10 +2337,10 @@ version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -2396,9 +2379,9 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "substrate-basic-authorship 2.0.0", @@ -2420,9 +2403,9 @@ dependencies = [ name = "node-template-runtime" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2475,7 +2458,7 @@ name = "num-integer" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2484,7 +2467,7 @@ name = "num-rational" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2495,7 +2478,7 @@ name = "num-traits" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2503,14 +2486,9 @@ name = "num_cpus" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "numtoa" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ole32-sys" version = "0.2.0" @@ -2535,15 +2513,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.23" +version = "0.10.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2553,13 +2531,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.47" +version = "0.9.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2594,13 +2572,13 @@ source = "git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7 [[package]] name = "parity-codec" -version = "4.1.1" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2610,8 +2588,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2626,7 +2604,7 @@ dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2710,7 +2688,7 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2721,7 +2699,7 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2733,7 +2711,7 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2747,7 +2725,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2771,8 +2749,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2801,7 +2779,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "pkg-config" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2854,8 +2832,8 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2868,7 +2846,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2877,7 +2855,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2897,14 +2875,14 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2915,7 +2893,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2925,7 +2903,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2938,7 +2916,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2948,8 +2926,8 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2967,8 +2945,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2978,16 +2956,15 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_chacha" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3042,7 +3019,7 @@ name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3054,7 +3031,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3065,7 +3042,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3103,7 +3080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3121,14 +3098,6 @@ name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ref_thread_local" version = "0.0.0" @@ -3136,19 +3105,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.1.9" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-automata" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3156,10 +3125,10 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3177,8 +3146,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3186,9 +3155,9 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3199,7 +3168,7 @@ name = "rocksdb" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3209,7 +3178,7 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3237,7 +3206,7 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3274,7 +3243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "same-file" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3298,7 +3267,7 @@ dependencies = [ "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3332,7 +3301,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3358,7 +3327,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3373,20 +3342,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.94" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.94" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3396,7 +3365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3466,7 +3435,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "slog" -version = "2.4.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3479,19 +3448,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "slog-scope" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3500,8 +3469,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3537,7 +3506,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3561,10 +3530,10 @@ version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-version 2.0.0", "substrate-client 2.0.0", @@ -3572,8 +3541,8 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "trybuild 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3583,7 +3552,7 @@ dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-offchain 2.0.0", @@ -3598,12 +3567,12 @@ name = "sr-primitives" version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", @@ -3615,7 +3584,7 @@ name = "sr-sandbox" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -3635,8 +3604,8 @@ name = "sr-version" version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -3645,8 +3614,8 @@ dependencies = [ name = "srml-assets" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3660,9 +3629,9 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3680,7 +3649,7 @@ dependencies = [ name = "srml-authorship" version = "0.1.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3695,9 +3664,9 @@ version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3715,9 +3684,9 @@ dependencies = [ name = "srml-balances" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3732,9 +3701,9 @@ name = "srml-collective" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3751,10 +3720,10 @@ dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", @@ -3772,9 +3741,9 @@ dependencies = [ name = "srml-democracy" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3789,9 +3758,9 @@ name = "srml-elections" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3805,8 +3774,8 @@ dependencies = [ name = "srml-example" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -3820,8 +3789,8 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3836,8 +3805,8 @@ dependencies = [ name = "srml-finality-tracker" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3851,8 +3820,8 @@ dependencies = [ name = "srml-generic-asset" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3865,8 +3834,8 @@ dependencies = [ name = "srml-grandpa" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3882,8 +3851,8 @@ dependencies = [ name = "srml-im-online" version = "0.1.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3897,10 +3866,10 @@ dependencies = [ name = "srml-indices" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3914,8 +3883,8 @@ dependencies = [ name = "srml-metadata" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -3925,9 +3894,9 @@ name = "srml-session" version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3942,10 +3911,10 @@ dependencies = [ name = "srml-staking" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3963,8 +3932,8 @@ dependencies = [ name = "srml-sudo" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3980,10 +3949,10 @@ version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3999,10 +3968,10 @@ name = "srml-support-procedural" version = "2.0.0" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "srml-support-procedural-tools 2.0.0", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4011,9 +3980,9 @@ version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 2.0.0", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4021,22 +3990,22 @@ name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-test" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "srml-support 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "trybuild 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4044,9 +4013,9 @@ name = "srml-system" version = "2.0.0" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4058,8 +4027,8 @@ dependencies = [ name = "srml-timestamp" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4073,8 +4042,8 @@ dependencies = [ name = "srml-treasury" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4136,8 +4105,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4152,8 +4121,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4165,7 +4134,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4192,8 +4161,8 @@ name = "substrate-basic-authorship" version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", @@ -4210,7 +4179,7 @@ name = "substrate-bip39" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4222,7 +4191,7 @@ version = "2.0.0" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4231,9 +4200,9 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4262,8 +4231,8 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", @@ -4290,8 +4259,8 @@ dependencies = [ "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4313,8 +4282,8 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4340,7 +4309,7 @@ dependencies = [ name = "substrate-consensus-aura-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4356,12 +4325,12 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4389,7 +4358,7 @@ dependencies = [ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4406,8 +4375,8 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4424,8 +4393,8 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4447,8 +4416,8 @@ version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4468,8 +4437,8 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4496,8 +4465,8 @@ dependencies = [ "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4522,8 +4491,8 @@ dependencies = [ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4534,7 +4503,7 @@ dependencies = [ name = "substrate-inherents" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4582,16 +4551,16 @@ dependencies = [ "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4617,8 +4586,8 @@ version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4643,8 +4612,8 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4654,7 +4623,7 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4676,15 +4645,15 @@ dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4707,11 +4676,11 @@ dependencies = [ "jsonrpc-core-client 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4733,8 +4702,8 @@ dependencies = [ "jsonrpc-http-server 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-ws-server 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -4754,7 +4723,7 @@ dependencies = [ name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4767,16 +4736,16 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4805,7 +4774,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -4821,8 +4790,8 @@ name = "substrate-state-db" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4833,9 +4802,9 @@ version = "2.0.0" dependencies = [ "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", @@ -4853,13 +4822,13 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-scope 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4870,7 +4839,7 @@ version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", @@ -4886,9 +4855,9 @@ name = "substrate-test-runtime" version = "2.0.0" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4931,10 +4900,10 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime 2.0.0", @@ -4946,8 +4915,8 @@ version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4966,7 +4935,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", "trie-bench 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4980,11 +4949,11 @@ name = "substrate-wasm-builder" version = "1.0.4" dependencies = [ "build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo_metadata 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cargo_metadata 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5008,11 +4977,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.39" +version = "0.15.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5022,8 +4991,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5034,7 +5003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5059,7 +5028,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5074,17 +5043,6 @@ dependencies = [ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "termion" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "textwrap" version = "0.10.0" @@ -5106,7 +5064,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5118,7 +5076,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5138,7 +5096,7 @@ name = "tinytemplate" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5148,7 +5106,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5221,7 +5179,7 @@ name = "tokio-executor" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5242,7 +5200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5250,10 +5208,10 @@ name = "tokio-reactor" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5265,7 +5223,7 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.10.0-alpha.3" +version = "0.10.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5305,9 +5263,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5319,7 +5277,7 @@ name = "tokio-timer" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5342,7 +5300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5357,8 +5315,8 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5371,7 +5329,7 @@ name = "toml" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5383,8 +5341,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "transaction-factory" version = "0.0.1" dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", @@ -5402,7 +5360,7 @@ dependencies = [ "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5416,7 +5374,7 @@ dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5444,12 +5402,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trybuild" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5485,7 +5443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ucd-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5609,8 +5567,8 @@ name = "wabt" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5620,17 +5578,17 @@ name = "wabt-sys" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "walkdir" -version = "2.2.8" +version = "2.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5641,81 +5599,81 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5724,11 +5682,11 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5736,7 +5694,7 @@ name = "wasmi" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5755,14 +5713,14 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5808,7 +5766,7 @@ dependencies = [ [[package]] name = "weedle" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5820,7 +5778,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5877,7 +5835,7 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5922,7 +5880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5945,8 +5903,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5959,15 +5917,16 @@ dependencies = [ "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" +"checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" -"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" +"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba" "checksum asn1_der 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bea40e881533b1fe23afca9cd1c1ca022219a10fce604099ecfc96bfa26eaf1a" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" -"checksum backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "18b50f5258d1a9ad8396d2d345827875de4261b158124d4c819d9b351454fae5" -"checksum backtrace-sys 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "5b3a000b9c543553af61bc01cbfc403b04b5caa9e421033866f2e98061eb3e61" +"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" +"checksum autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "22130e92352b948e7e82a49cdb0aa94f2211761117f29e052dd397c1ac33542b" +"checksum backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)" = "88fb679bc9af8fa639198790a77f52d345fe13656c08b43afa9424c206b731c6" +"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" @@ -5983,7 +5942,7 @@ dependencies = [ "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc0572e02f76cb335f309b19e0a0d585b4f62788f7d26de2a13a836a637385f" +"checksum bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e0a692f1c740e7e821ca71a22cf99b9b2322dfa94d10f71443befb1797b3946a" "checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" "checksum bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd43d82f27d68911e6ee11ee791fb248f138f5d69424dc02e098d4f152b0b05" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" @@ -5993,9 +5952,9 @@ dependencies = [ "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cargo_metadata 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "929766d993a2fde7a0ae962ee82429069cd7b68839cd9375b98efd719df65d3a" +"checksum cargo_metadata 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e904f164f39cae0c3a4f2713eb97a47ba64676a071e99a69ddfef4994694d2c" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" -"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ce400c638d48ee0e9ab75aef7997609ec57367ccfe1463f21bf53c3eca67bf46" "checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "77d81f58b7301084de3b958691458a53c3f7e0b1d702f77e550b6a88e3a88abe" @@ -6010,13 +5969,11 @@ dependencies = [ "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" "checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" -"checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" -"checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" -"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" +"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9" "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" +"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" @@ -6078,7 +6035,7 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" -"checksum h2 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "a539b63339fbbb00e081e84b6e11bd1d9634a82d91da2984a18ac74a8823f392" +"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" "checksum hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4a2710506bcc28e53b6d48d9686b233a31ad831597da7de91e6112a2fc8f260" "checksum hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff4a5dcbaf4fe8977852851d137546bcad8679c9582f170032ca35b30701138e" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" @@ -6089,14 +6046,14 @@ dependencies = [ "checksum hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3da68162fdd2147e66682e78e729bd77f93b4c99656db058c5782d8c6b6225a" "checksum hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06095d08c7c05760f11a071b3e1d4c5b723761c01bd8d7201c30a9536668a612" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" -"checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" +"checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" "checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -"checksum hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)" = "6481fff8269772d4463253ca83c788104a7305cb3fb9136bc651a6211e46e03f" +"checksum hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)" = "7cb44cbce9d8ee4fb36e4c0ad7b794ac44ebaad924b9c8291a63215bb44c2c8f" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62ed8ff267bc916dd848a800b96d3129aec73d5b23a5e3d018c83655d0c55371" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" @@ -6108,7 +6065,7 @@ dependencies = [ "checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" -"checksum js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "eac16f41aa9b9388230b1d6617d7ed897a1af5416b8fe1c8734dcef79c7aae10" +"checksum js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "da3ea71161651a4cd97d999b2da139109c537b15ab33abc8ae4ead38deac8a03" "checksum jsonrpc-client-transports 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6be24a8de4ced80f6fd8b6ace54aa610823a7642976a0e8e00e3bb2f4d8c33f0" "checksum jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0216cf4c95fb373d89c63572672097b8aa74cfcdd77054accbf545d840be5bd7" "checksum jsonrpc-core-client 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1603b6cc05060de7794c2962edd705e1ad2698bd2b0d2ddd4489f8c85df122b7" @@ -6126,7 +6083,7 @@ dependencies = [ "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3262021842bf00fe07dbd6cf34ff25c99d7a7ebef8deea84db72be3ea3bb0aff" +"checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" "checksum libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18b3404dae1e3110caaae14b2d59bf7254b1e988ed7ed38da59c005bed711e7d" "checksum libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efa1b75b0b388c0f33bc2e2f5d385885f9ed77f622802895b68ac8397aaef2de" @@ -6157,19 +6114,19 @@ dependencies = [ "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" +"checksum log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c275b6ad54070ac2d665eef9197db647b32239c9d244bfb6f041a766d00da5b3" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" "checksum malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35adee9ed962cf7d07d62cb58bc45029f3227f5b5b86246caa8632f06c187bc3" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" -"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" +"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f" "checksum memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "896b24d1a9850e7a25b070d552f311cbb8735214456efa222dcc4c431073c215" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "66448a173ad394ef5ebf734efa724f3644dcffda083b1e89979da4461ddac079" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" -"checksum miniz_oxide 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b6c3756d66cf286314d5f7ebe74886188a9a92f5eee68b06f31ac2b4f314c99d" -"checksum miniz_oxide_c_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5b78ca5446dd9fe0dab00e058731b6b08a8c1d2b9cdb8efb10876e24e9ae2494" +"checksum miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c061edee74a88eb35d876ce88b94d77a0448a201de111c244b70d047f5820516" +"checksum miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6c675792957b0d19933816c4e1d56663c341dd9bfa31cb2140ff2267c1d8ecf4" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" @@ -6187,18 +6144,17 @@ dependencies = [ "checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" -"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" +"checksum openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)" = "8152bb5a9b5b721538462336e3bef9a539f892715e5037fda0f984577311af15" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" +"checksum openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)" = "b5ba300217253bcc5dc68bed23d782affa45000193866e025329aa8a7a9f05b8" "checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7902deb39d3b431897f211c1918789938251e67a740f55effd53201e79c0906c" +"checksum parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2900f06356edf90de66a2922db622b36178dca71e85625eae58d0d9cc6cff2ac" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" @@ -6219,7 +6175,7 @@ dependencies = [ "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" +"checksum pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c1d2cfa5a714db3b5f24f0915e74fcdf91d09d496ba61329705dda7774d2af" "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" @@ -6227,19 +6183,19 @@ dependencies = [ "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "982a35d1194084ba319d65c4a68d24ca28f5fdb5b8bc20899e4eef8641ea5178" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f00e4a3cb64ecfeac2c0a73c74c68ae3439d7a6bead3870be56ad5dd2620a6f" +"checksum protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8aefcec9f142b524d98fc81d07827743be89dd6586a1ba6ab21fa66a500b3fa5" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c35d9c36a562f37eca96e79f66d5fd56eefbc22560dacc4a864cabd2d277456" -"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" +"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" "checksum rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c" "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e193067942ef6f485a349a113329140d0ab9e2168ce92274499bb0e9a4190d9d" +"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615e683324e75af5d43d8f7a39ffe3ee4a9dc42c5c701167a71dc59c3a493aca" @@ -6255,11 +6211,10 @@ dependencies = [ "checksum rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbe0df8435ac0c397d467b6cad6d25543d06e8a019ef3f6af3c384597515bd2" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" -"checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad" -"checksum regex-automata 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3ed09217220c272b29ef237a974ad58515bde75f194e3ffa7e6d0bf0f3b01f86" -"checksum regex-syntax 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9b01330cce219c1c6b2e209e5ed64ccd587ae5c67bed91c0b49eecf02ae40e21" +"checksum regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b23da8dfd98a84bd7e08700190a5d9f7d2d38abd4369dd1dae651bc40bfd2cc" +"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" +"checksum regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5485bf1523a9ed51c4964273f22f63f24e31632adb5dad134f488f86a3875c" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum rhododendron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "057fecd57cc69e24d9d215c9f283a42133c3f48952e4fc06b088ecf3ce3d90bb" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" @@ -6273,7 +6228,7 @@ dependencies = [ "checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" -"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" +"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" "checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" @@ -6285,8 +6240,8 @@ dependencies = [ "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "076a696fdea89c19d3baed462576b8f6d663064414b5c793642da8dfeb99475b" -"checksum serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "ef45eb79d6463b22f5f9e16d283798b7c0175ba6050bc25c1a946c122727fe7b" +"checksum serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)" = "d46b3dfedb19360a74316866cef04687cd4d6a70df8e6a506c63512790769b72" +"checksum serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)" = "c22a0820adfe2f257b098714323563dd06426502abbbce4f51b72ef544c5027f" "checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704" "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" @@ -6295,9 +6250,9 @@ dependencies = [ "checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" +"checksum slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" -"checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" +"checksum slog-scope 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1d3ec6214d46e57a7ec87c1972bbca66c59172a0cfffa5233c54726afb946bf" "checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" "checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" @@ -6318,14 +6273,13 @@ dependencies = [ "checksum substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f52ecbff6cc3d6e5c6401828e15937b680f459d6803ce238f01fe615bc40d071" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" -"checksum syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d960b829a55e56db167e861ddb43602c003c7be0bee1d345021703fac2fb7c" +"checksum syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)" = "eadc09306ca51a40555dd6fc2b415538e9e18bc9f870e47b1a524a79fe2dcf5e" "checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum sysinfo 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3e2cab189e59f72710e3dd5e1e0d5be0f6c5c999c326f2fdcdf3bf4483ec9fd" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" -"checksum termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8fb22f7cde82c8220e5aeacb3258ed7ce996142c77cba193f203515e26c330" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" @@ -6342,7 +6296,7 @@ dependencies = [ "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-rustls 0.10.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e5cebc3ca33110e460c4d2e7c5e863b159fadcbf125449d896720695b2af709" "checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" "checksum tokio-threadpool 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "90ca01319dea1e376a001e8dc192d42ebde6dd532532a5bad988ac37db365b19" @@ -6357,12 +6311,12 @@ dependencies = [ "checksum trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "226f4b2e7bc6a71172ffe7f137385cf63833de7c684059dde7520ddbf1fb04f4" "checksum trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b65b79aee5dcdcc7247fdd811f7e26b47e65ecc17f776ecf5db8e8fd46db3b54" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum trybuild 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b7592bfd3449da952920cb55618d55f34779293127f76d946c4a54f258ca87b8" +"checksum trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2e8e773ac21d176ee05243456b9f1a942cd1a586dab188ced05b8e8d58dc635" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7834480552ffc48e1930ceddd701f47d2234319d80b7bcbbe2fe7202933c101" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" -"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +"checksum ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa9b3b49edd3468c0e6565d85783f51af95212b6fa3986a5500954f00b460874" "checksum uint 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5375d2c574f89adad4108ad525c93e39669853a602560bf5ed4ca9943b10799" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" @@ -6382,23 +6336,23 @@ dependencies = [ "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "74e463a508e390cc7447e70f640fbf44ad52e1bd095314ace1fdf99516d32add" "checksum wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a6265b25719e82598d104b3717375e37661d41753e2c84cde3f51050c7ed7e3c" -"checksum walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c7904a7e2bb3cdf0cf5e783f44204a85a37a93151738fa349f06680f59a98b45" +"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -"checksum wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "22029998cc650473cb05f10f19c06a1536b9e1f1572e4f5dacd45ab4d3f85877" -"checksum wasm-bindgen-backend 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "6f858ff3cb4196c702e8c24b75fba1d3ab46958de4f7c253627f0507aae1507c" -"checksum wasm-bindgen-futures 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "cc16facd42fc3d0fa0cae78b39516bac04496cf80518fd09bbfa33e9b0e9c92d" -"checksum wasm-bindgen-macro 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "15c29f04eb117312931e7b02878453ee63d67a6f291797651890128bf5ee71db" -"checksum wasm-bindgen-macro-support 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "92b1356b623816248dfe0e2c4b7e113618d647808907ff6a3d9838ebee8e82ee" -"checksum wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "15de16ddb30cfd424a87598b30021491bae1607d32e52056979865c98b7913b4" -"checksum wasm-bindgen-webidl 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "21724123084234fff2f986018b790afc5d6f45c9a3903025e6c55d0068cb7d15" +"checksum wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "4de97fa1806bb1a99904216f6ac5e0c050dc4f8c676dc98775047c38e5c01b55" +"checksum wasm-bindgen-backend 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "5d82c170ef9f5b2c63ad4460dfcee93f3ec04a9a36a4cc20bc973c39e59ab8e3" +"checksum wasm-bindgen-futures 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "73c25810ee684c909488c214f55abcbc560beb62146d352b9588519e73c2fed9" +"checksum wasm-bindgen-macro 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f07d50f74bf7a738304f6b8157f4a581e1512cd9e9cdb5baad8c31bbe8ffd81d" +"checksum wasm-bindgen-macro-support 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "95cf8fe77e45ba5f91bc8f3da0c3aa5d464b3d8ed85d84f4d4c7cc106436b1d7" +"checksum wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c2d4d4756b2e46d3a5422e06277d02e4d3e1d62d138b76a4c681e925743623" +"checksum wasm-bindgen-webidl 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "24e47859b4eba3d3b9a5c2c299f9d6f8d0b613671315f6f0c5c7f835e524b36a" "checksum wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6101df9a5987df809216bdda7289f52b58128e6b6a6546e9ee3e6b632b4921" "checksum wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48437c526d40a6a593c50c5367dac825b8d6a04411013e866eca66123fb56faa" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" -"checksum web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "22306ce642c58266cb5c5938150194911322bc179aa895146076217410ddbc82" +"checksum web-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "86d515d2f713d3a6ab198031d2181b7540f8e319e4637ec2d4a41a208335ef29" "checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" "checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" -"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" +"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" -- GitLab From 0076250373e5af8ad4bff129c26a970d1d5c36f3 Mon Sep 17 00:00:00 2001 From: TriplEight Date: Fri, 26 Jul 2019 19:15:15 +0200 Subject: [PATCH 046/151] Fixed debug flags (#3215) * fixed debug flags * test everything works * test everything works 2 * sections are rewritten * everything works --- .gitlab-ci.yml | 97 +++++++++++++++++--------------------------------- 1 file changed, 33 insertions(+), 64 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f7d668b9b9..bd0fd9f08f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -172,13 +172,11 @@ test-linux-stable-int: expire_in: 24 hrs paths: - ${CI_COMMIT_SHORT_SHA}_int_failure.log - allow_failure: true check-web-wasm: stage: test <<: *docker-env - allow_failure: true except: - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 script: @@ -216,11 +214,11 @@ check-web-wasm: #### stage: build -build-linux-release: +build-linux-substrate: stage: build <<: *collect-artifacts <<: *docker-env - # debug <<: *build-only + <<: *build-only except: variables: - $DEPLOY_TAG @@ -233,8 +231,8 @@ build-linux-release: echo "${CI_COMMIT_TAG}" | tee ./artifacts/substrate/VERSION; else ./artifacts/substrate/substrate --version | - sed -n -r 's/^substrate ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p' | - tee ./artifacts/substrate/VERSION; + sed -n -r 's/^substrate ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p' | + tee ./artifacts/substrate/VERSION; fi - sha256sum ./artifacts/substrate/substrate | tee ./artifacts/substrate/substrate.sha256 - printf '\n# building node-template\n\n' @@ -246,7 +244,7 @@ build-linux-subkey: stage: build <<: *collect-artifacts <<: *docker-env - # debug <<: *build-only + <<: *build-only except: variables: - $DEPLOY_TAG @@ -260,7 +258,7 @@ build-linux-subkey: - echo -n "Subkey version = " - ./artifacts/subkey/subkey --version | sed -n -r 's/^subkey ([0-9.]+.*)/\1/p' | - tee ./artifacts/subkey/VERSION; + tee ./artifacts/subkey/VERSION; - sha256sum ./artifacts/subkey/subkey | tee ./artifacts/subkey/subkey.sha256 - cp -r scripts/docker/subkey.Dockerfile ./artifacts/subkey/ - sccache -s @@ -268,7 +266,6 @@ build-linux-subkey: build-rust-doc-release: stage: build <<: *docker-env - allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" @@ -286,100 +283,72 @@ build-rust-doc-release: #### stage: publish -.publish-build: &publish-build - stage: publish - dependencies: - - build-linux-release - - build-linux-subkey +.publish-docker-release: &publish-docker-release <<: *build-only <<: *kubernetes-build - -publish-docker-substrate: &publish-docker-release - # debug <<: *publish-build - stage: publish - dependencies: - - build-linux-release - <<: *kubernetes-build - # debug image: docker:stable services: - docker:dind - # collect VERSION artifact here to pass it on to kubernetes - <<: *collect-artifacts - variables: - DOCKER_HOST: tcp://localhost:2375 - DOCKER_DRIVER: overlay2 - GIT_STRATEGY: none - # DOCKERFILE: scripts/docker/substrate.Dockerfile - CONTAINER_IMAGE: parity/substrate before_script: - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" || ( echo "no docker credentials provided"; exit 1 ) - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" - docker info script: - - cd ./artifacts/substrate/ + - cd ./artifacts/$PRODUCT/ - VERSION="$(cat ./VERSION)" - - echo "Substrate version = ${VERSION}" + - echo "${PRODUCT} version = ${VERSION}" - test -z "${VERSION}" && exit 1 - docker build --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest - --file substrate.Dockerfile . + --file $DOCKERFILE . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest + +publish-docker-substrate: + stage: publish + <<: *publish-docker-release + # collect VERSION artifact here to pass it on to kubernetes + <<: *collect-artifacts + dependencies: + - build-linux-substrate + variables: + DOCKER_HOST: tcp://localhost:2375 + DOCKER_DRIVER: overlay2 + GIT_STRATEGY: none + PRODUCT: substrate + DOCKERFILE: $PRODUCT.Dockerfile + CONTAINER_IMAGE: parity/$PRODUCT after_script: - docker logout # only VERSION information is needed for the deployment - find ./artifacts/ -depth -not -name VERSION -type f -delete publish-docker-subkey: - # debug <<: *publish-docker-release stage: publish + <<: *publish-docker-release dependencies: - build-linux-subkey - # debug <<: *build-only - <<: *kubernetes-build - image: docker:stable - services: - - docker:dind variables: DOCKER_HOST: tcp://localhost:2375 DOCKER_DRIVER: overlay2 GIT_STRATEGY: none - # DOCKERFILE: scripts/docker/subkey.Dockerfile - CONTAINER_IMAGE: parity/subkey - before_script: - - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" - || ( echo "no docker credentials provided"; exit 1 ) - - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" - - docker info - script: - - cd ./artifacts/subkey/ - - VERSION="$(cat ./VERSION)" - - echo "Subkey version = ${VERSION}" - - test -z "${VERSION}" && exit 1 - - docker build - --build-arg VCS_REF="${CI_COMMIT_SHA}" - --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" - --tag $CONTAINER_IMAGE:$VERSION - --tag $CONTAINER_IMAGE:latest - --file subkey.Dockerfile . - - docker push $CONTAINER_IMAGE:$VERSION - - docker push $CONTAINER_IMAGE:latest + PRODUCT: subkey + DOCKERFILE: $PRODUCT.Dockerfile + CONTAINER_IMAGE: parity/$PRODUCT after_script: - docker logout publish-s3-release: - # debug <<: *publish-build stage: publish + <<: *build-only + <<: *kubernetes-build dependencies: - - build-linux-release + - build-linux-substrate - build-linux-subkey - <<: *kubernetes-build - # debug image: parity/awscli:latest variables: GIT_STRATEGY: none @@ -531,7 +500,7 @@ deploy-ue1-tag: .validator-deploy: &validator-deploy stage: flaming-fir dependencies: - - build-linux-release + - build-linux-substrate image: parity/azure-ansible:v1 allow_failure: true when: manual -- GitLab From bdc96e124dfcdd244d72425b4e4a5d5d77c757a8 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sat, 27 Jul 2019 15:41:22 +0200 Subject: [PATCH 047/151] Minor cleanup in native_executor.rs (#3218) * Minor cleanup in native_executor.rs * Fix tests --- core/client/src/genesis.rs | 6 +++--- core/client/src/light/call_executor.rs | 4 ++-- core/client/src/light/fetcher.rs | 20 ++++++++++---------- core/executor/src/native_executor.rs | 18 +++++++----------- node/executor/src/lib.rs | 14 +++++++------- 5 files changed, 29 insertions(+), 33 deletions(-) diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index de2563045e..b577d1c8a7 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -41,7 +41,7 @@ pub fn construct_genesis_block< mod tests { use super::*; use parity_codec::{Encode, Decode, Joiner}; - use executor::{NativeExecutionDispatch, native_executor_instance}; + use executor::native_executor_instance; use state_machine::{self, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage}; use state_machine::backend::InMemory; use test_client::{ @@ -61,7 +61,7 @@ mod tests { ); fn executor() -> executor::NativeExecutor { - NativeExecutionDispatch::new(None) + executor::NativeExecutor::new(None) } fn construct_block( @@ -226,7 +226,7 @@ mod tests { Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, - &Executor::new(None), + &executor(), "Core_execute_block", &b1data, ).execute( diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index faa7c10def..f164c17659 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -481,7 +481,7 @@ pub fn check_execution_proof( mod tests { use consensus::BlockOrigin; use test_client::{self, runtime::Header, ClientExt, TestClient}; - use executor::NativeExecutionDispatch; + use executor::NativeExecutor; use crate::backend::{Backend, NewBlockState}; use crate::in_mem::Backend as InMemBackend; use crate::light::fetcher::tests::OkCallFetcher; @@ -502,7 +502,7 @@ mod tests { ).unwrap(); // check remote execution proof locally - let local_executor = test_client::LocalExecutor::new(None); + let local_executor = NativeExecutor::::new(None); let local_result = check_execution_proof(&local_executor, &RemoteCallRequest { block: test_client::runtime::Hash::default(), header: test_client::runtime::Header { diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index dd718001cd..5d754a137b 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -488,7 +488,7 @@ pub mod tests { use parking_lot::Mutex; use parity_codec::Decode; use crate::client::tests::prepare_client_with_key_changes; - use executor::{self, NativeExecutionDispatch}; + use executor::{self, NativeExecutor}; use crate::error::Error as ClientError; use test_client::{ self, ClientExt, blockchain::HeaderBackend, AccountKeyring, @@ -578,7 +578,7 @@ pub mod tests { None, crate::backend::NewBlockState::Final, ).unwrap(); - let local_executor = test_client::LocalExecutor::new(None); + let local_executor = NativeExecutor::::new(None); let local_checker = LightDataChecker::new(Arc::new(DummyBlockchain::new(DummyStorage::new())), local_executor); (local_checker, remote_block_header, remote_read_proof, heap_pages) } @@ -604,7 +604,7 @@ pub mod tests { if insert_cht { local_storage.insert_cht_root(1, local_cht_root); } - let local_executor = test_client::LocalExecutor::new(None); + let local_executor = NativeExecutor::::new(None); let local_checker = LightDataChecker::new(Arc::new(DummyBlockchain::new(DummyStorage::new())), local_executor); (local_checker, local_cht_root, remote_block_header, remote_header_proof) } @@ -665,7 +665,7 @@ pub mod tests { let (remote_client, local_roots, test_cases) = prepare_client_with_key_changes(); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let local_checker = &local_checker as &dyn FetchChecker; let max = remote_client.info().chain.best_number; @@ -733,7 +733,7 @@ pub mod tests { local_storage.changes_tries_cht_roots.insert(0, local_cht_root); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(local_storage)), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); // check proof on local client @@ -761,7 +761,7 @@ pub mod tests { let (remote_client, local_roots, test_cases) = prepare_client_with_key_changes(); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let local_checker = &local_checker as &dyn FetchChecker; let max = remote_client.info().chain.best_number; @@ -842,7 +842,7 @@ pub mod tests { // fails when changes trie CHT is missing from the local db let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, remote_proof.roots_proof.clone()).is_err()); @@ -852,7 +852,7 @@ pub mod tests { local_storage.changes_tries_cht_roots.insert(0, local_cht_root); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(local_storage)), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, vec![]).is_err()); } @@ -866,7 +866,7 @@ pub mod tests { let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let body_request = RemoteBodyRequest { @@ -889,7 +889,7 @@ pub mod tests { let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let body_request = RemoteBodyRequest { diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index f295671209..10010ef166 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -52,16 +52,11 @@ pub trait NativeExecutionDispatch: Send + Sync { /// Get the wasm code that the native dispatch will be equivalent to. fn native_equivalent() -> &'static [u8]; - /// Dispatch a method and input data to be executed natively. Returns `Some` result or `None` - /// if the `method` is unknown. Panics if there's an unrecoverable error. - // fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; + /// Dispatch a method and input data to be executed natively. fn dispatch(ext: &mut dyn Externalities, method: &str, data: &[u8]) -> Result>; /// Provide native runtime version. fn native_version() -> NativeVersion; - - /// Construct corresponding `NativeExecutor` - fn new(default_heap_pages: Option) -> NativeExecutor where Self: Sized; } /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence @@ -222,7 +217,12 @@ macro_rules! native_executor_instance { // get a proper build script, this must be strictly adhered to or things will go wrong. $code } - fn dispatch(ext: &mut $crate::Externalities<$crate::Blake2Hasher>, method: &str, data: &[u8]) -> $crate::error::Result> { + + fn dispatch( + ext: &mut $crate::Externalities<$crate::Blake2Hasher>, + method: &str, + data: &[u8] + ) -> $crate::error::Result> { $crate::with_native_environment(ext, move || $dispatcher(method, data))? .ok_or_else(|| $crate::error::Error::MethodNotFound(method.to_owned())) } @@ -230,10 +230,6 @@ macro_rules! native_executor_instance { fn native_version() -> $crate::NativeVersion { $version() } - - fn new(default_heap_pages: Option) -> $crate::NativeExecutor<$name> { - $crate::NativeExecutor::new(default_heap_pages) - } } } } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 93e31ef6fc..6eba1022b2 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -39,7 +39,7 @@ mod tests { use super::Executor; use {balances, contracts, indices, staking, system, timestamp}; use runtime_io; - use substrate_executor::{WasmExecutor, NativeExecutionDispatch}; + use substrate_executor::WasmExecutor; use parity_codec::{Encode, Decode, Joiner}; use keyring::{AccountKeyring, Ed25519Keyring, Sr25519Keyring}; use runtime_support::{Hashable, StorageValue, StorageMap, assert_eq_error_rate, traits::Currency}; @@ -422,7 +422,7 @@ mod tests { }; // execute the block to get the real header. - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( env, "Core_initialize_block", &header.encode(), @@ -431,7 +431,7 @@ mod tests { ).0.unwrap(); for i in extrinsics.iter() { - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( env, "BlockBuilder_apply_extrinsic", &i.encode(), @@ -440,7 +440,7 @@ mod tests { ).0.unwrap(); } - let header = match Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + let header = match executor().call::<_, NeverNativeValue, fn() -> _>( env, "BlockBuilder_finalize_block", &[0u8;0], @@ -846,7 +846,7 @@ mod tests { fn native_big_block_import_succeeds() { let mut t = new_test_ext(COMPACT_CODE, false); - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", &block_with_size(42, 0, 120_000).0, @@ -860,7 +860,7 @@ mod tests { let mut t = new_test_ext(COMPACT_CODE, false); assert!( - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", &block_with_size(42, 0, 120_000).0, @@ -926,7 +926,7 @@ mod tests { let block = Block::decode(&mut &block_data[..]).unwrap(); let mut t = new_test_ext(COMPACT_CODE, true); - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", &block.encode(), -- GitLab From a08d7ce16be7e2b374c68c69ade7fb699ce8ba9f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sun, 28 Jul 2019 02:24:51 +0200 Subject: [PATCH 048/151] Clean up the basic-authorship crate (#3206) * Switch consensus-common to new futures * Fix tests * More tests fixing * Make Proposer, OnSlot and SyncOracle mut * Make the Environment mut as well * Fix test * Fix Babe tests * Babe fixes * Fix CLI service tests * Fix Babe tests * Remove unnecessary trait bound * Inline the code of BlockBuilder and AuthoringApi * Remove warning lint * Bounds simplification * Imports simplification * Don't panic on bad generated block * Code style * Add doc example * Remove dependency on aura * Order dependencies alphabetically * Minor style --- Cargo.lock | 1 - core/basic-authorship/Cargo.toml | 13 +- core/basic-authorship/src/basic_authorship.rs | 268 +++++++----------- core/basic-authorship/src/lib.rs | 41 ++- core/consensus/aura/src/lib.rs | 17 +- core/consensus/babe/src/lib.rs | 9 +- core/consensus/babe/src/tests.rs | 10 +- core/consensus/common/src/lib.rs | 24 +- core/consensus/rhd/src/lib.rs | 2 +- core/consensus/slots/src/lib.rs | 6 +- core/network/src/service.rs | 17 +- node-template/src/service.rs | 4 +- node/cli/src/service.rs | 10 +- 13 files changed, 203 insertions(+), 219 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f77a7f38f..e1d9a49793 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4165,7 +4165,6 @@ dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index ca6e4f0b8a..955677faf0 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -5,17 +5,16 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -log = "0.4" -futures-preview = "0.3.0-alpha.17" -codec = { package = "parity-codec", version = "4.1.1" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } client = { package = "substrate-client", path = "../../core/client" } -aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives" } +codec = { package = "parity-codec", version = "4.1.1" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } -primitives = { package = "substrate-primitives", path = "../../core/primitives" } +futures-preview = "0.3.0-alpha.17" inherents = { package = "substrate-inherents", path = "../inherents" } -transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } +log = "0.4" +primitives = { package = "substrate-primitives", path = "../../core/primitives" } +runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } substrate-telemetry = { path = "../telemetry" } +transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } [dev-dependencies] test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 00408a1545..d7450e4287 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -18,101 +18,25 @@ // FIXME #1021 move this into substrate-consensus-common // -use std::{self, time, sync::Arc}; - -use log::{info, debug, trace}; +use std::{time, sync::Arc}; use client::{ - self, error, Client as SubstrateClient, CallExecutor, - block_builder::api::BlockBuilder as BlockBuilderApi, runtime_api::Core, + error, Client as SubstrateClient, CallExecutor, + block_builder::api::BlockBuilder as BlockBuilderApi, }; use codec::Decode; -use consensus_common::{self, evaluation}; +use consensus_common::{evaluation}; +use inherents::InherentData; +use log::{error, info, debug, trace}; use primitives::{H256, Blake2Hasher, ExecutionContext}; +use runtime_primitives::{ApplyError, generic::BlockId}; use runtime_primitives::traits::{ Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, - DigestFor, + DigestFor, BlakeTwo256, }; -use runtime_primitives::generic::BlockId; -use runtime_primitives::ApplyError; use transaction_pool::txpool::{self, Pool as TransactionPool}; -use inherents::InherentData; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; -/// Build new blocks. -pub trait BlockBuilder { - /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. - fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error>; -} - -/// Local client abstraction for the consensus. -pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where - ::Api: Core -{ - /// The block used for this API type. - type Block: BlockT; - /// The error used by this API type. - type Error: std::error::Error; - - /// Build a block on top of the given block, with inherent extrinsics and - /// inherent digests pre-pushed. - fn build_block) -> ()>( - &self, - at: &BlockId, - inherent_data: InherentData, - inherent_digests: DigestFor, - build_ctx: F, - ) -> Result; -} - -impl<'a, B, E, Block, RA> BlockBuilder - for client::block_builder::BlockBuilder<'a, Block, SubstrateClient> -where - B: client::backend::Backend + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient : ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: BlockBuilderApi, -{ - fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error> { - client::block_builder::BlockBuilder::push(self, extrinsic).map_err(Into::into) - } -} - -impl AuthoringApi for SubstrateClient where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient : ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: BlockBuilderApi, -{ - type Block = Block; - type Error = client::error::Error; - - fn build_block) -> ()>( - &self, - at: &BlockId, - inherent_data: InherentData, - inherent_digests: DigestFor, - mut build_ctx: F, - ) -> Result { - - let mut block_builder = self.new_block_at(at, inherent_digests)?; - - let runtime_api = self.runtime_api(); - // We don't check the API versions any further here since the dispatch compatibility - // check should be enough. - runtime_api.inherent_extrinsics_with_context(at, ExecutionContext::BlockConstruction, inherent_data)? - .into_iter().try_for_each(|i| block_builder.push(i))?; - - build_ctx(&mut block_builder); - - block_builder.bake().map_err(Into::into) - } -} - /// Proposer factory. pub struct ProposerFactory where A: txpool::ChainApi { /// The client instance. @@ -121,19 +45,23 @@ pub struct ProposerFactory where A: txpool::ChainApi { pub transaction_pool: Arc>, } -impl consensus_common::Environment<::Block> for ProposerFactory where - C: AuthoringApi, - ::Api: BlockBuilderApi<::Block>, - A: txpool::ChainApi::Block>, - client::error::Error: From<::Error>, - Proposer<::Block, C, A>: consensus_common::Proposer<::Block>, +impl consensus_common::Environment for +ProposerFactory, A> +where + A: txpool::ChainApi, + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilderApi, { - type Proposer = Proposer<::Block, C, A>; + type Proposer = Proposer, A>; type Error = error::Error; fn init( - &self, - parent_header: &<::Block as BlockT>::Header, + &mut self, + parent_header: &::Header, ) -> Result { let parent_hash = parent_header.hash(); @@ -164,18 +92,22 @@ pub struct Proposer { now: Box time::Instant>, } -impl consensus_common::Proposer<::Block> for Proposer where - Block: BlockT, - C: AuthoringApi, - ::Api: BlockBuilderApi, +impl consensus_common::Proposer for +Proposer, A> +where A: txpool::ChainApi, - client::error::Error: From<::Error> + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilderApi, { - type Create = futures::future::Ready::Block, error::Error>>; + type Create = futures::future::Ready>; type Error = error::Error; fn propose( - &self, + &mut self, inherent_data: InherentData, inherent_digests: DigestFor, max_duration: time::Duration, @@ -186,80 +118,89 @@ impl consensus_common::Proposer<::Block> for Pro } } -impl Proposer where - Block: BlockT, - C: AuthoringApi, - ::Api: BlockBuilderApi, +impl Proposer, A> where A: txpool::ChainApi, - client::error::Error: From<::Error>, + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilderApi, { fn propose_with( &self, inherent_data: InherentData, inherent_digests: DigestFor, deadline: time::Instant, - ) -> Result<::Block, error::Error> - { - use runtime_primitives::traits::BlakeTwo256; - + ) -> Result { /// If the block is full we will attempt to push at most /// this number of transactions before quitting for real. /// It allows us to increase block utilization. const MAX_SKIPPED_TRANSACTIONS: usize = 8; - let block = self.client.build_block( - &self.parent_id, - inherent_data, - inherent_digests.clone(), - |block_builder| { - // proceed with transactions - let mut is_first = true; - let mut skipped = 0; - let mut unqueue_invalid = Vec::new(); - let pending_iterator = self.transaction_pool.ready(); - - debug!("Attempting to push transactions from the pool."); - for pending in pending_iterator { - if (self.now)() > deadline { - debug!("Consensus deadline reached when pushing block transactions, proceeding with proposing."); + let mut block_builder = self.client.new_block_at(&self.parent_id, inherent_digests)?; + + // We don't check the API versions any further here since the dispatch compatibility + // check should be enough. + for extrinsic in self.client.runtime_api() + .inherent_extrinsics_with_context( + &self.parent_id, + ExecutionContext::BlockConstruction, + inherent_data + )? + { + block_builder.push(extrinsic)?; + } + + // proceed with transactions + let mut is_first = true; + let mut skipped = 0; + let mut unqueue_invalid = Vec::new(); + let pending_iterator = self.transaction_pool.ready(); + + debug!("Attempting to push transactions from the pool."); + for pending in pending_iterator { + if (self.now)() > deadline { + debug!("Consensus deadline reached when pushing block transactions, proceeding with proposing."); + break; + } + + trace!("[{:?}] Pushing to the block.", pending.hash); + match client::block_builder::BlockBuilder::push(&mut block_builder, pending.data.clone()) { + Ok(()) => { + debug!("[{:?}] Pushed to the block.", pending.hash); + } + Err(error::Error::ApplyExtrinsicFailed(ApplyError::FullBlock)) => { + if is_first { + debug!("[{:?}] Invalid transaction: FullBlock on empty block", pending.hash); + unqueue_invalid.push(pending.hash.clone()); + } else if skipped < MAX_SKIPPED_TRANSACTIONS { + skipped += 1; + debug!( + "Block seems full, but will try {} more transactions before quitting.", + MAX_SKIPPED_TRANSACTIONS - skipped + ); + } else { + debug!("Block is full, proceed with proposing."); break; } + } + Err(e) => { + debug!("[{:?}] Invalid transaction: {}", pending.hash, e); + unqueue_invalid.push(pending.hash.clone()); + } + } - trace!("[{:?}] Pushing to the block.", pending.hash); - match block_builder.push_extrinsic(pending.data.clone()) { - Ok(()) => { - debug!("[{:?}] Pushed to the block.", pending.hash); - } - Err(error::Error::ApplyExtrinsicFailed(ApplyError::FullBlock)) => { - if is_first { - debug!("[{:?}] Invalid transaction: FullBlock on empty block", pending.hash); - unqueue_invalid.push(pending.hash.clone()); - } else if skipped < MAX_SKIPPED_TRANSACTIONS { - skipped += 1; - debug!( - "Block seems full, but will try {} more transactions before quitting.", - MAX_SKIPPED_TRANSACTIONS - skipped - ); - } else { - debug!("Block is full, proceed with proposing."); - break; - } - } - Err(e) => { - debug!("[{:?}] Invalid transaction: {}", pending.hash, e); - unqueue_invalid.push(pending.hash.clone()); - } - } + is_first = false; + } - is_first = false; - } + self.transaction_pool.remove_invalid(&unqueue_invalid); - self.transaction_pool.remove_invalid(&unqueue_invalid); - })?; + let block = block_builder.bake()?; info!("Prepared block for proposing at {} [hash: {:?}; parent_hash: {}; extrinsics: [{}]]", block.header().number(), - <::Block as BlockT>::Hash::from(block.header().hash()), + ::Hash::from(block.header().hash()), block.header().parent_hash(), block.extrinsics() .iter() @@ -269,19 +210,18 @@ impl Proposer where ); telemetry!(CONSENSUS_INFO; "prepared_block_for_proposing"; "number" => ?block.header().number(), - "hash" => ?<::Block as BlockT>::Hash::from(block.header().hash()), + "hash" => ?::Hash::from(block.header().hash()), ); - let substrate_block = Decode::decode(&mut block.encode().as_slice()) - .expect("blocks are defined to serialize to substrate blocks correctly; qed"); + if Decode::decode(&mut block.encode().as_slice()).as_ref() != Some(&block) { + error!("Failed to verify block encoding/decoding"); + } - assert!(evaluation::evaluate_initial( - &substrate_block, - &self.parent_hash, - self.parent_number, - ).is_ok()); + if let Err(err) = evaluation::evaluate_initial(&block, &self.parent_hash, self.parent_number) { + error!("Failed to evaluate authored block: {:?}", err); + } - Ok(substrate_block) + Ok(block) } } @@ -311,7 +251,7 @@ mod tests { txpool.submit_at(&BlockId::number(0), vec![extrinsic(0), extrinsic(1)]).unwrap(); - let proposer_factory = ProposerFactory { + let mut proposer_factory = ProposerFactory { client: client.clone(), transaction_pool: txpool.clone(), }; diff --git a/core/basic-authorship/src/lib.rs b/core/basic-authorship/src/lib.rs index 88a55c3bac..e579dadd83 100644 --- a/core/basic-authorship/src/lib.rs +++ b/core/basic-authorship/src/lib.rs @@ -15,9 +15,44 @@ // along with Substrate. If not, see . //! Basic implementation of block-authoring logic. - -#![warn(unused_extern_crates)] +//! +//! # Example +//! +//! ``` +//! # use substrate_basic_authorship::ProposerFactory; +//! # use consensus_common::{Environment, Proposer}; +//! # use runtime_primitives::generic::BlockId; +//! # use std::{sync::Arc, time::Duration}; +//! # use test_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; +//! # use transaction_pool::txpool::{self, Pool as TransactionPool}; +//! # let client = Arc::new(test_client::new()); +//! # let chain_api = transaction_pool::ChainApi::new(client.clone()); +//! # let txpool = Arc::new(TransactionPool::new(Default::default(), chain_api)); +//! // The first step is to create a `ProposerFactory`. +//! let mut proposer_factory = ProposerFactory { +//! client: client.clone(), +//! transaction_pool: txpool.clone(), +//! }; +//! +//! // From this factory, we create a `Proposer`. +//! let mut proposer = proposer_factory.init( +//! &client.header(&BlockId::number(0)).unwrap().unwrap(), +//! ).unwrap(); +//! +//! // This `Proposer` allows us to create a block proposition. +//! // The proposer will grab transactions from the transaction pool, and put them into the block. +//! let future = proposer.propose( +//! Default::default(), +//! Default::default(), +//! Duration::from_secs(2) +//! ); +//! +//! // We wait until the proposition is performed. +//! let block = futures::executor::block_on(future).unwrap(); +//! println!("Generated block: {:?}", block); +//! ``` +//! mod basic_authorship; -pub use crate::basic_authorship::{ProposerFactory, BlockBuilder, AuthoringApi, Proposer}; +pub use crate::basic_authorship::{ProposerFactory, Proposer}; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 485d4c78d0..1dd644b751 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -135,7 +135,7 @@ pub fn start_aura( client: Arc, select_chain: SC, block_import: I, - env: Arc, + env: E, sync_oracle: SO, inherent_data_providers: InherentDataProviders, force_authoring: bool, @@ -180,7 +180,7 @@ pub fn start_aura( struct AuraWorker { client: Arc, block_import: Arc>, - env: Arc, + env: E, local_key: Arc

, sync_oracle: SO, force_authoring: bool, @@ -204,7 +204,7 @@ impl SlotWorker for AuraWorker w type OnSlot = Pin> + Send>>; fn on_slot( - &self, + &mut self, chain_head: B::Header, slot_info: SlotInfo, ) -> Self::OnSlot { @@ -212,7 +212,6 @@ impl SlotWorker for AuraWorker w let public_key = self.local_key.public(); let client = self.client.clone(); let block_import = self.block_import.clone(); - let env = self.env.clone(); let (timestamp, slot_num, slot_duration) = (slot_info.timestamp, slot_info.number, slot_info.duration); @@ -253,7 +252,7 @@ impl SlotWorker for AuraWorker w ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head) { + let mut proposer = match self.env.init(&chain_head) { Ok(p) => p, Err(e) => { warn!("Unable to author block in slot {:?}: {:?}", slot_num, e); @@ -742,7 +741,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header) + fn init(&mut self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -754,7 +753,7 @@ mod tests { type Create = future::Ready>; fn propose( - &self, + &mut self, _: InherentData, digests: DigestFor, _: Duration, @@ -841,7 +840,7 @@ mod tests { let select_chain = LongestChain::new( client.backend().clone(), ); - let environ = Arc::new(DummyFactory(client.clone())); + let environ = DummyFactory(client.clone()); import_notifications.push( client.import_notification_stream() .take_while(|n| future::ready(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) @@ -862,7 +861,7 @@ mod tests { client.clone(), select_chain, client, - environ.clone(), + environ, DummyOracle, inherent_data_providers, false, diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 38b6257c8a..4f5f9856ff 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -154,7 +154,7 @@ pub struct BabeParams { pub block_import: I, /// The environment - pub env: Arc, + pub env: E, /// A sync oracle pub sync_oracle: SO, @@ -220,7 +220,7 @@ pub fn start_babe(BabeParams { struct BabeWorker { client: Arc, block_import: Arc>, - env: Arc, + env: E, local_key: Arc, sync_oracle: SO, force_authoring: bool, @@ -245,14 +245,13 @@ impl SlotWorker for BabeWorker w type OnSlot = Pin> + Send>>; fn on_slot( - &self, + &mut self, chain_head: B::Header, slot_info: SlotInfo, ) -> Self::OnSlot { let pair = self.local_key.clone(); let ref client = self.client; let block_import = self.block_import.clone(); - let ref env = self.env; let (timestamp, slot_number, slot_duration) = (slot_info.timestamp, slot_info.number, slot_info.duration); @@ -305,7 +304,7 @@ impl SlotWorker for BabeWorker w ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head) { + let mut proposer = match self.env.init(&chain_head) { Ok(p) => p, Err(e) => { warn!(target: "babe", diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index 1a68c35dbe..700ef690f3 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -52,7 +52,7 @@ impl Environment for DummyFactory { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header) + fn init(&mut self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -64,7 +64,7 @@ impl Proposer for DummyProposer { type Create = future::Ready>; fn propose( - &self, + &mut self, _: InherentData, digests: DigestFor, _: Duration, @@ -199,7 +199,7 @@ fn run_one_test() { let mut runtime = current_thread::Runtime::new().unwrap(); for (peer_id, key) in peers { let client = net.lock().peer(*peer_id).client().as_full().unwrap(); - let environ = Arc::new(DummyFactory(client.clone())); + let environ = DummyFactory(client.clone()); import_notifications.push( client.import_notification_stream() .take_while(|n| future::ready(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) @@ -224,7 +224,7 @@ fn run_one_test() { block_import: client.clone(), select_chain, client, - env: environ.clone(), + env: environ, sync_oracle: DummyOracle, inherent_data_providers, force_authoring: false, @@ -236,7 +236,7 @@ fn run_one_test() { net.lock().poll(); Ok::<_, ()>(futures01::Async::NotReady::<()>) })); - + runtime.block_on(future::join_all(import_notifications) .map(|_| Ok::<(), ()>(())).compat()).unwrap(); } diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index d901610df9..53816752b1 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -61,7 +61,7 @@ pub trait Environment { /// Initialize the proposal logic on top of a specific header. Provide /// the authorities at that header. - fn init(&self, parent_header: &B::Header) + fn init(&mut self, parent_header: &B::Header) -> Result; } @@ -78,7 +78,7 @@ pub trait Proposer { type Create: Future>; /// Create a proposal. fn propose( - &self, + &mut self, inherent_data: InherentData, inherent_digests: DigestFor, max_duration: Duration, @@ -92,10 +92,10 @@ pub trait Proposer { pub trait SyncOracle { /// Whether the synchronization service is undergoing major sync. /// Returns true if so. - fn is_major_syncing(&self) -> bool; + fn is_major_syncing(&mut self) -> bool; /// Whether the synchronization service is offline. /// Returns true if so. - fn is_offline(&self) -> bool; + fn is_offline(&mut self) -> bool; } /// A synchronization oracle for when there is no network. @@ -103,16 +103,18 @@ pub trait SyncOracle { pub struct NoNetwork; impl SyncOracle for NoNetwork { - fn is_major_syncing(&self) -> bool { false } - fn is_offline(&self) -> bool { false } + fn is_major_syncing(&mut self) -> bool { false } + fn is_offline(&mut self) -> bool { false } } -impl SyncOracle for Arc { - fn is_major_syncing(&self) -> bool { - T::is_major_syncing(&*self) +impl SyncOracle for Arc +where T: ?Sized, for<'r> &'r T: SyncOracle +{ + fn is_major_syncing(&mut self) -> bool { + <&T>::is_major_syncing(&mut &**self) } - fn is_offline(&self) -> bool { - T::is_offline(&*self) + fn is_offline(&mut self) -> bool { + <&T>::is_offline(&mut &**self) } } diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 4670cb5dee..281f497cbc 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -1392,7 +1392,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) + fn init(&mut self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) -> Result { Ok(DummyProposer(parent_header.number + 1)) diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 7e39d49651..4cea9d82bf 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -46,7 +46,7 @@ pub trait SlotWorker { type OnSlot: Future>; /// Called when a new slot is triggered. - fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; + fn on_slot(&mut self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; } /// Slot compatible inherent data. @@ -69,8 +69,8 @@ pub trait SlotCompatible { pub fn start_slot_worker( slot_duration: SlotDuration, client: C, - worker: W, - sync_oracle: SO, + mut worker: W, + mut sync_oracle: SO, inherent_data_providers: InherentDataProviders, timestamp_extractor: SC, ) -> impl Future diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 5b4c880c89..2075aef286 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -505,11 +505,22 @@ impl, H: ExHashT> NetworkServic impl, H: ExHashT> ::consensus::SyncOracle for NetworkService { - fn is_major_syncing(&self) -> bool { - self.is_major_syncing() + fn is_major_syncing(&mut self) -> bool { + NetworkService::is_major_syncing(self) } - fn is_offline(&self) -> bool { + fn is_offline(&mut self) -> bool { + self.num_connected.load(Ordering::Relaxed) == 0 + } +} + +impl<'a, B: BlockT + 'static, S: NetworkSpecialization, H: ExHashT> + ::consensus::SyncOracle for &'a NetworkService { + fn is_major_syncing(&mut self) -> bool { + NetworkService::is_major_syncing(self) + } + + fn is_offline(&mut self) -> bool { self.num_connected.load(Ordering::Relaxed) == 0 } } diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 2a981c3bcc..e5d83a1893 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -70,10 +70,10 @@ construct_service_factory! { |service: Self::FullService| { if let Some(key) = service.authority_key() { info!("Using authority key {}", key.public()); - let proposer = Arc::new(ProposerFactory { + let proposer = ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - }); + }; let client = service.client(); let select_chain = service.select_chain() .ok_or_else(|| ServiceError::SelectChainRequired)?; diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index aeeb8e2061..6c45f45d00 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -122,10 +122,10 @@ construct_service_factory! { if let Some(babe_key) = service.authority_key() { info!("Using BABE key {}", babe_key.public()); - let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { + let proposer = substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - }); + }; let client = service.client(); let select_chain = service.select_chain() @@ -355,10 +355,10 @@ mod tests { let parent_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); - let proposer_factory = Arc::new(substrate_basic_authorship::ProposerFactory { + let mut proposer_factory = substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - }); + }; let mut digest = Digest::::default(); @@ -381,7 +381,7 @@ mod tests { digest.push(::babe_pre_digest(babe_pre_digest)); - let proposer = proposer_factory.init(&parent_header).unwrap(); + let mut proposer = proposer_factory.init(&parent_header).unwrap(); let new_block = futures03::executor::block_on(proposer.propose( inherent_data, digest, -- GitLab From 809f70d03c467634790dc11d96cf7cfcbb842731 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 29 Jul 2019 09:29:06 +0200 Subject: [PATCH 049/151] Stop being generic over the message (#3186) --- core/network/src/custom_proto/behaviour.rs | 35 ++++----- core/network/src/custom_proto/handler.rs | 83 +++++++++++----------- core/network/src/custom_proto/mod.rs | 1 - core/network/src/custom_proto/tests.rs | 32 ++++----- core/network/src/custom_proto/upgrade.rs | 57 +++++++-------- core/network/src/protocol.rs | 12 ++-- core/network/src/protocol/message.rs | 13 ---- 7 files changed, 108 insertions(+), 125 deletions(-) diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs index 61fd9c3e7b..babd93f932 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -16,13 +16,15 @@ use crate::{DiscoveryNetBehaviour, config::ProtocolId}; use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; -use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; +use crate::custom_proto::upgrade::RegisteredProtocol; +use crate::protocol::message::Message; use fnv::FnvHashMap; use futures::prelude::*; use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt as _}; use libp2p::core::{ConnectedPoint, Multiaddr, PeerId}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use log::{debug, error, trace, warn}; +use runtime_primitives::traits::Block as BlockT; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; use std::time::{Duration, Instant}; @@ -58,9 +60,9 @@ use tokio_io::{AsyncRead, AsyncWrite}; /// Note that this "banning" system is not an actual ban. If a "banned" node tries to connect to /// us, we accept the connection. The "banning" system is only about delaying dialing attempts. /// -pub struct CustomProto { +pub struct CustomProto { /// List of protocols to open with peers. Never modified. - protocol: RegisteredProtocol, + protocol: RegisteredProtocol, /// Receiver for instructions about who to connect to or disconnect from. peerset: peerset::Peerset, @@ -77,7 +79,7 @@ pub struct CustomProto { next_incoming_index: peerset::IncomingIndex, /// Events to produce from `poll()`. - events: SmallVec<[NetworkBehaviourAction, CustomProtoOut>; 4]>, + events: SmallVec<[NetworkBehaviourAction, CustomProtoOut>; 4]>, /// Marker to pin the generics. marker: PhantomData, @@ -186,7 +188,7 @@ struct IncomingPeer { /// Event that can be emitted by the `CustomProto`. #[derive(Debug)] -pub enum CustomProtoOut { +pub enum CustomProtoOut { /// Opened a custom protocol with the remote. CustomProtocolOpen { /// Version of the protocol that has been opened. @@ -210,7 +212,7 @@ pub enum CustomProtoOut { /// Id of the peer the message came from. peer_id: PeerId, /// Message that has been received. - message: TMessage, + message: Message, }, /// The substream used by the protocol is pretty large. We should print avoid sending more @@ -219,11 +221,11 @@ pub enum CustomProtoOut { /// Id of the peer which is clogged. peer_id: PeerId, /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, + messages: Vec>, }, } -impl CustomProto { +impl CustomProto { /// Creates a `CustomProtos`. pub fn new( protocol: impl Into, @@ -347,7 +349,8 @@ impl CustomProto { /// /// Also note that even we have a valid open substream, it may in fact be already closed /// without us knowing, in which case the packet will not be received. - pub fn send_packet(&mut self, target: &PeerId, message: TMessage) { + pub fn send_packet(&mut self, target: &PeerId, message: Message) + where B: BlockT { if !self.is_open(target) { return; } @@ -603,7 +606,7 @@ impl CustomProto { } } -impl DiscoveryNetBehaviour for CustomProto { +impl DiscoveryNetBehaviour for CustomProto { fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); @@ -612,13 +615,13 @@ impl DiscoveryNetBehaviour for CustomProto NetworkBehaviour for CustomProto +impl NetworkBehaviour for CustomProto where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { - type ProtocolsHandler = CustomProtoHandlerProto; - type OutEvent = CustomProtoOut; + type ProtocolsHandler = CustomProtoHandlerProto; + type OutEvent = CustomProtoOut; fn new_handler(&mut self) -> Self::ProtocolsHandler { CustomProtoHandlerProto::new(self.protocol.clone()) @@ -816,7 +819,7 @@ where fn inject_node_event( &mut self, source: PeerId, - event: CustomProtoHandlerOut, + event: CustomProtoHandlerOut, ) { match event { CustomProtoHandlerOut::CustomProtocolClosed { reason } => { @@ -945,7 +948,7 @@ where _params: &mut impl PollParameters, ) -> Async< NetworkBehaviourAction< - CustomProtoHandlerIn, + CustomProtoHandlerIn, Self::OutEvent, >, > { diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs index 6609998242..6904d18c4b 100644 --- a/core/network/src/custom_proto/handler.rs +++ b/core/network/src/custom_proto/handler.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; -use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSubstream}; +use crate::custom_proto::upgrade::{RegisteredProtocol, RegisteredProtocolEvent, RegisteredProtocolSubstream}; +use crate::protocol::message::Message; use futures::prelude::*; use futures03::{compat::Compat, TryFutureExt as _}; use futures_timer::Delay; @@ -29,6 +29,7 @@ use libp2p::swarm::{ SubstreamProtocol, }; use log::{debug, error}; +use runtime_primitives::traits::Block as BlockT; use smallvec::{smallvec, SmallVec}; use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; @@ -87,21 +88,21 @@ use tokio_io::{AsyncRead, AsyncWrite}; /// We consider that we are now "closed" if the remote closes all the existing substreams. /// Re-opening it can then be performed by closing all active substream and re-opening one. /// -pub struct CustomProtoHandlerProto { +pub struct CustomProtoHandlerProto { /// Configuration for the protocol upgrade to negotiate. - protocol: RegisteredProtocol, + protocol: RegisteredProtocol, /// Marker to pin the generic type. marker: PhantomData, } -impl CustomProtoHandlerProto +impl CustomProtoHandlerProto where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { /// Builds a new `CustomProtoHandlerProto`. - pub fn new(protocol: RegisteredProtocol) -> Self { + pub fn new(protocol: RegisteredProtocol) -> Self { CustomProtoHandlerProto { protocol, marker: PhantomData, @@ -109,14 +110,14 @@ where } } -impl IntoProtocolsHandler for CustomProtoHandlerProto +impl IntoProtocolsHandler for CustomProtoHandlerProto where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { - type Handler = CustomProtoHandler; + type Handler = CustomProtoHandler; - fn inbound_protocol(&self) -> RegisteredProtocol { + fn inbound_protocol(&self) -> RegisteredProtocol { self.protocol.clone() } @@ -135,12 +136,12 @@ where } /// The actual handler once the connection has been established. -pub struct CustomProtoHandler { +pub struct CustomProtoHandler { /// Configuration for the protocol upgrade to negotiate. - protocol: RegisteredProtocol, + protocol: RegisteredProtocol, /// State of the communications with the remote. - state: ProtocolState, + state: ProtocolState, /// Identifier of the node we're talking to. Used only for logging purposes and shouldn't have /// any influence on the behaviour. @@ -154,15 +155,15 @@ pub struct CustomProtoHandler { /// /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. - events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, + events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, } /// State of the handler. -enum ProtocolState { +enum ProtocolState { /// Waiting for the behaviour to tell the handler whether it is enabled or disabled. Init { /// List of substreams opened by the remote but that haven't been processed yet. - substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, + substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, /// Deadline after which the initialization is abnormally long. init_deadline: Compat, }, @@ -178,9 +179,9 @@ enum ProtocolState { /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. Normal { /// The substreams where bidirectional communications happen. - substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, + substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, /// Contains substreams which are being shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, + shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, }, /// We are disabled. Contains substreams that are being closed. @@ -188,7 +189,7 @@ enum ProtocolState { /// outside or we have never sent any `CustomProtocolOpen` in the first place. Disabled { /// List of substreams to shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 6]>, + shutdown: SmallVec<[RegisteredProtocolSubstream; 6]>, /// If true, we should reactivate the handler after all the substreams in `shutdown` have /// been closed. @@ -209,7 +210,7 @@ enum ProtocolState { /// Event that can be received by a `CustomProtoHandler`. #[derive(Debug)] -pub enum CustomProtoHandlerIn { +pub enum CustomProtoHandlerIn { /// The node should start using custom protocols. Enable, @@ -219,13 +220,13 @@ pub enum CustomProtoHandlerIn { /// Sends a message through a custom protocol substream. SendCustomMessage { /// The message to send. - message: TMessage, + message: Message, }, } /// Event that can be emitted by a `CustomProtoHandler`. #[derive(Debug)] -pub enum CustomProtoHandlerOut { +pub enum CustomProtoHandlerOut { /// Opened a custom protocol with the remote. CustomProtocolOpen { /// Version of the protocol that has been opened. @@ -241,14 +242,14 @@ pub enum CustomProtoHandlerOut { /// Receives a message on a custom protocol substream. CustomMessage { /// Message that has been received. - message: TMessage, + message: Message, }, /// A substream to the remote is clogged. The send buffer is very large, and we should print /// a diagnostic message and/or avoid sending more data. Clogged { /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, + messages: Vec>, }, /// An error has happened on the protocol level with this node. @@ -260,10 +261,10 @@ pub enum CustomProtoHandlerOut { }, } -impl CustomProtoHandler +impl CustomProtoHandler where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { /// Enables the handler. fn enable(&mut self) { @@ -341,7 +342,7 @@ where /// Polls the state for events. Optionally returns an event to produce. #[must_use] fn poll_state(&mut self) - -> Option, (), CustomProtoHandlerOut>> { + -> Option, (), CustomProtoHandlerOut>> { match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", @@ -470,7 +471,7 @@ where /// Called by `inject_fully_negotiated_inbound` and `inject_fully_negotiated_outbound`. fn inject_fully_negotiated( &mut self, - mut substream: RegisteredProtocolSubstream + mut substream: RegisteredProtocolSubstream ) { self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { @@ -515,7 +516,7 @@ where } /// Sends a message to the remote. - fn send_message(&mut self, message: TMessage) { + fn send_message(&mut self, message: Message) { match self.state { ProtocolState::Normal { ref mut substreams, .. } => substreams[0].send_message(message), @@ -526,14 +527,14 @@ where } } -impl ProtocolsHandler for CustomProtoHandler -where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { - type InEvent = CustomProtoHandlerIn; - type OutEvent = CustomProtoHandlerOut; +impl ProtocolsHandler for CustomProtoHandler +where TSubstream: AsyncRead + AsyncWrite, B: BlockT { + type InEvent = CustomProtoHandlerIn; + type OutEvent = CustomProtoHandlerOut; type Substream = TSubstream; type Error = ConnectionKillError; - type InboundProtocol = RegisteredProtocol; - type OutboundProtocol = RegisteredProtocol; + type InboundProtocol = RegisteredProtocol; + type OutboundProtocol = RegisteredProtocol; type OutboundOpenInfo = (); fn listen_protocol(&self) -> SubstreamProtocol { @@ -555,7 +556,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { self.inject_fully_negotiated(proto); } - fn inject_event(&mut self, message: CustomProtoHandlerIn) { + fn inject_event(&mut self, message: CustomProtoHandlerIn) { match message { CustomProtoHandlerIn::Disable => self.disable(), CustomProtoHandlerIn::Enable => self.enable(), @@ -612,7 +613,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { } } -impl fmt::Debug for CustomProtoHandler +impl fmt::Debug for CustomProtoHandler where TSubstream: AsyncRead + AsyncWrite, { @@ -624,9 +625,9 @@ where /// Given a list of substreams, tries to shut them down. The substreams that have been successfully /// shut down are removed from the list. -fn shutdown_list - (list: &mut SmallVec>>) -where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { +fn shutdown_list + (list: &mut SmallVec>>) +where TSubstream: AsyncRead + AsyncWrite, B: BlockT { 'outer: for n in (0..list.len()).rev() { let mut substream = list.swap_remove(n); loop { diff --git a/core/network/src/custom_proto/mod.rs b/core/network/src/custom_proto/mod.rs index 22c66c1654..99f4f0183a 100644 --- a/core/network/src/custom_proto/mod.rs +++ b/core/network/src/custom_proto/mod.rs @@ -15,7 +15,6 @@ // along with Substrate. If not, see . pub use self::behaviour::{CustomProto, CustomProtoOut}; -pub use self::upgrade::CustomMessage; mod behaviour; mod handler; diff --git a/core/network/src/custom_proto/tests.rs b/core/network/src/custom_proto/tests.rs index b7e72af898..94456b1a0f 100644 --- a/core/network/src/custom_proto/tests.rs +++ b/core/network/src/custom_proto/tests.rs @@ -25,15 +25,15 @@ use libp2p::{PeerId, Multiaddr, Transport}; use rand::seq::SliceRandom; use std::{io, time::Duration, time::Instant}; use test_client::runtime::Block; -use crate::message::{Message as MessageAlias, generic::Message}; -use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage}; +use crate::message::generic::Message; +use crate::custom_proto::{CustomProto, CustomProtoOut}; /// Builds two nodes that have each other as bootstrap nodes. /// This is to be used only for testing, and a panic will happen if something goes wrong. -fn build_nodes() +fn build_nodes() -> ( - Swarm, CustomProtoWithAddr>, - Swarm, CustomProtoWithAddr> + Swarm, CustomProtoWithAddr>, + Swarm, CustomProtoWithAddr> ) { let mut out = Vec::with_capacity(2); @@ -100,29 +100,29 @@ fn build_nodes() } /// Wraps around the `CustomBehaviour` network behaviour, and adds hardcoded node addresses to it. -struct CustomProtoWithAddr { - inner: CustomProto>, +struct CustomProtoWithAddr { + inner: CustomProto>, addrs: Vec<(PeerId, Multiaddr)>, } -impl std::ops::Deref for CustomProtoWithAddr { - type Target = CustomProto>; +impl std::ops::Deref for CustomProtoWithAddr { + type Target = CustomProto>; fn deref(&self) -> &Self::Target { &self.inner } } -impl std::ops::DerefMut for CustomProtoWithAddr { +impl std::ops::DerefMut for CustomProtoWithAddr { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } -impl NetworkBehaviour for CustomProtoWithAddr { +impl NetworkBehaviour for CustomProtoWithAddr { type ProtocolsHandler = - > as NetworkBehaviour>::ProtocolsHandler; - type OutEvent = > as NetworkBehaviour>::OutEvent; + > as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = > as NetworkBehaviour>::OutEvent; fn new_handler(&mut self) -> Self::ProtocolsHandler { self.inner.new_handler() @@ -200,7 +200,7 @@ fn two_nodes_transfer_lots_of_packets() { // substreams allowed by the multiplexer. const NUM_PACKETS: u32 = 5000; - let (mut service1, mut service2) = build_nodes::>(); + let (mut service1, mut service2) = build_nodes(); let fut1 = future::poll_fn(move || -> io::Result<_> { loop { @@ -241,7 +241,7 @@ fn two_nodes_transfer_lots_of_packets() { #[test] fn basic_two_nodes_requests_in_parallel() { - let (mut service1, mut service2) = build_nodes::>(); + let (mut service1, mut service2) = build_nodes(); // Generate random messages with or without a request id. let mut to_send = { @@ -296,7 +296,7 @@ fn reconnect_after_disconnect() { // We connect two nodes together, then force a disconnect (through the API of the `Service`), // check that the disconnect worked, and finally check whether they successfully reconnect. - let (mut service1, mut service2) = build_nodes::>(); + let (mut service1, mut service2) = build_nodes(); // We use the `current_thread` runtime because it doesn't require us to have `'static` futures. let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); diff --git a/core/network/src/custom_proto/upgrade.rs b/core/network/src/custom_proto/upgrade.rs index 4cb6cb5dd9..c01de89cdd 100644 --- a/core/network/src/custom_proto/upgrade.rs +++ b/core/network/src/custom_proto/upgrade.rs @@ -15,12 +15,15 @@ // along with Substrate. If not, see . use crate::config::ProtocolId; +use crate::protocol::message::Message; use bytes::Bytes; use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; use libp2p::tokio_codec::Framed; use log::warn; use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; +use parity_codec::{Decode, Encode}; +use runtime_primitives::traits::Block as BlockT; use tokio_io::{AsyncRead, AsyncWrite}; use unsigned_varint::codec::UviBytes; @@ -28,7 +31,7 @@ use unsigned_varint::codec::UviBytes; /// /// Note that "a single protocol" here refers to `par` for example. However /// each protocol can have multiple different versions for networking purposes. -pub struct RegisteredProtocol { +pub struct RegisteredProtocol { /// Id of the protocol for API purposes. id: ProtocolId, /// Base name of the protocol as advertised on the network. @@ -38,10 +41,10 @@ pub struct RegisteredProtocol { /// Ordered in descending order so that the best comes first. supported_versions: Vec, /// Marker to pin the generic. - marker: PhantomData, + marker: PhantomData, } -impl RegisteredProtocol { +impl RegisteredProtocol { /// Creates a new `RegisteredProtocol`. The `custom_data` parameter will be /// passed inside the `RegisteredProtocolOutput`. pub fn new(protocol: impl Into, versions: &[u8]) @@ -64,7 +67,7 @@ impl RegisteredProtocol { } } -impl Clone for RegisteredProtocol { +impl Clone for RegisteredProtocol { fn clone(&self) -> Self { RegisteredProtocol { id: self.id.clone(), @@ -76,7 +79,7 @@ impl Clone for RegisteredProtocol { } /// Output of a `RegisteredProtocol` upgrade. -pub struct RegisteredProtocolSubstream { +pub struct RegisteredProtocolSubstream { /// If true, we are in the process of closing the sink. is_closing: bool, /// Whether the local node opened this substream (dialer), or we received this substream from @@ -94,10 +97,10 @@ pub struct RegisteredProtocolSubstream { /// unless the buffer empties then fills itself again. clogged_fuse: bool, /// Marker to pin the generic. - marker: PhantomData, + marker: PhantomData, } -impl RegisteredProtocolSubstream { +impl RegisteredProtocolSubstream { /// Returns the version of the protocol that was negotiated. pub fn protocol_version(&self) -> u8 { self.protocol_version @@ -121,43 +124,33 @@ impl RegisteredProtocolSubstream { } /// Sends a message to the substream. - pub fn send_message(&mut self, data: TMessage) - where TMessage: CustomMessage { + pub fn send_message(&mut self, data: Message) + where B: BlockT { if self.is_closing { return } - self.send_queue.push_back(data.into_bytes()); + self.send_queue.push_back(data.encode()); } } -/// Implemented on messages that can be sent or received on the network. -pub trait CustomMessage { - /// Turns a message into the raw bytes to send over the network. - fn into_bytes(self) -> Vec; - - /// Tries to parse `bytes` received from the network into a message. - fn from_bytes(bytes: &[u8]) -> Result - where Self: Sized; -} - /// Event produced by the `RegisteredProtocolSubstream`. #[derive(Debug, Clone)] -pub enum RegisteredProtocolEvent { +pub enum RegisteredProtocolEvent { /// Received a message from the remote. - Message(TMessage), + Message(Message), /// Diagnostic event indicating that the connection is clogged and we should avoid sending too /// many messages to it. Clogged { /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, + messages: Vec>, }, } -impl Stream for RegisteredProtocolSubstream -where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { - type Item = RegisteredProtocolEvent; +impl Stream for RegisteredProtocolSubstream +where TSubstream: AsyncRead + AsyncWrite, B: BlockT { + type Item = RegisteredProtocolEvent; type Error = io::Error; fn poll(&mut self) -> Poll, Self::Error> { @@ -186,7 +179,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { self.clogged_fuse = true; return Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages: self.send_queue.iter() - .map(|m| CustomMessage::from_bytes(&m)) + .map(|m| Decode::decode(&mut &m[..]).ok_or(())) .filter_map(Result::ok) .collect(), }))) @@ -206,7 +199,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { // Note that `inner` is wrapped in a `Fuse`, therefore we can poll it forever. match self.inner.poll()? { Async::Ready(Some(data)) => { - let message = ::from_bytes(&data) + let message = as Decode>::decode(&mut &data[..]).ok_or(()) .map_err(|()| { warn!(target: "sub-libp2p", "Couldn't decode packet sent by the remote: {:?}", data); io::ErrorKind::InvalidData @@ -224,7 +217,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { } } -impl UpgradeInfo for RegisteredProtocol { +impl UpgradeInfo for RegisteredProtocol { type Info = RegisteredProtocolName; type InfoIter = VecIntoIter; @@ -259,10 +252,10 @@ impl ProtocolName for RegisteredProtocolName { } } -impl InboundUpgrade for RegisteredProtocol +impl InboundUpgrade for RegisteredProtocol where TSubstream: AsyncRead + AsyncWrite, { - type Output = RegisteredProtocolSubstream; + type Output = RegisteredProtocolSubstream; type Future = future::FutureResult; type Error = io::Error; @@ -290,7 +283,7 @@ where TSubstream: AsyncRead + AsyncWrite, } } -impl OutboundUpgrade for RegisteredProtocol +impl OutboundUpgrade for RegisteredProtocol where TSubstream: AsyncRead + AsyncWrite, { type Output = >::Output; diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index dcb4ea35d0..0d71955474 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -111,7 +111,7 @@ pub struct Protocol, H: ExHashT> { /// When asked for a proof of finality, we use this struct to build one. finality_proof_provider: Option>>, /// Handles opening the unique substream and sending and receiving raw messages. - behaviour: CustomProto, Substream>, + behaviour: CustomProto>, } /// A peer that we are connected to @@ -150,7 +150,7 @@ pub struct PeerInfo { } struct OnDemandIn<'a, B: BlockT> { - behaviour: &'a mut CustomProto, Substream>, + behaviour: &'a mut CustomProto>, peerset: peerset::PeersetHandle, } @@ -281,7 +281,7 @@ pub trait Context { /// Protocol context. struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { - behaviour: &'a mut CustomProto, Substream>, + behaviour: &'a mut CustomProto>, context_data: &'a mut ContextData, peerset_handle: &'a peerset::PeersetHandle, } @@ -289,7 +289,7 @@ struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { impl<'a, B: BlockT + 'a, H: 'a + ExHashT> ProtocolContext<'a, B, H> { fn new( context_data: &'a mut ContextData, - behaviour: &'a mut CustomProto, Substream>, + behaviour: &'a mut CustomProto>, peerset_handle: &'a peerset::PeersetHandle, ) -> Self { ProtocolContext { context_data, peerset_handle, behaviour } @@ -1479,7 +1479,7 @@ pub enum CustomMessageOutcome { } fn send_message( - behaviour: &mut CustomProto, Substream>, + behaviour: &mut CustomProto>, peers: &mut HashMap>, who: PeerId, mut message: Message, @@ -1500,7 +1500,7 @@ fn send_message( impl, H: ExHashT> NetworkBehaviour for Protocol { - type ProtocolsHandler = , Substream> as NetworkBehaviour>::ProtocolsHandler; + type ProtocolsHandler = > as NetworkBehaviour>::ProtocolsHandler; type OutEvent = CustomMessageOutcome; fn new_handler(&mut self) -> Self::ProtocolsHandler { diff --git a/core/network/src/protocol/message.rs b/core/network/src/protocol/message.rs index 7b9b684cd8..5aa47d9c26 100644 --- a/core/network/src/protocol/message.rs +++ b/core/network/src/protocol/message.rs @@ -125,7 +125,6 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { - use crate::custom_proto::CustomMessage; use parity_codec::{Encode, Decode}; use runtime_primitives::Justification; use crate::config::Roles; @@ -210,18 +209,6 @@ pub mod generic { ChainSpecific(Vec), } - impl CustomMessage for Message - where Self: Decode + Encode - { - fn into_bytes(self) -> Vec { - self.encode() - } - - fn from_bytes(bytes: &[u8]) -> Result { - Decode::decode(&mut &bytes[..]).ok_or(()) - } - } - /// Status sent on connection. #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] pub struct Status { -- GitLab From 1430c33494cd12e9d51ef2d398a8dbb4741d7ef0 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Mon, 29 Jul 2019 10:40:02 +0200 Subject: [PATCH 050/151] staking need to get events (#3217) --- node/runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 700f3b20c7..c2e05f1cb5 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -183,7 +183,7 @@ impl authorship::Trait for Runtime { type FindAuthor = (); type UncleGenerations = UncleGenerations; type FilterUncle = (); - type EventHandler = (); + type EventHandler = Staking; } type SessionHandlers = (Grandpa, Babe, ImOnline); -- GitLab From 713ba0336cccb746cb606024a263677e49dd2a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 29 Jul 2019 10:44:40 +0200 Subject: [PATCH 051/151] Remove `IncrementalInput` and fix wasm `storage_into*` (#3224) --- core/executor/src/wasm_executor.rs | 6 ++-- core/sr-io/src/lib.rs | 18 +++++----- srml/support/src/storage/mod.rs | 42 +++--------------------- srml/support/src/storage/unhashed/mod.rs | 10 ++---- 4 files changed, 20 insertions(+), 56 deletions(-) diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 1b82b97d76..d7a8640e32 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -411,7 +411,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let written = std::cmp::min(value_len as usize, value.len()); this.memory.set(value_data, &value[..written]) .map_err(|_| "Invalid attempt to set value in ext_get_storage_into")?; - Ok(written as u32) + Ok(value.len() as u32) } else { Ok(u32::max_value()) } @@ -458,10 +458,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, if let Some(value) = maybe_value { let value = &value[value_offset as usize..]; - let written = ::std::cmp::min(value_len as usize, value.len()); + let written = std::cmp::min(value_len as usize, value.len()); this.memory.set(value_data, &value[..written]) .map_err(|_| "Invalid attempt to set value in ext_get_child_storage_into")?; - Ok(written as u32) + Ok(value.len() as u32) } else { Ok(u32::max_value()) } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 4a65ecfefe..7729a1e573 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -104,16 +104,18 @@ export_api! { /// Get `key` from child storage and return a `Vec`, empty if there's a problem. fn child_storage(storage_key: &[u8], key: &[u8]) -> Option>; - /// Get `key` from storage, placing the value into `value_out` (as much of it as possible) and return - /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry - /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned - /// number of bytes is not equal to the number of bytes written to the `value_out`. + /// Get `key` from storage, placing the value into `value_out` and return the number of + /// bytes that the entry in storage has beyond the offset or `None` if the storage entry + /// doesn't exist at all. + /// If `value_out` length is smaller than the returned length, only `value_out` length bytes + /// are copied into `value_out`. fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; - /// Get `key` from child storage, placing the value into `value_out` (as much of it as possible) and return - /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry - /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned - /// number of bytes is not equal to the number of bytes written to the `value_out`. + /// Get `key` from child storage, placing the value into `value_out` and return the number + /// of bytes that the entry in storage has beyond the offset or `None` if the storage entry + /// doesn't exist at all. + /// If `value_out` length is smaller than the returned length, only `value_out` length bytes + /// are copied into `value_out`. fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; /// Set the storage of some particular key to Some value. diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index 446855b55c..46b6603d91 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -18,7 +18,7 @@ use crate::rstd::prelude::*; use crate::rstd::borrow::Borrow; -use codec::{Codec, Encode, Decode, KeyedVec, Input, EncodeAppend}; +use codec::{Codec, Encode, Decode, KeyedVec, EncodeAppend}; use hashed::generator::{HashedStorage, StorageHasher}; use unhashed::generator::UnhashedStorage; @@ -27,35 +27,6 @@ pub mod storage_items; pub mod unhashed; pub mod hashed; -struct IncrementalInput<'a> { - key: &'a [u8], - pos: usize, -} - -impl<'a> Input for IncrementalInput<'a> { - fn read(&mut self, into: &mut [u8]) -> usize { - let len = runtime_io::read_storage(self.key, into, self.pos).unwrap_or(0); - let read = crate::rstd::cmp::min(len, into.len()); - self.pos += read; - read - } -} - -struct IncrementalChildInput<'a> { - storage_key: &'a [u8], - key: &'a [u8], - pos: usize, -} - -impl<'a> Input for IncrementalChildInput<'a> { - fn read(&mut self, into: &mut [u8]) -> usize { - let len = runtime_io::read_child_storage(self.storage_key, self.key, into, self.pos).unwrap_or(0); - let read = crate::rstd::cmp::min(len, into.len()); - self.pos += read; - read - } -} - /// The underlying runtime storage. pub struct RuntimeStorage; @@ -522,17 +493,12 @@ where /// Note that `storage_key` must be unique and strong (strong in the sense of being long enough to /// avoid collision from a resistant hash function (which unique implies)). pub mod child { - use super::{Codec, Decode, Vec, IncrementalChildInput}; + use super::{Codec, Decode, Vec}; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(storage_key: &[u8], key: &[u8]) -> Option { - runtime_io::read_child_storage(storage_key, key, &mut [0; 0][..], 0).map(|_| { - let mut input = IncrementalChildInput { - storage_key, - key, - pos: 0, - }; - Decode::decode(&mut input).expect("storage is not null, therefore must be a valid type") + runtime_io::child_storage(storage_key, key).map(|v| { + Decode::decode(&mut &v[..]).expect("storage is not null, therefore must be a valid type") }) } diff --git a/srml/support/src/storage/unhashed/mod.rs b/srml/support/src/storage/unhashed/mod.rs index 77e6c2b37b..5d086c36c4 100644 --- a/srml/support/src/storage/unhashed/mod.rs +++ b/srml/support/src/storage/unhashed/mod.rs @@ -17,18 +17,14 @@ //! Operation on unhashed runtime storage use crate::rstd::borrow::Borrow; -use super::{Codec, Encode, Decode, KeyedVec, Vec, IncrementalInput}; +use super::{Codec, Encode, Decode, KeyedVec, Vec}; pub mod generator; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(key: &[u8]) -> Option { - runtime_io::read_storage(key, &mut [0; 0][..], 0).map(|_| { - let mut input = IncrementalInput { - key, - pos: 0, - }; - Decode::decode(&mut input).expect("storage is not null, therefore must be a valid type") + runtime_io::storage(key).map(|val| { + Decode::decode(&mut &val[..]).expect("storage is not null, therefore must be a valid type") }) } -- GitLab From 8958f4106bb461d66952a92250d01e1c9ac31bdc Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Mon, 29 Jul 2019 14:13:47 +0200 Subject: [PATCH 052/151] srml-contracts: Refactor to remove duplication between call and create code paths (#3209) * srml-contracts: Change Ext interface to pass-by-value. * srml-contracts: Refactor ExecutionContext to reduce duplication. * srml-contracts: Refactor contracts Module to reduce duplication. * Bump node runtime impl version. --- node/runtime/src/lib.rs | 2 +- srml/contracts/src/exec.rs | 133 ++++++++++++++++---------------- srml/contracts/src/lib.rs | 134 ++++++++++++++------------------- srml/contracts/src/wasm/mod.rs | 111 ++++++++++++++++++++------- 4 files changed, 210 insertions(+), 170 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c2e05f1cb5..e657feebe9 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 122, - impl_version: 122, + impl_version: 123, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contracts/src/exec.rs b/srml/contracts/src/exec.rs index 4a83e606ac..a8219d7902 100644 --- a/srml/contracts/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -227,7 +227,7 @@ pub trait Vm { fn execute>( &self, exec: &Self::Executable, - ext: &mut E, + ext: E, input_data: &[u8], empty_output_buf: EmptyOutputBuf, gas_meter: &mut GasMeter, @@ -294,13 +294,13 @@ where } } - fn nested(&self, overlay: OverlayAccountDb<'a, T>, dest: T::AccountId, trie_id: Option) - -> Self + fn nested<'b, 'c: 'b>(&'c self, dest: T::AccountId, trie_id: Option) + -> ExecutionContext<'b, T, V, L> { ExecutionContext { self_trie_id: trie_id, self_account: dest, - overlay, + overlay: OverlayAccountDb::new(&self.overlay), depth: self.depth + 1, events: Vec::new(), calls: Vec::new(), @@ -342,54 +342,41 @@ where return Err("contract has been evicted"); }; - let mut output_data = Vec::new(); - - let (change_set, events, calls) = { - let mut nested = self.nested( - OverlayAccountDb::new(&self.overlay), - dest.clone(), - contract_info.and_then(|i| i.as_alive().map(|i| i.trie_id.clone())) - ); + let caller = self.self_account.clone(); + let dest_trie_id = contract_info.and_then(|i| i.as_alive().map(|i| i.trie_id.clone())); + let output_data = self.with_nested_context(dest.clone(), dest_trie_id, |nested| { if value > BalanceOf::::zero() { transfer( gas_meter, TransferCause::Call, - &self.self_account, + &caller, &dest, value, - &mut nested, + nested, )?; } // If code_hash is not none, then the destination account is a live contract, otherwise // it is a regular account since tombstone accounts have already been rejected. - if let Some(dest_code_hash) = self.overlay.get_code_hash(&dest) { - let executable = self.loader.load_main(&dest_code_hash)?; - output_data = self - .vm - .execute( - &executable, - &mut CallContext { - ctx: &mut nested, - caller: self.self_account.clone(), - value_transferred: value, - timestamp: self.timestamp.clone(), - block_number: self.block_number.clone(), - }, - input_data, - empty_output_buf, - gas_meter, - ) - .into_result()?; - } - - (nested.overlay.into_change_set(), nested.events, nested.calls) - }; - - self.overlay.commit(change_set); - self.events.extend(events); - self.calls.extend(calls); + let output_data = match nested.overlay.get_code_hash(&dest) { + Some(dest_code_hash) => { + let executable = nested.loader.load_main(&dest_code_hash)?; + nested.vm + .execute( + &executable, + nested.new_call_context(caller, value), + input_data, + empty_output_buf, + gas_meter, + ) + .into_result()? + } + None => Vec::new(), + }; + + Ok(output_data) + })?; Ok(CallReceipt { output_data }) } @@ -412,42 +399,35 @@ where return Err("not enough gas to pay base instantiate fee"); } + let caller = self.self_account.clone(); let dest = T::DetermineContractAddress::contract_address_for( code_hash, input_data, - &self.self_account, + &caller, ); - let (change_set, events, calls) = { - let mut overlay = OverlayAccountDb::new(&self.overlay); - - overlay.create_contract(&dest, code_hash.clone())?; + // TrieId has not been generated yet and storage is empty since contract is new. + let dest_trie_id = None; - // TrieId has not been generated yet and storage is empty since contract is new. - let mut nested = self.nested(overlay, dest.clone(), None); + let _ = self.with_nested_context(dest.clone(), dest_trie_id, |nested| { + nested.overlay.create_contract(&dest, code_hash.clone())?; // Send funds unconditionally here. If the `endowment` is below existential_deposit // then error will be returned here. transfer( gas_meter, TransferCause::Instantiate, - &self.self_account, + &caller, &dest, endowment, - &mut nested, + nested, )?; - let executable = self.loader.load_init(&code_hash)?; - self.vm + let executable = nested.loader.load_init(&code_hash)?; + nested.vm .execute( &executable, - &mut CallContext { - ctx: &mut nested, - caller: self.self_account.clone(), - value_transferred: endowment, - timestamp: self.timestamp.clone(), - block_number: self.block_number.clone(), - }, + nested.new_call_context(caller.clone(), endowment), input_data, EmptyOutputBuf::new(), gas_meter, @@ -456,18 +436,45 @@ where // Deposit an instantiation event. nested.events.push(IndexedEvent { - event: RawEvent::Instantiated(self.self_account.clone(), dest.clone()), + event: RawEvent::Instantiated(caller.clone(), dest.clone()), topics: Vec::new(), }); - (nested.overlay.into_change_set(), nested.events, nested.calls) + Ok(Vec::new()) + })?; + + Ok(InstantiateReceipt { address: dest }) + } + + fn new_call_context<'b>(&'b mut self, caller: T::AccountId, value: BalanceOf) + -> CallContext<'b, 'a, T, V, L> + { + let timestamp = self.timestamp.clone(); + let block_number = self.block_number.clone(); + CallContext { + ctx: self, + caller, + value_transferred: value, + timestamp, + block_number, + } + } + + fn with_nested_context(&mut self, dest: T::AccountId, trie_id: Option, func: F) + -> Result, &'static str> + where F: FnOnce(&mut ExecutionContext) -> Result, &'static str> + { + let (output_data, change_set, events, calls) = { + let mut nested = self.nested(dest, trie_id); + let output_data = func(&mut nested)?; + (output_data, nested.overlay.into_change_set(), nested.events, nested.calls) }; self.overlay.commit(change_set); self.events.extend(events); self.calls.extend(calls); - Ok(InstantiateReceipt { address: dest }) + Ok(output_data) } } @@ -806,13 +813,13 @@ mod tests { fn execute>( &self, exec: &MockExecutable, - ext: &mut E, + mut ext: E, input_data: &[u8], empty_output_buf: EmptyOutputBuf, gas_meter: &mut GasMeter, ) -> VmExecResult { (exec.0)(MockCtx { - ext, + ext: &mut ext, input_data, empty_output_buf: Some(empty_output_buf), gas_meter, diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index f38010a355..43996524aa 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -91,7 +91,8 @@ mod tests; use crate::exec::ExecutionContext; use crate::account_db::{AccountDb, DirectAccountDb}; -pub use crate::gas::Gas; +pub use crate::gas::{Gas, GasMeter}; +use crate::wasm::{WasmLoader, WasmVm}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; @@ -558,45 +559,9 @@ decl_module! { let origin = ensure_signed(origin)?; let dest = T::Lookup::lookup(dest)?; - // Pay for the gas upfront. - // - // NOTE: it is very important to avoid any state changes before - // paying for the gas. - let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; - - let cfg = Config::preload(); - let vm = crate::wasm::WasmVm::new(&cfg.schedule); - let loader = crate::wasm::WasmLoader::new(&cfg.schedule); - let mut ctx = ExecutionContext::top_level(origin.clone(), &cfg, &vm, &loader); - - let result = ctx.call(dest, value, &mut gas_meter, &data, exec::EmptyOutputBuf::new()); - - if let Ok(_) = result { - // Commit all changes that made it thus far into the persistent storage. - DirectAccountDb.commit(ctx.overlay.into_change_set()); - - // Then deposit all events produced. - ctx.events.into_iter().for_each(|indexed_event| { - >::deposit_event_indexed( - &*indexed_event.topics, - ::Event::from(indexed_event.event).into(), - ); - }); - } - - // Refund cost of the unused gas. - // - // NOTE: This should go after the commit to the storage, since the storage changes - // can alter the balance of the caller. - gas::refund_unused_gas::(&origin, gas_meter, imbalance); - - // Dispatch every recorded call with an appropriate origin. - ctx.calls.into_iter().for_each(|(who, call)| { - let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); - Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); - }); - - result.map(|_| ()) + Self::execute_wasm(origin, gas_limit, |ctx, gas_meter| { + ctx.call(dest, value, gas_meter, &data, exec::EmptyOutputBuf::new()).map(|_| ()) + }) } /// Creates a new contract from the `codehash` generated by `put_code`, optionally transferring some balance. @@ -618,44 +583,9 @@ decl_module! { ) -> Result { let origin = ensure_signed(origin)?; - // Commit the gas upfront. - // - // NOTE: It is very important to avoid any state changes before - // paying for the gas. - let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; - - let cfg = Config::preload(); - let vm = crate::wasm::WasmVm::new(&cfg.schedule); - let loader = crate::wasm::WasmLoader::new(&cfg.schedule); - let mut ctx = ExecutionContext::top_level(origin.clone(), &cfg, &vm, &loader); - let result = ctx.instantiate(endowment, &mut gas_meter, &code_hash, &data); - - if let Ok(_) = result { - // Commit all changes that made it thus far into the persistent storage. - DirectAccountDb.commit(ctx.overlay.into_change_set()); - - // Then deposit all events produced. - ctx.events.into_iter().for_each(|indexed_event| { - >::deposit_event_indexed( - &*indexed_event.topics, - ::Event::from(indexed_event.event).into(), - ); - }); - } - - // Refund cost of the unused gas. - // - // NOTE: This should go after the commit to the storage, since the storage changes - // can alter the balance of the caller. - gas::refund_unused_gas::(&origin, gas_meter, imbalance); - - // Dispatch every recorded call with an appropriate origin. - ctx.calls.into_iter().for_each(|(who, call)| { - let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); - Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); - }); - - result.map(|_| ()) + Self::execute_wasm(origin, gas_limit, |ctx, gas_meter| { + ctx.instantiate(endowment, gas_meter, &code_hash, &data).map(|_| ()) + }) } /// Allows block producers to claim a small reward for evicting a contract. If a block producer @@ -775,6 +705,54 @@ decl_module! { } } +impl Module { + fn execute_wasm( + origin: T::AccountId, + gas_limit: Gas, + func: impl FnOnce(&mut ExecutionContext, &mut GasMeter) -> Result + ) -> Result { + // Pay for the gas upfront. + // + // NOTE: it is very important to avoid any state changes before + // paying for the gas. + let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; + + let cfg = Config::preload(); + let vm = WasmVm::new(&cfg.schedule); + let loader = WasmLoader::new(&cfg.schedule); + let mut ctx = ExecutionContext::top_level(origin.clone(), &cfg, &vm, &loader); + + let result = func(&mut ctx, &mut gas_meter); + + if result.is_ok() { + // Commit all changes that made it thus far into the persistent storage. + DirectAccountDb.commit(ctx.overlay.into_change_set()); + + // Then deposit all events produced. + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); + } + + // Refund cost of the unused gas. + // + // NOTE: This should go after the commit to the storage, since the storage changes + // can alter the balance of the caller. + gas::refund_unused_gas::(&origin, gas_meter, imbalance); + + // Dispatch every recorded call with an appropriate origin. + ctx.calls.into_iter().for_each(|(who, call)| { + let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); + Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); + }); + + result + } +} + decl_event! { pub enum Event where diff --git a/srml/contracts/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs index 3a6d3ad566..9a0ca1056e 100644 --- a/srml/contracts/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -109,7 +109,7 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { fn execute>( &self, exec: &WasmExecutable, - ext: &mut E, + mut ext: E, input_data: &[u8], empty_output_buf: EmptyOutputBuf, gas_meter: &mut GasMeter, @@ -133,7 +133,7 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { }); let mut runtime = Runtime::new( - ext, + &mut ext, input_data.to_vec(), empty_output_buf, &self.schedule, @@ -299,12 +299,79 @@ mod tests { fn max_value_size(&self) -> u32 { 16_384 } } + impl Ext for &mut MockExt { + type T = ::T; + + fn get_storage(&self, key: &[u8; 32]) -> Option> { + (**self).get_storage(key) + } + fn set_storage(&mut self, key: [u8; 32], value: Option>) + -> Result<(), &'static str> + { + (**self).set_storage(key, value) + } + fn instantiate( + &mut self, + code: &CodeHash, + value: u64, + gas_meter: &mut GasMeter, + input_data: &[u8] + ) -> Result, &'static str> { + (**self).instantiate(code, value, gas_meter, input_data) + } + fn call( + &mut self, + to: &u64, + value: u64, + gas_meter: &mut GasMeter, + input_data: &[u8], + empty_output_buf: EmptyOutputBuf + ) -> Result { + (**self).call(to, value, gas_meter, input_data, empty_output_buf) + } + fn note_dispatch_call(&mut self, call: Call) { + (**self).note_dispatch_call(call) + } + fn caller(&self) -> &u64 { + (**self).caller() + } + fn address(&self) -> &u64 { + (**self).address() + } + fn balance(&self) -> u64 { + (**self).balance() + } + fn value_transferred(&self) -> u64 { + (**self).value_transferred() + } + fn now(&self) -> &u64 { + (**self).now() + } + fn random(&self, subject: &[u8]) -> H256 { + (**self).random(subject) + } + fn deposit_event(&mut self, topics: Vec, data: Vec) { + (**self).deposit_event(topics, data) + } + fn set_rent_allowance(&mut self, rent_allowance: u64) { + (**self).set_rent_allowance(rent_allowance) + } + fn rent_allowance(&self) -> u64 { + (**self).rent_allowance() + } + fn block_number(&self) -> u64 { + (**self).block_number() + } + fn max_value_size(&self) -> u32 { + (**self).max_value_size() + } + } fn execute( wat: &str, input_data: &[u8], output_data: &mut Vec, - ext: &mut E, + ext: E, gas_meter: &mut GasMeter, ) -> Result<(), &'static str> { use crate::exec::Vm; @@ -598,7 +665,7 @@ mod tests { CODE_GET_STORAGE, &[], &mut return_buf, - &mut mock_ext, + mock_ext, &mut GasMeter::with_limit(50_000, 1), ) .unwrap(); @@ -660,12 +727,11 @@ mod tests { #[test] fn caller() { - let mut mock_ext = MockExt::default(); execute( CODE_CALLER, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), ) .unwrap(); @@ -725,12 +791,11 @@ mod tests { #[test] fn address() { - let mut mock_ext = MockExt::default(); execute( CODE_ADDRESS, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), ) .unwrap(); @@ -787,13 +852,12 @@ mod tests { #[test] fn balance() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); execute( CODE_BALANCE, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut gas_meter, ) .unwrap(); @@ -850,13 +914,12 @@ mod tests { #[test] fn gas_price() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1312); execute( CODE_GAS_PRICE, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut gas_meter, ) .unwrap(); @@ -911,7 +974,6 @@ mod tests { #[test] fn gas_left() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1312); let mut return_buf = Vec::new(); @@ -919,7 +981,7 @@ mod tests { CODE_GAS_LEFT, &[], &mut return_buf, - &mut mock_ext, + MockExt::default(), &mut gas_meter, ) .unwrap(); @@ -980,13 +1042,12 @@ mod tests { #[test] fn value_transferred() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); execute( CODE_VALUE_TRANSFERRED, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut gas_meter, ) .unwrap(); @@ -1057,13 +1118,12 @@ mod tests { #[test] fn return_from_start_fn() { - let mut mock_ext = MockExt::default(); let mut output_data = Vec::new(); execute( CODE_RETURN_FROM_START_FN, &[], &mut output_data, - &mut mock_ext, + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), ) .unwrap(); @@ -1122,13 +1182,12 @@ mod tests { #[test] fn now() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); execute( CODE_TIMESTAMP_NOW, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut gas_meter, ) .unwrap(); @@ -1193,7 +1252,6 @@ mod tests { #[test] fn random() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); let mut return_buf = Vec::new(); @@ -1201,7 +1259,7 @@ mod tests { CODE_RANDOM, &[], &mut return_buf, - &mut mock_ext, + MockExt::default(), &mut gas_meter, ) .unwrap(); @@ -1291,7 +1349,6 @@ mod tests { #[test] fn deposit_event_max_topics() { // Checks that the runtime traps if there are more than `max_topic_events` topics. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); assert_eq!( @@ -1299,7 +1356,7 @@ mod tests { CODE_DEPOSIT_EVENT_MAX_TOPICS, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut gas_meter ), Err("during execution"), @@ -1335,7 +1392,6 @@ mod tests { #[test] fn deposit_event_duplicates() { // Checks that the runtime traps if there are duplicates. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); assert_eq!( @@ -1343,7 +1399,7 @@ mod tests { CODE_DEPOSIT_EVENT_DUPLICATES, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut gas_meter ), Err("during execution"), @@ -1404,12 +1460,11 @@ mod tests { #[test] fn block_number() { - let mut mock_ext = MockExt::default(); execute( CODE_BLOCK_NUMBER, &[], &mut Vec::new(), - &mut mock_ext, + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), ) .unwrap(); -- GitLab From 444bf719ebdaa733415af288332556542e7b3ac6 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 29 Jul 2019 14:39:47 +0200 Subject: [PATCH 053/151] core/consensus,node/runtime: Declare and implement authorities endpoint (#3207) The goal of the commit is to be able to retrieve the current set of authorities without needing to know the concrete consensus mechanism in place. In order to achieve the above this commit introduces the `core/consensus/common/primitives` crate, declaring the `ConsensusApi` runtime API. In addition it implements the above mentioned trait definition in `node/runtime` by returning the current authorities of the BABE consensus mechanism. --- Cargo.lock | 11 ++++++++ core/consensus/common/primitives/Cargo.toml | 21 ++++++++++++++ core/consensus/common/primitives/src/lib.rs | 31 +++++++++++++++++++++ node/runtime/Cargo.toml | 2 ++ node/runtime/src/lib.rs | 6 ++++ 5 files changed, 71 insertions(+) create mode 100644 core/consensus/common/primitives/Cargo.toml create mode 100644 core/consensus/common/primitives/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index e1d9a49793..7e77f3003b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2365,6 +2365,7 @@ dependencies = [ "srml-treasury 2.0.0", "substrate-client 2.0.0", "substrate-consensus-babe-primitives 2.0.0", + "substrate-consensus-common-primitives 2.0.0", "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -4385,6 +4386,16 @@ dependencies = [ "substrate-test-runtime-client 2.0.0", ] +[[package]] +name = "substrate-consensus-common-primitives" +version = "2.0.0" +dependencies = [ + "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", +] + [[package]] name = "substrate-consensus-rhd" version = "2.0.0" diff --git a/core/consensus/common/primitives/Cargo.toml b/core/consensus/common/primitives/Cargo.toml new file mode 100644 index 0000000000..154863eed5 --- /dev/null +++ b/core/consensus/common/primitives/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "substrate-consensus-common-primitives" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Common consensus primitives" +edition = "2018" + +[dependencies] +parity-codec = { version = "4.1.1", default-features = false } +client = { package = "substrate-client", path = "../../../client", default-features = false } +sr-primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } + +[features] +default = ["std"] +std = [ + "rstd/std", + "client/std", + "parity-codec/std", + "sr-primitives/std" +] diff --git a/core/consensus/common/primitives/src/lib.rs b/core/consensus/common/primitives/src/lib.rs new file mode 100644 index 0000000000..47c4371721 --- /dev/null +++ b/core/consensus/common/primitives/src/lib.rs @@ -0,0 +1,31 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Common consensus primitives. + +#![cfg_attr(not(feature = "std"), no_std)] + +use parity_codec::Codec; +use client::decl_runtime_apis; +use rstd::vec::Vec; + +decl_runtime_apis! { + /// Common consensus runtime api. + pub trait ConsensusApi { + /// Returns the set of authorities of the currently active consensus mechanism. + fn authorities() -> Vec; + } +} diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index eca7c9ebb7..9c52125fe8 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -19,6 +19,7 @@ support = { package = "srml-support", path = "../../srml/support", default-featu authorship = { package = "srml-authorship", path = "../../srml/authorship", default-features = false } babe = { package = "srml-babe", path = "../../srml/babe", default-features = false } babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } +consensus-primitives = { package = "substrate-consensus-common-primitives", path = "../../core/consensus/common/primitives", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default-features = false } contracts = { package = "srml-contracts", path = "../../srml/contracts", default-features = false } collective = { package = "srml-collective", path = "../../srml/collective", default-features = false } @@ -57,6 +58,7 @@ std = [ "authorship/std", "babe/std", "babe-primitives/std", + "consensus-primitives/std", "balances/std", "contracts/std", "collective/std", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index e657feebe9..f89b121afa 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -538,4 +538,10 @@ impl_runtime_apis! { } } } + + impl consensus_primitives::ConsensusApi for Runtime { + fn authorities() -> Vec { + Babe::authorities().into_iter().map(|(a, _)| a).collect() + } + } } -- GitLab From 1fcd1286d87dc7acb8c2b0ee3ff6fe2199536ea0 Mon Sep 17 00:00:00 2001 From: Kian Paimani Date: Mon, 29 Jul 2019 14:43:53 +0200 Subject: [PATCH 054/151] Refactor sr_primitives. (#3214) * refactor sr_primitives. * Fix try build error. * Line-width * Ui test. * Final fixes. * Fix build again. * bring back ui test. * Fix unsigned import. * Another ui fix. * Also refactor substrate-primitives * Fix benchmarks. * Fix doc test. * fix doc tests --- core/basic-authorship/Cargo.toml | 10 ++-- core/basic-authorship/src/basic_authorship.rs | 8 +-- core/basic-authorship/src/lib.rs | 2 +- core/cli/Cargo.toml | 2 +- core/cli/src/informant.rs | 3 +- core/cli/src/informant/display.rs | 2 +- core/client/Cargo.toml | 4 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/cache/list_cache.rs | 8 +-- core/client/db/src/cache/list_entry.rs | 2 +- core/client/db/src/cache/list_storage.rs | 4 +- core/client/db/src/cache/mod.rs | 4 +- core/client/db/src/lib.rs | 10 ++-- core/client/db/src/light.rs | 8 +-- core/client/db/src/storage_cache.rs | 8 +-- core/client/db/src/utils.rs | 8 +-- core/client/src/backend.rs | 4 +- core/client/src/block_builder/api.rs | 2 +- .../client/src/block_builder/block_builder.rs | 6 +-- core/client/src/blockchain.rs | 8 +-- core/client/src/call_executor.rs | 2 +- core/client/src/cht.rs | 2 +- core/client/src/client.rs | 10 ++-- core/client/src/error.rs | 2 +- core/client/src/genesis.rs | 4 +- core/client/src/in_mem.rs | 6 +-- core/client/src/leaves.rs | 2 +- core/client/src/light/backend.rs | 4 +- core/client/src/light/blockchain.rs | 4 +- core/client/src/light/call_executor.rs | 4 +- core/client/src/light/fetcher.rs | 4 +- core/client/src/light/mod.rs | 4 +- core/client/src/notifications.rs | 4 +- core/client/src/runtime_api.rs | 2 +- core/consensus/aura/Cargo.toml | 2 +- core/consensus/aura/primitives/Cargo.toml | 8 +-- core/consensus/aura/primitives/src/lib.rs | 2 +- core/consensus/aura/src/digest.rs | 2 +- core/consensus/aura/src/lib.rs | 6 +-- core/consensus/babe/Cargo.toml | 2 +- core/consensus/babe/primitives/Cargo.toml | 6 +-- core/consensus/babe/primitives/src/digest.rs | 4 +- core/consensus/babe/primitives/src/lib.rs | 4 +- core/consensus/babe/src/aux_schema.rs | 2 +- core/consensus/babe/src/lib.rs | 4 +- core/consensus/babe/src/tests.rs | 2 +- core/consensus/common/Cargo.toml | 2 +- core/consensus/common/src/block_import.rs | 4 +- core/consensus/common/src/evaluation.rs | 2 +- core/consensus/common/src/import_queue.rs | 2 +- .../common/src/import_queue/basic_queue.rs | 2 +- .../common/src/import_queue/buffered_link.rs | 2 +- core/consensus/common/src/lib.rs | 2 +- core/consensus/common/src/select_chain.rs | 2 +- core/consensus/rhd/Cargo.toml | 4 +- core/consensus/rhd/src/lib.rs | 16 +++--- core/consensus/rhd/src/misbehaviour_check.rs | 2 +- core/consensus/rhd/src/service.rs | 2 +- core/consensus/slots/Cargo.toml | 2 +- core/consensus/slots/src/aux_schema.rs | 4 +- core/consensus/slots/src/lib.rs | 6 +-- core/executor/runtime-test/Cargo.toml | 2 +- core/executor/runtime-test/src/lib.rs | 8 +-- core/finality-grandpa/Cargo.toml | 4 +- core/finality-grandpa/primitives/Cargo.toml | 4 +- core/finality-grandpa/primitives/src/lib.rs | 6 +-- core/finality-grandpa/src/aux_schema.rs | 4 +- .../src/communication/gossip.rs | 4 +- .../finality-grandpa/src/communication/mod.rs | 6 +-- .../src/communication/periodic.rs | 2 +- .../src/communication/tests.rs | 2 +- core/finality-grandpa/src/environment.rs | 6 +-- core/finality-grandpa/src/finality_proof.rs | 6 +-- core/finality-grandpa/src/import.rs | 8 +-- core/finality-grandpa/src/justification.rs | 6 +-- core/finality-grandpa/src/lib.rs | 8 +-- core/finality-grandpa/src/light_import.rs | 12 ++--- core/finality-grandpa/src/observer.rs | 4 +- core/finality-grandpa/src/tests.rs | 16 +++--- core/finality-grandpa/src/until_imported.rs | 2 +- core/inherents/Cargo.toml | 4 +- core/inherents/src/lib.rs | 2 +- core/keyring/Cargo.toml | 2 +- core/keyring/src/ed25519.rs | 6 +-- core/keyring/src/sr25519.rs | 6 +-- core/keystore/Cargo.toml | 2 +- core/keystore/src/lib.rs | 6 +-- core/network/Cargo.toml | 4 +- core/network/src/behaviour.rs | 2 +- core/network/src/chain.rs | 6 +-- core/network/src/config.rs | 2 +- core/network/src/lib.rs | 2 +- core/network/src/on_demand_layer.rs | 2 +- core/network/src/protocol.rs | 4 +- core/network/src/protocol/consensus_gossip.rs | 6 +-- core/network/src/protocol/message.rs | 4 +- core/network/src/protocol/on_demand.rs | 4 +- core/network/src/protocol/specialization.rs | 2 +- core/network/src/protocol/sync.rs | 2 +- core/network/src/protocol/sync/blocks.rs | 4 +- .../src/protocol/sync/extra_requests.rs | 2 +- core/network/src/service.rs | 4 +- core/network/src/test/block_import.rs | 2 +- core/network/src/test/mod.rs | 6 +-- core/offchain/Cargo.toml | 2 +- core/offchain/primitives/Cargo.toml | 4 +- core/offchain/primitives/src/lib.rs | 2 +- core/offchain/src/api.rs | 16 +++--- core/offchain/src/lib.rs | 2 +- core/primitives/benches/benches.rs | 11 ++-- core/rpc/Cargo.toml | 2 +- core/rpc/src/author/mod.rs | 2 +- core/rpc/src/chain/mod.rs | 4 +- core/rpc/src/state/mod.rs | 4 +- core/rpc/src/system/mod.rs | 2 +- core/service/Cargo.toml | 2 +- core/service/src/chain_ops.rs | 4 +- core/service/src/chain_spec.rs | 2 +- core/service/src/components.rs | 2 +- core/service/src/config.rs | 2 +- core/service/src/lib.rs | 16 +++--- core/service/test/Cargo.toml | 2 +- core/sr-api-macros/Cargo.toml | 4 +- core/sr-api-macros/benches/bench.rs | 2 +- core/sr-api-macros/src/lib.rs | 6 +-- core/sr-api-macros/tests/decl_and_impl.rs | 4 +- core/sr-api-macros/tests/runtime_calls.rs | 2 +- .../tests/ui/changed_in_unknown_version.rs | 2 +- .../tests/ui/declaring_old_block.rs | 2 +- .../tests/ui/declaring_old_block.stderr | 6 +-- ...declaring_own_block_with_different_name.rs | 2 +- ...aring_own_block_with_different_name.stderr | 6 +-- .../tests/ui/empty_impl_runtime_apis_call.rs | 2 +- .../ui/impl_incorrect_method_signature.rs | 2 +- .../ui/impl_two_traits_with_same_name.rs | 2 +- .../ui/missing_block_generic_parameter.rs | 2 +- .../tests/ui/missing_path_for_trait.rs | 2 +- ...ype_reference_in_impl_runtime_apis_call.rs | 2 +- core/sr-primitives/Cargo.toml | 4 +- core/sr-primitives/src/generic/digest.rs | 2 +- core/sr-primitives/src/generic/header.rs | 2 +- core/sr-primitives/src/generic/tests.rs | 2 +- core/sr-primitives/src/lib.rs | 8 +-- core/sr-primitives/src/testing.rs | 6 +-- core/sr-primitives/src/traits.rs | 18 +++---- core/sr-version/Cargo.toml | 4 +- core/sr-version/src/lib.rs | 6 +-- core/test-client/Cargo.toml | 2 +- core/test-client/src/client_ext.rs | 6 +-- core/test-client/src/lib.rs | 4 +- core/test-runtime/Cargo.toml | 4 +- core/test-runtime/client/Cargo.toml | 2 +- .../client/src/block_builder_ext.rs | 2 +- core/test-runtime/client/src/lib.rs | 2 +- core/test-runtime/client/src/trait_tests.rs | 4 +- core/test-runtime/src/genesismap.rs | 2 +- core/test-runtime/src/lib.rs | 18 +++---- core/test-runtime/src/system.rs | 10 ++-- core/transaction-pool/Cargo.toml | 2 +- core/transaction-pool/graph/Cargo.toml | 2 +- core/transaction-pool/graph/src/base_pool.rs | 2 +- core/transaction-pool/graph/src/future.rs | 2 +- core/transaction-pool/src/api.rs | 2 +- core/trie/Cargo.toml | 4 +- core/trie/benches/bench.rs | 4 +- core/trie/src/lib.rs | 4 +- node/executor/Cargo.toml | 2 +- node/executor/src/lib.rs | 6 +-- node/primitives/Cargo.toml | 4 +- node/primitives/src/lib.rs | 2 +- node/runtime/Cargo.toml | 8 +-- node/runtime/src/constants.rs | 2 +- node/runtime/src/impls.rs | 10 ++-- node/runtime/src/lib.rs | 16 +++--- srml/assets/Cargo.toml | 6 +-- srml/assets/src/lib.rs | 8 +-- srml/aura/Cargo.toml | 6 +-- srml/aura/src/lib.rs | 2 +- srml/aura/src/mock.rs | 6 +-- srml/aura/src/tests.rs | 2 +- srml/authorship/Cargo.toml | 8 +-- srml/authorship/src/lib.rs | 14 ++--- srml/babe/Cargo.toml | 6 +-- srml/babe/src/lib.rs | 4 +- srml/balances/Cargo.toml | 6 +-- srml/balances/src/lib.rs | 10 ++-- srml/balances/src/mock.rs | 6 +-- srml/balances/src/tests.rs | 2 +- srml/collective/Cargo.toml | 8 +-- srml/collective/src/lib.rs | 14 ++--- srml/contracts/Cargo.toml | 8 +-- srml/contracts/src/account_db.rs | 2 +- srml/contracts/src/exec.rs | 2 +- srml/contracts/src/gas.rs | 4 +- srml/contracts/src/lib.rs | 6 +-- srml/contracts/src/rent.rs | 2 +- srml/contracts/src/tests.rs | 12 ++--- srml/contracts/src/wasm/code_cache.rs | 2 +- srml/contracts/src/wasm/env_def/macros.rs | 2 +- srml/contracts/src/wasm/mod.rs | 2 +- srml/contracts/src/wasm/prepare.rs | 2 +- srml/contracts/src/wasm/runtime.rs | 2 +- srml/council/src/lib.rs | 8 +-- srml/democracy/Cargo.toml | 6 +-- srml/democracy/src/lib.rs | 10 ++-- srml/democracy/src/vote_threshold.rs | 2 +- srml/elections/Cargo.toml | 8 +-- srml/elections/src/lib.rs | 12 ++--- srml/example/Cargo.toml | 2 +- srml/example/src/lib.rs | 2 +- srml/executive/Cargo.toml | 6 +-- srml/executive/src/lib.rs | 54 +++++++++---------- srml/finality-tracker/Cargo.toml | 6 +-- srml/finality-tracker/src/lib.rs | 10 ++-- srml/generic-asset/Cargo.toml | 6 +-- srml/generic-asset/src/lib.rs | 6 +-- srml/generic-asset/src/mock.rs | 4 +- srml/grandpa/Cargo.toml | 8 +-- srml/grandpa/src/lib.rs | 5 +- srml/grandpa/src/mock.rs | 6 +-- srml/grandpa/src/tests.rs | 4 +- srml/im-online/Cargo.toml | 6 +-- srml/im-online/src/lib.rs | 4 +- srml/indices/Cargo.toml | 8 +-- srml/indices/src/lib.rs | 2 +- srml/indices/src/mock.rs | 8 +-- srml/session/Cargo.toml | 6 +-- srml/session/src/historical.rs | 8 +-- srml/session/src/lib.rs | 14 ++--- srml/session/src/mock.rs | 6 +-- srml/staking/Cargo.toml | 6 +-- srml/staking/src/inflation.rs | 2 +- srml/staking/src/lib.rs | 12 ++--- srml/staking/src/mock.rs | 10 ++-- srml/staking/src/phragmen.rs | 4 +- srml/staking/src/tests.rs | 2 +- srml/sudo/Cargo.toml | 2 +- srml/support/Cargo.toml | 2 +- .../procedural/src/storage/transformation.rs | 14 ++--- srml/support/src/dispatch.rs | 20 +++---- srml/support/src/inherent.rs | 2 +- srml/support/src/lib.rs | 3 +- srml/support/src/runtime.rs | 6 +-- srml/support/src/traits.rs | 6 +-- srml/support/src/unsigned.rs | 6 +-- srml/support/test/tests/instance.rs | 4 +- srml/support/test/tests/issue2219.rs | 4 +- srml/system/Cargo.toml | 8 +-- srml/system/benches/bench.rs | 4 +- srml/system/src/lib.rs | 26 +++++---- srml/timestamp/Cargo.toml | 6 +-- srml/timestamp/src/lib.rs | 8 +-- srml/treasury/Cargo.toml | 6 +-- srml/treasury/src/lib.rs | 10 ++-- subkey/Cargo.toml | 2 +- subkey/src/main.rs | 2 +- subkey/src/vanity.rs | 4 +- test-utils/chain-spec-builder/Cargo.toml | 2 +- test-utils/transaction-factory/Cargo.toml | 4 +- 259 files changed, 666 insertions(+), 664 deletions(-) diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index 955677faf0..9463e3c07f 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -5,14 +5,14 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -client = { package = "substrate-client", path = "../../core/client" } +log = "0.4" +futures-preview = "0.3.0-alpha.17" codec = { package = "parity-codec", version = "4.1.1" } +sr-primitives = { path = "../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } +client = { package = "substrate-client", path = "../../core/client" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } -futures-preview = "0.3.0-alpha.17" inherents = { package = "substrate-inherents", path = "../inherents" } -log = "0.4" -primitives = { package = "substrate-primitives", path = "../../core/primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } substrate-telemetry = { path = "../telemetry" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index d7450e4287..2a3fe8dab8 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -29,10 +29,10 @@ use consensus_common::{evaluation}; use inherents::InherentData; use log::{error, info, debug, trace}; use primitives::{H256, Blake2Hasher, ExecutionContext}; -use runtime_primitives::{ApplyError, generic::BlockId}; -use runtime_primitives::traits::{ - Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, - DigestFor, BlakeTwo256, +use sr_primitives::{ + traits::{Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, DigestFor, BlakeTwo256}, + generic::BlockId, + ApplyError, }; use transaction_pool::txpool::{self, Pool as TransactionPool}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; diff --git a/core/basic-authorship/src/lib.rs b/core/basic-authorship/src/lib.rs index e579dadd83..71c9e27922 100644 --- a/core/basic-authorship/src/lib.rs +++ b/core/basic-authorship/src/lib.rs @@ -21,7 +21,7 @@ //! ``` //! # use substrate_basic_authorship::ProposerFactory; //! # use consensus_common::{Environment, Proposer}; -//! # use runtime_primitives::generic::BlockId; +//! # use sr_primitives::generic::BlockId; //! # use std::{sync::Arc, time::Duration}; //! # use test_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; //! # use transaction_pool::txpool::{self, Pool as TransactionPool}; diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index bf583a3b7d..53c320035f 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -25,7 +25,7 @@ serde_json = "1.0" panic-handler = { package = "substrate-panic-handler", path = "../../core/panic-handler" } client = { package = "substrate-client", path = "../../core/client" } network = { package = "substrate-network", path = "../../core/network" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } service = { package = "substrate-service", path = "../../core/service" } state-machine = { package = "substrate-state-machine", path = "../../core/state-machine" } diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index ca4be4bd1b..e5e46ed17f 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -20,8 +20,7 @@ use client::{backend::Backend, BlockchainEvents}; use futures::{Future, Stream}; use futures03::{StreamExt as _, TryStreamExt as _}; use log::{info, warn}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::Header; +use sr_primitives::{generic::BlockId, traits::Header}; use service::{Service, Components}; use tokio::runtime::TaskExecutor; diff --git a/core/cli/src/informant/display.rs b/core/cli/src/informant/display.rs index 82bae3358d..c7cf9bfc93 100644 --- a/core/cli/src/informant/display.rs +++ b/core/cli/src/informant/display.rs @@ -18,7 +18,7 @@ use ansi_term::Colour; use client::ClientInfo; use log::info; use network::SyncState; -use runtime_primitives::traits::{Block as BlockT, CheckedDiv, NumberFor, Zero, Saturating}; +use sr_primitives::traits::{Block as BlockT, CheckedDiv, NumberFor, Zero, Saturating}; use service::NetworkStatus; use std::{convert::{TryFrom, TryInto}, fmt, time}; diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index f140b2f343..80a3b3d99a 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -21,7 +21,7 @@ hash-db = { version = "0.14.0", default-features = false } kvdb = { git = "https://github.com/paritytech/parity-common", optional = true, rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } -runtime-primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } runtime-version = { package = "sr-version", path = "../sr-version", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } @@ -38,7 +38,7 @@ std = [ "parity-codec/std", "primitives/std", "inherents/std", - "runtime-primitives/std", + "sr-primitives/std", "runtime-version/std", "hash-db/std", "consensus", diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 899c85998a..202b21558a 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -14,7 +14,7 @@ kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b031 linked-hash-map = "0.5" hash-db = { version = "0.14.0" } primitives = { package = "substrate-primitives", path = "../../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } client = { package = "substrate-client", path = "../../client" } state-machine = { package = "substrate-state-machine", path = "../../state-machine" } parity-codec = { version = "4.1.1", features = ["derive"] } diff --git a/core/client/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index 727375244d..9e54fdbb62 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -44,7 +44,7 @@ use std::collections::BTreeSet; use log::warn; use client::error::{Error as ClientError, Result as ClientResult}; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, NumberFor, Zero, Bounded, CheckedSub }; @@ -544,7 +544,7 @@ pub fn destroy_fork, Tx: Stor /// Blockchain related functions. mod chain { - use runtime_primitives::traits::Header as HeaderT; + use sr_primitives::traits::Header as HeaderT; use super::*; /// Is the block1 connected both ends of the range. @@ -618,8 +618,8 @@ fn read_forks>( #[cfg(test)] pub mod tests { use test_client::runtime::H256; - use runtime_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; - use runtime_primitives::traits::Header as HeaderT; + use sr_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::traits::Header as HeaderT; use crate::cache::list_storage::tests::{DummyStorage, FaultyStorage, DummyTransaction}; use super::*; diff --git a/core/client/db/src/cache/list_entry.rs b/core/client/db/src/cache/list_entry.rs index 3305b909d2..2ec5f01a44 100644 --- a/core/client/db/src/cache/list_entry.rs +++ b/core/client/db/src/cache/list_entry.rs @@ -17,7 +17,7 @@ //! List-cache storage entries. use client::error::Result as ClientResult; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use parity_codec::{Encode, Decode}; use crate::cache::{CacheItemT, ComplexBlockId}; diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index af0b74066c..3c4a7252f3 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -22,8 +22,8 @@ use kvdb::{KeyValueDB, DBTransaction}; use client::error::{Error as ClientError, Result as ClientResult}; use parity_codec::{Encode, Decode}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use crate::utils::{self, db_err, meta_keys}; use crate::cache::{CacheItemT, ComplexBlockId}; diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index 1c112c9036..a7632d6aeb 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -24,8 +24,8 @@ use kvdb::{KeyValueDB, DBTransaction}; use client::blockchain::Cache as BlockchainCache; use client::error::Result as ClientResult; use parity_codec::{Encode, Decode}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus_common::well_known_cache_keys::Id as CacheKeyId; use crate::utils::{self, COLUMN_META, db_err}; diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index e73d3df62c..e2472f1138 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -49,11 +49,11 @@ use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::{Mutex, RwLock}; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; -use runtime_primitives::{ +use sr_primitives::{ generic::{BlockId, DigestItem}, Justification, StorageOverlay, ChildrenStorageOverlay, BuildStorage }; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, Zero, One, SaturatedConversion }; use state_machine::backend::Backend as StateBackend; @@ -1427,8 +1427,8 @@ mod tests { use client::backend::Backend as BTrait; use client::blockchain::Backend as BLBTrait; use client::backend::BlockImportOperation as Op; - use runtime_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; - use runtime_primitives::traits::{Hash, BlakeTwo256}; + use sr_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::traits::{Hash, BlakeTwo256}; use state_machine::{TrieMut, TrieDBMut, ChangesTrieRootsStorage, ChangesTrieStorage}; use test_client; @@ -1457,7 +1457,7 @@ mod tests { changes: Vec<(Vec, Vec)>, extrinsics_root: H256, ) -> H256 { - use runtime_primitives::testing::Digest; + use sr_primitives::testing::Digest; let (changes_root, changes_trie_update) = prepare_changes(changes); let digest = Digest { diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 95f50ab6f6..3714338fad 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -31,8 +31,8 @@ use client::error::{Error as ClientError, Result as ClientResult}; use client::light::blockchain::Storage as LightBlockchainStorage; use parity_codec::{Decode, Encode}; use primitives::Blake2Hasher; -use runtime_primitives::generic::{DigestItem, BlockId}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; +use sr_primitives::generic::{DigestItem, BlockId}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; use consensus_common::well_known_cache_keys; use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; use crate::utils::{self, meta_keys, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; @@ -571,8 +571,8 @@ fn cht_key>(cht_type: u8, block: N) -> ClientResult<[u8; 5]> { #[cfg(test)] pub(crate) mod tests { use client::cht; - use runtime_primitives::generic::DigestItem; - use runtime_primitives::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::generic::DigestItem; + use sr_primitives::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; use super::*; type Block = RawBlock>; diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index 7df1472ece..61376bd9bd 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; use linked_hash_map::{LinkedHashMap, Entry}; use hash_db::Hasher; -use runtime_primitives::traits::{Block as BlockT, Header}; +use sr_primitives::traits::{Block as BlockT, Header}; use state_machine::{backend::Backend as StateBackend, TrieBackend}; use log::trace; use super::{StorageCollection, ChildStorageCollection}; @@ -105,7 +105,7 @@ impl LRUMap { // TODO assert k v size fit into limit?? to avoid insert remove? match lmap.entry(k) { Entry::Occupied(mut entry) => { - // note that in this case we are not running pure lru as + // note that in this case we are not running pure lru as // it would require to remove first *storage_used_size -= entry.get().estimate_size(); entry.insert(v); @@ -143,7 +143,7 @@ impl LRUMap { } } - + impl Cache { /// Returns the used memory size of the storage cache in bytes. pub fn used_storage_cache_size(&self) -> usize { @@ -563,7 +563,7 @@ impl, B: BlockT> StateBackend for CachingState< #[cfg(test)] mod tests { use super::*; - use runtime_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; use state_machine::backend::InMemory; use primitives::Blake2Hasher; diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index e0e36c6dbc..a2dd144c89 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -29,8 +29,8 @@ use log::debug; use client; use parity_codec::Decode; use trie::DBValue; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, UniqueSaturatedInto, }; @@ -187,7 +187,7 @@ pub fn block_id_to_lookup_key( id: BlockId ) -> Result>, client::error::Error> where Block: BlockT, - ::runtime_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, + ::sr_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, { let res = match id { BlockId::Number(n) => db.get( @@ -332,7 +332,7 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: #[cfg(test)] mod tests { use super::*; - use runtime_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; type Block = RawBlock>; #[test] diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 79bc1b475b..24b48c9b86 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -19,8 +19,8 @@ use std::collections::HashMap; use crate::error; use primitives::ChangesTrieConfiguration; -use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use state_machine::backend::Backend as StateBackend; use state_machine::ChangesTrieStorage as StateChangesTrieStorage; use consensus::well_known_cache_keys; diff --git a/core/client/src/block_builder/api.rs b/core/client/src/block_builder/api.rs index 44663a7094..5bf742a456 100644 --- a/core/client/src/block_builder/api.rs +++ b/core/client/src/block_builder/api.rs @@ -16,7 +16,7 @@ //! The runtime api for building blocks. -use runtime_primitives::{traits::Block as BlockT, ApplyResult}; +use sr_primitives::{traits::Block as BlockT, ApplyResult}; use rstd::vec::Vec; use sr_api_macros::decl_runtime_apis; pub use inherents::{InherentData, CheckInherentsResult}; diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 4564c29aae..5e836b6bc2 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -17,9 +17,9 @@ use super::api::BlockBuilder as BlockBuilderApi; use std::vec::Vec; use parity_codec::Encode; -use runtime_primitives::ApplyOutcome; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::ApplyOutcome; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef, DigestFor, }; use primitives::{H256, ExecutionContext}; diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index 77c2051138..2bf61df704 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -18,9 +18,9 @@ use std::sync::Arc; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::Justification; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::generic::BlockId; +use sr_primitives::Justification; use consensus::well_known_cache_keys; use crate::error::{Error, Result}; @@ -196,7 +196,7 @@ pub fn tree_route>( from: BlockId, to: BlockId, ) -> Result> { - use runtime_primitives::traits::Header; + use sr_primitives::traits::Header; let load_header = |id: BlockId| { match backend.header(id) { diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index c107e6f2bb..1b41cc3aa3 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -16,7 +16,7 @@ use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result, cell::RefCell, rc::Rc}; use parity_codec::{Encode, Decode}; -use runtime_primitives::{ +use sr_primitives::{ generic::BlockId, traits::Block as BlockT, }; use state_machine::{ diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index fc8920327e..56803a9827 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -30,7 +30,7 @@ use parity_codec::Encode; use trie; use primitives::{H256, convert_hash}; -use runtime_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; +use sr_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; use state_machine::backend::InMemory as InMemoryState; use state_machine::{MemoryDB, TrieBackend, Backend as StateBackend, prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend}; diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 6decdfc9ca..683b07dd70 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -24,7 +24,7 @@ use crate::error::Error; use futures::channel::mpsc; use parking_lot::{Mutex, RwLock}; use primitives::NativeOrEncoded; -use runtime_primitives::{ +use sr_primitives::{ Justification, generic::{BlockId, SignedBlock}, }; @@ -34,13 +34,13 @@ use consensus::{ well_known_cache_keys::Id as CacheKeyId, SelectChain, self, }; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, BlockNumberToHash, ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, }; -use runtime_primitives::generic::DigestItem; -use runtime_primitives::BuildStorage; +use sr_primitives::generic::DigestItem; +use sr_primitives::BuildStorage; use crate::runtime_api::{ CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, InitializeBlock, @@ -1851,7 +1851,7 @@ pub(crate) mod tests { use std::collections::HashMap; use super::*; use primitives::blake2_256; - use runtime_primitives::DigestItem; + use sr_primitives::DigestItem; use consensus::{BlockOrigin, SelectChain}; use test_client::{ prelude::*, diff --git a/core/client/src/error.rs b/core/client/src/error.rs index 2de5a42781..d95263abce 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -18,7 +18,7 @@ use std::{self, error, result}; use state_machine; -use runtime_primitives::ApplyError; +use sr_primitives::ApplyError; use consensus; use derive_more::{Display, From}; diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index b577d1c8a7..719661e344 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -16,7 +16,7 @@ //! Tool for creating the genesis block. -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, Zero}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, Zero}; /// Create a genesis block, given the initial storage. pub fn construct_genesis_block< @@ -49,7 +49,7 @@ mod tests { runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, AccountKeyring, Sr25519Keyring, }; - use runtime_primitives::traits::BlakeTwo256; + use sr_primitives::traits::BlakeTwo256; use primitives::Blake2Hasher; use hex::*; diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 8a229470be..dd56c76a2b 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -20,9 +20,9 @@ use std::collections::HashMap; use std::sync::Arc; use parking_lot::{RwLock, Mutex}; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; -use runtime_primitives::generic::{BlockId, DigestItem}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; -use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::generic::{BlockId, DigestItem}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; +use sr_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; use hash_db::Hasher; diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index b0e49ead80..ed2cde6d5e 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -19,7 +19,7 @@ use std::collections::BTreeMap; use std::cmp::Reverse; use kvdb::{KeyValueDB, DBTransaction}; -use runtime_primitives::traits::SimpleArithmetic; +use sr_primitives::traits::SimpleArithmetic; use parity_codec::{Encode, Decode}; use crate::error; diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 6f6bde2418..4730297656 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -21,9 +21,9 @@ use std::collections::HashMap; use std::sync::{Arc, Weak}; use parking_lot::{RwLock, Mutex}; -use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; -use runtime_primitives::traits::{Block as BlockT, NumberFor, Zero, Header}; +use sr_primitives::traits::{Block as BlockT, NumberFor, Zero, Header}; use crate::in_mem::{self, check_genesis_storage}; use crate::backend::{ AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index 6bd4c787d5..a2c2fe72ba 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -20,8 +20,8 @@ use std::{sync::{Weak, Arc}, collections::HashMap}; use parking_lot::Mutex; -use runtime_primitives::{Justification, generic::BlockId}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; +use sr_primitives::{Justification, generic::BlockId}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus::well_known_cache_keys; use crate::backend::{AuxStore, NewBlockState}; diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index f164c17659..5cd630ed79 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -24,8 +24,8 @@ use std::{ use parity_codec::{Encode, Decode}; use primitives::{offchain, H256, Blake2Hasher, convert_hash, NativeOrEncoded}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{One, Block as BlockT, Header as HeaderT}; use state_machine::{ self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, create_proof_check_backend, diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 5d754a137b..e788b3594b 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -24,7 +24,7 @@ use std::future::Future; use hash_db::{HashDB, Hasher}; use parity_codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, SimpleArithmetic, CheckedConversion, }; @@ -502,7 +502,7 @@ pub mod tests { use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; use primitives::{blake2_256, Blake2Hasher, H256}; use primitives::storage::{well_known_keys, StorageKey}; - use runtime_primitives::generic::BlockId; + use sr_primitives::generic::BlockId; use state_machine::Backend; use super::*; diff --git a/core/client/src/light/mod.rs b/core/client/src/light/mod.rs index 2cdcaf4990..69ba4d9f73 100644 --- a/core/client/src/light/mod.rs +++ b/core/client/src/light/mod.rs @@ -25,8 +25,8 @@ use std::sync::Arc; use executor::RuntimeInfo; use primitives::{H256, Blake2Hasher}; -use runtime_primitives::BuildStorage; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::BuildStorage; +use sr_primitives::traits::Block as BlockT; use state_machine::CodeExecutor; use crate::call_executor::LocalCallExecutor; diff --git a/core/client/src/notifications.rs b/core/client/src/notifications.rs index bfd97df95c..0ddc4c72cd 100644 --- a/core/client/src/notifications.rs +++ b/core/client/src/notifications.rs @@ -24,7 +24,7 @@ use std::{ use fnv::{FnvHashSet, FnvHashMap}; use futures::channel::mpsc; use primitives::storage::{StorageKey, StorageData}; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; /// Storage change set #[derive(Debug)] @@ -307,7 +307,7 @@ impl StorageNotifications { #[cfg(test)] mod tests { - use runtime_primitives::testing::{H256 as Hash, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{H256 as Hash, Block as RawBlock, ExtrinsicWrapper}; use super::*; use std::iter::{empty, Empty}; diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index d14907f162..890e265878 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -23,7 +23,7 @@ pub use state_machine::OverlayedChanges; #[cfg(feature = "std")] pub use primitives::NativeOrEncoded; #[doc(hidden)] -pub use runtime_primitives::{ +pub use sr_primitives::{ traits::{ Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index add7d8b217..e7a5007e22 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -18,7 +18,7 @@ srml-aura = { path = "../../../srml/aura" } client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } consensus_common = { package = "substrate-consensus-common", path = "../common" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index bc51c90d8c..cbebd10a4d 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -8,16 +8,16 @@ edition = "2018" [dependencies] parity-codec = { version = "4.1.1", default-features = false } substrate-client = { path = "../../../client", default-features = false } -substrate-primitives = { path = "../../../primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +sr-primitives = { path = "../../../sr-primitives", default-features = false } [features] default = ["std"] std = [ "rstd/std", "parity-codec/std", - "runtime_primitives/std", + "sr-primitives/std", "substrate-client/std", - "substrate-primitives/std", + "primitives/std", ] diff --git a/core/consensus/aura/primitives/src/lib.rs b/core/consensus/aura/primitives/src/lib.rs index 47b1399a67..10c3c96e4f 100644 --- a/core/consensus/aura/primitives/src/lib.rs +++ b/core/consensus/aura/primitives/src/lib.rs @@ -21,7 +21,7 @@ use parity_codec::{Encode, Decode, Codec}; use substrate_client::decl_runtime_apis; use rstd::vec::Vec; -use runtime_primitives::ConsensusEngineId; +use sr_primitives::ConsensusEngineId; /// The `ConsensusEngineId` of AuRa. pub const AURA_ENGINE_ID: ConsensusEngineId = [b'a', b'u', b'r', b'a']; diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs index 1fe79324f4..82fd0cf655 100644 --- a/core/consensus/aura/src/digest.rs +++ b/core/consensus/aura/src/digest.rs @@ -21,7 +21,7 @@ use primitives::Pair; use aura_primitives::AURA_ENGINE_ID; -use runtime_primitives::generic::{DigestItem, OpaqueDigestItemId}; +use sr_primitives::generic::{DigestItem, OpaqueDigestItemId}; use parity_codec::{Encode, Codec}; use std::fmt::Debug; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 1dd644b751..a08dcdf1d4 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -46,8 +46,8 @@ use client::{ backend::AuxStore, }; -use runtime_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; -use runtime_primitives::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; +use sr_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; +use sr_primitives::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; use primitives::Pair; use inherents::{InherentDataProviders, InherentData}; @@ -716,7 +716,7 @@ mod tests { use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; - use runtime_primitives::traits::{Block as BlockT, DigestFor}; + use sr_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index deb716a7ff..331c85dda8 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -21,7 +21,7 @@ srml-babe = { path = "../../../srml/babe" } client = { package = "substrate-client", path = "../../client" } consensus_common = { package = "substrate-consensus-common", path = "../common" } slots = { package = "substrate-consensus-slots", path = "../slots" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } fork-tree = { path = "../../utils/fork-tree" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } futures01 = { package = "futures", version = "0.1" } diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 6eb0a251e1..2c6ba886f4 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -8,8 +8,8 @@ edition = "2018" [dependencies] substrate-client = { path = "../../../client", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } -substrate-primitives = { path = "../../../primitives", default-features = false } +sr-primitives = { path = "../../../sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } parity-codec = { version = "4.1.1", default-features = false } schnorrkel = { version = "0.1.1", optional = true } @@ -18,7 +18,7 @@ schnorrkel = { version = "0.1.1", optional = true } default = ["std"] std = [ "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "substrate-client/std", "parity-codec/std", "schnorrkel", diff --git a/core/consensus/babe/primitives/src/digest.rs b/core/consensus/babe/primitives/src/digest.rs index f39cc96287..6266b828fb 100644 --- a/core/consensus/babe/primitives/src/digest.rs +++ b/core/consensus/babe/primitives/src/digest.rs @@ -17,14 +17,14 @@ //! Private implementation details of BABE digests. #[cfg(feature = "std")] -use substrate_primitives::sr25519::Signature; +use primitives::sr25519::Signature; #[cfg(feature = "std")] use super::{BABE_ENGINE_ID, Epoch}; #[cfg(not(feature = "std"))] use super::{VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}; use super::SlotNumber; #[cfg(feature = "std")] -use runtime_primitives::{DigestItem, generic::OpaqueDigestItemId}; +use sr_primitives::{DigestItem, generic::OpaqueDigestItemId}; #[cfg(feature = "std")] use std::fmt::Debug; use parity_codec::{Decode, Encode}; diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index b6e964d27f..0e1cc217ab 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -23,8 +23,8 @@ mod digest; use parity_codec::{Encode, Decode}; use rstd::vec::Vec; -use runtime_primitives::ConsensusEngineId; -use substrate_primitives::sr25519; +use sr_primitives::ConsensusEngineId; +use primitives::sr25519; use substrate_client::decl_runtime_apis; #[cfg(feature = "std")] diff --git a/core/consensus/babe/src/aux_schema.rs b/core/consensus/babe/src/aux_schema.rs index 50d2a727f1..91764839fb 100644 --- a/core/consensus/babe/src/aux_schema.rs +++ b/core/consensus/babe/src/aux_schema.rs @@ -21,7 +21,7 @@ use parity_codec::{Decode, Encode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use super::{EpochChanges, SharedEpochChanges}; diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 4f5f9856ff..4a4261b8dd 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -27,8 +27,8 @@ use consensus_common::import_queue::{ BoxJustificationImport, BoxFinalityProofImport, }; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use runtime_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; -use runtime_primitives::traits::{ +use sr_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; +use sr_primitives::traits::{ Block as BlockT, Header, DigestItemFor, NumberFor, ProvideRuntimeApi, SimpleBitOps, Zero, }; diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index 700ef690f3..f9a2360210 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -25,7 +25,7 @@ use client::{LongestChain, block_builder::BlockBuilder}; use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient}; -use runtime_primitives::traits::{Block as BlockT, DigestFor}; +use sr_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use tokio::runtime::current_thread; use keyring::sr25519::Keyring; diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index bb0970f8a2..c4731ce2a5 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -15,7 +15,7 @@ futures-preview = "0.3.0-alpha.17" futures-timer = "0.2.1" rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } parity-codec = { version = "4.1.1", features = ["derive"] } parking_lot = "0.8.0" diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 9293eda308..722bf1caed 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -16,8 +16,8 @@ //! Block import helpers. -use runtime_primitives::traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor}; -use runtime_primitives::Justification; +use sr_primitives::traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor}; +use sr_primitives::Justification; use std::borrow::Cow; use std::collections::HashMap; use std::sync::Arc; diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index ed7515a419..940728bc83 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -19,7 +19,7 @@ use super::MAX_BLOCK_SIZE; use parity_codec::Encode; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; // This is just a best effort to encode the number. None indicated that it's too big to encode // in a u128. diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 085f1e4177..99ca6e7ad7 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -26,7 +26,7 @@ //! queues to be instantiated simply. use std::{sync::Arc, collections::HashMap}; -use runtime_primitives::{Justification, traits::{Block as BlockT, Header as _, NumberFor}}; +use sr_primitives::{Justification, traits::{Block as BlockT, Header as _, NumberFor}}; use crate::{error::Error as ConsensusError, well_known_cache_keys::Id as CacheKeyId}; use crate::block_import::{ BlockImport, BlockOrigin, BlockImportParams, ImportedAux, JustificationImport, ImportResult, diff --git a/core/consensus/common/src/import_queue/basic_queue.rs b/core/consensus/common/src/import_queue/basic_queue.rs index d94c3a383c..851662dbc6 100644 --- a/core/consensus/common/src/import_queue/basic_queue.rs +++ b/core/consensus/common/src/import_queue/basic_queue.rs @@ -17,7 +17,7 @@ use std::{mem, pin::Pin, sync::Arc, time::Duration}; use futures::{prelude::*, channel::mpsc, task::SpawnExt as _, task::Context, task::Poll}; use futures_timer::Delay; -use runtime_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; +use sr_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; use crate::block_import::BlockOrigin; use crate::import_queue::{ diff --git a/core/consensus/common/src/import_queue/buffered_link.rs b/core/consensus/common/src/import_queue/buffered_link.rs index 90921bd1ea..b88f1bfd1e 100644 --- a/core/consensus/common/src/import_queue/buffered_link.rs +++ b/core/consensus/common/src/import_queue/buffered_link.rs @@ -38,7 +38,7 @@ //! use futures::{prelude::*, channel::mpsc}; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use std::{pin::Pin, task::Context, task::Poll}; use crate::import_queue::{Origin, Link, BlockImportResult, BlockImportError}; diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 53816752b1..3fd0a0c694 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -31,7 +31,7 @@ use std::sync::Arc; use std::time::Duration; -use runtime_primitives::traits::{Block as BlockT, DigestFor}; +use sr_primitives::traits::{Block as BlockT, DigestFor}; use futures::prelude::*; pub use inherents::InherentData; diff --git a/core/consensus/common/src/select_chain.rs b/core/consensus/common/src/select_chain.rs index 9ab21cba13..cae28656a1 100644 --- a/core/consensus/common/src/select_chain.rs +++ b/core/consensus/common/src/select_chain.rs @@ -15,7 +15,7 @@ // along with Substrate Consensus Common. If not, see . use crate::error::Error; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; /// The SelectChain trait defines the strategy upon which the head is chosen diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 7eda2d6904..b973e02c60 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -15,7 +15,7 @@ client = { package = "substrate-client", path = "../../client" } transaction_pool = { package = "substrate-transaction-pool", path = "../../transaction-pool" } runtime_support = { package = "srml-support", path = "../../../srml/support" } srml-system = { path = "../../../srml/system" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" @@ -32,6 +32,6 @@ default = ["std"] std = [ "primitives/std", "runtime_support/std", - "runtime_primitives/std", + "sr-primitives/std", "runtime_version/std", ] diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 281f497cbc..94e25dfc91 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -46,13 +46,13 @@ use consensus::error::{ErrorKind as CommonErrorKind}; use consensus::{Authorities, BlockImport, Environment, Proposer as BaseProposer}; use client::{Client as SubstrateClient, CallExecutor}; use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; -use runtime_primitives::generic::{BlockId, Era, ImportResult, BlockImportParams, BlockOrigin}; -use runtime_primitives::traits::{Block, Header}; -use runtime_primitives::traits::{ +use sr_primitives::generic::{BlockId, Era, ImportResult, BlockImportParams, BlockOrigin}; +use sr_primitives::traits::{Block, Header}; +use sr_primitives::traits::{ Block as BlockT, Hash as HashT, Header as HeaderT, BlockNumberToHash, SaturatedConversion }; -use runtime_primitives::Justification; +use sr_primitives::Justification; use primitives::{AuthorityId, ed25519, Blake2Hasher, ed25519::LocalizedSignature}; use srml_system::Trait as SystemT; @@ -982,7 +982,7 @@ impl consensus::Environment<::Block> for ProposerFac authorities: &[AuthorityId], sign_with: Arc, ) -> Result { - use runtime_primitives::traits::Hash as HashT; + use sr_primitives::traits::Hash as HashT; let parent_hash = parent_header.hash(); let id = BlockId::hash(parent_hash); @@ -1061,7 +1061,7 @@ impl BaseProposer<::Block> for Proposer where type Evaluate = Box>; fn propose(&self) -> Self::Create { - use runtime_primitives::traits::BlakeTwo256; + use sr_primitives::traits::BlakeTwo256; const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); @@ -1237,7 +1237,7 @@ impl LocalProposer<::Block> for Proposer where _misbehavior: Vec<(AuthorityId, Misbehavior<<::Block as BlockT>::Hash>)> ) { use rhododendron::Misbehavior as GenericMisbehavior; - use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use sr_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; use node_runtime::{Call, UncheckedExtrinsic, ConsensusCall}; let mut next_index = { @@ -1329,7 +1329,7 @@ mod tests { use std::collections::HashSet; use std::marker::PhantomData; - use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; + use sr_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; use primitives::H256; use keyring::Ed25519Keyring; diff --git a/core/consensus/rhd/src/misbehaviour_check.rs b/core/consensus/rhd/src/misbehaviour_check.rs index a475f5d1ef..e40311c14f 100644 --- a/core/consensus/rhd/src/misbehaviour_check.rs +++ b/core/consensus/rhd/src/misbehaviour_check.rs @@ -77,7 +77,7 @@ mod tests { use keyring::Ed25519Keyring; use rhododendron; - use runtime_primitives::testing::{H256, Block as RawBlock}; + use sr_primitives::testing::{H256, Block as RawBlock}; type Block = RawBlock; diff --git a/core/consensus/rhd/src/service.rs b/core/consensus/rhd/src/service.rs index f59393c530..641a97fe06 100644 --- a/core/consensus/rhd/src/service.rs +++ b/core/consensus/rhd/src/service.rs @@ -25,7 +25,7 @@ use std::sync::Arc; use client::{BlockchainEvents, BlockBody}; use futures::prelude::*; use transaction_pool::txpool::{Pool as TransactionPool, ChainApi as PoolChainApi}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; use tokio::executor::current_thread::TaskExecutor as LocalThreadHandle; use tokio::runtime::TaskExecutor as ThreadPoolHandle; diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 29c11f7533..8d73c44b2b 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" codec = { package = "parity-codec", version = "4.1.1" } client = { package = "substrate-client", path = "../../client" } primitives = { package = "substrate-primitives", path = "../../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../common" } inherents = { package = "substrate-inherents", path = "../../inherents" } futures-preview = "0.3.0-alpha.17" diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs index 1af8b2da53..193c9f9b9d 100644 --- a/core/consensus/slots/src/aux_schema.rs +++ b/core/consensus/slots/src/aux_schema.rs @@ -19,7 +19,7 @@ use codec::{Encode, Decode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; -use runtime_primitives::traits::Header; +use sr_primitives::traits::Header; const SLOT_HEADER_MAP_KEY: &[u8] = b"slot_header_map"; const SLOT_HEADER_START: &[u8] = b"slot_header_start"; @@ -153,7 +153,7 @@ pub fn check_equivocation( mod test { use primitives::{sr25519, Pair}; use primitives::hash::H256; - use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; + use sr_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; use test_client; use super::{MAX_SLOT_CAPACITY, PRUNING_BOUND, check_equivocation}; diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 4cea9d82bf..854e9c8d8b 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -35,8 +35,8 @@ use consensus_common::{SyncOracle, SelectChain}; use futures::{prelude::*, future::{self, Either}, task::Poll}; use inherents::{InherentData, InherentDataProviders}; use log::{debug, error, info, warn}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ApiRef, Block as BlockT, ProvideRuntimeApi}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ApiRef, Block as BlockT, ProvideRuntimeApi}; use std::{fmt::Debug, ops::Deref, panic, pin::Pin}; /// A worker that should be invoked at every new slot. @@ -208,7 +208,7 @@ impl SlotDuration { .into() }), None => { - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; let genesis_slot_duration = cb(client.runtime_api(), &BlockId::number(Zero::zero()))?; diff --git a/core/executor/runtime-test/Cargo.toml b/core/executor/runtime-test/Cargo.toml index 26bf2f71bd..28a0ed2b87 100644 --- a/core/executor/runtime-test/Cargo.toml +++ b/core/executor/runtime-test/Cargo.toml @@ -9,7 +9,7 @@ build = "build.rs" rstd = { package = "sr-std", path = "../../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../sr-io", default-features = false } sandbox = { package = "sr-sandbox", path = "../../sr-sandbox", default-features = false } -substrate-primitives = { path = "../../primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.2", path = "../../utils/wasm-builder-runner" } diff --git a/core/executor/runtime-test/src/lib.rs b/core/executor/runtime-test/src/lib.rs index 6d4e5ccb55..4c68d449f2 100644 --- a/core/executor/runtime-test/src/lib.rs +++ b/core/executor/runtime-test/src/lib.rs @@ -93,7 +93,7 @@ impl_stubs!( [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() }, test_enumerated_trie_root => |_| { - enumerated_trie_root::( + enumerated_trie_root::( &[ &b"zero"[..], &b"one"[..], @@ -138,7 +138,7 @@ impl_stubs!( [code].to_vec() }, test_offchain_local_storage => |_| { - let kind = substrate_primitives::offchain::StorageKind::PERSISTENT; + let kind = primitives::offchain::StorageKind::PERSISTENT; assert_eq!(runtime_io::local_storage_get(kind, b"test"), None); runtime_io::local_storage_set(kind, b"test", b"asd"); assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"asd".to_vec())); @@ -150,7 +150,7 @@ impl_stubs!( [0].to_vec() }, test_offchain_local_storage_with_none => |_| { - let kind = substrate_primitives::offchain::StorageKind::PERSISTENT; + let kind = primitives::offchain::StorageKind::PERSISTENT; assert_eq!(runtime_io::local_storage_get(kind, b"test"), None); let res = runtime_io::local_storage_compare_and_set(kind, b"test", None, b"value"); @@ -160,7 +160,7 @@ impl_stubs!( [0].to_vec() }, test_offchain_http => |_| { - use substrate_primitives::offchain::HttpRequestStatus; + use primitives::offchain::HttpRequestStatus; let run = || -> Option<()> { let id = runtime_io::http_request_start("POST", "http://localhost:12345", &[]).ok()?; runtime_io::http_request_add_header(id, "X-Auth", "test").ok()?; diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 3cbb56df81..8477f75edd 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -14,9 +14,9 @@ tokio-executor = "0.1.7" tokio-timer = "0.2.11" rand = "0.6" parity-codec = { version = "4.1.1", features = ["derive"] } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } substrate-telemetry = { path = "../telemetry" } serde_json = "1.0" client = { package = "substrate-client", path = "../client" } diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index 4f3b469ca8..75e6b5f608 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../client", default-features = false } -substrate-primitives = { path = "../../primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } sr-primitives = { path = "../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../sr-std", default-features = false } @@ -15,7 +15,7 @@ serde = { version = "1.0", optional = true, features = ["derive"] } [features] default = ["std"] std = [ - "substrate-primitives/std", + "primitives/std", "client/std", "parity-codec/std", "sr-primitives/std", diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 7752782025..b60acffc6c 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -30,13 +30,13 @@ use rstd::vec::Vec; /// The grandpa crypto scheme defined via the keypair type. #[cfg(feature = "std")] -pub type AuthorityPair = substrate_primitives::ed25519::Pair; +pub type AuthorityPair = primitives::ed25519::Pair; /// Identity of a Grandpa authority. -pub type AuthorityId = substrate_primitives::ed25519::Public; +pub type AuthorityId = primitives::ed25519::Public; /// Signature for a Grandpa authority. -pub type AuthoritySignature = substrate_primitives::ed25519::Signature; +pub type AuthoritySignature = primitives::ed25519::Signature; /// The `ConsensusEngineId` of GRANDPA. pub const GRANDPA_ENGINE_ID: ConsensusEngineId = *b"FRNK"; diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index f3939f4650..528a221c35 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -23,7 +23,7 @@ use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; use fork_tree::ForkTree; use grandpa::round::State as RoundState; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use log::{info, warn}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use fg_primitives::AuthorityId; @@ -456,7 +456,7 @@ pub(crate) fn load_authorities(backend: &B) #[cfg(test)] mod test { - use substrate_primitives::H256; + use primitives::H256; use test_client; use super::*; diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index dfaa96628f..3d14381e72 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -82,7 +82,7 @@ //! //! We only send polite messages to peers, -use runtime_primitives::traits::{NumberFor, Block as BlockT, Zero}; +use sr_primitives::traits::{NumberFor, Block as BlockT, Zero}; use network::consensus_gossip::{self as network_gossip, MessageIntent, ValidatorContext}; use network::{config::Roles, PeerId}; use parity_codec::{Encode, Decode}; @@ -1249,7 +1249,7 @@ mod tests { use crate::authorities::AuthoritySet; use crate::environment::{CompletedRound, CompletedRounds, HasVoted, VoterSetState}; use grandpa::round::State as RoundState; - use substrate_primitives::H256; + use primitives::H256; let state = RoundState::genesis((H256::zero(), 0)); let base = state.prevote_ghost.unwrap(); diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 4707dede78..e9be187eac 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -36,9 +36,9 @@ use futures::sync::{oneshot, mpsc}; use log::{debug, trace}; use tokio_executor::Executor; use parity_codec::{Encode, Decode}; -use substrate_primitives::{ed25519, Pair}; +use primitives::{ed25519, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; +use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; @@ -50,7 +50,7 @@ use crate::environment::HasVoted; use gossip::{ GossipMessage, FullCatchUpMessage, FullCommitMessage, VoteOrPrecommitMessage, GossipValidator }; -use substrate_primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; pub mod gossip; mod periodic; diff --git a/core/finality-grandpa/src/communication/periodic.rs b/core/finality-grandpa/src/communication/periodic.rs index 8490ff2f79..cae42d0dc7 100644 --- a/core/finality-grandpa/src/communication/periodic.rs +++ b/core/finality-grandpa/src/communication/periodic.rs @@ -19,7 +19,7 @@ use super::{gossip::{NeighborPacket, GossipMessage}, Network}; use futures::prelude::*; use futures::sync::mpsc; -use runtime_primitives::traits::{NumberFor, Block as BlockT}; +use sr_primitives::traits::{NumberFor, Block as BlockT}; use network::PeerId; use tokio_timer::Delay; use log::warn; diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 8b4d28d9f3..cfe41acb3c 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -143,7 +143,7 @@ fn voter_set_state() -> SharedVoterSetState { use crate::authorities::AuthoritySet; use crate::environment::{CompletedRound, CompletedRounds, HasVoted, VoterSetState}; use grandpa::round::State as RoundState; - use substrate_primitives::H256; + use primitives::H256; let state = RoundState::genesis((H256::zero(), 0)); let base = state.prevote_ghost.unwrap(); diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index e3189ecd92..e82cc1f421 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -33,11 +33,11 @@ use grandpa::{ BlockNumberOps, Equivocation, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet, }; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, }; -use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; +use primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use crate::{ diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index e9cc08c695..f174fb04f6 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -45,11 +45,11 @@ use client::{ }; use parity_codec::{Encode, Decode}; use grandpa::BlockNumberOps; -use runtime_primitives::{Justification, generic::BlockId}; -use runtime_primitives::traits::{ +use sr_primitives::{Justification, generic::BlockId}; +use sr_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use fg_primitives::AuthorityId; diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 2647fb5575..91e2b92182 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -32,13 +32,13 @@ use consensus_common::{ SelectChain, }; use fg_primitives::GrandpaApi; -use runtime_primitives::Justification; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::Justification; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Block as BlockT, DigestFor, Header as HeaderT, NumberFor, ProvideRuntimeApi, }; -use substrate_primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 99aedbae05..59a3d2166c 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -23,9 +23,9 @@ use client::error::Error as ClientError; use parity_codec::{Encode, Decode}; use grandpa::voter_set::VoterSet; use grandpa::{Error as GrandpaError}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; +use primitives::{H256, Blake2Hasher}; use fg_primitives::AuthorityId; use crate::{Commit, Error}; diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 534a5d9256..2e688ed952 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -58,14 +58,14 @@ use futures::sync::mpsc; use client::{BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError}; use client::blockchain::HeaderBackend; use parity_codec::Encode; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, }; use fg_primitives::GrandpaApi; use inherents::InherentDataProviders; -use runtime_primitives::generic::BlockId; +use sr_primitives::generic::BlockId; use consensus_common::SelectChain; -use substrate_primitives::{ed25519, H256, Pair, Blake2Hasher}; +use primitives::{ed25519, H256, Pair, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; use serde_json; @@ -355,7 +355,7 @@ where PRA::Api: GrandpaApi, SC: SelectChain, { - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; let chain_info = client.info(); let genesis_hash = chain_info.chain.genesis_hash; diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 133fbabb05..abc98976fd 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -32,13 +32,13 @@ use consensus_common::{ Error as ConsensusError, }; use network::config::{BoxFinalityProofRequestBuilder, FinalityProofRequestBuilder}; -use runtime_primitives::Justification; -use runtime_primitives::traits::{ +use sr_primitives::Justification; +use sr_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, ProvideRuntimeApi, DigestFor, }; use fg_primitives::{GrandpaApi, AuthorityId}; -use runtime_primitives::generic::BlockId; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::generic::BlockId; +use primitives::{H256, Blake2Hasher}; use crate::aux_schema::load_decode; use crate::consensus_changes::ConsensusChanges; @@ -468,7 +468,7 @@ fn load_aux_import_data, PRA>( PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, { - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; let authority_set = match load_decode(aux_store, LIGHT_AUTHORITY_SET_KEY)? { Some(authority_set) => authority_set, None => { @@ -538,7 +538,7 @@ fn on_post_finalization_error(error: ClientError, value_type: &str) -> Consensus pub mod tests { use super::*; use consensus_common::ForkChoiceStrategy; - use substrate_primitives::H256; + use primitives::H256; use test_client::client::in_mem::Blockchain as InMemoryAuxStore; use test_client::runtime::{Block, Header}; use crate::tests::TestApi; diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 2c0818c2d7..1301a6656b 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -26,8 +26,8 @@ use log::{debug, info, warn}; use consensus_common::SelectChain; use client::{CallExecutor, Client, backend::Backend}; -use runtime_primitives::traits::{NumberFor, Block as BlockT}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::traits::{NumberFor, Block as BlockT}; +use primitives::{H256, Blake2Hasher}; use crate::{ global_communication, CommandOrError, CommunicationIn, Config, environment, diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 506da2de14..797463f5de 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -35,9 +35,9 @@ use consensus_common::import_queue::{BoxBlockImport, BoxJustificationImport, Box use std::collections::{HashMap, HashSet}; use std::result; use parity_codec::Decode; -use runtime_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; -use runtime_primitives::generic::BlockId; -use substrate_primitives::{NativeOrEncoded, ExecutionContext}; +use sr_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; +use sr_primitives::generic::BlockId; +use primitives::{NativeOrEncoded, ExecutionContext}; use fg_primitives::AuthorityId; use authorities::AuthoritySet; @@ -273,7 +273,7 @@ impl GrandpaApi for RuntimeApi { _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { + ) -> Result>> { Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } @@ -342,7 +342,7 @@ impl AuthoritySetForFinalityChecker for TestApi { const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); -fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { +fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(primitives::ed25519::Public, u64)> { keys.iter() .map(|key| AuthorityId::from_raw(key.to_raw_public())) .map(|id| (id, 1)) @@ -704,7 +704,7 @@ fn justification_is_emitted_when_consensus_data_changes() { let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change - let new_authorities = vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]; + let new_authorities = vec![primitives::sr25519::Public::from_raw([42; 32])]; net.peer(0).push_authorities_change_block(new_authorities); net.block_until_sync(&mut runtime); let net = Arc::new(Mutex::new(net)); @@ -1320,7 +1320,7 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { // import block#1 WITH consensus data change. Light client ignores justification // && instead fetches finality proof for block #1 - net.peer(0).push_authorities_change_block(vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]); + net.peer(0).push_authorities_change_block(vec![primitives::sr25519::Public::from_raw([42; 32])]); let net = Arc::new(Mutex::new(net)); run_to_completion(&mut runtime, 1, net.clone(), peers); net.lock().block_until_sync(&mut runtime); @@ -1383,7 +1383,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // normally it will reach light client, but because of the forced change, it will not net.lock().peer(0).push_blocks(8, false); // best is #9 net.lock().peer(0).push_authorities_change_block( - vec![substrate_primitives::sr25519::Public::from_raw([42; 32])] + vec![primitives::sr25519::Public::from_raw([42; 32])] ); // #10 net.lock().peer(0).push_blocks(1, false); // best is #11 net.lock().block_until_sync(&mut runtime); diff --git a/core/finality-grandpa/src/until_imported.rs b/core/finality-grandpa/src/until_imported.rs index 5575a0d2c6..af797c99ab 100644 --- a/core/finality-grandpa/src/until_imported.rs +++ b/core/finality-grandpa/src/until_imported.rs @@ -29,7 +29,7 @@ use futures::stream::Fuse; use futures03::{StreamExt as _, TryStreamExt as _}; use grandpa::voter; use parking_lot::Mutex; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use tokio_timer::Interval; use std::collections::{HashMap, VecDeque}; diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index 1824eef80f..7174b7acea 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" parking_lot = { version = "0.8.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } [features] default = [ "std" ] @@ -16,5 +16,5 @@ std = [ "parking_lot", "rstd/std", "parity-codec/std", - "runtime_primitives/std", + "sr-primitives/std", ] diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 040f289957..a5dcfdffcf 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -44,7 +44,7 @@ use parking_lot::RwLock; #[cfg(feature = "std")] use std::{sync::Arc, format}; -pub use runtime_primitives::RuntimeString; +pub use sr_primitives::RuntimeString; /// An identifier for an inherent. pub type InherentIdentifier = [u8; 8]; diff --git a/core/keyring/Cargo.toml b/core/keyring/Cargo.toml index 299d822843..84d6f765b7 100644 --- a/core/keyring/Cargo.toml +++ b/core/keyring/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } sr-primitives = { path = "../sr-primitives" } lazy_static = { version = "1.0" } strum = "0.14.0" diff --git a/core/keyring/src/ed25519.rs b/core/keyring/src/ed25519.rs index bec4c80156..a66cc73b56 100644 --- a/core/keyring/src/ed25519.rs +++ b/core/keyring/src/ed25519.rs @@ -18,8 +18,8 @@ use std::{collections::HashMap, ops::Deref}; use lazy_static::lazy_static; -use substrate_primitives::{ed25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; -pub use substrate_primitives::ed25519; +use primitives::{ed25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; +pub use primitives::ed25519; /// Set of test accounts. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum_macros::Display, strum_macros::EnumIter)] @@ -168,7 +168,7 @@ impl Deref for Keyring { #[cfg(test)] mod tests { use super::*; - use substrate_primitives::{ed25519::Pair, Pair as PairT}; + use primitives::{ed25519::Pair, Pair as PairT}; #[test] fn should_work() { diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 202b954966..aefdc05fa7 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -19,8 +19,8 @@ use std::collections::HashMap; use std::ops::Deref; use lazy_static::lazy_static; -use substrate_primitives::{sr25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; -pub use substrate_primitives::sr25519; +use primitives::{sr25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; +pub use primitives::sr25519; /// Set of test accounts. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum_macros::Display, strum_macros::EnumIter)] @@ -178,7 +178,7 @@ impl Deref for Keyring { #[cfg(test)] mod tests { use super::*; - use substrate_primitives::{sr25519::Pair, Pair as PairT}; + use primitives::{sr25519::Pair, Pair as PairT}; #[test] fn should_work() { diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 1d4f146b7e..00a653c114 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } hex = "0.3" rand = "0.6" serde_json = "1.0" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 77106059f8..89cfca559c 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -23,7 +23,7 @@ use std::path::PathBuf; use std::fs::{self, File}; use std::io::{self, Write}; -use substrate_primitives::crypto::{KeyTypeId, Pair, Public}; +use primitives::crypto::{KeyTypeId, Pair, Public}; /// Keystore error. #[derive(Debug, derive_more::Display, derive_more::From)] @@ -165,8 +165,8 @@ impl Store { mod tests { use super::*; use tempdir::TempDir; - use substrate_primitives::ed25519; - use substrate_primitives::crypto::Ss58Codec; + use primitives::ed25519; + use primitives::crypto::Ss58Codec; #[test] fn basic_store() { diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 6fd793a841..3d687486c0 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -24,10 +24,10 @@ rustc-hex = "2.0" rand = "0.6" libp2p = { version = "0.11.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } fork-tree = { path = "../../core/utils/fork-tree" } -primitives = { package = "substrate-primitives", path = "../../core/primitives" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } client = { package = "substrate-client", path = "../../core/client" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } parity-codec = { version = "4.1.1", features = ["derive"] } peerset = { package = "substrate-peerset", path = "../../core/peerset" } serde = { version = "1.0.70", features = ["derive"] } diff --git a/core/network/src/behaviour.rs b/core/network/src/behaviour.rs index 0fc034edfc..f2144c89a5 100644 --- a/core/network/src/behaviour.rs +++ b/core/network/src/behaviour.rs @@ -27,7 +27,7 @@ use libp2p::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess}; use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; use libp2p::multihash::Multihash; use log::warn; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use std::iter; use void; diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index 76096a44aa..e857aa095c 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -20,9 +20,9 @@ use client::{self, Client as SubstrateClient, ClientInfo, BlockStatus, CallExecu use client::error::Error; use client::light::fetcher::ChangesProof; use consensus::{BlockImport, Error as ConsensusError}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; -use runtime_primitives::generic::{BlockId}; -use runtime_primitives::Justification; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; +use sr_primitives::generic::{BlockId}; +use sr_primitives::Justification; use primitives::{H256, Blake2Hasher, storage::StorageKey}; /// Local client abstraction for the network. diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 7c7c540d11..13e9a0d3a5 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -28,7 +28,7 @@ use crate::service::{ExHashT, TransactionPool}; use bitflags::bitflags; use consensus::import_queue::ImportQueue; use parity_codec; -use runtime_primitives::traits::{Block as BlockT}; +use sr_primitives::traits::{Block as BlockT}; use std::sync::Arc; use libp2p::identity::{Keypair, secp256k1, ed25519}; use libp2p::wasm_ext; diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 4e2a9c882c..28437901e2 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -202,7 +202,7 @@ pub use on_demand_layer::{OnDemand, RemoteResponse}; // Used by the `construct_simple_protocol!` macro. #[doc(hidden)] -pub use runtime_primitives::traits::Block as BlockT; +pub use sr_primitives::traits::Block as BlockT; use libp2p::core::ConnectedPoint; use serde::{Deserialize, Serialize}; diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs index 17a70bbe0d..1cbb5387d6 100644 --- a/core/network/src/on_demand_layer.rs +++ b/core/network/src/on_demand_layer.rs @@ -25,7 +25,7 @@ use client::error::Error as ClientError; use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, RemoteReadChildRequest, RemoteBodyRequest}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Implements the `Fetcher` trait of the client. Makes it possible for the light client to perform /// network requests for some state. diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 0d71955474..e23ec1e099 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -24,8 +24,8 @@ use libp2p::swarm::{ProtocolsHandler, IntoProtocolsHandler}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use primitives::storage::StorageKey; use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; -use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; -use runtime_primitives::traits::{ +use sr_primitives::{generic::BlockId, ConsensusEngineId, Justification}; +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, One, Zero, CheckedSub, SaturatedConversion }; diff --git a/core/network/src/protocol/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs index f134326959..c2a2debaea 100644 --- a/core/network/src/protocol/consensus_gossip.rs +++ b/core/network/src/protocol/consensus_gossip.rs @@ -25,8 +25,8 @@ use log::{trace, debug}; use futures::sync::mpsc; use lru_cache::LruCache; use libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, Hash, HashFor}; -use runtime_primitives::ConsensusEngineId; +use sr_primitives::traits::{Block as BlockT, Hash, HashFor}; +use sr_primitives::ConsensusEngineId; pub use crate::message::generic::{Message, ConsensusMessage}; use crate::protocol::Context; use crate::config::Roles; @@ -556,7 +556,7 @@ impl ConsensusGossip { #[cfg(test)] mod tests { - use runtime_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; use futures::Stream; use super::*; diff --git a/core/network/src/protocol/message.rs b/core/network/src/protocol/message.rs index 5aa47d9c26..def9d4c225 100644 --- a/core/network/src/protocol/message.rs +++ b/core/network/src/protocol/message.rs @@ -17,7 +17,7 @@ //! Network packet message types. These get serialized and put into the lower level protocol payload. use bitflags::bitflags; -use runtime_primitives::{ConsensusEngineId, traits::{Block as BlockT, Header as HeaderT}}; +use sr_primitives::{ConsensusEngineId, traits::{Block as BlockT, Header as HeaderT}}; use parity_codec::{Encode, Decode, Input, Output}; pub use self::generic::{ BlockAnnounce, RemoteCallRequest, RemoteReadRequest, @@ -126,7 +126,7 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { use parity_codec::{Encode, Decode}; - use runtime_primitives::Justification; + use sr_primitives::Justification; use crate::config::Roles; use super::{ RemoteReadResponse, Transactions, Direction, diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/on_demand.rs index 7f07ab96f9..9d35535e21 100644 --- a/core/network/src/protocol/on_demand.rs +++ b/core/network/src/protocol/on_demand.rs @@ -29,7 +29,7 @@ use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use libp2p::PeerId; use crate::config::Roles; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Remote request timeout. const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); @@ -637,7 +637,7 @@ pub mod tests { use std::sync::Arc; use std::time::Instant; use futures::{Future, sync::oneshot}; - use runtime_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; + use sr_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; use client::{error::{Error as ClientError, Result as ClientResult}}; use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, ChangesProof, RemoteCallRequest, RemoteReadRequest, diff --git a/core/network/src/protocol/specialization.rs b/core/network/src/protocol/specialization.rs index 7f6b7dc44f..e2c444ea88 100644 --- a/core/network/src/protocol/specialization.rs +++ b/core/network/src/protocol/specialization.rs @@ -20,7 +20,7 @@ pub use crate::protocol::event::{DhtEvent, Event}; use crate::protocol::Context; use libp2p::PeerId; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs index e4e1c35599..12f0ac6568 100644 --- a/core/network/src/protocol/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -39,7 +39,7 @@ use either::Either; use extra_requests::ExtraRequests; use libp2p::PeerId; use log::{debug, trace, warn, info, error}; -use runtime_primitives::{ +use sr_primitives::{ Justification, generic::BlockId, traits::{Block as BlockT, Header, NumberFor, Zero, One, CheckedSub, SaturatedConversion} diff --git a/core/network/src/protocol/sync/blocks.rs b/core/network/src/protocol/sync/blocks.rs index ff8d9907af..90264249ea 100644 --- a/core/network/src/protocol/sync/blocks.rs +++ b/core/network/src/protocol/sync/blocks.rs @@ -21,7 +21,7 @@ use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use log::trace; use libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, NumberFor, One}; +use sr_primitives::traits::{Block as BlockT, NumberFor, One}; use crate::message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; @@ -202,7 +202,7 @@ impl BlockCollection { mod test { use super::{BlockCollection, BlockData, BlockRangeState}; use crate::{message, PeerId}; - use runtime_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; use primitives::H256; type Block = RawBlock>; diff --git a/core/network/src/protocol/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs index c4f6de05a2..0ee009cab8 100644 --- a/core/network/src/protocol/sync/extra_requests.rs +++ b/core/network/src/protocol/sync/extra_requests.rs @@ -19,7 +19,7 @@ use crate::protocol::sync::{PeerSync, PeerSyncState}; use fork_tree::ForkTree; use libp2p::PeerId; use log::warn; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use std::collections::{HashMap, HashSet, VecDeque}; use std::time::{Duration, Instant}; diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 2075aef286..acd3bbeab7 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -38,7 +38,7 @@ use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::swarm::NetworkBehaviour; use parking_lot::Mutex; use peerset::PeersetHandle; -use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; +use sr_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; use crate::{behaviour::{Behaviour, BehaviourOut}, config::parse_str_addr}; use crate::{NetworkState, NetworkStateNotConnectedPeer, NetworkStatePeer}; @@ -536,7 +536,7 @@ pub trait NetworkStateInfo { impl NetworkStateInfo for NetworkService where - B: runtime_primitives::traits::Block, + B: sr_primitives::traits::Block, S: NetworkSpecialization, H: ExHashT, { diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index eb49dbda7a..ce58755a89 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -21,7 +21,7 @@ use consensus::import_queue::{ }; use test_client::{self, prelude::*}; use test_client::runtime::{Block, Hash}; -use runtime_primitives::generic::BlockId; +use sr_primitives::generic::BlockId; use super::*; fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) { diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 8f9fe7d097..c416d347d6 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -47,9 +47,9 @@ use libp2p::PeerId; use parking_lot::Mutex; use primitives::{H256, Blake2Hasher}; use crate::protocol::{Context, ProtocolConfig}; -use runtime_primitives::generic::{BlockId, OpaqueDigestItemId}; -use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; -use runtime_primitives::Justification; +use sr_primitives::generic::{BlockId, OpaqueDigestItemId}; +use sr_primitives::traits::{Block as BlockT, Header, NumberFor}; +use sr_primitives::Justification; use crate::service::TransactionPool; use crate::specialization::NetworkSpecialization; use test_client::{self, AccountKeyring}; diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index ecc098ae08..694ce38663 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -14,7 +14,7 @@ offchain-primitives = { package = "substrate-offchain-primitives", path = "./pri parity-codec = { version = "4.1.1", features = ["derive"] } parking_lot = "0.8.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } network = { package = "substrate-network", path = "../../core/network" } diff --git a/core/offchain/primitives/Cargo.toml b/core/offchain/primitives/Cargo.toml index a081f681b6..c96a579c44 100644 --- a/core/offchain/primitives/Cargo.toml +++ b/core/offchain/primitives/Cargo.toml @@ -8,11 +8,11 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../client", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives", default-features = false } +sr-primitives = { path = "../../sr-primitives", default-features = false } [features] default = ["std"] std = [ "client/std", - "runtime_primitives/std" + "sr-primitives/std" ] diff --git a/core/offchain/primitives/src/lib.rs b/core/offchain/primitives/src/lib.rs index c05e8dceb9..d51239483a 100644 --- a/core/offchain/primitives/src/lib.rs +++ b/core/offchain/primitives/src/lib.rs @@ -20,7 +20,7 @@ #![warn(missing_docs)] use client::decl_runtime_apis; -use runtime_primitives::traits::NumberFor; +use sr_primitives::traits::NumberFor; decl_runtime_apis! { /// The offchain worker api. diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 711611ada5..8af7b333f5 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -15,9 +15,9 @@ // along with Substrate. If not, see . use std::{ - str::FromStr, - sync::Arc, - convert::{TryFrom, TryInto}, + str::FromStr, + sync::Arc, + convert::{TryFrom, TryInto}, time::{SystemTime, Duration}, thread::sleep, }; @@ -36,7 +36,7 @@ use primitives::offchain::{ }; use primitives::crypto::{Pair, Public, Protected}; use primitives::{ed25519, sr25519}; -use runtime_primitives::{ +use sr_primitives::{ generic::BlockId, traits::{self, Extrinsic}, }; @@ -569,7 +569,7 @@ impl AsyncApi { mod tests { use super::*; use std::convert::TryFrom; - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; use client_db::offchain::LocalStorage; use crate::tests::TestProvider; use network::PeerId; @@ -602,14 +602,14 @@ mod tests { #[test] fn should_get_timestamp() { let mut api = offchain_api().0; - + // Get timestamp from std. let now = SystemTime::now(); let d: u64 = now.duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis().try_into().unwrap(); // Get timestamp from offchain api. let timestamp = api.timestamp(); - + // Compare. assert!(timestamp.unix_millis() > 0); assert_eq!(timestamp.unix_millis(), d); @@ -627,7 +627,7 @@ mod tests { // Act. api.sleep_until(deadline); let new_now = api.timestamp(); - + // Assert. // The diff could be more than the sleep duration. assert!(new_now.unix_millis() - 100 >= now.unix_millis()); diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index d4947e271f..feacb535aa 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -45,7 +45,7 @@ use primitives::{ ExecutionContext, crypto, }; -use runtime_primitives::{ +use sr_primitives::{ generic::BlockId, traits::{self, ProvideRuntimeApi}, }; diff --git a/core/primitives/benches/benches.rs b/core/primitives/benches/benches.rs index 4a0e08978f..5245af44a8 100644 --- a/core/primitives/benches/benches.rs +++ b/core/primitives/benches/benches.rs @@ -16,10 +16,11 @@ #[macro_use] extern crate criterion; +use substrate_primitives as primitives; use criterion::{Criterion, black_box, Bencher, Fun}; use std::time::Duration; -use substrate_primitives::crypto::Pair as _; -use substrate_primitives::hashing::{twox_128, blake2_128}; +use primitives::crypto::Pair as _; +use primitives::hashing::{twox_128, blake2_128}; const MAX_KEY_SIZE: u32 = 32; @@ -71,7 +72,7 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate().0; + let key = primitives::ed25519::Pair::generate().0; b.iter(|| key.sign(&msg)) }, vec![32, 1024, 1024 * 1024]); @@ -79,10 +80,10 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate().0; + let key = primitives::ed25519::Pair::generate().0; let sig = key.sign(&msg); let public = key.public(); - b.iter(|| substrate_primitives::ed25519::Pair::verify(&sig, &msg, &public)) + b.iter(|| primitives::ed25519::Pair::verify(&sig, &msg, &public)) }, vec![32, 1024, 1024 * 1024]); } diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index 181cbdfd8e..a94b410775 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -23,7 +23,7 @@ network = { package = "substrate-network", path = "../network" } primitives = { package = "substrate-primitives", path = "../primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } transaction_pool = { package = "substrate-transaction-pool", path = "../transaction-pool" } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } runtime_version = { package = "sr-version", path = "../sr-version" } [dev-dependencies] diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 5594984d0e..4e64ff0ce2 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -32,7 +32,7 @@ use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use log::warn; use parity_codec::{Encode, Decode}; use primitives::{Bytes, Blake2Hasher, H256}; -use runtime_primitives::{generic, traits}; +use sr_primitives::{generic, traits}; use self::error::Result; use transaction_pool::{ txpool::{ diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index d1d476c3ab..9b8192e660 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -33,8 +33,8 @@ use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use log::warn; use primitives::{H256, Blake2Hasher}; -use runtime_primitives::generic::{BlockId, SignedBlock}; -use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; +use sr_primitives::generic::{BlockId, SignedBlock}; +use sr_primitives::traits::{Block as BlockT, Header, NumberFor}; use self::error::Result; pub use self::gen_client::Client as ChainClient; diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index 40ee94fdb2..0044ad77b8 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -38,8 +38,8 @@ use log::{warn, trace}; use primitives::hexdisplay::HexDisplay; use primitives::storage::{self, StorageKey, StorageData, StorageChangeSet}; use primitives::{H256, Blake2Hasher, Bytes}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Block as BlockT, Header, ProvideRuntimeApi, NumberFor, SaturatedConversion }; diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index d0578590ae..c8cf97c658 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -26,7 +26,7 @@ use crate::helpers::Receiver; use futures::sync::{mpsc, oneshot}; use jsonrpc_derive::rpc; use network; -use runtime_primitives::traits::{self, Header as HeaderT}; +use sr_primitives::traits::{self, Header as HeaderT}; use self::error::Result; pub use self::helpers::{Properties, SystemInfo, Health, PeerInfo}; diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 6a15e2eeb6..4ce3facb52 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -21,7 +21,7 @@ sysinfo = "0.9.0" target_info = "0.1" keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 6e7151ee0a..39cd5f570f 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -21,8 +21,8 @@ use futures::prelude::*; use futures03::TryFutureExt as _; use log::{info, warn}; -use runtime_primitives::generic::{SignedBlock, BlockId}; -use runtime_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; +use sr_primitives::generic::{SignedBlock, BlockId}; +use sr_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; use consensus_common::import_queue::{ImportQueue, IncomingBlock, Link, BlockImportError, BlockImportResult}; use network::message; diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index 6af0f5766e..461d24e188 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -21,7 +21,7 @@ use std::fs::File; use std::path::PathBuf; use serde::{Serialize, Deserialize}; use primitives::storage::{StorageKey, StorageData}; -use runtime_primitives::{BuildStorage, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::{BuildStorage, StorageOverlay, ChildrenStorageOverlay}; use serde_json as json; use crate::components::RuntimeGenesis; use network::Multiaddr; diff --git a/core/service/src/components.rs b/core/service/src/components.rs index e81380b320..dff6161f16 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -26,7 +26,7 @@ use consensus_common::{import_queue::ImportQueue, SelectChain}; use network::{self, OnDemand, FinalityProofProvider, NetworkStateInfo, config::BoxFinalityProofRequestBuilder}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; -use runtime_primitives::{ +use sr_primitives::{ BuildStorage, traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi}, generic::BlockId }; use crate::config::Configuration; diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 6f2f51ebfb..cd2364b37d 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -24,7 +24,7 @@ use std::{path::PathBuf, net::SocketAddr}; use transaction_pool; use crate::chain_spec::ChainSpec; use primitives::crypto::Protected; -use runtime_primitives::BuildStorage; +use sr_primitives::BuildStorage; use serde::{Serialize, de::DeserializeOwned}; use target_info::Target; use tel::TelemetryEndpoints; diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index bd600b81cb..9f5de4de1b 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -42,8 +42,8 @@ use network::{NetworkState, NetworkStateInfo}; use log::{log, info, warn, debug, error, Level}; use parity_codec::{Encode, Decode}; use primitives::{Pair, ed25519, sr25519, crypto}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, NumberFor, SaturatedConversion, Zero}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Header, NumberFor, SaturatedConversion, Zero}; use substrate_executor::NativeExecutor; use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use tel::{telemetry, SUBSTRATE_INFO}; @@ -722,7 +722,7 @@ fn build_network_future< "Polling the network future took {:?}", polling_dur ); - + Ok(Async::NotReady) }) } @@ -846,7 +846,7 @@ fn transactions_to_propagate(pool: &TransactionPool) where PoolApi: ChainApi, B: BlockT, - H: std::hash::Hash + Eq + runtime_primitives::traits::Member + serde::Serialize, + H: std::hash::Hash + Eq + sr_primitives::traits::Member + serde::Serialize, E: txpool::error::IntoPoolError + From, { pool.ready() @@ -916,7 +916,7 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider where - Block: runtime_primitives::traits::Block, + Block: sr_primitives::traits::Block, ConsensusPair: Pair, FinalityPair: Pair, { @@ -991,8 +991,8 @@ where /// # use node_runtime::{GenesisConfig, RuntimeApi}; /// # use std::sync::Arc; /// # use node_primitives::Block; -/// # use runtime_primitives::Justification; -/// # use runtime_primitives::traits::Block as BlockT; +/// # use sr_primitives::Justification; +/// # use sr_primitives::traits::Block as BlockT; /// # use grandpa; /// # construct_simple_protocol! { /// # pub struct NodeProtocol where Block = Block { } @@ -1178,7 +1178,7 @@ macro_rules! construct_service_factory { mod tests { use super::*; use consensus_common::SelectChain; - use runtime_primitives::traits::BlindCheckable; + use sr_primitives::traits::BlindCheckable; use substrate_test_runtime_client::{prelude::*, runtime::{Extrinsic, Transfer}}; #[test] diff --git a/core/service/test/Cargo.toml b/core/service/test/Cargo.toml index 38cdd042d6..aa3dddfc18 100644 --- a/core/service/test/Cargo.toml +++ b/core/service/test/Cargo.toml @@ -14,6 +14,6 @@ fdlimit = "0.1" service = { package = "substrate-service", path = "../../../core/service" } network = { package = "substrate-network", path = "../../../core/network" } consensus = { package = "substrate-consensus-common", path = "../../../core/consensus/common" } -primitives = { package = "substrate-primitives", path = "../../../core/primitives" } client = { package = "substrate-client", path = "../../../core/client" } sr-primitives = { path = "../../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../../../core/primitives" } diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index c9a91e7491..aed1c022da 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -18,9 +18,9 @@ proc-macro-crate = "0.1.3" client = { package = "substrate-client", path = "../client" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } sr-version = { path = "../sr-version" } -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } criterion = "0.2" consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } codec = { package = "parity-codec", version = "4.1.1" } diff --git a/core/sr-api-macros/benches/bench.rs b/core/sr-api-macros/benches/bench.rs index 054f73c3d4..9aba38c2d1 100644 --- a/core/sr-api-macros/benches/bench.rs +++ b/core/sr-api-macros/benches/bench.rs @@ -19,7 +19,7 @@ use test_client::{ DefaultTestClientBuilderExt, TestClientBuilder, TestClientBuilderExt, runtime::TestAPI, }; -use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; +use sr_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; use state_machine::ExecutionStrategy; fn sr_api_benchmark(c: &mut Criterion) { diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index 1a315f44dd..d88fb09d1b 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -50,10 +50,10 @@ mod utils; /// /// use version::create_runtime_str; /// # extern crate test_client; -/// # extern crate runtime_primitives; -/// # extern crate substrate_primitives; +/// # extern crate sr_primitives; +/// # extern crate primitives; /// # -/// # use runtime_primitives::traits::GetNodeBlockType; +/// # use sr_primitives::traits::GetNodeBlockType; /// # use test_client::runtime::{Block, Header}; /// # /// # /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` diff --git a/core/sr-api-macros/tests/decl_and_impl.rs b/core/sr-api-macros/tests/decl_and_impl.rs index ba7ef23b99..36091d1f85 100644 --- a/core/sr-api-macros/tests/decl_and_impl.rs +++ b/core/sr-api-macros/tests/decl_and_impl.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT}; -use runtime_primitives::generic::BlockId; +use sr_primitives::traits::{GetNodeBlockType, Block as BlockT}; +use sr_primitives::generic::BlockId; use client::runtime_api::{self, RuntimeApiInfo}; use client::{error::Result, decl_runtime_apis, impl_runtime_apis}; use test_client::runtime::Block; diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index 83a4f58095..75da2fe292 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -19,7 +19,7 @@ use test_client::{ DefaultTestClientBuilderExt, TestClientBuilder, runtime::{TestAPI, DecodeFails, Transfer, Header}, }; -use runtime_primitives::{ +use sr_primitives::{ generic::BlockId, traits::{ProvideRuntimeApi, Header as HeaderT, Hash as HashT}, }; diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs index 27aa60c624..1272362005 100644 --- a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::decl_runtime_apis; diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.rs b/core/sr-api-macros/tests/ui/declaring_old_block.rs index 6b7f380ef2..78d35579fa 100644 --- a/core/sr-api-macros/tests/ui/declaring_old_block.rs +++ b/core/sr-api-macros/tests/ui/declaring_old_block.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use client::decl_runtime_apis; decl_runtime_apis! { diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.stderr b/core/sr-api-macros/tests/ui/declaring_old_block.stderr index 2ab1cc675d..181aa2a3ca 100644 --- a/core/sr-api-macros/tests/ui/declaring_old_block.stderr +++ b/core/sr-api-macros/tests/ui/declaring_old_block.stderr @@ -10,10 +10,10 @@ error: `Block: BlockT` generic parameter will be added automatically by the `dec 5 | pub trait Api { | ^^^^^^ -warning: unused import: `runtime_primitives::traits::Block as BlockT` +warning: unused import: `sr_primitives::traits::Block as BlockT` --> $DIR/declaring_old_block.rs:1:5 | -1 | use runtime_primitives::traits::Block as BlockT; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1 | use sr_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs index 1371295cc0..d63eadc1e4 100644 --- a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use client::decl_runtime_apis; decl_runtime_apis! { diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr index cf5fe0f53f..a591d0448c 100644 --- a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr @@ -4,10 +4,10 @@ error: `Block: BlockT` generic parameter will be added automatically by the `dec 5 | pub trait Api { | ^^^^^^ -warning: unused import: `runtime_primitives::traits::Block as BlockT` +warning: unused import: `sr_primitives::traits::Block as BlockT` --> $DIR/declaring_own_block_with_different_name.rs:1:5 | -1 | use runtime_primitives::traits::Block as BlockT; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1 | use sr_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs index 4cf56bf54b..c9c334f6fd 100644 --- a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs index 91ffdd798a..774d017c19 100644 --- a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs index 0871b0ff33..acca97a73d 100644 --- a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs index eafe53e23b..99755144f7 100644 --- a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs index cbf339e73b..f6f6e3dfb3 100644 --- a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs index 014b7bd1e8..0e7dc56951 100644 --- a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index a5399eb5f7..f736df0e01 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -9,7 +9,7 @@ num-traits = { version = "0.2", default-features = false } integer-sqrt = { version = "0.1.2" } serde = { version = "1.0", optional = true, features = ["derive"] } codec = { package = "parity-codec", version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } log = { version = "0.4", optional = true } @@ -28,5 +28,5 @@ std = [ "rstd/std", "runtime_io/std", "codec/std", - "substrate-primitives/std", + "primitives/std", ] diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 5edb370e50..9d18f67f4c 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -105,7 +105,7 @@ pub enum DigestItem { impl ::serde::Serialize for DigestItem { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| { - ::substrate_primitives::bytes::serialize(bytes, seq) + ::primitives::bytes::serialize(bytes, seq) }) } } diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index 887aedc818..66d226b2c4 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -48,7 +48,7 @@ pub struct Header, Hash: HashT> { #[cfg(feature = "std")] pub fn serialize_number>(val: &T, s: S) -> Result where S: ::serde::Serializer { - use substrate_primitives::uint::U256; + use primitives::uint::U256; let v: u128 = (*val).into(); let lower = U256::from(v as u64); let upper = U256::from(v.rotate_left(64) as u64) << 64; diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index fe2ec2fe56..67e85da374 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -17,7 +17,7 @@ //! Tests for the generic implementations of Extrinsic/Header/Block. use crate::codec::{Decode, Encode}; -use substrate_primitives::H256; +use primitives::H256; use super::DigestItem; #[test] diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 922fe7f9de..08cd4d1a05 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -35,7 +35,7 @@ pub use paste; pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; use rstd::{prelude::*, ops, convert::TryInto}; -use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; +use primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; #[cfg(feature = "std")] @@ -52,7 +52,7 @@ pub mod transaction_validity; pub use generic::{DigestItem, Digest}; /// Re-export this since it's part of the API of this crate. -pub use substrate_primitives::crypto::{key_types, KeyTypeId}; +pub use primitives::crypto::{key_types, KeyTypeId}; /// A message indicating an invalid signature in extrinsic. pub const BAD_SIGNATURE: &str = "bad signature in extrinsic"; @@ -868,14 +868,14 @@ pub struct OpaqueExtrinsic(pub Vec); #[cfg(feature = "std")] impl std::fmt::Debug for OpaqueExtrinsic { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(fmt, "{}", substrate_primitives::hexdisplay::HexDisplay::from(&self.0)) + write!(fmt, "{}", primitives::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] impl ::serde::Serialize for OpaqueExtrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - codec::Encode::using_encoded(&self.0, |bytes| ::substrate_primitives::bytes::serialize(bytes, seq)) + codec::Encode::using_encoded(&self.0, |bytes| ::primitives::bytes::serialize(bytes, seq)) } } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 6ef7844fc9..0986c4f81a 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -25,9 +25,9 @@ use crate::traits::{ }; use crate::{generic, KeyTypeId}; use crate::weights::{GetDispatchInfo, DispatchInfo}; -pub use substrate_primitives::H256; -use substrate_primitives::U256; -use substrate_primitives::ed25519::{Public as AuthorityId}; +pub use primitives::H256; +use primitives::U256; +use primitives::ed25519::{Public as AuthorityId}; use crate::transaction_validity::TransactionValidity; /// Authority Id diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 670f8d181d..2019bbf126 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -21,12 +21,12 @@ use rstd::{self, result, marker::PhantomData, convert::{TryFrom, TryInto}}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; -use substrate_primitives::{self, Hasher, Blake2Hasher}; +use primitives::{self, Hasher, Blake2Hasher}; use crate::codec::{Codec, Encode, Decode, HasCompact}; use crate::transaction_validity::{ValidTransaction, TransactionValidity}; use crate::generic::{Digest, DigestItem}; use crate::weights::DispatchInfo; -pub use substrate_primitives::crypto::TypedKey; +pub use primitives::crypto::TypedKey; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, @@ -57,15 +57,15 @@ pub trait Verify { fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; } -impl Verify for substrate_primitives::ed25519::Signature { - type Signer = substrate_primitives::ed25519::Public; +impl Verify for primitives::ed25519::Signature { + type Signer = primitives::ed25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { runtime_io::ed25519_verify(self.as_ref(), msg.get(), signer) } } -impl Verify for substrate_primitives::sr25519::Signature { - type Signer = substrate_primitives::sr25519::Public; +impl Verify for primitives::sr25519::Signature { + type Signer = primitives::sr25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { runtime_io::sr25519_verify(self.as_ref(), msg.get(), signer) } @@ -458,7 +458,7 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup pub struct BlakeTwo256; impl Hash for BlakeTwo256 { - type Output = substrate_primitives::H256; + type Output = primitives::H256; type Hasher = Blake2Hasher; fn hash(s: &[u8]) -> Self::Output { runtime_io::blake2_256(s).into() @@ -493,10 +493,10 @@ pub trait CheckEqual { fn check_equal(&self, other: &Self); } -impl CheckEqual for substrate_primitives::H256 { +impl CheckEqual for primitives::H256 { #[cfg(feature = "std")] fn check_equal(&self, other: &Self) { - use substrate_primitives::hexdisplay::HexDisplay; + use primitives::hexdisplay::HexDisplay; if self != other { println!("Hash: given={}, expected={}", HexDisplay::from(self.as_fixed_bytes()), HexDisplay::from(other.as_fixed_bytes())); } diff --git a/core/sr-version/Cargo.toml b/core/sr-version/Cargo.toml index fb9b0a4688..e7ce3327a0 100644 --- a/core/sr-version/Cargo.toml +++ b/core/sr-version/Cargo.toml @@ -9,7 +9,7 @@ impl-serde = { version = "0.1", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } [features] default = ["std"] @@ -18,5 +18,5 @@ std = [ "serde", "parity-codec/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", ] diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 179146cc84..12998cecbc 100644 --- a/core/sr-version/src/lib.rs +++ b/core/sr-version/src/lib.rs @@ -25,13 +25,13 @@ use std::fmt; #[cfg(feature = "std")] use std::collections::HashSet; #[cfg(feature = "std")] -use runtime_primitives::traits::RuntimeApiInfo; +use sr_primitives::traits::RuntimeApiInfo; use parity_codec::Encode; #[cfg(feature = "std")] use parity_codec::Decode; -use runtime_primitives::RuntimeString; -pub use runtime_primitives::create_runtime_str; +use sr_primitives::RuntimeString; +pub use sr_primitives::create_runtime_str; /// The identity of a particular API interface that the runtime might provide. pub type ApiId = [u8; 8]; diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 0d709fab68..abb42daea2 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -14,5 +14,5 @@ hash-db = "0.14.0" keyring = { package = "substrate-keyring", path = "../keyring" } parity-codec = "4.1.1" primitives = { package = "substrate-primitives", path = "../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index cb0d5c1736..e8fe0a1f8b 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -22,9 +22,9 @@ use consensus::{ ForkChoiceStrategy, }; use hash_db::Hasher; -use runtime_primitives::Justification; -use runtime_primitives::traits::{Block as BlockT}; -use runtime_primitives::generic::BlockId; +use sr_primitives::Justification; +use sr_primitives::traits::{Block as BlockT}; +use sr_primitives::generic::BlockId; use primitives::Blake2Hasher; use parity_codec::alloc::collections::hash_map::HashMap; diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 27237e13b6..175996a432 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -31,7 +31,7 @@ pub use keyring::{ sr25519::Keyring as Sr25519Keyring, }; pub use primitives::Blake2Hasher; -pub use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +pub use sr_primitives::{StorageOverlay, ChildrenStorageOverlay}; pub use state_machine::ExecutionStrategy; use std::sync::Arc; @@ -39,7 +39,7 @@ use std::collections::HashMap; use futures::future::Ready; use hash_db::Hasher; use primitives::storage::well_known_keys; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, NumberFor }; use client::LocalCallExecutor; diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 6302753950..532d5a4b38 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -17,7 +17,7 @@ aura-primitives = { package = "substrate-consensus-aura-primitives", path = "../ babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } runtime_version = { package = "sr-version", path = "../sr-version", default-features = false } runtime_support = { package = "srml-support", path = "../../srml/support", default-features = false } substrate-trie = { path = "../trie", default-features = false } @@ -53,7 +53,7 @@ std = [ "runtime_support/std", "primitives/std", "inherents/std", - "runtime_primitives/std", + "sr-primitives/std", "runtime_version/std", "aura-primitives/std", "babe-primitives/std", diff --git a/core/test-runtime/client/Cargo.toml b/core/test-runtime/client/Cargo.toml index 4905678ae9..5e6a676990 100644 --- a/core/test-runtime/client/Cargo.toml +++ b/core/test-runtime/client/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" generic-test-client = { package = "substrate-test-client", path = "../../test-client" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime = { package = "substrate-test-runtime", path = "../../test-runtime", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } [features] default = [ diff --git a/core/test-runtime/client/src/block_builder_ext.rs b/core/test-runtime/client/src/block_builder_ext.rs index 9b7d343f02..c389a946ba 100644 --- a/core/test-runtime/client/src/block_builder_ext.rs +++ b/core/test-runtime/client/src/block_builder_ext.rs @@ -17,7 +17,7 @@ //! Block Builder extensions for tests. use runtime; -use runtime_primitives::traits::ProvideRuntimeApi; +use sr_primitives::traits::ProvideRuntimeApi; use generic_test_client::client; use generic_test_client::client::block_builder::api::BlockBuilder; diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs index 4383a80e68..36a2fd3e86 100644 --- a/core/test-runtime/client/src/lib.rs +++ b/core/test-runtime/client/src/lib.rs @@ -27,7 +27,7 @@ pub use generic_test_client::*; pub use runtime; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; /// A prelude to import in tests. pub mod prelude { diff --git a/core/test-runtime/client/src/trait_tests.rs b/core/test-runtime/client/src/trait_tests.rs index 3d013e3e74..37fad9c7a1 100644 --- a/core/test-runtime/client/src/trait_tests.rs +++ b/core/test-runtime/client/src/trait_tests.rs @@ -28,8 +28,8 @@ use crate::{AccountKeyring, ClientExt, TestClientBuilder, TestClientBuilderExt}; use generic_test_client::consensus::BlockOrigin; use primitives::Blake2Hasher; use runtime::{self, Transfer}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::Block as BlockT; /// helper to test the `leaves` implementation for various backends pub fn test_leaves_for_backend(backend: Arc) where diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index 8e0a423c92..da7d9cf4ef 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -21,7 +21,7 @@ use runtime_io::{blake2_256, twox_128}; use super::{AuthorityId, AccountId, WASM_BINARY}; use parity_codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; -use runtime_primitives::traits::Block; +use sr_primitives::traits::Block; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index d4c1620863..c529fa201f 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -33,7 +33,7 @@ use substrate_client::{ runtime_api as client_api, block_builder::api as block_builder_api, decl_runtime_apis, impl_runtime_apis, }; -use runtime_primitives::{ +use sr_primitives::{ ApplyResult, create_runtime_str, Perbill, transaction_validity::{TransactionValidity, ValidTransaction}, traits::{ @@ -125,13 +125,13 @@ impl BlindCheckable for Extrinsic { match self { Extrinsic::AuthoritiesChange(new_auth) => Ok(Extrinsic::AuthoritiesChange(new_auth)), Extrinsic::Transfer(transfer, signature) => { - if runtime_primitives::verify_encoded_lazy(&signature, &transfer, &transfer.from) { + if sr_primitives::verify_encoded_lazy(&signature, &transfer, &transfer.from) { Ok(Extrinsic::Transfer(transfer, signature)) } else { - Err(runtime_primitives::BAD_SIGNATURE) + Err(sr_primitives::BAD_SIGNATURE) } }, - Extrinsic::IncludeData(_) => Err(runtime_primitives::BAD_SIGNATURE), + Extrinsic::IncludeData(_) => Err(sr_primitives::BAD_SIGNATURE), Extrinsic::StorageChange(key, value) => Ok(Extrinsic::StorageChange(key, value)), } } @@ -173,13 +173,13 @@ pub type BlockNumber = u64; /// Index of a transaction. pub type Index = u64; /// The item of a block digest. -pub type DigestItem = runtime_primitives::generic::DigestItem; +pub type DigestItem = sr_primitives::generic::DigestItem; /// The digest of a block. -pub type Digest = runtime_primitives::generic::Digest; +pub type Digest = sr_primitives::generic::Digest; /// A test block. -pub type Block = runtime_primitives::generic::Block; +pub type Block = sr_primitives::generic::Block; /// A test block's header. -pub type Header = runtime_primitives::generic::Header; +pub type Header = sr_primitives::generic::Header; /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { @@ -775,7 +775,7 @@ mod tests { DefaultTestClientBuilderExt, TestClientBuilder, runtime::TestAPI, }; - use runtime_primitives::{ + use sr_primitives::{ generic::BlockId, traits::ProvideRuntimeApi, }; diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 926f2f5410..30cd105328 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -21,10 +21,10 @@ use rstd::prelude::*; use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128, blake2_256}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; -use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; -use runtime_primitives::generic; -use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult}; -use runtime_primitives::transaction_validity::{TransactionValidity, ValidTransaction}; +use sr_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; +use sr_primitives::generic; +use sr_primitives::{ApplyError, ApplyOutcome, ApplyResult}; +use sr_primitives::transaction_validity::{TransactionValidity, ValidTransaction}; use parity_codec::{KeyedVec, Encode}; use super::{ AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId @@ -232,7 +232,7 @@ pub fn finalize_block() -> Header { #[inline(always)] fn check_signature(utx: &Extrinsic) -> Result<(), ApplyError> { - use runtime_primitives::traits::BlindCheckable; + use sr_primitives::traits::BlindCheckable; utx.clone().check().map_err(|_| ApplyError::BadSignature)?; Ok(()) } diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index 2e4f32197b..6d2465922b 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -12,7 +12,7 @@ parity-codec = "4.1.1" parking_lot = "0.8.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } txpool = { package = "substrate-transaction-graph", path = "./graph" } [dev-dependencies] diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 951a595810..2ecb6ab188 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -10,7 +10,7 @@ futures = "0.1" log = "0.4" parking_lot = "0.8.0" serde = { version = "1.0", features = ["derive"] } -substrate-primitives = { path = "../../primitives" } +primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } [dev-dependencies] diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index b3a2cf0e54..cb37aee07f 100644 --- a/core/transaction-pool/graph/src/base_pool.rs +++ b/core/transaction-pool/graph/src/base_pool.rs @@ -27,7 +27,7 @@ use std::{ use log::{trace, debug, warn}; use serde::Serialize; -use substrate_primitives::hexdisplay::HexDisplay; +use primitives::hexdisplay::HexDisplay; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ TransactionTag as Tag, diff --git a/core/transaction-pool/graph/src/future.rs b/core/transaction-pool/graph/src/future.rs index 6ca5019e47..c7b13c912d 100644 --- a/core/transaction-pool/graph/src/future.rs +++ b/core/transaction-pool/graph/src/future.rs @@ -22,7 +22,7 @@ use std::{ time, }; -use substrate_primitives::hexdisplay::HexDisplay; +use primitives::hexdisplay::HexDisplay; use sr_primitives::transaction_validity::{ TransactionTag as Tag, }; diff --git a/core/transaction-pool/src/api.rs b/core/transaction-pool/src/api.rs index 84475376fe..668a9b8013 100644 --- a/core/transaction-pool/src/api.rs +++ b/core/transaction-pool/src/api.rs @@ -23,7 +23,7 @@ use std::{ use client::{runtime_api::TaggedTransactionQueue, blockchain::HeaderBackend}; use parity_codec::Encode; use txpool; -use substrate_primitives::{ +use primitives::{ H256, Blake2Hasher, Hasher, diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index ef00e52eda..d2ba352257 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -18,7 +18,7 @@ hash-db = { version = "0.14.0", default-features = false } trie-db = { version = "0.14.0", default-features = false } trie-root = { version = "0.14.0", default-features = false } memory-db = { version = "0.14.0", default-features = false } -substrate-primitives = { path = "../primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } [dev-dependencies] trie-bench = { version = "0.14.0" } @@ -36,5 +36,5 @@ std = [ "memory-db/std", "trie-db/std", "trie-root/std", - "substrate-primitives/std", + "primitives/std", ] diff --git a/core/trie/benches/bench.rs b/core/trie/benches/bench.rs index 179dc6aaf8..176bf5971e 100644 --- a/core/trie/benches/bench.rs +++ b/core/trie/benches/bench.rs @@ -20,8 +20,8 @@ criterion_main!(benches); fn benchmark(c: &mut Criterion) { trie_bench::standard_benchmark::< - substrate_primitives::Blake2Hasher, - substrate_trie::NodeCodec, + primitives::Blake2Hasher, + substrate_trie::NodeCodec, substrate_trie::TrieStream, >(c, "substrate-blake2"); trie_bench::standard_benchmark::< diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index fe45c4aaf1..6e8adb4941 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -144,7 +144,7 @@ where /// /// `child_trie_root` and `child_delta_trie_root` can panic if invalid value is provided to them. pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { - use substrate_primitives::storage::well_known_keys; + use primitives::storage::well_known_keys; let has_right_prefix = storage_key.starts_with(b":child_storage:default:"); if has_right_prefix { // This is an attempt to catch a change of `is_child_storage_key`, which @@ -332,7 +332,7 @@ fn branch_node(has_value: bool, has_children: impl Iterator) -> [u8 mod tests { use super::*; use codec::{Encode, Compact}; - use substrate_primitives::Blake2Hasher; + use primitives::Blake2Hasher; use hash_db::{HashDB, Hasher}; use trie_db::{DBValue, TrieMut, Trie}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 2e3ba49d98..1849e1eeed 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -19,7 +19,7 @@ node-runtime = { path = "../runtime" } [dev-dependencies] test-client = { package = "substrate-test-client", path = "../../core/test-client" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } runtime_support = { package = "srml-support", path = "../../srml/support" } balances = { package = "srml-balances", path = "../../srml/balances" } session = { package = "srml-session", path = "../../srml/session" } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 6eba1022b2..fa3a5b08bd 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -46,9 +46,9 @@ mod tests { use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; use primitives::{ twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId, Balance, Index}; - use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Convert}; - use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; - use runtime_primitives::weights::{WeightMultiplier, GetDispatchInfo}; + use sr_primitives::traits::{Header as HeaderT, Hash as HashT, Convert}; + use sr_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + use sr_primitives::weights::{WeightMultiplier, GetDispatchInfo}; use contracts::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{ diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index c4be1ef6f2..36ea1eb414 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -9,7 +9,7 @@ serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] substrate-serializer = { path = "../../core/serializer" } @@ -21,6 +21,6 @@ std = [ "parity-codec/std", "primitives/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "serde", ] diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 96085cf60f..0895a8675d 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -20,7 +20,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use runtime_primitives::{ +use sr_primitives::{ generic, traits::{Verify, BlakeTwo256}, OpaqueExtrinsic, AnySignature }; diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 9c52125fe8..c40e6d7796 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -9,10 +9,10 @@ build = "build.rs" integer-sqrt = { version = "0.1.2" } safe-mix = { version = "1.0", default-features = false } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } client = { package = "substrate-client", path = "../../core/client", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } version = { package = "sr-version", path = "../../core/sr-version", default-features = false } support = { package = "srml-support", path = "../../srml/support", default-features = false } @@ -51,9 +51,9 @@ no_std = [ ] std = [ "parity-codec/std", - "substrate-primitives/std", + "primitives/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "support/std", "authorship/std", "babe/std", diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs index 5c149b6d14..5443c7e636 100644 --- a/node/runtime/src/constants.rs +++ b/node/runtime/src/constants.rs @@ -68,7 +68,7 @@ pub mod time { // the ratio that `system` module uses to find normal transaction quota. /// Fee-related. pub mod fee { - pub use runtime_primitives::Perbill; + pub use sr_primitives::Perbill; /// The block saturation level. Fees will be updates based on this value. pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); diff --git a/node/runtime/src/impls.rs b/node/runtime/src/impls.rs index 464f1a424b..2e1fcc8826 100644 --- a/node/runtime/src/impls.rs +++ b/node/runtime/src/impls.rs @@ -17,9 +17,9 @@ //! Some configurable implementations as associated type for the substrate runtime. use node_primitives::Balance; -use runtime_primitives::weights::{Weight, WeightMultiplier}; -use runtime_primitives::traits::{Convert, Saturating}; -use runtime_primitives::Fixed64; +use sr_primitives::weights::{Weight, WeightMultiplier}; +use sr_primitives::traits::{Convert, Saturating}; +use sr_primitives::Fixed64; use support::traits::{OnUnbalanced, Currency}; use crate::{Balances, Authorship, MaximumBlockWeight, NegativeImbalance}; use crate::constants::fee::TARGET_BLOCK_FULLNESS; @@ -131,8 +131,8 @@ impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierU #[cfg(test)] mod tests { use super::*; - use runtime_primitives::weights::Weight; - use runtime_primitives::Perbill; + use sr_primitives::weights::Weight; + use sr_primitives::Perbill; use crate::{MaximumBlockWeight, AvailableBlockRatio, Runtime}; use crate::constants::currency::*; diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index f89b121afa..583496508e 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -24,7 +24,7 @@ use rstd::prelude::*; use support::{ construct_runtime, parameter_types, traits::{SplitTwoWays, Currency} }; -use substrate_primitives::u32_trait::{_1, _2, _3, _4}; +use primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Moment, Signature, @@ -35,26 +35,26 @@ use client::{ block_builder::api::{self as block_builder_api, InherentData, CheckInherentsResult}, runtime_api as client_api, impl_runtime_apis }; -use runtime_primitives::{ApplyResult, impl_opaque_keys, generic, create_runtime_str, key_types}; -use runtime_primitives::transaction_validity::TransactionValidity; -use runtime_primitives::weights::Weight; -use runtime_primitives::traits::{ +use sr_primitives::{ApplyResult, impl_opaque_keys, generic, create_runtime_str, key_types}; +use sr_primitives::transaction_validity::TransactionValidity; +use sr_primitives::weights::Weight; +use sr_primitives::traits::{ BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, }; use version::RuntimeVersion; use elections::VoteIndex; #[cfg(any(feature = "std", test))] use version::NativeVersion; -use substrate_primitives::OpaqueMetadata; +use primitives::OpaqueMetadata; use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; use finality_tracker::{DEFAULT_REPORT_LATENCY, DEFAULT_WINDOW_SIZE}; #[cfg(any(feature = "std", test))] -pub use runtime_primitives::BuildStorage; +pub use sr_primitives::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use contracts::Gas; -pub use runtime_primitives::{Permill, Perbill}; +pub use sr_primitives::{Permill, Perbill}; pub use support::StorageValue; pub use staking::StakerStatus; diff --git a/srml/assets/Cargo.toml b/srml/assets/Cargo.toml index 977248a7a7..d1526c8be8 100644 --- a/srml/assets/Cargo.toml +++ b/srml/assets/Cargo.toml @@ -8,14 +8,14 @@ edition = "2018" serde = { version = "1.0", optional = true } parity-codec = { version = "4.1.1", default-features = false } # Needed for various traits. In our case, `OnFinalize`. -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } # Needed for type-safe access to storage DB. srml-support = { path = "../support", default-features = false } # `system` module provides us with all sorts of useful stuff and macros depend on it being around. system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } sr-std = { path = "../../core/sr-std" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } @@ -24,7 +24,7 @@ default = ["std"] std = [ "serde", "parity-codec/std", - "primitives/std", + "sr-primitives/std", "srml-support/std", "system/std", ] diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 6dc5f321e4..363e1c351c 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -131,9 +131,9 @@ #![cfg_attr(not(feature = "std"), no_std)] use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage, ensure}; -use primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; +use sr_primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; use system::ensure_signed; -use primitives::traits::One; +use sr_primitives::traits::One; /// The module configuration trait. pub trait Trait: system::Trait { @@ -241,10 +241,10 @@ mod tests { use runtime_io::with_externalities; use srml_support::{impl_outer_origin, assert_ok, assert_noop, parameter_types}; - use substrate_primitives::{H256, Blake2Hasher}; + use primitives::{H256, Blake2Hasher}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. - use primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sr_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index c1bf922a58..9ce3658283 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -9,8 +9,8 @@ parity-codec = { version = "4.1.1", default-features = false, features = ["deriv serde = { version = "1.0", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } @@ -30,8 +30,8 @@ std = [ "parity-codec/std", "rstd/std", "srml-support/std", + "sr-primitives/std", "primitives/std", - "substrate-primitives/std", "system/std", "timestamp/std", "staking/std", diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index a0f7ad6242..1402cb1d9e 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -53,7 +53,7 @@ pub use timestamp; use rstd::{result, prelude::*}; use parity_codec::Encode; use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue, traits::Get}; -use primitives::{ +use sr_primitives::{ traits::{SaturatedConversion, Saturating, Zero, One, Member, IsMember, TypedKey}, generic::DigestItem, }; diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index 42f06b564f..f00e090b68 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -18,13 +18,13 @@ #![cfg(test)] -use primitives::{ +use sr_primitives::{ traits::IdentityLookup, Perbill, testing::{Header, UintAuthorityId}, }; use srml_support::{impl_outer_origin, parameter_types}; use runtime_io; -use substrate_primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use crate::{Trait, Module, GenesisConfig}; impl_outer_origin!{ @@ -48,7 +48,7 @@ impl system::Trait for Test { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; diff --git a/srml/aura/src/tests.rs b/srml/aura/src/tests.rs index 3e20613c48..12deeb99a8 100644 --- a/srml/aura/src/tests.rs +++ b/srml/aura/src/tests.rs @@ -20,7 +20,7 @@ use lazy_static::lazy_static; use crate::mock::{System, Aura, new_test_ext}; -use primitives::traits::Header; +use sr_primitives::traits::Header; use runtime_io::with_externalities; use parking_lot::Mutex; use crate::{AuraReport, HandleReport}; diff --git a/srml/authorship/Cargo.toml b/srml/authorship/Cargo.toml index 0cf2f1e256..29de88ba2c 100644 --- a/srml/authorship/Cargo.toml +++ b/srml/authorship/Cargo.toml @@ -6,10 +6,10 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -18,10 +18,10 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = default = ["std"] std = [ "parity-codec/std", - "substrate-primitives/std", + "primitives/std", + "sr-primitives/std", "rstd/std", "srml-support/std", - "primitives/std", "system/std", "runtime_io/std", ] diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 39a3e8000a..2325dac5f3 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -27,8 +27,8 @@ use srml_support::traits::{FindAuthor, VerifySeal, Get}; use srml_support::dispatch::Result as DispatchResult; use parity_codec::{Encode, Decode}; use system::ensure_none; -use primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; -use primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; +use sr_primitives::weights::SimpleDispatchInfo; pub trait Trait: system::Trait { /// Find the author of a block. @@ -324,11 +324,11 @@ impl Module { mod tests { use super::*; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::traits::{BlakeTwo256, IdentityLookup}; - use primitives::testing::Header; - use primitives::generic::DigestItem; - use primitives::Perbill; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::traits::{BlakeTwo256, IdentityLookup}; + use sr_primitives::testing::Header; + use sr_primitives::generic::DigestItem; + use sr_primitives::Perbill; use srml_support::{parameter_types, impl_outer_origin, ConsensusEngineId}; impl_outer_origin!{ diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index 7922c1dfe7..ba47d8e278 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -10,7 +10,7 @@ parity-codec = { version = "4.1.1", default-features = false, features = ["deriv serde = { version = "1.0.93", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } staking = { package = "srml-staking", path = "../staking", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } @@ -22,7 +22,7 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = [dev-dependencies] lazy_static = "1.3.0" parking_lot = "0.8.0" -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] @@ -31,7 +31,7 @@ std = [ "parity-codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", "timestamp/std", "inherents/std", diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index c75869ab57..2dbb9222fb 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -24,8 +24,8 @@ pub use timestamp; use rstd::{result, prelude::*}; use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get}; use timestamp::{OnTimestampSet}; -use primitives::{generic::DigestItem, ConsensusEngineId}; -use primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; +use sr_primitives::{generic::DigestItem, ConsensusEngineId}; +use sr_primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; use parity_codec::{Encode, Decode}; diff --git a/srml/balances/Cargo.toml b/srml/balances/Cargo.toml index cc8f442e04..f096d506a4 100644 --- a/srml/balances/Cargo.toml +++ b/srml/balances/Cargo.toml @@ -10,13 +10,13 @@ safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] @@ -27,6 +27,6 @@ std = [ "parity-codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index cde3fa2d16..bff5e90c32 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -112,7 +112,7 @@ //! //! ``` //! use srml_support::traits::{WithdrawReasons, LockableCurrency}; -//! use primitives::traits::Bounded; +//! use sr_primitives::traits::Bounded; //! pub trait Trait: system::Trait { //! type Currency: LockableCurrency; //! } @@ -159,12 +159,12 @@ use srml_support::traits::{ Imbalance, SignedImbalance, ReservableCurrency, Get, }; use srml_support::dispatch::Result; -use primitives::traits::{ +use sr_primitives::traits::{ Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, Saturating, Bounded, SignedExtension, SaturatedConversion, DispatchError, Convert, }; -use primitives::transaction_validity::{TransactionPriority, ValidTransaction}; -use primitives::weights::{DispatchInfo, SimpleDispatchInfo, Weight}; +use sr_primitives::transaction_validity::{TransactionPriority, ValidTransaction}; +use sr_primitives::weights::{DispatchInfo, SimpleDispatchInfo, Weight}; use system::{IsDeadAccount, OnNewAccount, ensure_signed, ensure_root}; mod mock; @@ -344,7 +344,7 @@ decl_storage! { // Total genesis `balance` minus `liquid` equals funds locked for vesting let locked = balance.saturating_sub(liquid); // Number of units unlocked per block after `begin` - let per_block = locked / length.max(primitives::traits::One::one()); + let per_block = locked / length.max(sr_primitives::traits::One::one()); (who.clone(), VestingSchedule { locked: locked, diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index 116515c368..2c84bb9afb 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -18,8 +18,8 @@ #![cfg(test)] -use primitives::{Perbill, traits::{Convert, IdentityLookup}, testing::Header, weights::{DispatchInfo, Weight}}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::{Perbill, traits::{Convert, IdentityLookup}, testing::Header, weights::{DispatchInfo, Weight}}; +use primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{impl_outer_origin, parameter_types}; use srml_support::traits::Get; @@ -86,7 +86,7 @@ impl system::Trait for Runtime { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 595be0e1ca..5a977747fe 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -774,7 +774,7 @@ fn signed_extension_take_fees_is_bounded() { .monied(true) .build(), || { - use primitives::weights::Weight; + use sr_primitives::weights::Weight; // maximum weight possible assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(Weight::max_value()), 10).is_ok()); diff --git a/srml/collective/Cargo.toml b/srml/collective/Cargo.toml index cd0bb17871..83d25593e4 100644 --- a/srml/collective/Cargo.toml +++ b/srml/collective/Cargo.toml @@ -8,10 +8,10 @@ edition = "2018" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } @@ -24,11 +24,11 @@ default = ["std"] std = [ "safe-mix/std", "parity-codec/std", - "substrate-primitives/std", + "primitives/std", "rstd/std", "serde", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index b05b69db77..20c11bdf9b 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -21,9 +21,9 @@ #![recursion_limit="128"] use rstd::{prelude::*, result}; -use substrate_primitives::u32_trait::Value as U32; -use primitives::traits::{Hash, EnsureOrigin}; -use primitives::weights::SimpleDispatchInfo; +use primitives::u32_trait::Value as U32; +use sr_primitives::traits::{Hash, EnsureOrigin}; +use sr_primitives::weights::SimpleDispatchInfo; use srml_support::{ dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, traits::ChangeMembers, StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure @@ -397,8 +397,8 @@ mod tests { use system::{EventRecord, Phase}; use hex_literal::hex; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::{ + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{ Perbill, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage }; use crate as collective; @@ -436,8 +436,8 @@ mod tests { type Event = Event; } - pub type Block = primitives::generic::Block; - pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic; + pub type Block = sr_primitives::generic::Block; + pub type UncheckedExtrinsic = sr_primitives::generic::UncheckedExtrinsic; srml_support::construct_runtime!( pub enum Test where diff --git a/srml/contracts/Cargo.toml b/srml/contracts/Cargo.toml index 19afc06406..33c32c8ea2 100644 --- a/srml/contracts/Cargo.toml +++ b/srml/contracts/Cargo.toml @@ -10,8 +10,8 @@ pwasm-utils = { version = "0.6.1", default-features = false } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } parity-wasm = { version = "0.31", default-features = false } wasmi-validation = { version = "0.1", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } -runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sandbox = { package = "sr-sandbox", path = "../../core/sr-sandbox", default-features = false } @@ -34,8 +34,8 @@ core = [ std = [ "serde", "parity-codec/std", - "substrate-primitives/std", - "runtime-primitives/std", + "primitives/std", + "sr-primitives/std", "runtime-io/std", "rstd/std", "sandbox/std", diff --git a/srml/contracts/src/account_db.rs b/srml/contracts/src/account_db.rs index f912266415..5cfd0d3a65 100644 --- a/srml/contracts/src/account_db.rs +++ b/srml/contracts/src/account_db.rs @@ -25,7 +25,7 @@ use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use rstd::prelude::*; use runtime_io::blake2_256; -use runtime_primitives::traits::{Bounded, Zero}; +use sr_primitives::traits::{Bounded, Zero}; use srml_support::traits::{Currency, Get, Imbalance, SignedImbalance, UpdateBalanceOutcome}; use srml_support::{storage::child, StorageMap}; use system; diff --git a/srml/contracts/src/exec.rs b/srml/contracts/src/exec.rs index a8219d7902..084558e76f 100644 --- a/srml/contracts/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -21,7 +21,7 @@ use crate::gas::{Gas, GasMeter, Token, approx_gas_for_balance}; use crate::rent; use rstd::prelude::*; -use runtime_primitives::traits::{Bounded, CheckedAdd, CheckedSub, Zero}; +use sr_primitives::traits::{Bounded, CheckedAdd, CheckedSub, Zero}; use srml_support::traits::{WithdrawReason, Currency}; use timestamp; diff --git a/srml/contracts/src/gas.rs b/srml/contracts/src/gas.rs index 44d5b32fd9..a5811e81a0 100644 --- a/srml/contracts/src/gas.rs +++ b/srml/contracts/src/gas.rs @@ -16,8 +16,8 @@ use crate::{GasSpent, Module, Trait, BalanceOf, NegativeImbalanceOf}; use rstd::convert::TryFrom; -use runtime_primitives::BLOCK_FULL; -use runtime_primitives::traits::{CheckedMul, Zero, SaturatedConversion, SimpleArithmetic, UniqueSaturatedInto}; +use sr_primitives::BLOCK_FULL; +use sr_primitives::traits::{CheckedMul, Zero, SaturatedConversion, SimpleArithmetic, UniqueSaturatedInto}; use srml_support::StorageValue; use srml_support::traits::{Currency, ExistenceRequirement, Get, Imbalance, OnUnbalanced, WithdrawReason}; diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index 43996524aa..c4e588e12e 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -96,11 +96,11 @@ use crate::wasm::{WasmLoader, WasmVm}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -use substrate_primitives::crypto::UncheckedFrom; +use primitives::crypto::UncheckedFrom; use rstd::{prelude::*, marker::PhantomData}; use parity_codec::{Codec, Encode, Decode}; use runtime_io::blake2_256; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Hash, StaticLookup, Zero, MaybeSerializeDebug, Member }; use srml_support::dispatch::{Result, Dispatchable}; @@ -110,7 +110,7 @@ use srml_support::{ }; use srml_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency, Get}; use system::{ensure_signed, RawOrigin, ensure_root}; -use substrate_primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; +use primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; use timestamp; pub type CodeHash = ::Hash; diff --git a/srml/contracts/src/rent.rs b/srml/contracts/src/rent.rs index 96f8516a5f..fea6cdc7f3 100644 --- a/srml/contracts/src/rent.rs +++ b/srml/contracts/src/rent.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use crate::{BalanceOf, ContractInfo, ContractInfoOf, TombstoneContractInfo, Trait, AliveContractInfo}; -use runtime_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, +use sr_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, SaturatedConversion}; use srml_support::traits::{Currency, ExistenceRequirement, Get, WithdrawReason}; use srml_support::StorageMap; diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index db196ef7fe..f4699a8c1a 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -29,17 +29,17 @@ use hex_literal::*; use parity_codec::{Decode, Encode, KeyedVec}; use runtime_io; use runtime_io::with_externalities; -use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; -use runtime_primitives::traits::{BlakeTwo256, Hash, IdentityLookup}; -use runtime_primitives::{Perbill, BuildStorage}; +use sr_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; +use sr_primitives::traits::{BlakeTwo256, Hash, IdentityLookup}; +use sr_primitives::{Perbill, BuildStorage}; use srml_support::{ assert_ok, assert_err, impl_outer_dispatch, impl_outer_event, impl_outer_origin, parameter_types, storage::child, StorageMap, StorageValue, traits::{Currency, Get}, }; use std::cell::RefCell; use std::sync::atomic::{AtomicUsize, Ordering}; -use substrate_primitives::storage::well_known_keys; -use substrate_primitives::Blake2Hasher; +use primitives::storage::well_known_keys; +use primitives::Blake2Hasher; use system::{self, EventRecord, Phase}; use {balances, wabt}; @@ -196,7 +196,7 @@ impl ContractAddressFor for DummyContractAddressFor { pub struct DummyTrieIdGenerator; impl TrieIdGenerator for DummyTrieIdGenerator { fn trie_id(account_id: &u64) -> TrieId { - use substrate_primitives::storage::well_known_keys; + use primitives::storage::well_known_keys; let new_seed = super::AccountCounter::mutate(|v| { *v = v.wrapping_add(1); diff --git a/srml/contracts/src/wasm/code_cache.rs b/srml/contracts/src/wasm/code_cache.rs index 140878f28b..9e8fcab8c2 100644 --- a/srml/contracts/src/wasm/code_cache.rs +++ b/srml/contracts/src/wasm/code_cache.rs @@ -30,7 +30,7 @@ use crate::gas::{Gas, GasMeter, Token}; use crate::wasm::{prepare, runtime::Env, PrefabWasmModule}; use crate::{CodeHash, CodeStorage, PristineCode, Schedule, Trait}; use rstd::prelude::*; -use runtime_primitives::traits::{Hash, Bounded}; +use sr_primitives::traits::{Hash, Bounded}; use srml_support::StorageMap; /// Gas metering token that used for charging storing code into the code storage. diff --git a/srml/contracts/src/wasm/env_def/macros.rs b/srml/contracts/src/wasm/env_def/macros.rs index 4f8bce9904..af83c36623 100644 --- a/srml/contracts/src/wasm/env_def/macros.rs +++ b/srml/contracts/src/wasm/env_def/macros.rs @@ -195,7 +195,7 @@ macro_rules! define_env { mod tests { use parity_wasm::elements::FunctionType; use parity_wasm::elements::ValueType; - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; use sandbox::{self, ReturnValue, TypedValue}; use crate::wasm::tests::MockExt; use crate::wasm::Runtime; diff --git a/srml/contracts/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs index 9a0ca1056e..c832d324b3 100644 --- a/srml/contracts/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -173,7 +173,7 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { mod tests { use super::*; use std::collections::HashMap; - use substrate_primitives::H256; + use primitives::H256; use crate::exec::{CallReceipt, Ext, InstantiateReceipt, EmptyOutputBuf, StorageKey}; use crate::gas::{Gas, GasMeter}; use crate::tests::{Test, Call}; diff --git a/srml/contracts/src/wasm/prepare.rs b/srml/contracts/src/wasm/prepare.rs index c135c45d3a..4539b9d388 100644 --- a/srml/contracts/src/wasm/prepare.rs +++ b/srml/contracts/src/wasm/prepare.rs @@ -26,7 +26,7 @@ use parity_wasm::elements::{self, Internal, External, MemoryType, Type}; use pwasm_utils; use pwasm_utils::rules; use rstd::prelude::*; -use runtime_primitives::traits::{SaturatedConversion}; +use sr_primitives::traits::{SaturatedConversion}; struct ContractModule<'a> { /// A deserialized module. The module is valid (this is Guaranteed by `new` method). diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index 92d9b98acf..556aa829cd 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -27,7 +27,7 @@ use system; use rstd::prelude::*; use rstd::mem; use parity_codec::{Decode, Encode}; -use runtime_primitives::traits::{Bounded, SaturatedConversion}; +use sr_primitives::traits::{Bounded, SaturatedConversion}; /// Enumerates all possible *special* trap conditions. /// diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 3fc9926942..6d2db9373d 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -41,10 +41,10 @@ mod tests { pub use runtime_io::with_externalities; use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; use srml_support::traits::Get; - pub use substrate_primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; - pub use primitives::traits::{BlakeTwo256, IdentityLookup}; - pub use primitives::testing::{Digest, DigestItem, Header}; - pub use primitives::Perbill; + pub use primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; + pub use sr_primitives::traits::{BlakeTwo256, IdentityLookup}; + pub use sr_primitives::testing::{Digest, DigestItem, Header}; + pub use sr_primitives::Perbill; pub use {seats, motions}; use std::cell::RefCell; diff --git a/srml/democracy/Cargo.toml b/srml/democracy/Cargo.toml index e7b06ca597..baf1488d42 100644 --- a/srml/democracy/Cargo.toml +++ b/srml/democracy/Cargo.toml @@ -10,12 +10,12 @@ safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } balances = { package = "srml-balances", path = "../balances" } [features] @@ -27,6 +27,6 @@ std = [ "rstd/std", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 1736d8a97e..ae53a53bb8 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -20,8 +20,8 @@ use rstd::prelude::*; use rstd::{result, convert::TryFrom}; -use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; -use primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; +use sr_primitives::weights::SimpleDispatchInfo; use parity_codec::{Encode, Decode, Input, Output}; use srml_support::{ decl_module, decl_storage, decl_event, ensure, @@ -990,9 +990,9 @@ mod tests { impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types, traits::Contains }; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::{traits::{BlakeTwo256, IdentityLookup, Bounded}, testing::Header}; - use primitives::Perbill; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{traits::{BlakeTwo256, IdentityLookup, Bounded}, testing::Header}; + use sr_primitives::Perbill; use balances::BalanceLock; use system::EnsureSignedBy; diff --git a/srml/democracy/src/vote_threshold.rs b/srml/democracy/src/vote_threshold.rs index ee42363d47..96e5849e43 100644 --- a/srml/democracy/src/vote_threshold.rs +++ b/srml/democracy/src/vote_threshold.rs @@ -19,7 +19,7 @@ #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; -use primitives::traits::{Zero, IntegerSquareRoot}; +use sr_primitives::traits::{Zero, IntegerSquareRoot}; use rstd::ops::{Add, Mul, Div, Rem}; /// A means of determining if a vote is past pass threshold. diff --git a/srml/elections/Cargo.toml b/srml/elections/Cargo.toml index cd0a43aeb5..dc004471d5 100644 --- a/srml/elections/Cargo.toml +++ b/srml/elections/Cargo.toml @@ -8,10 +8,10 @@ edition = "2018" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } @@ -24,11 +24,11 @@ default = ["std"] std = [ "safe-mix/std", "parity-codec/std", - "substrate-primitives/std", + "primitives/std", "rstd/std", "serde", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 8a681fa145..0e761c94c8 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -24,8 +24,8 @@ #![recursion_limit="128"] use rstd::prelude::*; -use primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; -use primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; +use sr_primitives::weights::SimpleDispatchInfo; use runtime_io::print; use srml_support::{ StorageValue, StorageMap, @@ -1116,8 +1116,8 @@ mod tests { use std::cell::RefCell; use srml_support::{assert_ok, assert_err, assert_noop, parameter_types}; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::{ + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{ Perbill, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage }; use crate as elections; @@ -1234,8 +1234,8 @@ mod tests { type DecayRatio = DecayRatio; } - pub type Block = primitives::generic::Block; - pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic; + pub type Block = sr_primitives::generic::Block; + pub type UncheckedExtrinsic = sr_primitives::generic::UncheckedExtrinsic; srml_support::construct_runtime!( pub enum Test where diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index f46ce54749..2cbd707f18 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -14,7 +14,7 @@ sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] sr-io = { path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 68b52425ed..5925c438a8 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -506,7 +506,7 @@ mod tests { use srml_support::{assert_ok, impl_outer_origin, parameter_types}; use sr_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; + use primitives::{H256, Blake2Hasher}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. use sr_primitives::{ diff --git a/srml/executive/Cargo.toml b/srml/executive/Cargo.toml index 27057fe523..e732c9b636 100644 --- a/srml/executive/Cargo.toml +++ b/srml/executive/Cargo.toml @@ -9,13 +9,13 @@ serde = { version = "1.0", optional = true } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] hex-literal = "0.2.0" -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } srml-indices = { path = "../indices" } balances = { package = "srml-balances", path = "../balances" } @@ -26,7 +26,7 @@ std = [ "srml-support/std", "serde", "parity-codec/std", - "primitives/std", + "sr-primitives/std", "runtime_io/std", "system/std", ] diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 9ae794d698..b1368e8a28 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -50,7 +50,7 @@ //! `Executive` type declaration from the node template. //! //! ``` -//! # use primitives::generic; +//! # use sr_primitives::generic; //! # use srml_executive as executive; //! # pub struct UncheckedExtrinsic {}; //! # pub struct Header {}; @@ -59,8 +59,8 @@ //! # pub type Balances = u64; //! # pub type AllModules = u64; //! # pub enum Runtime {}; -//! # use primitives::transaction_validity::TransactionValidity; -//! # use primitives::traits::ValidateUnsigned; +//! # use sr_primitives::transaction_validity::TransactionValidity; +//! # use sr_primitives::traits::ValidateUnsigned; //! # impl ValidateUnsigned for Runtime { //! # type Call = (); //! # @@ -77,19 +77,19 @@ use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; -use primitives::{generic::Digest, traits::{ +use sr_primitives::{generic::Digest, traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, OnInitialize, NumberFor, Block as BlockT, OffchainWorker, ValidateUnsigned }}; use srml_support::Dispatchable; use parity_codec::{Codec, Encode}; use system::{extrinsics_root, DigestOf}; -use primitives::{ApplyOutcome, ApplyError}; -use primitives::transaction_validity::TransactionValidity; -use primitives::weights::GetDispatchInfo; +use sr_primitives::{ApplyOutcome, ApplyError}; +use sr_primitives::transaction_validity::TransactionValidity; +use sr_primitives::weights::GetDispatchInfo; mod internal { - use primitives::traits::DispatchError; + use sr_primitives::traits::DispatchError; pub enum ApplyError { BadSignature(&'static str), @@ -292,7 +292,7 @@ where >::note_applied_extrinsic(&r, encoded_len as u32); r.map(|_| internal::ApplyOutcome::Success).or_else(|e| match e { - primitives::BLOCK_FULL => Err(internal::ApplyError::FullBlock), + sr_primitives::BLOCK_FULL => Err(internal::ApplyError::FullBlock), e => Ok(internal::ApplyOutcome::Fail(e)) }) } @@ -336,7 +336,7 @@ where Err("invalid account index") => return TransactionValidity::Unknown(INVALID_INDEX), // Technically a bad signature could also imply an out-of-date account index, but // that's more of an edge case. - Err(primitives::BAD_SIGNATURE) => return TransactionValidity::Invalid(ApplyError::BadSignature as i8), + Err(sr_primitives::BAD_SIGNATURE) => return TransactionValidity::Invalid(ApplyError::BadSignature as i8), Err(_) => return TransactionValidity::Invalid(UNKNOWN_ERROR), }; @@ -356,12 +356,12 @@ mod tests { use super::*; use balances::Call; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::generic::Era; - use primitives::Perbill; - use primitives::weights::Weight; - use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup, ConvertInto}; - use primitives::testing::{Digest, Header, Block}; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::generic::Era; + use sr_primitives::Perbill; + use sr_primitives::weights::Weight; + use sr_primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup, ConvertInto}; + use sr_primitives::testing::{Digest, Header, Block}; use srml_support::{impl_outer_event, impl_outer_origin, parameter_types}; use srml_support::traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason}; use system; @@ -391,7 +391,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; - type Hash = substrate_primitives::H256; + type Hash = primitives::H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; @@ -443,7 +443,7 @@ mod tests { system::CheckWeight, balances::TakeFees ); - type TestXt = primitives::testing::TestXt, SignedExtra>; + type TestXt = sr_primitives::testing::TestXt, SignedExtra>; type Executive = super::Executive, system::ChainContext, Runtime, ()>; fn extra(nonce: u64, fee: u64) -> SignedExtra { @@ -466,7 +466,7 @@ mod tests { balances: vec![(1, 211)], vesting: vec![], }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 69)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 69)); let weight = xt.get_dispatch_info().weight as u64; let mut t = runtime_io::TestExternalities::::new_with_children(t); with_externalities(&mut t, || { @@ -547,7 +547,7 @@ mod tests { fn bad_extrinsic_not_inserted() { let mut t = new_test_ext(1); // bad nonce check! - let xt = primitives::testing::TestXt(sign_extra(1, 30, 0), Call::transfer(33, 69)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 30, 0), Call::transfer(33, 69)); with_externalities(&mut t, || { Executive::initialize_block(&Header::new( 1, @@ -565,7 +565,7 @@ mod tests { fn block_weight_limit_enforced() { let mut t = new_test_ext(10000); // given: TestXt uses the encoded len as fixed Len: - let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer::(33, 0)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer::(33, 0)); let encoded = xt.encode(); let encoded_len = encoded.len() as Weight; let limit = AvailableBlockRatio::get() * MaximumBlockWeight::get(); @@ -581,7 +581,7 @@ mod tests { assert_eq!(>::all_extrinsics_weight(), 0); for nonce in 0..=num_to_exhaust_block { - let xt = primitives::testing::TestXt(sign_extra(1, nonce.into(), 0), Call::transfer::(33, 0)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, nonce.into(), 0), Call::transfer::(33, 0)); let res = Executive::apply_extrinsic(xt); if nonce != num_to_exhaust_block { assert_eq!(res.unwrap(), ApplyOutcome::Success); @@ -596,9 +596,9 @@ mod tests { #[test] fn block_weight_and_size_is_stored_per_tx() { - let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(33, 0)); - let x1 = primitives::testing::TestXt(sign_extra(1, 1, 0), Call::transfer(33, 0)); - let x2 = primitives::testing::TestXt(sign_extra(1, 2, 0), Call::transfer(33, 0)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(33, 0)); + let x1 = sr_primitives::testing::TestXt(sign_extra(1, 1, 0), Call::transfer(33, 0)); + let x2 = sr_primitives::testing::TestXt(sign_extra(1, 2, 0), Call::transfer(33, 0)); let len = xt.clone().encode().len() as u32; let mut t = new_test_ext(1); with_externalities(&mut t, || { @@ -622,7 +622,7 @@ mod tests { #[test] fn validate_unsigned() { - let xt = primitives::testing::TestXt(None, Call::set_balance(33, 69, 69)); + let xt = sr_primitives::testing::TestXt(None, Call::set_balance(33, 69, 69)); let valid = TransactionValidity::Valid(Default::default()); let mut t = new_test_ext(1); @@ -645,7 +645,7 @@ mod tests { 10, lock, ); - let xt = primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 10)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 10)); let weight = xt.get_dispatch_info().weight as u64; Executive::initialize_block(&Header::new( 1, diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml index e7eea0e152..3dfd453c75 100644 --- a/srml/finality-tracker/Cargo.toml +++ b/srml/finality-tracker/Cargo.toml @@ -9,12 +9,12 @@ serde = { version = "1.0", default-features = false, features = ["derive"] } parity-codec = { version = "4.1.1", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } srml-system = { path = "../system", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } sr-io = { path = "../../core/sr-io", default-features = false } [features] @@ -24,7 +24,7 @@ std = [ "parity-codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "srml-system/std", "inherents/std", ] diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index d59183a166..f0e2ae0f54 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -23,7 +23,7 @@ use inherents::{ InherentData, MakeFatalError, }; use srml_support::StorageValue; -use primitives::traits::{One, Zero, SaturatedConversion}; +use sr_primitives::traits::{One, Zero, SaturatedConversion}; use rstd::{prelude::*, result, cmp, vec}; use parity_codec::Decode; use srml_support::{decl_module, decl_storage, for_each_tuple}; @@ -265,10 +265,10 @@ mod tests { use super::*; use sr_io::{with_externalities, TestExternalities}; - use substrate_primitives::H256; - use primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT}; - use primitives::testing::Header; - use primitives::Perbill; + use primitives::H256; + use sr_primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT}; + use sr_primitives::testing::Header; + use sr_primitives::Perbill; use srml_support::{assert_ok, impl_outer_origin, parameter_types}; use srml_system as system; use std::cell::RefCell; diff --git a/srml/generic-asset/Cargo.toml b/srml/generic-asset/Cargo.toml index bfa49d8018..0e10e15590 100644 --- a/srml/generic-asset/Cargo.toml +++ b/srml/generic-asset/Cargo.toml @@ -8,13 +8,13 @@ edition = "2018" serde = { version = "1.0", optional = true } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } support = { package = "srml-support", path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] @@ -22,7 +22,7 @@ std =[ "serde/std", "parity-codec/std", "rstd/std", - "primitives/std", + "sr-primitives/std", "support/std", "system/std", ] diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 8a4e47180c..60d1f0a3ff 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -153,7 +153,7 @@ use parity_codec::{Decode, Encode, HasCompact, Input, Output}; -use primitives::traits::{ +use sr_primitives::traits::{ CheckedAdd, CheckedSub, MaybeSerializeDebug, Member, One, Saturating, SimpleArithmetic, Zero, Bounded }; @@ -477,8 +477,8 @@ decl_storage! { config(endowed_accounts): Vec; build(| - storage: &mut primitives::StorageOverlay, - _: &mut primitives::ChildrenStorageOverlay, + storage: &mut sr_primitives::StorageOverlay, + _: &mut sr_primitives::ChildrenStorageOverlay, config: &GenesisConfig| { config.assets.iter().for_each(|asset_id| { config.endowed_accounts.iter().for_each(|account_id| { diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index 9437b06d20..80e04a6b7e 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -20,8 +20,8 @@ #![cfg(test)] -use primitives::{Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}}; -use substrate_primitives::{Blake2Hasher, H256}; +use sr_primitives::{Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}}; +use primitives::{Blake2Hasher, H256}; use support::{parameter_types, impl_outer_event, impl_outer_origin}; use super::*; diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml index 2f13bd018f..478cddd153 100644 --- a/srml/grandpa/Cargo.toml +++ b/srml/grandpa/Cargo.toml @@ -7,10 +7,10 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } substrate-finality-grandpa-primitives = { path = "../../core/finality-grandpa/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } @@ -24,11 +24,11 @@ default = ["std"] std = [ "serde", "parity-codec/std", - "substrate-primitives/std", + "primitives/std", "substrate-finality-grandpa-primitives/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", "session/std", "finality-tracker/std", diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index 9615953e67..6cde95d457 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -35,8 +35,8 @@ use parity_codec::{self as codec, Encode, Decode}; use srml_support::{ decl_event, decl_storage, decl_module, dispatch::Result, storage::StorageValue }; -use primitives::{ - generic::{DigestItem, OpaqueDigestItemId}, traits::CurrentHeight +use sr_primitives::{ + generic::{DigestItem, OpaqueDigestItemId}, traits::{CurrentHeight, Zero}, }; use fg_primitives::{ScheduledChange, ConsensusLog, GRANDPA_ENGINE_ID}; pub use fg_primitives::{AuthorityId, AuthorityWeight}; @@ -354,7 +354,6 @@ impl session::OneSessionHandler for Module { let next_authorities = validators.map(|(_, k)| (k, 1u64)).collect::>(); let last_authorities = >::grandpa_authorities(); if next_authorities != last_authorities { - use primitives::traits::Zero; if let Some((further_wait, median)) = >::take() { let _ = Self::schedule_change(next_authorities, further_wait, Some(median)); } else { diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 9abb12b15b..637ae7c25f 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -18,10 +18,10 @@ #![cfg(test)] -use primitives::{Perbill, DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; +use sr_primitives::{Perbill, DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; use runtime_io; use srml_support::{impl_outer_origin, impl_outer_event, parameter_types}; -use substrate_primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use parity_codec::{Encode, Decode}; use crate::{AuthorityId, GenesisConfig, Trait, Module, ConsensusLog}; use substrate_finality_grandpa_primitives::GRANDPA_ENGINE_ID; @@ -52,7 +52,7 @@ impl system::Trait for Test { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 11700fa99f..adef602ce6 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -18,8 +18,8 @@ #![cfg(test)] -use primitives::testing::Digest; -use primitives::traits::{Header, OnFinalize}; +use sr_primitives::testing::Digest; +use sr_primitives::traits::{Header, OnFinalize}; use runtime_io::with_externalities; use crate::mock::*; use system::{EventRecord, Phase}; diff --git a/srml/im-online/Cargo.toml b/srml/im-online/Cargo.toml index 5ca5e0c533..c015e5e4c5 100644 --- a/srml/im-online/Cargo.toml +++ b/srml/im-online/Cargo.toml @@ -6,20 +6,20 @@ edition = "2018" [dependencies] parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } serde = { version = "1.0", optional = true } session = { package = "srml-session", path = "../session", default-features = false } srml-support = { path = "../support", default-features = false } sr-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -substrate_primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [features] default = ["std"] std = [ "parity-codec/std", - "primitives/std", + "sr-primitives/std", "rstd/std", "serde", "session/std", diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 7898fea8eb..8254cb6078 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -68,14 +68,14 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use substrate_primitives::{ +use primitives::{ crypto::TypedKey, offchain::CryptoKey, offchain::OpaqueNetworkState, offchain::StorageKind, sr25519, ed25519, }; use parity_codec::{Encode, Decode}; -use primitives::{ +use sr_primitives::{ ApplyError, traits::{Member, IsMember, Extrinsic as ExtrinsicT}, transaction_validity::{TransactionValidity, TransactionLongevity, ValidTransaction}, }; diff --git a/srml/indices/Cargo.toml b/srml/indices/Cargo.toml index bc67132c86..c500cf5f87 100644 --- a/srml/indices/Cargo.toml +++ b/srml/indices/Cargo.toml @@ -11,10 +11,10 @@ parity-codec = { version = "4.1.1", default-features = false, features = ["deriv substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } [dev-dependencies] ref_thread_local = "0.0" @@ -26,10 +26,10 @@ std = [ "safe-mix/std", "substrate-keyring", "parity-codec/std", - "substrate-primitives/std", + "primitives/std", "rstd/std", "runtime-io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index 45487e3b51..0bfd6d6054 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -22,7 +22,7 @@ use rstd::{prelude::*, result, marker::PhantomData, convert::TryInto}; use parity_codec::{Encode, Decode, Codec, Input, Output}; use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; -use primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; +use sr_primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; use system::{IsDeadAccount, OnNewAccount}; use self::address::Address as RawAddress; diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index d1ce8dbe2a..ef4b2eb649 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -20,9 +20,9 @@ use std::collections::HashSet; use ref_thread_local::{ref_thread_local, RefThreadLocal}; -use primitives::testing::Header; -use primitives::Perbill; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::testing::Header; +use sr_primitives::Perbill; +use primitives::{H256, Blake2Hasher}; use srml_support::{impl_outer_origin, parameter_types}; use {runtime_io, system}; use crate::{GenesisConfig, Module, Trait, IsDeadAccount, OnNewAccount, ResolveHint}; @@ -76,7 +76,7 @@ impl system::Trait for Runtime { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = Indices; type Header = Header; diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml index 51b613497f..a5dfb713d1 100644 --- a/srml/session/Cargo.toml +++ b/srml/session/Cargo.toml @@ -9,7 +9,7 @@ serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } @@ -17,7 +17,7 @@ substrate-trie = { path = "../../core/trie", default-features = false, optional runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } lazy_static = "1.0" [features] @@ -29,7 +29,7 @@ std = [ "parity-codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "timestamp/std", "substrate-trie/std" ] diff --git a/srml/session/src/historical.rs b/srml/session/src/historical.rs index c6755c3ba3..402a73adf3 100644 --- a/srml/session/src/historical.rs +++ b/srml/session/src/historical.rs @@ -27,8 +27,8 @@ use rstd::prelude::*; use parity_codec::{Encode, Decode}; -use primitives::KeyTypeId; -use primitives::traits::{Convert, OpaqueKeys, Hash as HashT}; +use sr_primitives::KeyTypeId; +use sr_primitives::traits::{Convert, OpaqueKeys, Hash as HashT}; use srml_support::{ StorageValue, StorageMap, decl_module, decl_storage, }; @@ -312,8 +312,8 @@ impl> srml_support::traits::KeyOwnerProofSystem<(KeyTyp mod tests { use super::*; use runtime_io::with_externalities; - use substrate_primitives::Blake2Hasher; - use primitives::{ + use primitives::Blake2Hasher; + use sr_primitives::{ traits::OnInitialize, testing::{UintAuthorityId, UINT_DUMMY_KEY}, }; diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 8589f92006..a189a91da2 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -121,9 +121,9 @@ use rstd::{prelude::*, marker::PhantomData, ops::{Sub, Rem}}; use parity_codec::Decode; -use primitives::KeyTypeId; -use primitives::weights::SimpleDispatchInfo; -use primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey}; +use sr_primitives::KeyTypeId; +use sr_primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey}; use srml_support::{ dispatch::Result, ConsensusEngineId, StorageValue, StorageDoubleMap, for_each_tuple, decl_module, decl_event, decl_storage, @@ -317,8 +317,8 @@ decl_storage! { add_extra_genesis { config(keys): Vec<(T::ValidatorId, T::Keys)>; build(| - storage: &mut primitives::StorageOverlay, - _: &mut primitives::ChildrenStorageOverlay, + storage: &mut sr_primitives::StorageOverlay, + _: &mut sr_primitives::ChildrenStorageOverlay, config: &GenesisConfig | { runtime_io::with_storage(storage, || { @@ -562,8 +562,8 @@ mod tests { use super::*; use srml_support::assert_ok; use runtime_io::with_externalities; - use substrate_primitives::Blake2Hasher; - use primitives::{ + use primitives::Blake2Hasher; + use sr_primitives::{ traits::OnInitialize, testing::UintAuthorityId, }; diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index 5c2711e971..734f5bbde4 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -19,8 +19,8 @@ use super::*; use std::cell::RefCell; use srml_support::{impl_outer_origin, parameter_types}; -use substrate_primitives::H256; -use primitives::{ +use primitives::H256; +use sr_primitives::{ Perbill, traits::{BlakeTwo256, IdentityLookup, ConvertInto}, testing::{Header, UintAuthorityId} @@ -159,7 +159,7 @@ impl Trait for Test { #[cfg(feature = "historical")] impl crate::historical::Trait for Test { type FullIdentification = u64; - type FullIdentificationOf = primitives::traits::ConvertInto; + type FullIdentificationOf = sr_primitives::traits::ConvertInto; } pub type System = system::Module; diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index e9a660ebe0..5feab0f516 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -11,14 +11,14 @@ parity-codec = { version = "4.1.1", default-features = false, features = ["deriv substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } session = { package = "srml-session", path = "../session", default-features = false, features = ["historical"] } authorship = { package = "srml-authorship", path = "../authorship", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } balances = { package = "srml-balances", path = "../balances" } timestamp = { package = "srml-timestamp", path = "../timestamp" } rand = "0.6.5" @@ -35,7 +35,7 @@ std = [ "rstd/std", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "session/std", "system/std", "authorship/std", diff --git a/srml/staking/src/inflation.rs b/srml/staking/src/inflation.rs index 503a20a629..f80e94f7c4 100644 --- a/srml/staking/src/inflation.rs +++ b/srml/staking/src/inflation.rs @@ -16,7 +16,7 @@ //! http://research.web3.foundation/en/latest/polkadot/Token%20Economics/#inflation-model -use primitives::{Perbill, traits::SimpleArithmetic}; +use sr_primitives::{Perbill, traits::SimpleArithmetic}; /// Linear function truncated to positive part `y = max(0, b [+ or -] a*x)` for PNPoS usage #[derive(Debug, PartialEq, Eq, Clone, Copy)] diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index a1a555bcf5..ade395ec1c 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -293,14 +293,14 @@ use srml_support::{ } }; use session::{historical::OnSessionEnding, SelectInitialValidators, SessionIndex}; -use primitives::Perbill; -use primitives::weights::SimpleDispatchInfo; -use primitives::traits::{ +use sr_primitives::Perbill; +use sr_primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{ Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded, SaturatedConversion, SimpleArithmetic }; #[cfg(feature = "std")] -use primitives::{Serialize, Deserialize}; +use sr_primitives::{Serialize, Deserialize}; use system::{ensure_signed, ensure_root}; use phragmen::{elect, ACCURACY, ExtendedBalance, equalize}; @@ -621,8 +621,8 @@ decl_storage! { config(stakers): Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>; build(| - storage: &mut primitives::StorageOverlay, - _: &mut primitives::ChildrenStorageOverlay, + storage: &mut sr_primitives::StorageOverlay, + _: &mut sr_primitives::ChildrenStorageOverlay, config: &GenesisConfig | { with_storage(storage, || { diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 426ba680a9..344ef70e3b 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -17,10 +17,10 @@ //! Test utilities use std::{collections::HashSet, cell::RefCell}; -use primitives::Perbill; -use primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize}; -use primitives::testing::{Header, UintAuthorityId}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::Perbill; +use sr_primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize}; +use sr_primitives::testing::{Header, UintAuthorityId}; +use primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{assert_ok, impl_outer_origin, parameter_types, EnumerableStorageMap}; use srml_support::traits::{Currency, Get, FindAuthor}; @@ -111,7 +111,7 @@ impl system::Trait for Test { type Index = u64; type BlockNumber = BlockNumber; type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Header = Header; diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index 39480bf689..cce2a8e0a3 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -17,8 +17,8 @@ //! Rust implementation of the Phragmén election algorithm. use rstd::{prelude::*, collections::btree_map::BTreeMap}; -use primitives::{PerU128}; -use primitives::traits::{Zero, Convert, Saturating}; +use sr_primitives::{PerU128}; +use sr_primitives::traits::{Zero, Convert, Saturating}; use crate::{BalanceOf, RawAssignment, ExpoMap, Trait, ValidatorPrefs, IndividualExposure}; type Fraction = PerU128; diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index 39409c2c39..4f42f991a8 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -19,7 +19,7 @@ use super::*; use runtime_io::with_externalities; use phragmen; -use primitives::traits::OnInitialize; +use sr_primitives::traits::OnInitialize; use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap}; use mock::*; use srml_support::traits::{Currency, ReservableCurrency}; diff --git a/srml/sudo/Cargo.toml b/srml/sudo/Cargo.toml index 7a25075390..6f7d290396 100644 --- a/srml/sudo/Cargo.toml +++ b/srml/sudo/Cargo.toml @@ -16,7 +16,7 @@ system = { package = "srml-system", path = "../system", default-features = false [dev-dependencies] sr-io = { path = "../../core/sr-io", default-features = false } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] diff --git a/srml/support/Cargo.toml b/srml/support/Cargo.toml index 6abe1fb336..99fa2dbb38 100644 --- a/srml/support/Cargo.toml +++ b/srml/support/Cargo.toml @@ -11,7 +11,7 @@ srml-metadata = { path = "../metadata", default-features = false } sr-std = { path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } srml-support-procedural = { path = "./procedural" } paste = "0.1" diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 0977c29665..2e33493964 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -531,8 +531,8 @@ fn decl_store_extra_genesis( impl#fparam_impl GenesisConfig#sparam #genesis_where_clause { pub fn build_storage #fn_generic (self) -> std::result::Result< ( - #scrate::runtime_primitives::StorageOverlay, - #scrate::runtime_primitives::ChildrenStorageOverlay, + #scrate::sr_primitives::StorageOverlay, + #scrate::sr_primitives::ChildrenStorageOverlay, ), String > #fn_where_clause { @@ -545,8 +545,8 @@ fn decl_store_extra_genesis( /// Assimilate the storage for this module into pre-existing overlays. pub fn assimilate_storage #fn_generic ( self, - r: &mut #scrate::runtime_primitives::StorageOverlay, - c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay, + r: &mut #scrate::sr_primitives::StorageOverlay, + c: &mut #scrate::sr_primitives::ChildrenStorageOverlay, ) -> std::result::Result<(), String> #fn_where_clause { let storage = r; @@ -559,13 +559,13 @@ fn decl_store_extra_genesis( } #[cfg(feature = "std")] - impl#build_storage_impl #scrate::runtime_primitives::#impl_trait + impl#build_storage_impl #scrate::sr_primitives::#impl_trait for GenesisConfig#sparam #build_storage_where_clause { fn build_module_genesis_storage( self, - r: &mut #scrate::runtime_primitives::StorageOverlay, - c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay, + r: &mut #scrate::sr_primitives::StorageOverlay, + c: &mut #scrate::sr_primitives::ChildrenStorageOverlay, ) -> std::result::Result<(), String> { self.assimilate_storage::<#fn_traitinstance> (r, c) } diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index 1e0556731e..0391d2995f 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -749,7 +749,7 @@ macro_rules! decl_module { fn on_initialize() { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnInitialize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnInitialize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_initialize(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } @@ -762,7 +762,7 @@ macro_rules! decl_module { fn on_initialize($param:ident : $param_ty:ty) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnInitialize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnInitialize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_initialize($param: $param_ty) { $( $impl )* } @@ -774,7 +774,7 @@ macro_rules! decl_module { { $( $other_where_bounds:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnInitialize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnInitialize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* {} }; @@ -785,7 +785,7 @@ macro_rules! decl_module { fn on_finalize() { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnFinalize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnFinalize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_finalize(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } @@ -798,7 +798,7 @@ macro_rules! decl_module { fn on_finalize($param:ident : $param_ty:ty) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnFinalize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnFinalize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_finalize($param: $param_ty) { $( $impl )* } @@ -810,7 +810,7 @@ macro_rules! decl_module { { $( $other_where_bounds:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnFinalize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnFinalize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { } @@ -822,7 +822,7 @@ macro_rules! decl_module { fn offchain_worker() { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn generate_extrinsics(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } @@ -835,7 +835,7 @@ macro_rules! decl_module { fn offchain_worker($param:ident : $param_ty:ty) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn generate_extrinsics($param: $param_ty) { $( $impl )* } @@ -847,7 +847,7 @@ macro_rules! decl_module { { $( $other_where_bounds:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* {} }; @@ -1595,7 +1595,7 @@ macro_rules! __check_reserved_fn_name { #[allow(dead_code)] mod tests { use super::*; - use crate::runtime_primitives::traits::{OnInitialize, OnFinalize}; + use crate::sr_primitives::traits::{OnInitialize, OnFinalize}; use sr_primitives::weights::{DispatchInfo, DispatchClass}; pub trait Trait: system::Trait + Sized where Self::AccountId: From { diff --git a/srml/support/src/inherent.rs b/srml/support/src/inherent.rs index d886abbca7..1b6d8fbdd7 100644 --- a/srml/support/src/inherent.rs +++ b/srml/support/src/inherent.rs @@ -17,7 +17,7 @@ #[doc(hidden)] pub use crate::rstd::vec::Vec; #[doc(hidden)] -pub use crate::runtime_primitives::traits::{Block as BlockT, Extrinsic}; +pub use crate::sr_primitives::traits::{Block as BlockT, Extrinsic}; #[doc(hidden)] pub use inherents::{InherentData, ProvideInherent, CheckInherentsResult, IsFatalError}; diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index e504726703..677fd6b82e 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -35,7 +35,6 @@ pub use codec; pub use once_cell; #[doc(hidden)] pub use paste; -pub use sr_primitives as runtime_primitives; pub use self::storage::hashed::generator::{ HashedStorage, Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat @@ -69,7 +68,7 @@ pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use self::double_map::StorageDoubleMapWithHasher; pub use runtime_io::{print, storage_root}; -pub use runtime_primitives::ConsensusEngineId; +pub use sr_primitives::{self, ConsensusEngineId}; /// Macro for easily creating a new implementation of the `Get` trait. Use similarly to /// how you would declare a `const`: diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs index 0897bd153b..9aae241dba 100644 --- a/srml/support/src/runtime.rs +++ b/srml/support/src/runtime.rs @@ -194,10 +194,10 @@ macro_rules! construct_runtime { #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] pub struct $runtime; - impl $crate::runtime_primitives::traits::GetNodeBlockType for $runtime { + impl $crate::sr_primitives::traits::GetNodeBlockType for $runtime { type NodeBlock = $node_block; } - impl $crate::runtime_primitives::traits::GetRuntimeBlockType for $runtime { + impl $crate::sr_primitives::traits::GetRuntimeBlockType for $runtime { type RuntimeBlock = $block; } $crate::__decl_outer_event!( @@ -698,7 +698,7 @@ macro_rules! __decl_outer_config { }; ) => { $crate::paste::item! { - $crate::runtime_primitives::impl_outer_config!( + $crate::sr_primitives::impl_outer_config!( pub struct GenesisConfig for $runtime { $( [< $parsed_name Config >] => diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index aca056eb50..5f1d7c32ef 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -20,9 +20,9 @@ use crate::rstd::{result, marker::PhantomData, ops::Div}; use crate::codec::{Codec, Encode, Decode}; -use substrate_primitives::u32_trait::Value as U32; -use crate::runtime_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; -use crate::runtime_primitives::ConsensusEngineId; +use primitives::u32_trait::Value as U32; +use crate::sr_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; +use crate::sr_primitives::ConsensusEngineId; use super::for_each_tuple; diff --git a/srml/support/src/unsigned.rs b/srml/support/src/unsigned.rs index 8ea613461a..1c62dd0c58 100644 --- a/srml/support/src/unsigned.rs +++ b/srml/support/src/unsigned.rs @@ -15,11 +15,11 @@ // along with Substrate. If not, see . #[doc(hidden)] -pub use crate::runtime_primitives::traits::ValidateUnsigned; +pub use crate::sr_primitives::traits::ValidateUnsigned; #[doc(hidden)] -pub use crate::runtime_primitives::transaction_validity::TransactionValidity; +pub use crate::sr_primitives::transaction_validity::TransactionValidity; #[doc(hidden)] -pub use crate::runtime_primitives::ApplyError; +pub use crate::sr_primitives::ApplyError; /// Implement `ValidateUnsigned` for `Runtime`. diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 30db9c980b..863532ff09 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -18,7 +18,7 @@ use runtime_io::{with_externalities, Blake2Hasher}; use srml_support::{ Parameter, traits::Get, parameter_types, - runtime_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}}, + sr_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}}, metadata::{ DecodeDifferent, StorageMetadata, StorageEntryModifier, StorageEntryType, DefaultByteGetter, StorageEntryMetadata, StorageHasher @@ -504,4 +504,4 @@ fn instance_prefix_is_prefix_of_entries() { assert!(module2::Instance2::PREFIX_FOR_Map.starts_with(prefix)); assert!(module2::Instance2::PREFIX_FOR_LinkedMap.starts_with(prefix)); assert!(module2::Instance2::PREFIX_FOR_DoubleMap.starts_with(prefix)); -} \ No newline at end of file +} diff --git a/srml/support/test/tests/issue2219.rs b/srml/support/test/tests/issue2219.rs index 54ad62cc93..cb8b4cef09 100644 --- a/srml/support/test/tests/issue2219.rs +++ b/srml/support/test/tests/issue2219.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use srml_support::runtime_primitives::generic; -use srml_support::runtime_primitives::traits::{BlakeTwo256, Block as _, Verify}; +use srml_support::sr_primitives::generic; +use srml_support::sr_primitives::traits::{BlakeTwo256, Block as _, Verify}; use srml_support::codec::{Encode, Decode}; use primitives::{H256, sr25519}; use serde::{Serialize, Deserialize}; diff --git a/srml/system/Cargo.toml b/srml/system/Cargo.toml index d6039499e1..35ddfabd6e 100644 --- a/srml/system/Cargo.toml +++ b/srml/system/Cargo.toml @@ -8,10 +8,10 @@ edition = "2018" serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } [dev-dependencies] @@ -23,11 +23,11 @@ std = [ "serde", "safe-mix/std", "parity-codec/std", - "substrate-primitives/std", + "primitives/std", "rstd/std", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", ] [[bench]] diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index 071446ea35..8e13e92d3f 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -18,8 +18,8 @@ use criterion::{Criterion, criterion_group, criterion_main, black_box}; use srml_system as system; use srml_support::{decl_module, decl_event, impl_outer_origin, impl_outer_event}; use runtime_io::{with_externalities, Blake2Hasher}; -use substrate_primitives::H256; -use primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; +use primitives::H256; +use sr_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; mod module { use super::*; diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index e98c53bf1d..1d73567c77 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -77,16 +77,16 @@ use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; use rstd::marker::PhantomData; -use primitives::generic::{self, Era}; -use primitives::Perbill; -use primitives::weights::{Weight, DispatchInfo, DispatchClass, WeightMultiplier, SimpleDispatchInfo}; -use primitives::transaction_validity::{ValidTransaction, TransactionPriority, TransactionLongevity}; -use primitives::traits::{self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Convert, +use sr_primitives::generic::{self, Era}; +use sr_primitives::Perbill; +use sr_primitives::weights::{Weight, DispatchInfo, DispatchClass, WeightMultiplier, SimpleDispatchInfo}; +use sr_primitives::transaction_validity::{ValidTransaction, TransactionPriority, TransactionLongevity}; +use sr_primitives::traits::{self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Convert, SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash, MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup, DispatchError, SaturatedConversion, }; -use substrate_primitives::storage::well_known_keys; +use primitives::storage::well_known_keys; use srml_support::{ storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, StorageMap, Parameter, for_each_tuple, traits::{Contains, Get} @@ -98,7 +98,7 @@ use parity_codec::{Encode, Decode}; use runtime_io::{twox_128, TestExternalities, Blake2Hasher}; #[cfg(any(feature = "std", test))] -use substrate_primitives::ChangesTrieConfiguration; +use primitives::ChangesTrieConfiguration; /// Handler for when a new account has been created. pub trait OnNewAccount { @@ -401,10 +401,14 @@ decl_storage! { } add_extra_genesis { config(changes_trie_config): Option; - #[serde(with = "substrate_primitives::bytes")] + #[serde(with = "primitives::bytes")] config(code): Vec; - build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { + build( + |storage: &mut sr_primitives::StorageOverlay, + _: &mut sr_primitives::ChildrenStorageOverlay, + config: &GenesisConfig| + { use parity_codec::Encode; storage.insert(well_known_keys::CODE.to_vec(), config.code.clone()); @@ -1042,8 +1046,8 @@ impl BlockNumberToHash for ChainContext { mod tests { use super::*; use runtime_io::with_externalities; - use substrate_primitives::H256; - use primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use primitives::H256; + use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; use srml_support::{impl_outer_origin, parameter_types}; impl_outer_origin!{ diff --git a/srml/timestamp/Cargo.toml b/srml/timestamp/Cargo.toml index bb82d1a42b..765573ce46 100644 --- a/srml/timestamp/Cargo.toml +++ b/srml/timestamp/Cargo.toml @@ -8,14 +8,14 @@ edition = "2018" serde = { version = "1.0", optional = true } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] @@ -23,7 +23,7 @@ std = [ "inherents/std", "parity-codec/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "srml-support/std", "serde", "system/std", diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 46ffb6ed22..cc439da8ee 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -98,8 +98,8 @@ use parity_codec::Decode; use inherents::ProvideInherentData; use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple}; use srml_support::traits::{Time, Get}; -use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; -use runtime_primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; +use sr_primitives::weights::SimpleDispatchInfo; use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; @@ -339,8 +339,8 @@ mod tests { use srml_support::{impl_outer_origin, assert_ok, parameter_types}; use runtime_io::{with_externalities, TestExternalities}; - use substrate_primitives::H256; - use runtime_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use primitives::H256; + use sr_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} diff --git a/srml/treasury/Cargo.toml b/srml/treasury/Cargo.toml index 64190f9c4f..4314d959b3 100644 --- a/srml/treasury/Cargo.toml +++ b/srml/treasury/Cargo.toml @@ -8,14 +8,14 @@ edition = "2018" serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } balances = { package = "srml-balances", path = "../balances", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] @@ -23,7 +23,7 @@ std = [ "serde", "parity-codec/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "srml-support/std", "system/std", "balances/std", diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index f86a8271a2..702fe3048e 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -75,11 +75,11 @@ use srml_support::traits::{ Currency, ExistenceRequirement, Get, Imbalance, OnDilution, OnUnbalanced, ReservableCurrency, WithdrawReason }; -use runtime_primitives::{Permill, ModuleId}; -use runtime_primitives::traits::{ +use sr_primitives::{Permill, ModuleId}; +use sr_primitives::traits::{ Zero, EnsureOrigin, StaticLookup, CheckedSub, CheckedMul, AccountIdConversion }; -use runtime_primitives::weights::SimpleDispatchInfo; +use sr_primitives::weights::SimpleDispatchInfo; use parity_codec::{Encode, Decode}; use system::ensure_signed; @@ -363,8 +363,8 @@ mod tests { use runtime_io::with_externalities; use srml_support::{assert_noop, assert_ok, impl_outer_origin, parameter_types}; - use substrate_primitives::{H256, Blake2Hasher}; - use runtime_primitives::{Perbill, traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header}; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{Perbill, traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 6ecede88ed..3e0079cedf 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -substrate-primitives = { version = "*", path = "../core/primitives" } +primitives = { package = "substrate-primitives", version = "*", path = "../core/primitives" } node-runtime = { version = "*", path = "../node/runtime" } node-primitives = { version = "*", path = "../node/primitives" } sr-primitives = { version = "*", path = "../core/sr-primitives" } diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 16abc8723a..9ef3586ed0 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -22,7 +22,7 @@ use std::{str::FromStr, io::{stdin, Read}, convert::TryInto}; use hex_literal::hex; use clap::load_yaml; use bip39::{Mnemonic, Language, MnemonicType}; -use substrate_primitives::{ +use primitives::{ ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, blake2_256, crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat} }; diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index ea1a609218..988055c67c 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -16,7 +16,7 @@ use rand::{rngs::OsRng, RngCore}; use super::Crypto; -use substrate_primitives::Pair; +use primitives::Pair; fn good_waypoint(done: u64) -> u64 { match done { @@ -103,7 +103,7 @@ pub(super) fn generate_key(desired: &str) -> Result, &str> mod tests { use super::*; use super::super::Ed25519; - use substrate_primitives::{Pair, crypto::Ss58Codec}; + use primitives::{Pair, crypto::Ss58Codec}; #[cfg(feature = "bench")] use test::Bencher; diff --git a/test-utils/chain-spec-builder/Cargo.toml b/test-utils/chain-spec-builder/Cargo.toml index a54094d8c7..1e048a91cd 100644 --- a/test-utils/chain-spec-builder/Cargo.toml +++ b/test-utils/chain-spec-builder/Cargo.toml @@ -7,5 +7,5 @@ edition = "2018" [dependencies] clap = { version = "~2.32", features = ["yaml"] } node-cli = { path = "../../node/cli" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } substrate-service = { path = "../../core/service" } diff --git a/test-utils/transaction-factory/Cargo.toml b/test-utils/transaction-factory/Cargo.toml index 2868b4f537..1c4cf5a5d5 100644 --- a/test-utils/transaction-factory/Cargo.toml +++ b/test-utils/transaction-factory/Cargo.toml @@ -11,12 +11,12 @@ consensus_common = { package = "substrate-consensus-common", path = "../../core/ log = "0.4" parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } -sr_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } substrate-service = { path = "../../core/service" } [features] default = ["std"] std = [ "parity-codec/std", - "primitives/std", + "sr-primitives/std", ] -- GitLab From 5aa84b865dd31f3fb29eee3430553bdc80024aa0 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 29 Jul 2019 15:55:57 +0200 Subject: [PATCH 055/151] core/network: Fix bad import %s/runtime_primitives/sr_primitives/ (#3236) * core/network: Fix bad import %s/runtime_primitives/sr_primitives/ * Cargo.lock: Update consensus-common-primitives parity-codec version * core/consensus/common: Remove obsolete package path --- Cargo.lock | 2 +- core/consensus/common/primitives/Cargo.toml | 2 +- core/network/src/custom_proto/behaviour.rs | 2 +- core/network/src/custom_proto/handler.rs | 2 +- core/network/src/custom_proto/upgrade.rs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e77f3003b..eb7a89e78c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4390,7 +4390,7 @@ dependencies = [ name = "substrate-consensus-common-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", diff --git a/core/consensus/common/primitives/Cargo.toml b/core/consensus/common/primitives/Cargo.toml index 154863eed5..df44db2f34 100644 --- a/core/consensus/common/primitives/Cargo.toml +++ b/core/consensus/common/primitives/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] parity-codec = { version = "4.1.1", default-features = false } client = { package = "substrate-client", path = "../../../client", default-features = false } -sr-primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +sr-primitives = { path = "../../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } [features] diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs index babd93f932..1cfa16ea6b 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -24,7 +24,7 @@ use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt use libp2p::core::{ConnectedPoint, Multiaddr, PeerId}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use log::{debug, error, trace, warn}; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; use std::time::{Duration, Instant}; diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs index 6904d18c4b..5cdedf4940 100644 --- a/core/network/src/custom_proto/handler.rs +++ b/core/network/src/custom_proto/handler.rs @@ -29,7 +29,7 @@ use libp2p::swarm::{ SubstreamProtocol, }; use log::{debug, error}; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use smallvec::{smallvec, SmallVec}; use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; diff --git a/core/network/src/custom_proto/upgrade.rs b/core/network/src/custom_proto/upgrade.rs index c01de89cdd..1959ca2883 100644 --- a/core/network/src/custom_proto/upgrade.rs +++ b/core/network/src/custom_proto/upgrade.rs @@ -23,7 +23,7 @@ use log::warn; use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; use parity_codec::{Decode, Encode}; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use tokio_io::{AsyncRead, AsyncWrite}; use unsigned_varint::codec::UviBytes; -- GitLab From 2a3b4ccccaf166389d4cc3ac88c00b0f032a01f7 Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Mon, 29 Jul 2019 17:06:13 +0200 Subject: [PATCH 056/151] Fix substrate factory CLI command (#3239) * CLI execution flag for import-blocks and factory. * Fix minimum_balance bug with CLI factory. --- Cargo.lock | 1 + core/cli/src/lib.rs | 9 ++++++-- core/cli/src/params.rs | 13 +++++++++++ node/cli/Cargo.toml | 1 + node/cli/src/factory_impl.rs | 10 ++++---- node/cli/src/lib.rs | 23 +++++++++++++++++-- .../transaction-factory/src/complex_mode.rs | 9 ++------ test-utils/transaction-factory/src/lib.rs | 7 +++--- 8 files changed, 54 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb7a89e78c..4b44d70737 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2252,6 +2252,7 @@ dependencies = [ "srml-contracts 2.0.0", "srml-finality-tracker 2.0.0", "srml-indices 2.0.0", + "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index cc31af184e..7cd7db8897 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -51,7 +51,7 @@ use params::{ NetworkConfigurationParams, MergeParameters, TransactionPoolParams, NodeKeyParams, NodeKeyType, Cors, }; -pub use params::{NoCustom, CoreParams, SharedParams}; +pub use params::{NoCustom, CoreParams, SharedParams, ExecutionStrategy as ExecutionStrategyParam}; pub use traits::{GetLogFilter, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; use log::info; @@ -639,7 +639,12 @@ where E: IntoExit, S: FnOnce(&str) -> Result>>, String>, { - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; + let mut config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; + config.execution_strategies = ExecutionStrategies { + importing: cli.execution.into(), + other: cli.execution.into(), + ..Default::default() + }; let file: Box = match cli.input { Some(filename) => Box::new(File::open(filename)?), diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 499c8b9eca..e1018eb93a 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -33,6 +33,7 @@ macro_rules! impl_get_log_filter { arg_enum! { /// How to execute blocks + #[allow(missing_docs)] #[derive(Debug, Clone, Copy)] pub enum ExecutionStrategy { Native, @@ -610,6 +611,18 @@ pub struct ImportBlocksCmd { #[allow(missing_docs)] #[structopt(flatten)] pub shared_params: SharedParams, + + /// The means of execution used when calling into the runtime while importing blocks. + #[structopt( + long = "execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""NativeElseWasm""# + ) + )] + pub execution: ExecutionStrategy, } impl_get_log_filter!(ImportBlocksCmd); diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index d3d48ebe01..f40ef95ada 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -42,6 +42,7 @@ finality_tracker = { package = "srml-finality-tracker", path = "../../srml/final contracts = { package = "srml-contracts", path = "../../srml/contracts" } system = { package = "srml-system", path = "../../srml/system" } balances = { package = "srml-balances", path = "../../srml/balances" } +support = { package = "srml-support", path = "../../srml/support", default-features = false } [dev-dependencies] babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index 182cf4080e..2d812b35ca 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -23,11 +23,13 @@ use rand::rngs::StdRng; use parity_codec::Decode; use keyring::sr25519::Keyring; -use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall}; +use node_primitives::Hash; +use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall, ExistentialDeposit}; use primitives::{sr25519, crypto::Pair}; use parity_codec::Encode; use sr_primitives::{generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension}}; use substrate_service::ServiceFactory; +use support::traits::Get; use transaction_factory::RuntimeAdapter; use transaction_factory::modes::Mode; use crate::service; @@ -133,7 +135,7 @@ impl RuntimeAdapter for FactoryState { sender: &Self::AccountId, key: &Self::Secret, destination: &Self::AccountId, - amount: &Self::Number, + amount: &Self::Balance, prior_block_hash: &::Hash, ) -> ::Extrinsic { let index = self.extract_index(&sender, prior_block_hash); @@ -161,9 +163,9 @@ impl RuntimeAdapter for FactoryState { inherent } - fn minimum_balance() -> Self::Number { + fn minimum_balance() -> Self::Balance { // TODO get correct amount via api. See #2587. - 1337 + ExistentialDeposit::get() } fn master_account_id() -> Self::AccountId { diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index b18fa57411..adf9d81fa7 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -26,7 +26,7 @@ mod factory_impl; use tokio::prelude::Future; use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; -pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams}; +pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams, ExecutionStrategyParam}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use std::ops::Deref; use log::info; @@ -34,6 +34,7 @@ use structopt::{StructOpt, clap::App}; use cli::{AugmentClap, GetLogFilter}; use crate::factory_impl::FactoryState; use transaction_factory::RuntimeAdapter; +use client::ExecutionStrategies; /// The chain specification option. #[derive(Clone, Debug, PartialEq)] @@ -102,6 +103,18 @@ pub struct FactoryCmd { #[allow(missing_docs)] #[structopt(flatten)] pub shared_params: SharedParams, + + /// The means of execution used when calling into the runtime while importing blocks. + #[structopt( + long = "execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategyParam::variants()", + case_insensitive = "true", + default_value = r#""NativeElseWasm""# + ) + )] + pub execution: ExecutionStrategyParam, } impl AugmentClap for FactoryCmd { @@ -173,11 +186,17 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul match &ret { Ok(Some(CustomSubcommands::Factory(cli_args))) => { - let config = cli::create_config_with_db_path::( + let mut config = cli::create_config_with_db_path::( load_spec, &cli_args.shared_params, &version, )?; + config.execution_strategies = ExecutionStrategies { + importing: cli_args.execution.into(), + block_construction: cli_args.execution.into(), + other: cli_args.execution.into(), + ..Default::default() + }; match ChainSpec::from(config.chain_spec.id()) { Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs index 0d383c3025..66e209fc81 100644 --- a/test-utils/transaction-factory/src/complex_mode.rs +++ b/test-utils/transaction-factory/src/complex_mode.rs @@ -83,13 +83,8 @@ where let seed = factory_state.start_number() + factory_state.block_no(); let to = RA::gen_random_account_id(&seed); - let amount; - if factory_state.round() == RA::Number::zero() { - amount = RA::minimum_balance() * factory_state.rounds(); - } else { - let rounds_left = factory_state.rounds() - factory_state.round(); - amount = RA::minimum_balance() * rounds_left; - }; + let rounds_left = factory_state.rounds() - factory_state.round(); + let amount = RA::minimum_balance() * rounds_left.into(); let transfer = factory_state.transfer_extrinsic( &from.0, diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index 61dbfab658..747811433a 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -21,7 +21,6 @@ use std::collections::HashMap; use std::sync::Arc; -use std::ops::Mul; use std::cmp::PartialOrd; use std::fmt::Display; @@ -51,7 +50,7 @@ mod simple_modes; pub trait RuntimeAdapter { type AccountId: Display; - type Balance: Display + Mul; + type Balance: Display + SimpleArithmetic + From; type Block: BlockT; type Index: Copy; type Number: Display + PartialOrd + SimpleArithmetic + Zero + One; @@ -77,13 +76,13 @@ pub trait RuntimeAdapter { sender: &Self::AccountId, key: &Self::Secret, destination: &Self::AccountId, - amount: &Self::Number, + amount: &Self::Balance, prior_block_hash: &::Hash, ) -> ::Extrinsic; fn inherent_extrinsics(&self) -> InherentData; - fn minimum_balance() -> Self::Number; + fn minimum_balance() -> Self::Balance; fn master_account_id() -> Self::AccountId; fn master_account_secret() -> Self::Secret; fn extract_index(&self, account_id: &Self::AccountId, block_hash: &::Hash) -> Self::Index; -- GitLab From b77d8dbf64b60c1d2329db97e3dc50ab44d3a30e Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 29 Jul 2019 18:21:28 +0200 Subject: [PATCH 057/151] Add documentation for the client (#3221) --- core/client/src/lib.rs | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index 441b2480e9..595bf55b32 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -15,6 +15,62 @@ // along with Substrate. If not, see . //! Substrate Client and associated logic. +//! +//! The [`Client`] is one of the most important components of Substrate. It mainly comprises two +//! parts: +//! +//! - A database containing the blocks and chain state, generally referred to as +//! the [`Backend`](backend::Backend). +//! - A runtime environment, generally referred to as the [`Executor`](CallExecutor). +//! +//! # Initialization +//! +//! Creating a [`Client`] is done by calling the `new` method and passing to it a +//! [`Backend`](backend::Backend) and an [`Executor`](CallExecutor). +//! +//! The former is typically provided by the `substrate-client-db` crate, but [`in_mem::Backend`] +//! can be used for testing purposes. +//! +//! The latter typically requires passing one of: +//! +//! - A [`LocalCallExecutor`] running the runtime locally. +//! - A [`RemoteCallExecutor`](light::call_executor::RemoteCallExecutor) that will ask a +//! third-party to perform the executions. +//! - A [`RemoteOrLocalCallExecutor`](light::call_executor::RemoteOrLocalCallExecutor), combination +//! of the two. +//! +//! Additionally, the fourth generic parameter of the `Client` is a marker type representing +//! the ways in which the runtime can interface with the outside. Any code that builds a `Client` +//! is responsible for putting the right marker. +//! +//! ## Example +//! +//! ``` +//! use std::sync::Arc; +//! use substrate_client::{Client, in_mem::Backend, LocalCallExecutor}; +//! use primitives::Blake2Hasher; +//! use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +//! use executor::NativeExecutor; +//! +//! // In this example, we're using the `Block` and `RuntimeApi` types from the +//! // `substrate-test-runtime-client` crate. These types are automatically generated when +//! // compiling a runtime. In a typical use-case, these types would have been to be generated +//! // from your runtime. +//! use test_client::{LocalExecutor, runtime::Block, runtime::RuntimeApi}; +//! +//! let backend = Arc::new(Backend::::new()); +//! let client = Client::<_, _, _, RuntimeApi>::new( +//! backend.clone(), +//! LocalCallExecutor::new( +//! backend.clone(), +//! NativeExecutor::::new(None) +//! ), +//! // This parameter provides the storage for the chain genesis. +//! <(StorageOverlay, ChildrenStorageOverlay)>::default(), +//! Default::default() +//! ); +//! ``` +//! #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] -- GitLab From 285204c3942a8c0bb647e356593cd1cecdd48bd6 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 29 Jul 2019 20:43:03 +0200 Subject: [PATCH 058/151] Fix master (#3242) --- core/client/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index 595bf55b32..a1351f20e4 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -49,7 +49,7 @@ //! use std::sync::Arc; //! use substrate_client::{Client, in_mem::Backend, LocalCallExecutor}; //! use primitives::Blake2Hasher; -//! use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +//! use sr_primitives::{StorageOverlay, ChildrenStorageOverlay}; //! use executor::NativeExecutor; //! //! // In this example, we're using the `Block` and `RuntimeApi` types from the -- GitLab From f8c05eb36ea0e7228a1e368a9b1f37a2293d11a5 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 29 Jul 2019 20:50:50 +0200 Subject: [PATCH 059/151] Allow creating a ChainSpec from a Vec (#3233) * Allow creating a ChainSpec from a Vec * Line widths * Embedded -> Binary * Remove from_embedded --- core/service/src/chain_spec.rs | 24 ++++++++++++++---------- node/cli/src/chain_spec.rs | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index 461d24e188..ca92a4814c 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -16,6 +16,7 @@ //! Substrate chain configurations. +use std::borrow::Cow; use std::collections::HashMap; use std::fs::File; use std::path::PathBuf; @@ -29,7 +30,7 @@ use tel::TelemetryEndpoints; enum GenesisSource { File(PathBuf), - Embedded(&'static [u8]), + Binary(Cow<'static, [u8]>), Factory(fn() -> G), } @@ -37,7 +38,7 @@ impl Clone for GenesisSource { fn clone(&self) -> Self { match *self { GenesisSource::File(ref path) => GenesisSource::File(path.clone()), - GenesisSource::Embedded(d) => GenesisSource::Embedded(d), + GenesisSource::Binary(ref d) => GenesisSource::Binary(d.clone()), GenesisSource::Factory(f) => GenesisSource::Factory(f), } } @@ -50,14 +51,16 @@ impl GenesisSource { genesis: Genesis, } - match *self { - GenesisSource::File(ref path) => { + match self { + GenesisSource::File(path) => { let file = File::open(path).map_err(|e| format!("Error opening spec file: {}", e))?; - let genesis: GenesisContainer = json::from_reader(file).map_err(|e| format!("Error parsing spec file: {}", e))?; + let genesis: GenesisContainer = + json::from_reader(file).map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(genesis.genesis) }, - GenesisSource::Embedded(buf) => { - let genesis: GenesisContainer = json::from_reader(buf).map_err(|e| format!("Error parsing embedded file: {}", e))?; + GenesisSource::Binary(buf) => { + let genesis: GenesisContainer = + json::from_reader(buf.as_ref()).map_err(|e| format!("Error parsing embedded file: {}", e))?; Ok(genesis.genesis) }, GenesisSource::Factory(f) => Ok(Genesis::Runtime(f())), @@ -158,11 +161,12 @@ impl ChainSpec { } /// Parse json content into a `ChainSpec` - pub fn from_embedded(json: &'static [u8]) -> Result { - let spec = json::from_slice(json).map_err(|e| format!("Error parsing spec file: {}", e))?; + pub fn from_json_bytes(json: impl Into>) -> Result { + let json = json.into(); + let spec = json::from_slice(json.as_ref()).map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(ChainSpec { spec, - genesis: GenesisSource::Embedded(json), + genesis: GenesisSource::Binary(json), }) } diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 26e54f6ee6..d2fd0cfbc5 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -39,7 +39,7 @@ pub type ChainSpec = substrate_service::ChainSpec; /// Flaming Fir testnet generator pub fn flaming_fir_config() -> Result { - ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) + ChainSpec::from_json_bytes(&include_bytes!("../res/flaming-fir.json")[..]) } fn session_keys(ed_key: ed25519::Public, sr_key: sr25519::Public) -> SessionKeys { -- GitLab From 78ee571dfec3730cddabcd8f2ac3c9cef46b0a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Tue, 30 Jul 2019 06:39:33 +0100 Subject: [PATCH 060/151] srml: babe: add expected block time and epoch duration constants (#3241) * srml: babe: add expected block time constant * srml: babe: expose epoch duration constant * node: bump spec_version * core: don't use moment type in test-runtime * babe: add docs regarding c parameter --- core/consensus/babe/primitives/src/lib.rs | 5 ++++- core/test-runtime/src/lib.rs | 2 ++ node/runtime/src/constants.rs | 3 ++- node/runtime/src/lib.rs | 11 +++++++---- srml/babe/src/lib.rs | 12 ++++++++++++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 0e1cc217ab..9d69fb14bb 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -104,7 +104,10 @@ pub struct BabeConfiguration { /// A constant value that is used in the threshold calculation formula. /// Expressed as a fraction where the first member of the tuple is the - /// numerator and the second is the denominator. + /// numerator and the second is the denominator. The fraction should + /// represent a value between 0 and 1. + /// In the threshold formula calculation, `1 - c` represents the probability + /// of a slot being empty. pub c: (u64, u64), /// The minimum number of blocks that must be received before running the diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index c529fa201f..e2cdcabd2b 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -362,10 +362,12 @@ impl srml_timestamp::Trait for Runtime { parameter_types! { pub const EpochDuration: u64 = 6; + pub const ExpectedBlockTime: u64 = 10_000; } impl srml_babe::Trait for Runtime { type EpochDuration = EpochDuration; + type ExpectedBlockTime = ExpectedBlockTime; } /// Adds one to the given input and returns the final result. diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs index 5443c7e636..03f6e34c93 100644 --- a/node/runtime/src/constants.rs +++ b/node/runtime/src/constants.rs @@ -34,7 +34,8 @@ pub mod time { /// by `SLOT_DURATION`, but some slots will not be allocated to any /// authority and hence no block will be produced. We expect to have this /// block time on average following the defined slot duration and the value - /// of `c` configured for BABE. + /// of `c` configured for BABE (where `1 - c` represents the probability of + /// a slot being empty). /// This value is only used indirectly to define the unit constants below /// that are expressed in blocks. The rest of the code should use /// `SLOT_DURATION` instead (like the timestamp module for calculating the diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 583496508e..3d8b02a84d 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 122, + spec_version: 123, impl_version: 123, apis: RUNTIME_API_VERSIONS, }; @@ -128,10 +128,12 @@ impl system::Trait for Runtime { parameter_types! { pub const EpochDuration: u64 = EPOCH_DURATION_IN_SLOTS; + pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } impl babe::Trait for Runtime { type EpochDuration = EpochDuration; + type ExpectedBlockTime = ExpectedBlockTime; } impl indices::Trait for Runtime { @@ -517,9 +519,10 @@ impl_runtime_apis! { impl babe_primitives::BabeApi for Runtime { fn startup_data() -> babe_primitives::BabeConfiguration { - // The choice of `c` parameter is done in accordance to - // the slot duration and expected target block time, for - // safely resisting network delays of maximum two seconds. + // The choice of `c` parameter (where `1 - c` represents the + // probability of a slot being empty), is done in accordance to the + // slot duration and expected target block time, for safely + // resisting network delays of maximum two seconds. // babe_primitives::BabeConfiguration { median_required_blocks: 1000, diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index 2dbb9222fb..91ad5f3a85 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -109,6 +109,7 @@ impl ProvideInherentData for InherentDataProvider { pub trait Trait: timestamp::Trait { type EpochDuration: Get; + type ExpectedBlockTime: Get; } /// The length of the BABE randomness @@ -156,6 +157,17 @@ decl_storage! { decl_module! { /// The BABE SRML module pub struct Module for enum Call where origin: T::Origin { + /// The number of **slots** that an epoch takes. We couple sessions to + /// epochs, i.e. we start a new session once the new epoch begins. + const EpochDuration: u64 = T::EpochDuration::get(); + + /// The expected average block time at which BABE should be creating + /// blocks. Since BABE is probabilistic it is not trivial to figure out + /// what the expected average block time should be based on the slot + /// duration and the security parameter `c` (where `1 - c` represents + /// the probability of a slot being empty). + const ExpectedBlockTime: T::Moment = T::ExpectedBlockTime::get(); + /// Initialization fn on_initialize() { for digest in Self::get_inherent_digests() -- GitLab From cfb99a6b468b4af207fa50c450bdb575386bee82 Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Tue, 30 Jul 2019 07:41:09 +0200 Subject: [PATCH 061/151] srml-contracts: Forbid declaration of float types in contracts (#3234) * srml-contracts: Forbid remaining uses of float types. * Bump node runtime impl version. --- node/runtime/src/lib.rs | 2 +- srml/contracts/src/wasm/prepare.rs | 91 +++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 3d8b02a84d..6be19f02ae 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 123, - impl_version: 123, + impl_version: 124, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contracts/src/wasm/prepare.rs b/srml/contracts/src/wasm/prepare.rs index 4539b9d388..8dc137fc01 100644 --- a/srml/contracts/src/wasm/prepare.rs +++ b/srml/contracts/src/wasm/prepare.rs @@ -22,7 +22,7 @@ use crate::wasm::env_def::ImportSatisfyCheck; use crate::wasm::PrefabWasmModule; use crate::Schedule; -use parity_wasm::elements::{self, Internal, External, MemoryType, Type}; +use parity_wasm::elements::{self, Internal, External, MemoryType, Type, ValueType}; use pwasm_utils; use pwasm_utils::rules; use rstd::prelude::*; @@ -93,6 +93,50 @@ impl<'a> ContractModule<'a> { Ok(()) } + /// Ensures that no floating point types are in use. + fn ensure_no_floating_types(&self) -> Result<(), &'static str> { + if let Some(global_section) = self.module.global_section() { + for global in global_section.entries() { + match global.global_type().content_type() { + ValueType::F32 | ValueType::F64 => + return Err("use of floating point type in globals is forbidden"), + _ => {} + } + } + } + + if let Some(code_section) = self.module.code_section() { + for func_body in code_section.bodies() { + for local in func_body.locals() { + match local.value_type() { + ValueType::F32 | ValueType::F64 => + return Err("use of floating point type in locals is forbidden"), + _ => {} + } + } + } + } + + if let Some(type_section) = self.module.type_section() { + for wasm_type in type_section.types() { + match wasm_type { + Type::Function(func_type) => { + let return_type = func_type.return_type(); + for value_type in func_type.params().iter().chain(return_type.iter()) { + match value_type { + ValueType::F32 | ValueType::F64 => + return Err("use of floating point type in function types is forbidden"), + _ => {} + } + } + } + } + } + } + + Ok(()) + } + fn inject_gas_metering(self) -> Result { let gas_rules = rules::Set::new( @@ -291,6 +335,7 @@ pub fn prepare_contract( contract_module.scan_exports()?; contract_module.ensure_no_internal_memory()?; contract_module.ensure_table_size_limit(schedule.max_table_size)?; + contract_module.ensure_no_floating_types()?; struct MemoryDefinition { initial: u32, @@ -740,5 +785,49 @@ mod tests { "#, Err("unknown export: expecting only deploy and call functions") ); + + prepare_test!(global_float, + r#" + (module + (global $x f32 (f32.const 0)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in globals is forbidden") + ); + + prepare_test!(local_float, + r#" + (module + (func $foo (local f32)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in locals is forbidden") + ); + + prepare_test!(param_float, + r#" + (module + (func $foo (param f32)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in function types is forbidden") + ); + + prepare_test!(result_float, + r#" + (module + (func $foo (result f32) (f32.const 0)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in function types is forbidden") + ); } } -- GitLab From 0b008bde856c21e8ca45fc45df43ab298449f77a Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 30 Jul 2019 13:04:28 +0200 Subject: [PATCH 062/151] Properly stop block import on error (#3240) * Stop block import after error * Better diagnostic on error --- core/service/src/chain_ops.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 39cd5f570f..19666c090c 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -101,12 +101,14 @@ pub fn export_blocks( struct WaitLink { imported_blocks: u64, + has_error: bool, } impl WaitLink { fn new() -> WaitLink { WaitLink { imported_blocks: 0, + has_error: false, } } } @@ -115,12 +117,17 @@ impl Link for WaitLink { fn blocks_processed( &mut self, imported: usize, - count: usize, + _count: usize, results: Vec<(Result>, BlockImportError>, B::Hash)> ) { self.imported_blocks += imported as u64; - if results.iter().any(|(r, _)| r.is_err()) { - warn!("There was an error importing {} blocks", count); + + for result in results { + if let (Err(err), hash) = result { + warn!("There was an error importing block with hash {:?}: {:?}", hash, err); + self.has_error = true; + break; + } } } } @@ -198,6 +205,13 @@ pub fn import_blocks( queue.poll_actions(cx, &mut link); std::task::Poll::Pending::> }).compat().poll(); + if link.has_error { + info!( + "Stopping after #{} blocks because of an error", + link.imported_blocks, + ); + return Ok(Async::Ready(())); + } if link.imported_blocks / 1000 != blocks_before / 1000 { info!( "#{} blocks were imported (#{} left)", -- GitLab From 9db4bd96153f6a0aff65b336d1c4874f3a68f08d Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Tue, 30 Jul 2019 14:30:01 +0200 Subject: [PATCH 063/151] Remove unused imports introduced in #3239. (#3252) Partly due to interaction with #3191. --- Cargo.lock | 1 - node/cli/Cargo.toml | 1 - node/cli/src/factory_impl.rs | 2 -- 3 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b44d70737..eb7a89e78c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2252,7 +2252,6 @@ dependencies = [ "srml-contracts 2.0.0", "srml-finality-tracker 2.0.0", "srml-indices 2.0.0", - "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index f40ef95ada..d3d48ebe01 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -42,7 +42,6 @@ finality_tracker = { package = "srml-finality-tracker", path = "../../srml/final contracts = { package = "srml-contracts", path = "../../srml/contracts" } system = { package = "srml-system", path = "../../srml/system" } balances = { package = "srml-balances", path = "../../srml/balances" } -support = { package = "srml-support", path = "../../srml/support", default-features = false } [dev-dependencies] babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index 2d812b35ca..e902b45f35 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -23,13 +23,11 @@ use rand::rngs::StdRng; use parity_codec::Decode; use keyring::sr25519::Keyring; -use node_primitives::Hash; use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall, ExistentialDeposit}; use primitives::{sr25519, crypto::Pair}; use parity_codec::Encode; use sr_primitives::{generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension}}; use substrate_service::ServiceFactory; -use support::traits::Get; use transaction_factory::RuntimeAdapter; use transaction_factory::modes::Mode; use crate::service; -- GitLab From 02b081730cc0b2a3ccff502b848d89fcf232048f Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Tue, 30 Jul 2019 23:07:57 +0200 Subject: [PATCH 064/151] Synchronize state cache on finalization (#3246) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Reorg test * Fixed informant misreporting reorgs * Update cache when reorg is caused by applying finality * Test for finality reorg * Simplified test * Typo Co-Authored-By: André Silva --- Cargo.lock | 1 + core/cli/src/informant.rs | 10 ++- core/client/Cargo.toml | 1 + core/client/db/src/lib.rs | 13 +++- core/client/db/src/storage_cache.rs | 117 +++++++++++++++------------- core/client/src/client.rs | 85 ++++++++++++++++++++ core/state-db/src/lib.rs | 7 +- core/test-client/src/client_ext.rs | 22 ++++++ 8 files changed, 195 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb7a89e78c..191b308754 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4225,6 +4225,7 @@ name = "substrate-client" version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index e5e46ed17f..b5a2f03d79 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -48,15 +48,15 @@ where C: Components { }); let client = service.client(); - let mut last = { + let mut last_best = { let info = client.info(); Some((info.chain.best_number, info.chain.best_hash)) }; let display_block_import = client.import_notification_stream().map(|v| Ok::<_, ()>(v)).compat().for_each(move |n| { // detect and log reorganizations. - if let Some((ref last_num, ref last_hash)) = last { - if n.header.parent_hash() != last_hash { + if let Some((ref last_num, ref last_hash)) = last_best { + if n.header.parent_hash() != last_hash && n.is_new_best { let tree_route = ::client::blockchain::tree_route( #[allow(deprecated)] client.backend().blockchain(), @@ -77,7 +77,9 @@ where C: Components { } } - last = Some((n.header.number().clone(), n.hash.clone())); + if n.is_new_best { + last_best = Some((n.header.number().clone(), n.hash.clone())); + } info!(target: "substrate", "Imported #{} ({})", n.header.number(), n.hash); Ok(()) diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 80a3b3d99a..704f1ebccb 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -28,6 +28,7 @@ inherents = { package = "substrate-inherents", path = "../inherents", default-fe sr-api-macros = { path = "../sr-api-macros" } [dev-dependencies] +env_logger = "0.6" test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index e2472f1138..906404e8fc 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -1108,21 +1108,24 @@ impl> Backend { None }; - if let Some(set_head) = operation.set_head { + let cache_update = if let Some(set_head) = operation.set_head { if let Some(header) = ::client::blockchain::HeaderBackend::header(&self.blockchain, set_head)? { let number = header.number(); let hash = header.hash(); - self.set_head_with_transaction( + let (enacted, retracted) = self.set_head_with_transaction( &mut transaction, hash.clone(), (number.clone(), hash.clone()) )?; meta_updates.push((hash, *number, true, false)); + Some((enacted, retracted)) } else { return Err(client::error::Error::UnknownBlock(format!("Cannot set head {:?}", set_head))) } - } + } else { + None + }; let write_result = self.storage.db.write(transaction).map_err(db_err); @@ -1152,6 +1155,10 @@ impl> Backend { ); } + if let Some((enacted, retracted)) = cache_update { + self.shared_cache.lock().sync(&enacted, &retracted); + } + for (hash, number, is_best, is_finalized) in meta_updates { self.blockchain.update_meta(hash, number, is_best, is_finalized); } diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index 61376bd9bd..f6277747d8 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -151,6 +151,65 @@ impl Cache { + self.lru_child_storage.used_size() // ignore small hashes storage and self.lru_hashes.used_size() } + + /// Synchronize the shared cache with the best block state. + /// This function updates the shared cache by removing entries + /// that are invalidated by chain reorganization. It should be + /// be called when chain reorg happens without importing a new block. + pub fn sync(&mut self, enacted: &[B::Hash], retracted: &[B::Hash]) { + trace!("Syncing shared cache, enacted = {:?}, retracted = {:?}", enacted, retracted); + + // Purge changes from re-enacted and retracted blocks. + // Filter out commiting block if any. + let mut clear = false; + for block in enacted { + clear = clear || { + if let Some(ref mut m) = self.modifications.iter_mut().find(|m| &m.hash == block) { + trace!("Reverting enacted block {:?}", block); + m.is_canon = true; + for a in &m.storage { + trace!("Reverting enacted key {:?}", a); + self.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Reverting enacted child key {:?}", a); + self.lru_child_storage.remove(a); + } + false + } else { + true + } + }; + } + + for block in retracted { + clear = clear || { + if let Some(ref mut m) = self.modifications.iter_mut().find(|m| &m.hash == block) { + trace!("Retracting block {:?}", block); + m.is_canon = false; + for a in &m.storage { + trace!("Retracted key {:?}", a); + self.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Retracted child key {:?}", a); + self.lru_child_storage.remove(a); + } + false + } else { + true + } + }; + } + if clear { + // We don't know anything about the block; clear everything + trace!("Wiping cache"); + self.lru_storage.clear(); + self.lru_child_storage.clear(); + self.lru_hashes.clear(); + self.modifications.clear(); + } + } } pub type SharedCache = Arc>>; @@ -247,58 +306,12 @@ impl CacheChanges { let is_best = is_best(); trace!("Syncing cache, id = (#{:?}, {:?}), parent={:?}, best={}", commit_number, commit_hash, self.parent_hash, is_best); let cache = &mut *cache; - - // Purge changes from re-enacted and retracted blocks. - // Filter out commiting block if any. - let mut clear = false; - for block in enacted.iter().filter(|h| commit_hash.as_ref().map_or(true, |p| *h != p)) { - clear = clear || { - if let Some(ref mut m) = cache.modifications.iter_mut().find(|m| &m.hash == block) { - trace!("Reverting enacted block {:?}", block); - m.is_canon = true; - for a in &m.storage { - trace!("Reverting enacted key {:?}", a); - cache.lru_storage.remove(a); - } - for a in &m.child_storage { - trace!("Reverting enacted child key {:?}", a); - cache.lru_child_storage.remove(a); - } - false - } else { - true - } - }; - } - - for block in retracted { - clear = clear || { - if let Some(ref mut m) = cache.modifications.iter_mut().find(|m| &m.hash == block) { - trace!("Retracting block {:?}", block); - m.is_canon = false; - for a in &m.storage { - trace!("Retracted key {:?}", a); - cache.lru_storage.remove(a); - } - for a in &m.child_storage { - trace!("Retracted child key {:?}", a); - cache.lru_child_storage.remove(a); - } - false - } else { - true - } - }; - } - if clear { - // We don't know anything about the block; clear everything - trace!("Wiping cache"); - cache.lru_storage.clear(); - cache.lru_child_storage.clear(); - cache.lru_hashes.clear(); - cache.modifications.clear(); - } - + let enacted: Vec<_> = enacted + .iter() + .filter(|h| commit_hash.as_ref().map_or(true, |p| *h != p)) + .cloned() + .collect(); + cache.sync(&enacted, retracted); // Propagate cache only if committing on top of the latest canonical state // blocks are ordered by number and only one block with a given number is marked as canonical // (contributed to canonical state cache) diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 683b07dd70..444344c4fd 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -2690,4 +2690,89 @@ pub(crate) mod tests { let id = BlockId::::Number(72340207214430721); client.header(&id).expect_err("invalid block number overflows u32"); } + + #[test] + fn state_reverted_on_reorg() { + let _ = env_logger::try_init(); + let client = test_client::new(); + + let current_balance = || + client.runtime_api().balance_of( + &BlockId::number(client.current_height()), AccountKeyring::Alice.into() + ).unwrap(); + + // G -> A1 -> A2 + // \ + // -> B1 + let mut a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + a1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Bob.into(), + amount: 10, + nonce: 0, + }).unwrap(); + let a1 = a1.bake().unwrap(); + client.import(BlockOrigin::Own, a1.clone()).unwrap(); + + let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + b1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), + amount: 50, + nonce: 0, + }).unwrap(); + let b1 = b1.bake().unwrap(); + // Reorg to B1 + client.import_as_best(BlockOrigin::Own, b1.clone()).unwrap(); + + assert_eq!(950, current_balance()); + let mut a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + a2.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Charlie.into(), + amount: 10, + nonce: 1, + }).unwrap(); + // Re-org to A2 + client.import_as_best(BlockOrigin::Own, a2.bake().unwrap()).unwrap(); + assert_eq!(980, current_balance()); + } + + #[test] + fn state_reverted_on_set_head() { + let _ = env_logger::try_init(); + let client = test_client::new(); + + let current_balance = || + client.runtime_api().balance_of( + &BlockId::number(client.current_height()), AccountKeyring::Alice.into() + ).unwrap(); + + // G -> A1 + // \ + // -> B1 + let mut a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + a1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Bob.into(), + amount: 10, + nonce: 0, + }).unwrap(); + let a1 = a1.bake().unwrap(); + client.import(BlockOrigin::Own, a1.clone()).unwrap(); + + let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + b1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), + amount: 50, + nonce: 0, + }).unwrap(); + let b1 = b1.bake().unwrap(); + client.import(BlockOrigin::Own, b1.clone()).unwrap(); + assert_eq!(990, current_balance()); + // Set B1 as new best + client.set_head(BlockId::hash(b1.hash())).unwrap(); + assert_eq!(950, current_balance()); + } } diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 8986dda32d..4434fa4ef6 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -292,8 +292,11 @@ impl StateDbSync { } pub fn pin(&mut self, hash: &BlockHash) { - trace!(target: "state-db", "Pinned block: {:?}", hash); - *self.pinned.entry(hash.clone()).or_default() += 1; + let refs = self.pinned.entry(hash.clone()).or_default(); + if *refs == 0 { + trace!(target: "state-db", "Pinned block: {:?}", hash); + } + *refs += 1 } pub fn unpin(&mut self, hash: &BlockHash) { diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index e8fe0a1f8b..a256dd8be5 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -34,6 +34,10 @@ pub trait ClientExt: Sized { fn import(&self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; + /// Import a block and make it our best block if possible. + fn import_as_best(&self, origin: BlockOrigin, block: Block) + -> Result<(), ConsensusError>; + /// Import block with justification, finalizes block. fn import_justified( &self, @@ -78,6 +82,24 @@ impl ClientExt for Client BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) } + fn import_as_best(&self, origin: BlockOrigin, block: Block) + -> Result<(), ConsensusError> + { + let (header, extrinsics) = block.deconstruct(); + let import = BlockImportParams { + origin, + header, + justification: None, + post_digests: vec![], + body: Some(extrinsics), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::Custom(true), + }; + + BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) + } + fn import_justified( &self, origin: BlockOrigin, -- GitLab From 21dc1fd25300bbe30ecc72dfdf42c92cb152870c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Tue, 30 Jul 2019 22:08:20 +0100 Subject: [PATCH 065/151] babe: Disable unused median calculation (#3251) * babe: don't execute median algorithm * babe: checked sub in median calculation * node: bump impl_version to make ci happy * babe: remove forbid dead_code --- core/consensus/babe/src/lib.rs | 17 ++++++----------- node/runtime/src/lib.rs | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 4a4261b8dd..fae6fb3c32 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -19,7 +19,6 @@ //! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. #![forbid(unsafe_code, missing_docs, unused_must_use, unused_imports, unused_variables)] -#![cfg_attr(not(test), forbid(dead_code))] pub use babe_primitives::*; pub use consensus_common::SyncOracle; use consensus_common::ImportResult; @@ -581,6 +580,7 @@ impl BabeVerifier { } } +#[allow(dead_code)] fn median_algorithm( median_required_blocks: u64, slot_duration: u64, @@ -612,8 +612,12 @@ fn median_algorithm( .get(num_timestamps / 2) .expect("we have at least one timestamp, so this is a valid index; qed"); + let now = Instant::now(); + if now >= median { + time_source.0.replace(now - median); + } + time_source.1.clear(); - time_source.0.replace(Instant::now() - median); } else { time_source.1.push((Instant::now(), slot_now)) } @@ -706,15 +710,6 @@ impl Verifier for BabeVerifier where fork_choice: ForkChoiceStrategy::LongestChain, }; - // FIXME: this should eventually be moved to BabeBlockImport - median_algorithm( - self.config.0.median_required_blocks, - self.config.get(), - slot_number, - slot_now, - &mut *self.time_source.0.lock(), - ); - Ok((import_block, Default::default())) } CheckedHeader::Deferred(a, b) => { diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 6be19f02ae..af1812f34d 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 123, - impl_version: 124, + impl_version: 125, apis: RUNTIME_API_VERSIONS, }; -- GitLab From d013bd900face690506312771d22e46a7590e5a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Tue, 30 Jul 2019 22:44:02 +0100 Subject: [PATCH 066/151] node: update flaming fir chain spec (#3258) * node: update BABE authority ids in staging testnet config * node: update flaming fir chain spec --- node/cli/res/flaming-fir.json | 161 ++++++++++++++-------------------- node/cli/src/chain_spec.rs | 16 ++-- 2 files changed, 76 insertions(+), 101 deletions(-) diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json index 3ff5495c9b..f4865d3c73 100644 --- a/node/cli/res/flaming-fir.json +++ b/node/cli/res/flaming-fir.json @@ -22,108 +22,83 @@ "consensusEngine": null, "genesis": { "raw": { - "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", - "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", - "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", - "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", - "0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4405633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", - "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", - "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", - "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973a6e391e5d17627fa5aaa7a76b39ebee4b139bff595608fe41aea21aa7ea48053": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797372fff749dbf31067eff27b442ec22922d2b7817d7c6fbc6895d90847fd91504c": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b657973e54094c2d5af8ae10b91e1288f4f59f2946d7738f2c509b7effd909e5e9ba0ad": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a", + "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b6579737f325c981c2b001f5fe8c51cc7b89e50ebb1f60feb7ab3fa3bc79d6ab71d45cb": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993326e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", + "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", + "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797361be8e37f76f246c8d427bc3a669795df24fff7035dc10ba08f864f7d286c05e": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", + "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", + "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", "0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000", - "0xeecb67c20ca6cc8ba4d4434687f61309": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe969933201000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000003919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", + "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", + "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", + "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", + "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", + "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", + "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", + "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", + "0xb2029f8665aac509629f2d28cea790a3": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26633919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d655633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde787932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d129becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993326e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", + "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973887a8c8429d90d6cf7a8ba6b60877979bff529eab6930cb2fdea5edf5a79c7d5": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x579ab55d37b1220812be3c3df29d4858": "0x00000000", "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", - "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973559fe6ed570e93d5c6b0b335ecf466e5fbbbe8261673da66a68c9fcc835db06b": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", - "0x763c9e671e9c7ff51644a965ea0f2707": "0x0000000000000000", - "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", - "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", - "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", - "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", - "0x15b569617561081f097bbc5c5a059d2f7ccf6d23be534cffa33fb544946a6a92": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", - "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", - "0x3a636f6465": "0x0061736d01000000019f022760027f7f0060017f0060037f7f7f017f60027f7f017f60037f7f7f0060047f7f7f7f0060057f7f7f7f7f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60017e0060017f017f60000060017e017f60037f7e7e0060057f7e7f7f7e0060027f7e0060047f7f7e7e0060067f7f7e7e7e7f0060037f7f7e0060027e7e017e60087f7f7f7f7f7f7f7f0060047f7f7f7f017e60087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060057f7f7f7e7e0060057f7f7e7e7f0060037f7e7f0060037e7f7f017f60037f7e7f017f60017f017e60047f7e7e7e0060027f7f017e60087f7f7f7f7f7e7e7f0060057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f000286061d03656e760c6578745f74776f785f313238000403656e76146578745f6765745f73746f726167655f696e746f000703656e760e6578745f626c616b65325f323536000403656e76116578745f636c6561725f73746f72616765000003656e760f6578745f7365745f73746f72616765000503656e76166578745f73616e64626f785f6d656d6f72795f6e6577000303656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000103656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000103656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76156578745f7365745f6368696c645f73746f72616765000a03656e76176578745f636c6561725f6368696c645f73746f72616765000503656e76166578745f6b696c6c5f6368696c645f73746f72616765000003656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e760e6578745f7072696e745f75746638000003656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e76166578745f6368696c645f73746f726167655f726f6f74000203656e76196578745f6765745f616c6c6f63617465645f73746f72616765000203656e76106578745f73746f726167655f726f6f74000103656e76186578745f73746f726167655f6368616e6765735f726f6f74000203656e760d6578745f7072696e745f686578000003656e76106578745f636c6561725f707265666978000003656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000503656e760d6578745f7072696e745f6e756d000c03656e760a6578745f6d616c6c6f63000d03656e76086578745f667265650001038104ff030e0e0f0000000101000d020004001004110f0000000600000112000000010101000000000000000000000000000000000000010000000000000e0400000b1300000000030014150000000000010100000000010000000000000004000013011604130001040004000101000006000300000500000e04000101030803020404040404010003000000040000000000000d000400000003020301051705050505050505050505050505050505050505050505051800040e04010406040003040013000110010419040e060e1a0404030400000100010100000000000000000001000110010013131b131c03000c000000010000000000001300000012000404060000000000000000000000000000000003030406041d00000001010100000000000000000000000004050001030503031e0c0415011f04000101002001040003030001010e010000010e010101001e02000c01210101010101010101010101010404000e01010101010101002222010004050c00222200040000002222220022222222220422222222040101010000000300010101000101010000000d01010123010003000503030400000003000d04000404060506040404040405030303040504020303030204030404000004040303030301030300040001000d01020d0e0302030301200b0503030d0303050102010303010203030202020224242525260407017001ab01ab0105030100120619037f01418080c0000b7f0041adb1c5000b7f0041adb1c5000b07a30414066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00880312436f72655f657865637574655f626c6f636b00890315436f72655f696e697469616c697a655f626c6f636b009003114d657461646174615f6d657461646174610091031c426c6f636b4275696c6465725f6170706c795f65787472696e7369630097031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00980320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963730099031c426c6f636b4275696c6465725f636865636b5f696e686572656e7473009b0318426c6f636b4275696c6465725f72616e646f6d5f73656564009c032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e009d03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572009e03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765009f03204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500a1031e4772616e6470614170695f6772616e6470615f617574686f72697469657300a20315417572614170695f736c6f745f6475726174696f6e00a30313417572614170695f617574686f72697469657300a40309cb02010041010baa0160bf03db02dc029601cb02a101b801b901ba01bb01bc01bd01be01bf01c001c101c201c301c401c501c601c701c801c901ca01cb01cc01cd01ce01cf01ca02c802ac03c203c303ac02b2019801e103d803d903da03e403df038804fc03840485048004b802f20140b1033e3d7473727170f90180018201788101fa01f801f701f601f501f401f301bf02be02bd02bc02bb02ba02b902e302e202e902df02e102de02f1028003e702e802e602b303b403b203f202fd01ff01fb01f302ba03bb03b903f4026a6f69f5023b3c3af602f001f101ee01f702af03b003ae03f8029501810382038303f902a703a803a603fa02b602b702b502fb02840385038603f0028703a903d601d701da01d901d501db01bd03e501e901eb01ea01e801ec018f04f003e003f103eb03ee03ed03ec03fd03fe03ff0381048c048b048d048e049004910492040acdca39ff030500101e000b0a0041f481c500104f000be11204077f037e037f117e230041c0026b2201240041082102200141b8016a41086a22034200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2003290300370300200120012903b8013703980141002104024002400240024002400240024020014198016a411041a886c500410041001001417f460d002001421037022c200120014198016a360228200141b8016a200141286a102020012802b8012202450d0220012802bc0121054198012103200141c0016a28020022044198016c2206450d010c030b41002105419801210341004198016c22060d020b200141003602302001200236022c200120023602282001200141b8026a36023420040d020c030b41d4aac10041331021000b200220066a2106200141b8016a20022802701022200220036a21030240024020012802c8012207450d00200141186a20012903b801200141b8016a41086a290300200141d0016a3502004200109804200141186a41086a29030021082001290318210920012802cc01450d01200710230c010b42002109420021080b200141013602302001200636022c200120033602282001200141b8026a36023402402002450d002002ad422086210a024020032006460d0020044198016c41e87e6a2106200141c8016a210b200141d0016a210c200141cc016a210d4201210e0340200141b8016a200341f0006a280200102202400240200b2802002207450d00200141086a20012903b801200141b8016a41086a290300200c3502004200109804200141086a41086a290300210f20012903082110200d280200450d01200710230c010b420021104200210f0b024020092010562008200f562008200f511b0d002003ad422086200e84210a20102109200f21080b20034198016a2103200e42017c210e200641e87e6a22060d000b0b200a4280808080105a0d030b2004450d010b20044198016c21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b200141c0026a240041a489c0000f0b024002400240024002402004200aa722034d0d0020022004417f6a22074198016c6a220641e0006a2903002110200641e8006a2903002109200641f0006a290300210a200641f8006a2903002111200641c0006a2903002112200641c8006a2903002113200641d0006a2903002114200641d8006a2903002115200641206a2903002116200641286a2903002117200641306a2903002118200641386a29030021192006290300211a2006290308211b2006290310211c200220034198016c6a220341186a220b290300211d20064190016a290300210f20064188016a290300210820064180016a290300210e200b200641186a2903003703002003290310211e2003201c3703102003290308211c2003201b3703082003290300211b2003201a370300200341386a2206290200211a20062019370200200341306a2206290200211920062018370200200341286a2206290200211820062017370200200341206a2206290200211720062016370200200341d8006a2206290200211620062015370200200341d0006a2206290200211520062014370200200341c8006a2206290200211420062013370200200341c0006a2206290200211320062012370200200341f8006a2011370200200341f0006a2206280200210b2006200a370200200341e8006a2206290200210a20062009370200200341e0006a220629020021092006201037020020034180016a200e37020020034188016a2008370200200141b8016a41086a2206200837030020034190016a200f370200200141b8016a41106a200f3703002001200e3703b801200141286a41e8006a200a370300200141286a41e0006a2009370300200141286a41d8006a2016370300200141286a41d0006a2015370300200141286a41c8006a2014370300200141286a41c0006a2013370300200141286a41386a201a370300200141286a41306a2019370300200141286a41286a2018370300200141286a41206a2017370300200141286a41186a201d3703002001201e3703382001201c3703302001201b370328200120073602b002200120053602ac02200120023602a80220064200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2006290300370300200120012903b80137039801200141103602bc01200120014198016a3602b801200141a8026a200141b8016a102502402007450d0020044198016c41e87e6a21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b411310262203450d01410021072003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d022003200b360013200141b8016a41186a22064200370300200141b8016a41106a22024200370300200141b8016a41086a220c4200370300200142003703b80120034117200141b8016a100220014198016a41186a200629030037030020014198016a41106a200229030037030020014198016a41086a200c290300370300200120012903b8013703980102400240024020014198016a412041a886c500410041001001417f460d00200120014198016a3602a802200141203602ac02200142003703c001200142003703b8012001410020014198016a4120200141b8016a41104100100122062006417f461b2206411020064110491b3602b0022006410f4d0d02200141c0016a290300210f20012903b8012108200141b8016a200141a8026a102820012802b8012207450d0220012902bc01210e20014198016a41201003200e422088a72102200ea7210c200310232007450d010c060b2003102341000d050b200141286a10240c050b41d4aac10041331021000b419489c000200320041029000b41134101102a000b41264101102a000b024020024105742206450d0020072103034020032008200f102b200341206a2103200641606a22060d000b0b200141e0016a200f370300200141d8016a2008370300200141d0016a2002360200200141cc016a200c360200200141c8016a2007360200200141c4016a200b360200200141c0016a41013a0000200141053a00b80141a886c5004100200141b8016a102c200141b8016a200141286a41f0001094041a20014198016a20004280e20e7c200141b8016a41004280e90f102d2001280298014101470d00200128029c012103200141c0026a240020030f0b200141c0026a240041000bb40803027f017e107f230041b0046b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad4298017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241b0046a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241b0026a4104722107200141086a210820024190046a41186a210920024190046a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f20082802002110200241003602a003200841002001280200200f200241a0036a410420101001220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d0020022802a0032111200241a0036a2001102f20022802a003410e460d00200241b0026a200241a0036a41f0001094041a20094200370300200a420037030020024190046a41086a221042003703002002420037039004200841002001280200200e28020020024190046a412020082802001001220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d00200241a0016a41186a2009290300370300200241a0016a41106a200a290300370300200241a0016a41086a201029030037030020022002290390043703a00120022802b0022110200241c4016a200741ec001094041a201121120c020b200241b0026a10240b410e21100b200241a0036a200241c4016a41ec001094041a200241b0026a41186a220e200241a0016a41186a290300370300200241b0026a41106a2211200241a0016a41106a290300370300200241b0026a41086a2213200241a0016a41086a290300370300200220022903a0013703b0022010410e460d02200541016a210f200241346a200241a0036a41ec001094041a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903b00237031002402005200d470d00200b200f200f200b491b220dad4298017e2204422088a70d042004a722134100480d0402402005450d002006200c2013102722060d010c060b201310262206450d050b2006200c6a22052010360200200541046a200241346a41ec001094041a200541f0006a20123602002005418c016a201429030037020020054184016a200e290300370200200541fc006a2011290300370200200541f4006a2002290310370200200b41026a210b200c4198016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241b0046a24000f0b2000410036020002402005450d002006210503402005102420054198016a2105200c41e87e6a220c0d000b0b0240200d450d00200610230b200241b0046a24000f0b101e000b20134108102a000b5e01017f230041306b220224002002200136020c20022000360208200241246a41013602002002410136022c20024201370214200241ccb0c5003602102002200241086a3602282002200241286a360220200241106a41d4b0c5001061000bad0302047f037e230041d0006b2202240002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d00200220023602202002412036022420024200370338200242003703302002410020024120200241306a41104100100122012001417f461b2201411020014110491b3602282001410f4d0d02200241386a290300210620022903302107200241306a200241206a102820022802302201450d0220022902342108200020063703082000200737030020002008370214200020013602100c010b200041003602100b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41264101102a000b0700200010f8030bee0601027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410c4b0d0020010e0d01151515020304050615071508010b20002802044101470d14200041086a22002802001024200028020010230f0b200041086a280200220141044b0d0c024020010e051400140e0f140b200041106a280200450d132000410c6a28020010230f0b200041086a280200450d12200028020410230f0b200041086a2d00002201410c4b0d1020014106470d11200041106a280200450d112000410c6a28020010230f0b200041086a2d0000417f6a220141074b0d10024020010e080011111107110809000b2000410c6a22002802001024200028020010230f0b200041086a28020022014102460d0320014101470d0f200041106a280200450d0f2000410c6a28020010230f0b20002d000422014102460d0320014101470d0e200041086a22002802001024200028020010230f0b200041086a280200450d0d200028020410230f0b200041086a2d0000220141054b0d08024020010e060d0d000a0b0d0d0b200041106a280200450d0c2000410c6a28020010230f0b200041106a280200450d0b2000410c6a28020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010230b2001410c6a2101200241746a22020d000b0b200041106a280200450d062000410c6a28020010230f0b200041106a280200450d052000410c6a28020010230f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200241686a22020d000b0b200041106a280200450d042000410c6a28020010230f0b200041d0006a280200450d03200041cc006a28020010230f0b200041346a280200450d02200041306a28020010230f0b200041306a280200450d012000412c6a28020010230f0b200041106a280200450d002000410c6a28020010230f0b0bc80401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d0020004198016c2104200241086a22052802002100200228020421060340200341f0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c070b200228020021060c020b200010262206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200320021039024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000102722080d020c080b200228020021080c020b200010262208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341fc006a290000370000200741106a20034184016a290000370000200741186a2003418c016a2900003700002007200341f4006a29000037000020034198016a2103200441e87e6a22040d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20004101102a000b20004101102a000b200810230b200241106a24000b0700200010f7030b0b0020002001200210f9030bdc0403027f017e0d7f230041d0006b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b101d000b20054101102a000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e102722060d010c060b200e10262206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d00200610230b200241d0006a24000f0b101e000b200e4101102a000b6c01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c2003419886c500360208200320033602282003200341046a3602202003200341206a360218200341086a20001061000b0e0041b080c500412210f60300000bdb0604027f017e037f047e230041c0006b22032400024002400240411810262204450d00200441106a410029008db741370000200441086a4100290085b741370000200441002900fdb64137000020044118413810272204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044138200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a2903002109200329032021052004102341142106411410262204450d010c050b4200210920041023411421064114102622040d040b20064101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b641370000024020042006413410272204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a2900003700004200210a200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044134200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a290300210b2003290320210a0c010b4200210b0b200410232000200a200120052005200156200920025620092002511b22041b22017c220c200b2002200920041b22027c200c200a54ad7c10df012000200520017d200920027d2005200154ad7d10fe01200341c0006a24000f0b41d4aac10041331021000b41344101102a000bd52803087f047e047f230041a0036b22032400410021044101210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240418595c300411041a886c500410041001001417f460d002003410036029801418595c300411020034198016a41044100100141016a41044d0d0320032802980121064100210720010d010c020b410121072001450d010b200141057422044100480d13200410262205450d032001410574220841606a410576210941002104034020034198016a41186a200020046a220a41186a290000220b37030020034198016a41106a200a41106a290000220c37030020034198016a41086a200a41086a290000220d3703002003200a290000220e37039801200520046a220a41106a200c370000200a41086a200d370000200a41186a200b370000200a200e3700002008200441206a2204470d000b200941016a21040b20034184016a20063602002003200736028001200341106a200241f0001094041a20034190016a20043602002003418c016a20013602002003200536028801200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a2004290300370300200320032903b0023703e8024100210f0240200341e8026a411041a886c500410041001001417f460d002003410036029801200341e8026a411020034198016a41044100100141016a41044d0d02200328029801210f0b0240200f41016a220a200f4f0d00200341106a10d802200341a0036a24000f0b200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a22052004290300370300200320032903b0023703e8022003200a36029801200341e8026a411020034198016a4104100420034198016a200341106a4188011094041a20044200370300200342003703b00241b49dc300410d200341b0026a100020052004290300370300200320032903b0023703e802200341003602b002200341e8026a4110200341b0026a1014210a0240024002400240024002400240024020032802b0022204417f460d00200a450d00200320043602a802200320043602a4022003200a3602a0022004450d01200320043602b4022003200a3602b002200341086a200341b0026a104502402003280208450d004101210a200328020c220541016a220820054f0d030b410021040c140b200341003602a802200342013703a0020b200341003602b802200342013703b002200341013602e802200341e8026a200341b0026a10410240024002402003280288024101470d0020032802b402200341b8026a2802002204470d01200441016a220a2004490d1b20044101742205200a200a2005491b22054100480d1b2004450d0420032802b002200420051027220a450d050c120b20032802b402200341b8026a2802002204470d01200441016a220a2004490d1a20044101742205200a200a2005491b22054100480d1a2004450d0520032802b002200420051027220a450d060c0f0b20032802b002210a0c110b20032802b002210a0c0e0b0240200541c000490d004102210a200541808001490d00410441052005418080808004491b210a0b410121050240200841c000490d0041022105200841808001490d00410441052008418080808004491b21050b2005200a470d042003200341a0026a3602b0022008200341b0026a200a10d90220034198016a200341a0026a10da02200341a8026a280200210520032802a402210820032802a00222040d130c180b20051026220a0d0d0b20054101102a000b20051026220a0d090b20054101102a000b20042005200a6b6a2204417f4c0d0f024002402004450d002004102622020d0120044101102a000b410121020b200320043602880320032004360284032003200236028003200320034180036a3602b0022008200341b0026a200510d90220042005490d0320032802880322082004490d04200341a8026a2802002208200a490d05200328028003210220032802a00221062003200420056b22043602900320032008200a6b22083602940320042008470d06200220056a2006200a6a20041094041a20034198016a20034180036a10da0220034188036a28020021052003280284032108200328028003210420032802a402450d0d20032802a002102320040d0e0c130b41d4aac10041331021000b41d4aac10041331021000b20044101102a000b200520041048000b20042008108c01000b200a20081048000b200320034190036a36029803200320034194036a36029c03200341b0026a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341d0026a41146a4103360200200341a886c5003602c002200342013702b402200341a881c5003602b002200341043602ec02200342033702d402200341d480c5003602d0022003200341b0026a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602e002200341d0026a41e481c5001061000b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a2205200441016a360200200a20046a41003a00002003418c026a28020021080240024002400240024020032802b402220a200528020022046b41044f0d00200441046a22052004490d0e200a4101742204200520052004491b22044100480d0e200a450d0120032802b002200a20041027220a450d020c030b20032802b002210a0c030b20041026220a0d010b20044101102a000b200320043602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441046a360200200a20046a20083600000c020b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441016a360200200a20046a41013a00000b20034198016a200341b0026a10dd0220032802900221042003200328029802220a3602e802200341e8026a200341b0026a10410240200a450d00200a4105742106200341b0026a41086a2207280200210520032802b402210803400240024002400240200820056b41204f0d00200541206a220a2005490d0c20084101742205200a200a2005491b22054100480d0c2008450d0120032802b00220082005102722020d020c0b0b20032802b00221022005210a0c020b200510262202450d090b200320053602b402200320023602b0022007280200210a200521080b2007200a41206a22053602002002200a6a220a41086a200441086a290000370000200a41106a200441106a290000370000200a41186a200441186a290000370000200a2004290000370000200441206a2104200641606a22060d000b0b200341b8026a280200210520032802b402210820032802b002210420032802a402450d010b20032802a00210230b2004450d050b4200210c200341b0026a41086a220a4200370300200342003703b00241b49dc300410d200341b0026a1000200341e8026a41086a2202200a290300370300200320032903b0023703e802200341e8026a411020042005100402402008450d00200410230b20034198016a10d802200a4200370300200342003703b00241af98c300410d200341b0026a10002002200a290300370300200320032903b0023703e8020240200341e8026a411041a886c500410041001001417f460d002003420037039801200341e8026a411020034198016a41084100100141016a41084d0d02200329039801210c0b02402001450d0020014105742110200341d0026a41086a2111024003402011200f3602002003200c3703d0020240024002400240024002400240024002400240024002400240024002400240411210262204450d00200441106a41002f00e29d433b0000200441086a41002900da9d43370000200441002900d29d4337000020034198016a41186a2208420037030020034198016a41106a2202420037030020034198016a41086a220a420037030020034200370398012004411220034198016a1002200341b0026a41186a22062008290300370300200341b0026a41106a22072002290300370300200341b0026a41086a2201200a29030037030020032003290398013703b002412010262205450d01200520032903b002370000200541186a2006290300370000200541106a2007290300370000200541086a2001290300370000200410232008420037030020024200370300200a420037030020034200370398012000412020034198016a100220062008290300370300200720022903003703002001200a29030037030020032003290398013703b0022005412041c00010272204450d02200420032903b002370020200441386a2006290300370000200441306a2007290300370000200441286a20012903003700002003410036029801200441c00020034198016a101421050240024002400240024002400240024002400240024002400240024002400240024002402003280298012208417f460d00200341a0026a41086a22022008360200200320083602a402200320053602a0022008450d012003200836029c012003200536029801200320034198016a10452003280200450d02410021052003280204220a41016a2207200a490d0641012105410121060240200a41c000490d0041022106200a41808001490d0041044105200a418080808004491b21060b0240200741c000490d0041022105200741808001490d00410441052007418080808004491b21050b20052006470d082003200341a0026a36029801200720034198016a200610d90220032903d002210b20032802a40222052002280200220a6b41084f0d09200a41086a2208200a490d282005410174220a20082008200a491b220a4100480d282005450d0c20032802a0022005200a102722050d0d0c1c0b200341a0026a41086a4100360200200342013703a0020b200a41003602002003420137039801200341013602b002200341b0026a20034198016a104120032903d002210b0240200328029c012208200a28020022026b41084f0d00200241086a22052002490d2720084101742206200520052006491b22064100480d272008450d0220032802980120082006102722050d030c140b20032802980121050c030b4100210520032802a4020d040c1d0b200610262205450d110b2003200636029c012003200536029801200621080b200a200241086a2206360200200520026a200b370000201128020021070240024002400240200820066b41034b0d00200641046a22012006490d2620084101742209200120012009491b22094100480d262008450d01200520082009102722050d020c140b200821090c020b200910262205450d120b2003200936029c0120032005360298010b200a2002410c6a2212360200200520066a20073600000b20032802a402450d190b20032802a00210230c180b2008200520066b6a2208417f4c0d1c2008450d012008102622010d020c0e0b20032802a00221050c040b410121010b20034180036a41086a220a200836020020032008360284032003200136028003200320034180036a36029801200720034198016a200510d90220082005490d0c200a28020022072008490d0d200228020022022006490d0e200328028003210720032802a00221012003200820056b2208360290032003200220066b22023602940320082002470d0f200720056a200120066a20081094041a20032903d002210b02402003280284032208200a28020022056b41084f0d00200541086a22022005490d1d20084101742205200220022005491b22054100480d1d2008450d0420032802800320082005102722080d050c130b20032802800321080c050b200a10262205450d0f0b2003200a3602a402200320053602a0022002280200210a0b2002200a41086a3602002005200a6a200b37000020112802002108024002400240024020032802a40222052002280200220a6b41044f0d00200a41046a2206200a490d1d2005410174220a20062006200a491b220a4100480d1d2005450d0120032802a0022005200a102722050d020c120b20032802a00221050c020b200a10262205450d100b2003200a3602a402200320053602a0022002280200210a0b2002200a41046a3602002005200a6a20083600002002280200211220032802a402210920032802a00222050d120c140b200510262208450d0e0b20032005360284032003200836028003200a28020021050b200a200541086a360200200820056a200b3700002011280200210202400240024002402003280284032208200a28020022056b41044f0d00200541046a22062005490d1a20084101742205200620062005491b22054100480d1a2008450d0120032802800320082005102722080d020c110b20032802800321080c020b200510262208450d0f0b20032005360284032003200836028003200a28020021050b200a200541046a360200200820056a2002360000200a28020021122003280284032109200328028003210520032802a402450d0e20032802a002102320050d0f0c110b41124101102a000b41204101102a000b41c0004101102a000b20064101102a000b20094101102a000b20084101102a000b200520081048000b20082007108c01000b200620021048000b200320034190036a36029803200320034194036a36029c0320034198016a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341b0026a41146a4103360200200341a886c5003602a8012003420137029c01200341a881c50036029801200341043602ec02200342033702b402200341d480c5003602b002200320034198016a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602c002200341b0026a41e481c5001061000b200a4101102a000b200a4101102a000b20054101102a000b20054101102a000b2005450d020b200441c00020052012100402402009450d00200510230b200041206a210020041023201041606a22100d000c020b0b200410230b200341a0036a24000f0b101d000b41d4aac10041331021000b20054101102a000b101e000b20034198016a10d802200341a0036a24000b8d0c03037f017e037f230041b0026b2205240020054188016a41086a22064200370300200542003703880141a387c000411920054188016a1000200541086a20062903003703002005200529038801370300410021060240024002400240024002400240024002400240024002400240024002402005411041a886c500410041001001417f460d0020054100360288012005411020054188016a41044100100141016a41044d0d0120052802880121060b024002402006417f6a220720064d0d002005410e3602080c010b2005200710382005280208410e460d0020054188016a20054188011094041a200529038801210820054188016a41086a102420082001580d00200041b588c00036020420004101360200200041086a41c70036020020021024200541b0026a24000f0b20054188016a41086a22074200370300200542003703880141a387c000411920054188016a1000200541086a200729030037030020052005290388013703002005200641016a360288012005411020054188016a4104100420052001370388012007200241f0001094042109200520033a0088022005200437038002411a10262207450d01200741186a41002f00dc86403b0000200741106a41002900d48640370000200741086a41002900cc8640370000200741002900c486403700002007411a413410272202450d022002200636001a200541186a220a4200370300200541106a220b4200370300200541086a22074200370300200542003703002002411e2005100220054190026a41186a200a29030037030020054190026a41106a200b29030037030020054190026a41086a200729030037030020052005290300370390022005410036020820054201370300200529038801210141081026220a450d032005410836020420072007280200220b41086a3602002005200a360200200a200b6a20013700002009200510390240024002400240024002400240024002400240024020054188026a2d000022074101460d0020074102470d012005280204200541086a2802002207470d03200741016a220a2007490d162007410174220b200a200a200b491b220b4100480d162007450d0720052802002007200b1027220a450d080c130b2005280204200541086a2802002207470d01200741016a220a2007490d152007410174220b200a200a200b491b220b4100480d152007450d0420052802002007200b1027220a450d050c100b2005280204200541086a2802002207470d02200741016a220a2007490d142007410174220b200a200a200b491b220b4100480d142007450d0720052802002007200b1027220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b1026220a0d0b0b200b4101102a000b200b1026220a0d0b0b200b4101102a000b200b1026220a0d050b200b4101102a000b41d4aac10041331021000b411a4101102a000b41344101102a000b41084101102a000b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41003a00000c040b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41013a00000c020b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41023a00000b20054180026a29030021010240024002402005280204220a200541086a28020022076b41084f0d00200741086a220b2007490d03200a4101742207200b200b2007491b22074100480d03200a450d012005280200200a20071027220a450d020c040b2005280200210a0c040b20071026220a0d020b20074101102a000b101e000b200520073602042005200a360200200541086a28020021070b200541086a220b200741086a360200200a20076a20013700002005280204210720054190026a41202005280200220a200b280200100402402007450d00200a10230b200210232009102420054194016a200636020020054191016a20033a000020054188016a41086a41033a0000200541053a00880141a886c500410020054188016a102c2000410036020020002006360204200541b0026a24000bf10401047f230041c0046b22012400200141d0036a41086a22024200370300200142003703d003418388c0004116200141d0036a1000200141d8016a41086a2002290300370300200120012903d0033703d8010240024002400240200141d8016a411041a886c500410041001001417f460d00200142103702ec012001200141d8016a3602e801200141d0036a200141e8016a102f20012802d003410e460d03200141e0026a200141d0036a41f0001094041a200141003a00f40120012802e80120012802ec01200141f4016a4101200141f0016a22022802001001210320022002280200200341016a41014b22036a3602002003450d0220012d00f401220341034f0d0220012802e0022102200141f4016a200141e0026a41047241ec001094041a2002410e460d03200141d0036a200141f4016a41ec001094041a200141d8016a411010030c010b410e21020b200141ec006a200141d0036a41ec001094041a02402002410e470d00200141c0046a2400419988c0000f0b2001200141ec006a41ec00109404220141013a00e002200141d0036a41086a22044200370300200142003703d00341f186c000411f200141d0036a1000200141d8016a41086a2004290300370300200120012903d0033703d801200141d8016a4110200141e0026a41011004200441023a0000200141053a00d0034100210441a886c5004100200141d0036a102c200120023602d003200141d0036a410472200141ec001094041a200141e0026a20004280e20e7c200141d0036a20034280e90f102d024020012802e0024101470d0020012802e40221040b200141c0046a240020040f0b200141e0026a10240b41d4aac10041331021000b965605047f057e0a7f027e047f230041b0086b22022400200241003a00d00620012802002001280204200241d0066a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00d0062203410d4b0d0e024020030e0e00090607030a0c080e050d02040b000b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d6120022d00bc05220341044b0d61024020030e050029252624000b20022001104a2002280200450d6120022802042203417f4c0d622003450d4d200310ac012205450d6c200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d4e0c760b2000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d2020022d00bc05220341044b0d20024020030e05001f1d1e1c000b200241b0036a2001104c20022903b003a7450d20200241c0036a290300210620022903b8032107200241d0066a200110c20220022d00d00622034102460d20200241ec066a2902002108200241e4066a290200210920022f00d106210120022d00d306210420022902d406210a2002200241dc066a2902003703e8052002200a3703e005200220093703f00520012004411074722101410121040c1f0b41002103200241003a00bc052001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d5120022d00bc050d51200241e8066a220c4200370300200241e0066a4200370300200241d0066a41086a220d4200370300200242003703d006200141086a220341002001280200200141046a220e280200200241d0066a4120200b100122042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d50200241e0056a41086a200d290300370300200220022903d0063703e005200c290300210620022903e0062107200220022f00e1053b01bc0520022d00e005210420022800e305210b20022800e705211020022800eb05211120022d00ef052105200220022f01bc053b01f804200c4200370300200d4200370300200242003703e006200242003703d006200341002001280200200e280200200241d0066a4120200f1001220c200c417f461b220c4120200c4120491b20032802006a360200200c411f4d0d50200241e0056a41086a200241d0066a41086a290300370300200220022903d0063703e005200241e8066a2903002108200241e0066a2903002109200220022f00e10522033b01bc05200241eb056a280000210c200241ef056a2d0000210d20022d00e005210e20022800e305210f20022800e7052112200220033b019805200220033b01de05200220022f01f8043b01b00420024180016a2001104a200228028001450d502002280284012213417f4c0d5f2013450d4e201310ac012203450d6b200141086a2214201341002001280200200141046a280200200320132014280200100122012001417f461b2201200120134b1b220120142802006a36020020012013470d4f0c710b200241c0076a200110c00220022d00c0072101200241d0066a200241c0076a41017241e7001094041a20014107470d0b2000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6e20022d00d006450d0c0c6e0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22012001280200200341016a41014b6a3602002000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0f20022d00bc0522034101460d0d20030d0f200241c0076a200110c20220022d00c00722034102460d0f20022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241386a2001104c2002280238450d0f20112010411074722101200241386a41106a2903002109410121102002290340210a0c0e0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d3320022d00bc05220341094b0d33024020030e0a00272425222a2b262d23000b200241d0066a200110a60220022802d0062203450d3320022902d406210620024188026a2001104a2006a72104200228028802450d32200228028c022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d3220064220882106200441087621012003410876210c20022802d006210d4101210e0c270b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6920022d00d006450d090c690b200241003a00bc054104210b2001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22103602002003450d5220022d00bc05220d410c4b0d520240200d0e0d00383a51343c3d3b3e363f3335000b200241d0066a200110c20220022d00d00622044102460d5220022d00d306211020022f00d106210c200241dc066a2902002106200241ec066a2902002107200241e8066a2802002111200241e4066a280200210320022902d406210820024188016a2001104c200229038801a7450d5220024188016a41106a290300210a2002290390012109200241003a00bc052001280200200141046a280200200241bc056a4101200141086a22012802001001210b20012001280200200b41016a41014b220b6a360200200b450d5220022d00bc05220541034f0d52200c201041107472210c4101210b0c500b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0d20022d00d00622034101460d0c20030d0d200241c0076a2001102f20022802c0072103200241d0066a200241c0076a41047241ec001094041a2003410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262201450d5d20012003360200200141046a200241e0056a41ec001094041a20024198056a41186a200241bc056a41186a29020037030020024198056a41106a200241bc056a41106a29020037030020024198056a41086a200241bc056a41086a290200370300200220022902bc053703980520014108762104410121030c1c0b200241d0066a20011049200220022f01d2063b01e0052002200241f2066a2f01003b01bc0520022d00d00622014111470d042000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6420022d00d006450d060c640b200241003a00bc05410421032001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d0d20022d00bc0522044102460d0c20044101460d0b20040d0d200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262204450d5c20042001360200200441046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01bc053b01ae04410121030c0e0b2000410e360200200241b0086a24000f0b200241e0056a200241d0066a41e7001094041a200041086a20013a00002000410c360200200041096a200241e0056a41e7001094041a200241b0086a24000f0b200241d0066a41196a2900002106200241d0066a41116a2900002107200241d0066a41216a2d00002103200241d0066a41106a2d00002104200241d0066a410c6a280200210b200241d0066a41086a280200211020022802d406211120022d00d1062105200220022f01e0053b01b004200220022f01bc053b019805200241f4066a280200210c200041216a2006370000200041196a2007370000200020053a0009200041086a20013a000020004106360200200020033a0029200041186a20043a0000200041146a200b360200200041106a20103602002000410c6a20113602002000412c6a200c360200200020022f01b0043b000a200020022f0198053b012a200041306a20022903c007370300200041386a200241c0076a41086a290300370300200041c0006a200241c0076a41106a290300370300200041c8006a200241c0076a41186a290300370300200041d0006a200241e0076a290300370300200041d8006a200241e8076a290300370300200041e0006a200241c0076a41306a290300370300200041e8006a200241c0076a41386a290300370300200241b0086a24000f0b20024198036a2001104b200229039803a7450d6120022903a003210620004109360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241286a2001104b2002290328a7450d5f2002290330210620004101360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241a8036a2001104a20022802a803450d5d20022802ac032203417f4c0d4e2003450d24200310ac012204450d55200141086a220b200341002001280200200141046a28020020042003200b280200100122012001417f461b2201200120034b1b2201200b2802006a36020020012003470d250c5c0b200241c0076a200110c20220022d00c00722034102460d0120022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241e8006a2001104c2002290368a7450d01200241e8006a41106a29030021092002290370210a200241d0006a2001104c2002290350a7450d0120112010411074722101200241e0006a290300211520022903582116410221100b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2015370200200041c0006a2016370200200041386a2009370200200041306a200a370200200041186a2006370000200041106a2008370000200041286a2007370000200041246a2004360000200041206a200b3600002000410c6a20033a0000200041086a2010360200200041d0006a20022903d006370300200041d8006a200241d0066a41086a290300370300200041e0006a200241d0066a41106a290300370300200041e8006a200241d0066a41186a290300370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b200241c0076a200110c202200241d0066a41086a220b200241cc076a290200370300200241d0066a41106a2210200241d4076a290200370300200241d0066a41186a2211200241dc076a290200370300200220022902c4073703d0064102210320022d00c00722014102470d0e0b2000410e360200200241b0086a24000f0b20024188036a2001104a200228028803450d01200228028c032104200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d01200241e0056a200241d0066a41ec001094041a41f0001026220b450d51200b2001360200200b41046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01ce053b01ae04410221030c020b200241e8066a22114200370300200241e0066a4200370300200241d0066a41086a4200370300200242003703d00641042103200141086a221041002001280200200141046a280200200241d0066a4120200b100122042004417f461b2204412020044120491b20102802006a3602002004411f4d0d00200220022f00d1063b01bc052011290300210720022903e006210620022d00d006210520022800d306210420022800d706210b20022800db06211020022d00df062111200220022f01bc053b01980520024190036a2001104a200228029003450d00200228029403210c200241003a00c007410421032001280200200141046a280200200241c0076a4101200141086a22012802001001210d20012001280200200d41016a41014b220d6a360200200d450d0020022d00c0072101200220022f01980522033b01f804200220033b01de05410321030c010b0b200220022f01de053b01e005200220022f01ae043b01bc05024020034104470d002000410e360200200241b0086a24000f0b200220022f01e0053b01ac04200220022f01bc053b01aa042000411d6a2007370000200041156a2006370000200020053a0005200020033a000420004108360200200020013a0025200041146a20113a0000200041106a20103602002000410c6a200b360200200041086a2004360200200041286a200c360200200020022f01ac043b0006200020022f01aa043b01262000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200241a0046a2001104a20022802a004450d0420022802a4042203410876210141052104420021080c030b20024190046a2001104a200228029004450d032002280294042103200241f8036a2001104c20022903f803a7450d0320024188046a29030021062002290380042107200241e8036a2001104b20022903e803a7450d0320022903f0032108200241e0036a2001104a20022802e003450d0320022802e4032101200241f0056a2006370300200220073703e805200220013602e00520034108762101410321040c020b20024198046a2001104a200228029804450d02200228029c042203410876210141042104420021080c010b200241c8036a2001104c20022903c803a7450d01200241d8036a2903002106200220022903d0033703e005200220063703e805410221040b200241d0066a41106a200241e0056a41106a2903002209370300200241d0066a41086a200241e0056a41086a290300220a370300200241b0046a41086a220b200a370300200241b0046a41106a22102009370300200220022903e00522093703b004200220093703d006200041386a2006370200200041306a20073702002000410c6a2001410874200341ff017172360200200041086a20043602002000410b360200200041286a2008370200200041106a20022903b004370200200041186a200b290300370200200041206a2010290300370200200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b200241d0066a41106a200241e0056a41106a290300370300200241d0066a41086a200241e0056a41086a290300370300200220022903e0053703d0062000410e360200200241b0086a24000f0b200241d0066a200110a80220022802d0062205450d3d20022902d4062106410521010c530b200241086a2001104a2002280208450d3c200228020c2203417f4c0d3d2003450d26200310ac012205450d48200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d270c4a0b200241206a2001104a2002280220450d3b20022802242214ad42187e2206422088a70d3c2006a72203417f4c0d3c2003450d292003102622050d2a20034104102a000b20022f00c10720022d00c30741107472210420024198056a41186a201129030037030020024198056a41106a201029030037030020024198056a41086a200b290300370300200220022903d006370398050b200241f8046a41186a220b20024198056a41186a290300370300200241f8046a41106a221020024198056a41106a290300370300200241f8046a41086a221120024198056a41086a29030037030020022002290398053703f804200041086a2004410874200141ff017172360200200020033602042000410d3602002000410c6a20022903f804370200200041146a20112903003702002000411c6a2010290300370200200041246a200b2903003702002000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200242003703d006200141086a220341002001280200200141046a280200200241d0066a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d3820022903d0062106410221010c4e0b200241b8026a2001104a20022802b802450d1120022802bc022203410876210c4105210e0c090b200241f8026a2001104b20022903f802a7450d10200229038003220742208821062007a722044108762101410a210e0c0a0b200241a8026a2001104a20022802a802450d0f20022802ac022103200241d0066a200110c20220022d00d00622044102460d0f20022d00d306211020022f00d1062111200241dc066a2902002109200241ec066a2902002107200241e8066a280200210c200241e4066a280200210b20022902d4062106200241a0026a2001104a20022802a002450d0f20022802a402210520024198026a2001104a200228029802450d0f20112010411074722101200228029c02210d2002200c3602e0052003410876210c2006422088a72110200220073702e4052007422088a7210f2009422088a7211120022903e0052107200dad21082009a7210d420021094103210e0c0b0b200241b0026a2001104a20022802b002450d0e20022802b4022203410876210c4104210e0c060b200241d0066a200110c20220022d00d00622034102460d0d20022902d406220742208821064108210e2007a72204410876210120022f00d10620022d00d30641107472210c200241dc066a2902002208422088a7210d200241e4066a2802002111200241e8066a280200210b200241ec066a29020021072008a721100c020b200241d0066a200110a60220022802d0062203450d0c20022902d406210620024190026a2001104a2006a72104200228029002450d0b2002280294022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d0b20064220882106200441087621012003410876210c20022802d006210d4102210e0b0b0c060b200241d0066a200110c20220022d00d00622034102460d0920022d00d306210420022f00d1062110200241dc066a290200210a200241ec066a2902002107200241e8066a280200210b200241e4066a280200211120022902d4062116200241c8026a2001104c20022903c802a7450d09200241c8026a41106a290300210920022903d0022108200241c0026a2001104a20022802c002450d092010200441107472210c20022802c402210f201642208821062016a722044108762101200a422088a7210d200aa721104106210e0c050b200241e0026a2001104a20022802e002450d0820022802e4022203410876210c4107210e0b42002106410021010c020b200241e8026a2001104b20022903e802a7450d0620022903f002220742208821062007a7220441087621014109210e0b0b0b20004107360200200041c0006a2009370200200041386a2008370200200041346a2005360200200041306a200f360200200041286a2007370200200041246a200b360200200041206a20113602002000411c6a200d360200200041186a2010360200200041086a200e360200200041c8006a20022903c0073703002000410c6a200c410874200341ff017172360200200041d0006a200241c0076a41086a290300370300200041d8006a200241c0076a41106a290300370300200041e0006a200241c0076a41186a290300370300200041e8006a200241c0076a41206a290300370300200041106a20064220862001ad42ffffff07834208862004ad42ff01838484370200200241b0086a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d370b2003450d37200410230c370b2004450d00200310230b2000410e360200200241b0086a24000f0b20024180026a2001104a200228028002450d1f2002280284022104200220022f0198053b01b0042004410876210c410c210b0c030b200241e8016a2001104a20022802e801450d1e20022802ec012103200241d0016a2001104c20022903d001a7450d1e200241e0016a290300210620022903d8012108200220022f01d0063b01b0044105210b4100210c0c040b200241d0066a2001102820022802d0062204450d1d20022902d4062108200220022f0198053b01b0042004410876210c410d210b0c180b200241f8016a2001104a20022802f801450d1c20022802fc012104200220022f01d0063b01b0042004410876210c410a210b0b420021060c090b200241a0016a2001104c20022903a001a7450d1a200241b0016a290300210620022903a8012108200220022f01d0063b01b00420022802e005210320022802e405211120022903e80521074102210b4100210c0b0c160b200241b8016a2001104c20022903b801a7450d18200241c8016a290300210620022903c0012108200220022f01e0053b01b004200241e8066a290300210a20022903e006210920022802d006210320022802d406211120022903d80621074103210b4100210c0c150b200241003a00bc052001280200200141046a280200200241bc056a4101201010012103200141086a22012001280200200341016a41014b22016a3602002001450d1720022d00bc05220541034f0d17200220022f01d0063b01b0044108210b420021064100210c0c150b200241f0016a2001104a20022802f001450d1620022802f4012213ad42247e2206422088a70d1c2006a72203417f4c0d1c2003450d0f2003102622040d1020034104102a000b4107210b0c020b200241d0066a200110c20220022d00d00622044102460d14200241dc066a290200210620022902d4062108200241e4066a2802002103200241e8066a2802002111200241ec066a290200210720022f00d106210120022d00d306210b200220022f01e0053b01b0042001200b41107472210c4109210b0c110b410b210b0b0b0c0d0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d230b20030d130c140b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d280b20030d110c120b410421050b024002402014450d0042002106200141086a2111200141046a21124100210d4100210341002110201421130340200241186a2001104a2002280218450d11200228021c220b417f4c0d1402400240200b450d00200b10ac01220e450d1b2011200b410020012802002012280200200e200b2011280200100122042004417f461b22042004200b4b1b220420112802006a3602002004200b460d010c120b4101210e2001280200201228020041014100201128020010011a4100200b470d110b200241106a2001104a2002280210450d1020022802142204417f4c0d14024002402004450d00200410ac01220f450d1a20112004410020012802002012280200200f200420112802001001220c200c417f461b220c200c20044b1b220c20112802006a360200200c2004460d010c110b4101210f2001280200201228020041014100201128020010011a41002004470d100b201041016a210c024020102013470d00200d200c200c200d491b2213ad42187e2207422088a70d162007a722174100480d1602402010450d00200520032017102722050d010c180b201710262205450d170b200520036a2210200e360200201041146a2004360200201041106a20043602002010410c6a200f360200201041046a200bad220742208620078437020020064280808080107c2106200d41026a210d200341186a2103200c2110200c2014490d000c020b0b41002113420021060b2005450d1020062013ad842106410421010c260b410121032001280200200141046a28020041014100200141086a28020010011a41002013460d220b2013450d00200310230b410021030b0c200b410421040b024002402013450d0042002106200241d0066a410c6a2114200241d0066a411c6a2117200241d0066a41186a2118200241d0066a41146a2119410021114100211041002103201321120340200241d0066a200110c20220022d00d00622054102460d07200341016a210b20022d00d306210c20022f00d106210d20142902002107201729020021082018280200210e2019280200210f20022902d4062109024020032012470d002011200b200b2011491b2212ad42247e220a422088a70d10200aa7221a4100480d1002402003450d0020042010201a102722040d010c130b201a10262204450d120b200420106a220320053a0000200341036a200d200c4110747222054110763a0000200341016a20053b00002003410c6a2007370000200341046a20093700002003411c6a2008370000200341186a200e360000200341146a200f36000020064280808080107c2106201141026a2111201041246a2110200b2103200b2013490d000c020b0b41002112420021060b2004450d0520062012ad842108200220022f01e0053b01b0042004410876210c4106210b0b0b0b0b200220022f01b00422013b01d006200220013b01f804200041386a200a370000200041306a2009370000200041186a2006370000200041106a2008370000200020053a0009200041086a200b3a000020004105360200200041286a2007370000200041246a2011360000200041206a20033600002000410c6a200c410874200441ff017172360000200020022f01f8043b000a200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b2012450d00200410230b200220022f01b0043b01d0062000410e360200200241b0086a24000f0b2004450d00200f10230b200b450d00200e10230b02402010450d002005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200341686a22030d000b0b2013450d010b200510230b2000410e360200200241b0086a24000f0b101d000b101e000b20174104102a000b201a4104102a000b20044101102a000b200b4101102a000b41f0004108102a000b20034101102a000b41f0004108102a000b41f0004108102a000b20034101102a000b20034101102a000b20134101102a000b2003ad22064220862006842106410321010c070b200020043602042000410a360200200041086a2003ad2206422086200684370200200041106a200241c0076a41e0001094041a200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b200220022f01b0043b01ae04200220022f01de053b01ac042013ad220a422086200a84210a0b200220022f01ae043b01d006200220022f01ac043b01e00502402003450d00200220022f01d0063b01aa04200220022f01e0053b01a804200041286a2006370000200041206a2007370000200041c8006a2008370000200041c0006a2009370000200041106a20043a0000200041086a200a3702002000200336020420004104360200200041306a200e3a0000200020053a001f2000201136001b200041176a2010360000200041136a200b3600002000200d3a003f2000200c36003b200041376a2012360000200041336a200f360000200020022f01aa043b0011200020022f01a8043b0031200041e8006a200241d8076a290300370300200041e0006a200241c0076a41106a290300370300200041d8006a200241c0076a41086a290300370300200041d0006a20022903c007370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b2003ad22064220862006842106410121010b20004100360200200041106a20063702002000410c6a2005360200200041086a2001360200200041186a200241c0076a41d8001094041a200241b0086a24000bd20201047f230041d0006b22022400024002400240411310262203450d002003410f6a41002800e28740360000200341086a41002900db8740370000200341002900d3874037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b41134101102a000b41264101102a000b41d4aac10041331021000ba70301047f230041c0006b22022400024002400240411010262203450d00200341086a410029009886403700002003410029009086403700002001280200210420034110412010272203450d01200320043600102003412041c00010272203450d02200320012900043700142003412c6a2001411c6a290000370000200341246a200141146a2900003700002003411c6a2001410c6a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300410021010240024002402002412041a886c500410041001001417f460d00200241003a002020024120200241206a41014100100141016a41014d0d0220022d0020220441ff0071220141064f0d02200441077621040c010b410021040b20031023200020013a0001200020043a0000200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000b41c0004101102a000bb81604047f047e107f087e230041b0046b22052400024002400240024002400240024002400240024002402004450d0020054190046a41186a2206420037030020054190046a41106a2207420037030020054190046a41086a22084200370300200542003703900441e687c000411d20054190046a1002200541e8026a41186a2006290300370300200541e8026a41106a2007290300370300200541e8026a41086a200829030037030020052005290390043703e802410021070240200541e8026a412041a886c500410041001001417f460d00200541d0036a41186a4200370300200541d0036a41106a4200370300200541d0036a41086a4200370300200542003703d003200541e8026a4120200541d0036a4120410010012206417f460d0a2006411f4d0d0a200541a0026a41186a200541d0036a41186a290300370300200541a0026a41106a200541d0036a41106a290300370300200541a0026a41086a200541d0036a41086a290300370300200520052903d0033703a002410121070b412810262206450d0a200620073a0004200641a886c500360200200620052903a002370005200620052f00e8023b00252006410d6a200541a8026a290300370000200641156a200541b0026a2903003700002006411d6a200541b8026a290300370000200641276a200541ea026a2d00003a0000200541a0026a20061033420021094200210a4200210b4200210c20052d00e0024106460d022004417f6a210d200541e8026a41206a2108200541e8026a41c0006a220e2002460d01200541e8026a41186a210f200541e8026a41106a2110200541c8036a2111200341ff017121124200210b4200210c420021094200210a0340200f200c3703002010200b370300200520093703e8022005200a3703f0022008200541a0026a41c10010940421040240200e200241201096040d00200541f0036a41186a2213200441186a2214290200370300200541f0036a41106a2215200441106a2216290200370300200541f0036a41086a2217200441086a2218290200370300200520042902003703f003411010262207450d06200741086a4100290098864037000020074100290090864037000020074110412010272207450d09200720013600102007412041c00010272207450d0a200720052903f0033700142007412c6a2013290300370000200741246a20152903003700002007411c6a201729030037000020054190046a41186a2219420037030020054190046a41106a221a420037030020054190046a41086a221b420037030020054200370390042007413420054190046a1002200541d0036a41186a2019290300370300200541d0036a41106a201a290300370300200541d0036a41086a201b29030037030020052005290390043703d003200541d0036a412041a886c500410041001001211c20071023201c417f470d0020112d00002107201320142900003703002015201629000037030020172018290000370300200520042900003703f00302404100417f4101200720124b1b20072012461b41016a41014b0d00200321070b20054190026a200541f0036a103420054190026a41086a290300211d200529039002211e02400240200741ff0171450d00200541d0016a201d42002007ad42ff0183221f4200109804200541e0016a201e4200201f420010980420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541f0016a200120054190046a2007200d1032200541c0016a42004200201e4200109804427f200541e0016a41086a290300221f20052903d00120052903c0017c7c222020052903d80120052903c801844200522020201f547222041b2120427f20052903e00120041b211f200541f0016a41186a2903002121200541f0016a41086a2903002122200529038002212320052903f00121240c010b20054190016a201e201d420a420010970420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541a0016a200120054190046a4100200d1032200541a0016a41186a2903002121200541a0016a41086a290300212220052903b001212320052903a0012124200529039001221f211e20054190016a41086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000c030b0b4200210b4200210c420021094200210a0c020b200541c8036a211a200341ff017121194200210b4200210c420021094200210a0340200541e8026a41186a200c370300200541e8026a41106a200b370300200520093703e8022005200a3703f0022008200541a0026a41c100109404210f200541f0036a41186a2207200541a0026a41186a290300370300200541f0036a41106a2202200541a0026a41106a290300370300200541f0036a41086a220e200541a0026a41086a290300370300200520052903a0023703f003411010262204450d03200441086a4100290098864037000020044100290090864037000020044110412010272204450d04200420013600102004412041c00010272204450d05200420052903f0033700142004412c6a2007290300370000200441246a20022903003700002004411c6a200e29030037000020054190046a41186a2210420037030020054190046a41106a2213420037030020054190046a41086a2215420037030020054200370390042004413420054190046a1002200541d0036a41186a2010290300370300200541d0036a41106a2013290300370300200541d0036a41086a201529030037030020052005290390043703d003200541d0036a412041a886c50041004100100121172004102302402017417f470d00201a2d000021042007200f41186a2900003703002002200f41106a290000370300200e200f41086a2900003703002005200f2900003703f00302404100417f4101200420194b1b20042019461b41016a41014b0d00200321040b20054180016a200541f0036a103420054180016a41086a290300211d200529038001211e02400240200441ff0171450d00200541c0006a201d42002004ad42ff0183221f4200109804200541d0006a201e4200201f420010980420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541e0006a200120054190046a2004200d1032200541306a42004200201e4200109804427f200541d0006a41086a290300221f200529034020052903307c7c222020052903482005290338844200522020201f547222041b2120427f200529035020041b211f200541e0006a41186a2903002121200541e0006a41086a290300212220052903702123200529036021240c010b2005201e201d420a420010970420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541106a200120054190046a4100200d1032200541106a41186a2903002121200541106a41086a290300212220052903202123200529031021242005290300221f211e200541086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000b0b200610230b2000200b37031020002009370300200041186a200c3703002000200a370308200541b0046a24000f0b41104101102a000b41204101102a000b41c0004101102a000b41204101102a000b41c0004101102a000b41d4aac10041331021000b41284104102a000b8d0903037f047e067f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e001024002400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318411510262204450d012004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d0220042002290318370015200420093a00342004412c6a2002412f6a290000370000200441256a200241186a41106a2903003700002004411d6a200241186a41086a290300370000200241e0016a41186a220a4200370300200241e0016a41106a220b4200370300200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1002200241386a41186a200a290300370300200241386a41106a200b290300370300200241386a41086a200c290300370300200220022903e001370338200241386a412041a886c500410041001001417f460d03200242203702d4012002200241386a3602d001200241e0016a200241d0016a105920022d0081024102460d04200241a8016a41206a220a200241e0016a41206a2d00003a0000200241a8016a41186a220b200241e0016a41186a290300370300200241a8016a41106a220c200241e0016a41106a290300370300200241a8016a41086a220d200241e0016a41086a290300370300200220022903e0013703a801200241e0006a20024182026a41c1001094041a200241386a41206a220e200a2d00003a0000200241386a41186a220a200b290300370300200241386a41106a220b200c290300370300200241386a41086a220c200d290300370300200220022903a801370338200241e0016a200241e0006a41c1001094041a200141246a200241e0016a41c0006a2d00003a00002001411c6a200241e0016a41386a290000370000200141146a200241e0016a41306a2900003700002001410c6a200241e0016a41286a290000370000200120022900800237000420002002290318370000200041086a200241186a41086a290300370000200041106a200241186a41106a290300370000200041176a200241186a41176a290000370000200020093a001f200041c0006a200e2d00003a0000200041386a200a290300370000200041306a200b290300370000200041286a200c2903003700002000200229033837002020041023200324000f0b200041063a0040200324000f0b41154101102a000b41354101102a000b41faccc40041d7001021000b41d4aac10041331021000ba40604027f017e037f037e230041c0006b22022400024002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22054200370300200241206a41106a22064200370300200241206a41086a220742003703002002420037032020034134200241206a1002200241186a2005290300370300200241106a2006290300370300200241086a2007290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012205417f460d022005410f4d0d02200241286a29030021082002290320210420031023411810262203450d010c050b42002108200310234118102622030d040b41184101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b200341106a410029008db741370000200341086a4100290085b741370000200341002900fdb641370000024020034118413810272203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002109200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034138200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a290300210a200229032021090c010b4200210a0b200310232000200920047c22043703002000200a20087c2004200954ad7c370308200241c0006a24000f0b41d4aac10041331021000b41384101102a000b8507010d7f230041e0006b220124000240024002400240411a10262202450d00200241186a41002f00dc86403b0000200241106a41002900d48640370000200241086a41002900cc8640370000200241002900c486403700002002411a413410272202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1002200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100320021023411310262202450d022002410f6a41002800e28740360000200241086a41002900db8740370000200241002900d3874037000020024113412610272202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1002200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100320021023200141c0006a200010302001280244210820012802402109024002400240024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010262202450d02200241086a4100290098864037000020024100290090864037000020024110412010272202450d03200220003600102002412041c00010272202450d04200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10022006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100320021023200a41606a220a0d000b0b02402008450d00200910230b200141e0006a24000f0b41104101102a000b41204101102a000b41c0004101102a000b411a4101102a000b41344101102a000b41134101102a000b41264101102a000bd20201057f230041d0006b22022400024002400240411710262203450d002003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1002200241186a2004290300370300200241106a2005290300370300200241086a200629030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a103720022802302204450d0420002002290234370204200020043602000c010b20004100360208200042083702000b20031023200241d0006a24000f0b41174101102a000b412e4101102a000b41d4aac10041331021000beb0603027f017e0b7f230041c0046b22022400200241086a2001104a02400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42f8007e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241c0046a24000f0b4108210620030d030b4100210d4100210b0c030b101d000b20054108102a000b200241d8026a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00c8032001280200200141046a220c280200200241c8036a410120052802001001210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00c803220d4101460d00200d0d06200241c8036a20024180016a41ec001094041a410e210c0c010b200241c8036a2001102f20022802c803410e460d04200241d8026a200241c8036a41f0001094041a200c280200210d2005280200210c200241003602bc04200541002001280200200d200241bc046a4104200c1001220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d0320022802bc04210e20022802d802210c200241ec016a200741ec001094041a200241c8036a200241ec016a41ec001094041a200c410e460d0520024180016a200241c8036a41ec001094041a200241c8036a20024180016a41ec001094041a200c410f460d060b200a41016a210d200241146a200241c8036a41ec001094041a0240200a200b470d002008200d200d2008491b220bad42f8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f102722060d010c090b200f10262206450d080b200620096a220a200c360200200a41046a200241146a41ec001094041a200a41f0006a200e360200200841026a2108200941f8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d360200200241c0046a24000f0b200241d8026a10240b200241c8036a200241ec016a41ec001094041a0b200241c8036a20024180016a41ec001094041a0b200041003602000240200a450d0020062105034002402005280200410e460d00200510240b200541f8006a2105200941887f6a22090d000b0b0240200b450d00200610230b200241c0046a24000f0b101e000b200f4108102a000beb0604047f017e027f017e23004180046b220224000240024002400240411a10262203450d00200341186a41002f00dc86403b0000200341106a41002900d48640370000200341086a41002900cc8640370000200341002900c486403700002003411a413410272203450d012003200136001a200241a0026a41186a22014200370300200241a0026a41106a22044200370300200241a0026a41086a22054200370300200242003703a0022003411e200241a0026a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a2005290300370300200220022903a002370308024002400240200241086a412041a886c500410041001001417f460d002002200241086a3602282002412036022c200242003703a00220024100200241086a4120200241a0026a41084100100122012001417f461b2201410820014108491b360230200141074d0d0620022903a0022106200241a0026a200241286a102f20022802a002210120024194036a200241a0026a41047241ec001094041a2001410e460d06200241b4016a20024194036a41ec001094041a20022001360240200241c0006a410472200241b4016a41ec001094042104200241003a00a0022002280228200228022c200241a0026a4101200241306a22012802001001210520012001280200200541016a41014b22056a22073602002005450d0220022d00a002220541034f0d02200242003703a002200241286a41086a220841002002280228200228022c200241a0026a41082007100122012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903a002210920022802402101200241a0026a200441ec001094041a20022002413c6a2800003600970320022002280039360294032001410e460d06200241c0006a200241a0026a41ec001094041a20022002280097033600b70120022002280294033602b40120002001360208200020063703002000410c6a200241c0006a41ec001094041a20004180016a20053a0000200041f8006a2009370200200020022802b4013600810120004184016a20022800b7013600000c010b2000410e3602080b2003102320024180046a24000f0b200241c0006a102441d4aac10041331021000b411a4101102a000b41344101102a000b200241c0006a10240b41d4aac10041331021000bc6c00102097f027e230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200417f6a2203410c4b0d00024002400240024002400240024002400240024020030e0d0008050602090b070d040c0103000b200141046a280200200141086a2802002203470d14200341016a22042003490d6220034101742205200420042005491b22054100480d622003450d2920012802002003200510272204450d2a0c600b200141046a280200200141086a2802002203470d0c200341016a22042003490d5a20034101742205200420042005491b22054100480d5a2003450d1a20012802002003200510272204450d1b0c4e0b200141046a2206280200200141086a22042802002203470d0c200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d1b20012802002003200710272205450d1c0c4b0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1c20012802002003200510272204450d1d0c480b200141046a280200200141086a2802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1d20012802002003200510272204450d1e0c450b200141046a280200200141086a2802002203470d0c200341016a22042003490d5d20034101742205200420042005491b22054100480d5d2003450d1e20012802002003200510272204450d1f0c420b200141046a280200200141086a2802002203470d0c200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1f20012802002003200510272204450d200c3f0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2020012802002003200510272204450d210c3c0b200141046a280200200141086a2802002200470d0d200041016a22032000490d5a20004101742204200320032004491b22044100480d5a2000450d2320012802002000200410272203450d240c390b200141046a2206280200200141086a22042802002203470d0d200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d2420012802002003200710272205450d250c360b200141046a280200200141086a2802002203470d0d200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2520012802002003200510272204450d260c330b200141046a280200200141086a2802002203470d0d200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2620012802002003200510272204450d270c300b200141046a280200200141086a2802002203470d0d200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d2720012802002003200510272204450d280c2d0b200141046a280200200141086a2802002203470d0d200341016a22042003490d4e20034101742205200420042005491b22054100480d4e2003450d2820012802002003200510272204450d290c2a0b200128020021040c420b200128020021050c3f0b200128020021040c3c0b200128020021040c390b200128020021040c360b200128020021040c330b200128020021040c300b200128020021040c4c0b200128020021030c2c0b200128020021050c290b200128020021040c260b200128020021040c230b200128020021040c200b200128020021040c1d0b2005102622040d330b20054101102a000b2007102622050d2f0b20074101102a000b2005102622040d2b0b20054101102a000b2005102622040d270b20054101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d360b20054101102a000b2004102622030d150b20044101102a000b2007102622050d110b20074101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041086a280200417f6a220341044b0d1602400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d3d20034101742205200420042005491b22054100480d3d2003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3a20034101742205200420042005491b22054100480d3a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110412002200041186a36020c2002410c6a20011066200041286a2001109802200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110662000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041086a280200417f6a220341094b0d1402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b200141046a280200200141086a2802002203470d0e200341016a22042003490d6020034101742205200420042005491b22054100480d602003450d1d20012802002003200510272204450d1e0c390b200141046a280200200141086a2802002203470d08200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1220012802002003200510272204450d130c360b200141046a280200200141086a2802002203470d08200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1320012802002003200510272204450d140c330b200141046a280200200141086a2802002203470d08200341016a22042003490d5620034101742205200420042005491b22054100480d562003450d1420012802002003200510272204450d150c300b200141046a280200200141086a2802002203470d08200341016a22042003490d5520034101742205200420042005491b22054100480d552003450d1520012802002003200510272204450d160c2d0b200141046a280200200141086a2802002203470d08200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d1620012802002003200510272204450d170c2a0b200141046a280200200141086a2802002203470d09200341016a22042003490d5320034101742205200420042005491b22054100480d532003450d1920012802002003200510272204450d1a0c270b200141046a280200200141086a2802002203470d09200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d1a20012802002003200510272204450d1b0c240b200141046a280200200141086a2802002203470d09200341016a22042003490d5120034101742205200420042005491b22054100480d512003450d1b20012802002003200510272204450d1c0c210b200141046a280200200141086a2802002203470d09200341016a22042003490d5020034101742205200420042005491b22054100480d502003450d1c20012802002003200510272204450d1d0c1e0b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c2b0b200128020021040c1e0b200128020021040c1b0b200128020021040c180b200128020021040c150b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d130b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110ec022002200041386a36020c2002410c6a20011066200041306a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d332003410174220a20062006200a491b220a4100480d332003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d3020034101742200200520052000491b22004100480d302003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011041200041106a200110ec02200041346a20011041200041386a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d272003410174220a20062006200a491b220a4100480d272003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d2420034101742200200520052000491b22004100480d242003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200417f6a220341044b0d1202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d4020034101742205200420042005491b22054100480d402003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3f20034101742205200420042005491b22054100480d3f2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3d20034101742205200420042005491b22044100480d3d2003450d0a20012802002003200410272205450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021050c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2004102622050d070b20044101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041106a290300210b02400240024002400240200141046a2802002203200528020022006b41084f0d00200041086a22042000490d3020034101742200200420042000491b22004100480d302003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a200b370000200241106a24000f0b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41033a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d182003200041186c6a2108200141046a2106024002400340200328020021092002200341086a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c050b200128020021070c020b200510262207450d030b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a2003410c6a28020021092002200341146a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c060b200128020021070c020b200510262207450d040b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a200341186a22032008470d000c1b0b0b20054101102a000b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2c20044101742203200520052003491b22034100480d2c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002000410c6a28020021042002200041146a280200220036020c2002410c6a200110412000450d1420042000410c6c6a2108200141046a210902400340200428020021072002200441086a280200220036020c2002410c6a20011041024002400240024020092802002206200528020022036b20004f0d00200320006a220a2003490d2b20064101742203200a200a2003491b22034100480d2b2006450d01200128020020062003102722060d020c050b200128020021060c020b200310262206450d030b2001200636020020092003360200200528020021030b2005200320006a360200200620036a200720001094041a2004410c6a22042008470d000c160b0b20034101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2820044101742203200520052003491b22034100480d282004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200041086a22032d0000417f6a2205410f4b0d1002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e10000a0608030b0d090f050e02040c0107000b200628020020042802002203470d18200341016a22042003490d800120034101742205200420042005491b22054100480d80012003450d3120012802002003200510272204450d320c5d0b200628020020042802002200470d0e200041016a22052000490d7f20004101742207200520052007491b22074100480d7f2000450d1e20012802002000200710272205450d1f0c5a0b200628020020042802002200470d0e200041016a22052000490d7e20004101742207200520052007491b22074100480d7e2000450d1f20012802002000200710272205450d200c570b200628020020042802002203470d0e200341016a22052003490d7d20034101742207200520052007491b22074100480d7d2003450d2020012802002003200710272205450d210c540b200628020020042802002200470d0e200041016a22032000490d7c20004101742205200320032005491b22054100480d7c2000450d2120012802002000200510272203450d220c510b200628020020042802002203470d0e200341016a22042003490d7b20034101742205200420042005491b22054100480d7b2003450d2220012802002003200510272204450d230c4e0b200628020020042802002205470d0e200541016a22062005490d7a20054101742207200620062007491b22074100480d7a2005450d2320012802002005200710272206450d240c4b0b200628020020042802002200470d0e200041016a22032000490d7920004101742205200320032005491b22054100480d792000450d2420012802002000200510272203450d250c480b200628020020042802002205470d0e200541016a22062005490d7820054101742207200620062007491b22074100480d782005450d2520012802002005200710272206450d260c450b200628020020042802002203470d0e200341016a22042003490d7720034101742205200420042005491b22054100480d772003450d2620012802002003200510272204450d270c420b200628020020042802002203470d0f200341016a22042003490d7620034101742205200420042005491b22054100480d762003450d2920012802002003200510272204450d2a0c3f0b200628020020042802002203470d0f200341016a22052003490d7520034101742207200520052007491b22074100480d752003450d2a20012802002003200710272205450d2b0c3c0b200628020020042802002200470d0f200041016a22052000490d7420004101742207200520052007491b22074100480d742000450d2b20012802002000200710272205450d2c0c390b200628020020042802002203470d0f200341016a22042003490d7320034101742205200420042005491b22054100480d732003450d2c20012802002003200510272204450d2d0c360b200628020020042802002203470d0f200341016a22042003490d7220034101742205200420042005491b22054100480d722003450d2d20012802002003200510272204450d2e0c330b200628020020042802002200470d0f200041016a22052000490d7120004101742207200520052007491b22074100480d712000450d2e20012802002000200710272205450d2f0c300b200128020021050c4c0b200128020021050c490b200128020021050c460b200128020021030c430b200128020021040c400b200128020021060c3d0b200128020021030c3a0b200128020021060c370b200128020021040c340b200128020021040c450b200128020021040c300b200128020021050c2d0b200128020021050c2a0b200128020021040c270b200128020021040c240b200128020021050c210b2007102622050d3b0b20074101102a000b2007102622050d370b20074101102a000b2007102622050d330b20074101102a000b2005102622030d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622060d270b20074101102a000b2005102622030d230b20054101102a000b2007102622060d1f0b20074101102a000b2005102622040d1b0b20054101102a000b2005102622040d2b0b20054101102a000b2005102622040d150b20054101102a000b2007102622050d110b20074101102a000b2007102622050d0d0b20074101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41083a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d4420054101742200200620062000491b22004100480d442005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041186a20011098022000410c6a20011041200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410d3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3e20054101742200200620062000491b22004100480d3e2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a00002000410c6a28020021050240024002400240024020062802002203200428020022006b41044f0d00200041046a22062000490d3c20034101742200200620062000491b22004100480d3c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a2005360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a28020020011039200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41033a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3620004101742207200320032007491b22074100480d362000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410f3a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41023a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3220004101742207200320032007491b22074100480d322000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410c3a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41043a00002000410c6a28020020011039024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200628020020042802002203470d03200341016a22052003490d3920034101742207200520052007491b22074100480d392003450d0720012802002003200710272205450d080c0f0b200628020020042802002203470d01200341016a22052003490d3820034101742207200520052007491b22074100480d382003450d0420012802002003200710272205450d050c0c0b200628020020042802002203470d02200341016a22052003490d3720034101742207200520052007491b22074100480d372003450d0720012802002003200710272205450d080c090b200128020021050c0b0b200128020021050c0c0b200128020021050c070b2007102622050d070b20074101102a000b2007102622050d070b20074101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a00000c040b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a00000c020b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41023a00000b200041106a290300210b0240024002400240024020062802002205200428020022036b41084f0d00200341086a22072003490d2c20054101742203200720072003491b22034100480d2c2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a200b370000200041186a290300210b0240024002400240024020062802002203200428020022006b41084f0d00200041086a22052000490d2c20034101742200200520052000491b22004100480d2c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a200b3700000c160b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410b3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d2a20054101742200200620062000491b22004100480d2a2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410e3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22042000490d2820054101742200200420042000491b22004100480d282005450d0120012802002005200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a29000037000020002003290001370000200341216a2d00002001103f200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a280200200110392002200041106a36020c2002410c6a20011066200241106a24000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a00000240024002400240024002400240024002400240024002400240024002400240200041046a22042d000022034103460d00024020034102460d0020034101470d1d200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22052003490d2520034101742206200520052006491b22064100480d252003450d0520012802002003200610272205450d060c090b200128020021040c0b0b200128020021050c080b200128020021040c0b0b2005102622040d070b20054101102a000b2006102622050d030b20064101102a000b2005102622040d050b20054101102a000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41023a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a29000037000020032004290001370000200041286a2001104102400240024002400240200141046a28020020062802002200470d00200041016a22032000490d1f20004101742205200320032005491b22054100480d1f2000450d0120012802002000200510272203450d020c030b200128020021030c030b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a200441216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110412000410c6a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041106a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041306a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240024002400240024002400240200041086a28020022034102460d0020034101470d13200141046a280200200141086a2802002203470d01200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110ec022002200041306a36020c2002410c6a200110662002200041c0006a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240024002400240024002400240024002400240200028020422034102460d0020034101470d0f200141046a280200200141086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a0000200041086a2d0000417f6a2203410c4b0d0202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b200628020020042802002203470d13200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d2720012802002003200710272205450d280c4b0b200628020020042802002203470d0b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f2003450d1820012802002003200510272204450d190c480b200628020020042802002203470d0b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e2003450d1920012802002003200510272204450d1a0c450b200628020020042802002203470d0b200341016a22052003490d5d20034101742207200520052007491b22074100480d5d2003450d1a20012802002003200710272205450d1b0c420b200628020020042802002203470d0b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1b20012802002003200510272204450d1c0c3f0b200628020020042802002203470d0b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b2003450d1c20012802002003200510272204450d1d0c3c0b200628020020042802002200470d0b200041016a22032000490d5a20004101742205200320032005491b22054100480d5a2000450d1d20012802002000200510272203450d1e0c390b200628020020042802002203470d0b200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d1e20012802002003200710272205450d1f0c360b200628020020042802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2120012802002003200510272204450d220c330b200628020020042802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2220012802002003200510272204450d230c300b200628020020042802002200470d0c200041016a22032000490d5620004101742205200320032005491b22054100480d562000450d2320012802002000200510272203450d240c2d0b200628020020042802002200470d0c200041016a22032000490d5520004101742205200320032005491b22054100480d552000450d2420012802002000200510272203450d250c2a0b200628020020042802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2520012802002003200510272204450d260c270b200128020021040c3d0b200128020021040c3a0b200128020021050c370b200128020021040c340b200128020021040c310b200128020021030c2e0b200128020021050c2b0b200128020021050c380b200128020021040c270b200128020021040c240b200128020021030c210b200128020021030c1e0b200128020021040c1b0b2005102622040d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622050d270b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622030d1b0b20054101102a000b2007102622050d170b20074101102a000b2007102622050d230b20074101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2005102622030d090b20054101102a000b2005102622030d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110ec02200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410a3a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d14200041246c210003402003200110ec02200341246a21032000415c6a22000d000c150b0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41073a000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d3220004101742205200320032005491b22054100480d322000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d3120004101742205200320032005491b22054100480d312000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d3020004101742205200320032005491b22054100480d302000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a220a200341016a360200200520036a410c3a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d0820004105742107200141046a210802400340024002400240024020062802002205200428020022006b41204f0d00200041206a22092000490d1f20054101742200200920092000491b22004100480d1f2005450d01200128020020052000102722050d020c050b200128020021050c020b200010262205450d030b2001200536020020082000360200200a28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000c0a0b0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110412002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a2001106602400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d2420004101742205200320032005491b22054100480d242000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d2320004101742205200320032005491b22054100480d232000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d2220004101742205200320032005491b22054100480d222000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041086a22032d0000417f6a220441054b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c260b200141046a280200200141086a2802002200470d04200041016a22042000490d2220004101742205200420042005491b22054100480d222000450d0a20012802002000200510272204450d0b0c200b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1d0b200141046a280200200141086a2802002204470d04200441016a22052004490d2020044101742206200520052006491b22064100480d202004450d0c20012802002004200610272205450d0d0c1a0b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c170b200141046a280200200141086a2802002204470d05200441016a22052004490d1e20044101742206200520052006491b22064100480d1e2004450d1020012802002004200610272205450d110c120b200128020021040c1c0b200128020021040c190b200128020021050c160b200128020021040c1e0b200128020021040c120b200128020021050c0d0b2005102622040d150b20054101102a000b2005102622040d110b20054101102a000b2006102622050d0d0b20064101102a000b2005102622040d140b20054101102a000b2005102622040d070b20054101102a000b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41053a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341216a220341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200041e0006a290300210b200041d8006a290300210c02400240024002400240200141046a2802002204200628020022036b41104f0d00200341106a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2204200341106a360200200520036a2203200b3700082003200c370000200041cc006a28020021032002200041d4006a280200220036020c2002410c6a200110412000450d0020004105742106200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22092000490d0f20054101742200200920092000491b22004100480d0f2005450d01200128020020052000102722050d020c060b200128020021050c020b200010262205450d040b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011098022000410c6a28020021062002200041146a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a36020c2002410c6a20011066200041c8006a200110980202400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0920054101742204200620062004491b22044100480d092005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a290000370000200420032900013700002000412c6a28020021052002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200628020022006b20034f0d00200020036a22062000490d0920044101742200200620062000491b22004100480d092004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200520031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110ec022002200041c0006a36020c2002410c6a20011066200041d0006a2001109802200041306a28020021062002200041386a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0720044101742200200520052000491b22004100480d072004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0520044101742200200520052000491b22004100480d052004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240024002400240024002400240200341216a2d00004101470d00200141046a28020020052802002200470d01200041016a22042000490d0b20004101742205200420042005491b22054100480d0b2000450d0320012802002000200510272204450d040c090b200141046a28020020052802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420012802002000200410272203450d050c060b200128020021040c080b200128020021030c050b2005102622040d050b20054101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a0000024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0320044101742200200520052000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341226a220041186a290000370000200141106a200041106a290000370000200141086a200041086a29000037000020012000290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a200110b202200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d0120012802002003200510272204450d020c040b200128020021040c040b2005102622040d020b20054101102a000b101e000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000b130020004110360204200041888ac0003602000b130020004109360204200041e2a2c0003602000b13002000410f360204200041eca2c0003602000b9e0101047f23004190016b220224002002410e360208200241003602880120024201370380010240410110262203450d002002200336028001200320024180016a41086a220428020022056a41003a0000200241013602840120002002290380013702002004200541016a2203360200200041086a200336020002402002280208410e460d00200241086a10240b20024190016a24000f0b41014101102a000bcb0101057f230041306b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030020024100360228200242013703200240412010262206450d0020062002290300370000200641086a2005290300370000200641106a2004290300370000200641186a2003290300370000200242a08080808004370224200220063602204100200241206a103f200041086a200241206a41086a28020036020020002002290320370200200241306a24000f0b41204101102a000ba50801027f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041ff0171417f6a220041044b0d000240024002400240024020000e050004020301000b200141046a280200200141086a2802002200470d08200041016a22022000490d1720004101742203200220022003491b22034100480d172000450d1120012802002000200310272202450d120c220b200141046a280200200141086a2802002200470d04200041016a22022000490d1620004101742203200220022003491b22034100480d162000450d0a20012802002000200310272202450d0b0c1f0b200141046a280200200141086a2802002200470d04200041016a22022000490d1520004101742203200220022003491b22034100480d152000450d0b20012802002000200310272202450d0c0c1c0b200141046a280200200141086a2802002200470d04200041016a22022000490d1420004101742203200220022003491b22034100480d142000450d0c20012802002000200310272202450d0d0c190b200141046a280200200141086a2802002200470d05200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c160b200141046a280200200141086a2802002200470d05200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d1020012802002000200310272202450d110c130b200128020021020c1b0b200128020021020c180b200128020021020c150b200128020021020c1a0b200128020021020c110b200128020021020c0e0b2003102622020d140b20034101102a000b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d100b20034101102a000b2003102622020d060b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41053a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021041200041086a200228020836020020002002290300370200200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d0520012802002000200410272203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d0820012802002003200010272203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2000102622030d0b0b20004101102a000b200010262203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000102722020d020c070b200128020021020c020b200010262202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b101e000b20004101102a000b20044101102a000b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000b8b0401047f230041e0006b2202240002400240410f10262203450d00200341076a41002900a78640370000200341002900a086403700002003410f412f10272203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412f200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410f4101102a000b412f4101102a000bed2604077f017e017f017e230041f0036b22022400200241003a00940220024194026a200128020022032001280204220441004722051094041a024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0094022204410f4b0d10024020040e10000b0709040c0e0a0f061003050d0208000b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d0f200241a8016a41186a220520024194026a41186a290000370300200241a8016a41106a220620024194026a41106a290000370300200241a8016a41086a220720024194026a41086a29000037030020022002290094023703a80120024180036a41186a2208200529030037030020024180036a41106a2205200629030037030020024180036a41086a22062007290300370300200220022903a8013703800320024188016a41186a200829030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903800337038801200241003a00940220024194026a2004200341004722051094041a20032005490d29200141046a200320056b3602002001200420056a3602002003450d1d20022d009402220141064f0d1d200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220520024188016a41106a290300370300200241e8006a41086a220320024188016a41086a29030037030020022002290388013703682000410f3a0000200041216a20013a000020002002290368370001200041096a2003290300370000200041116a2005290300370000200041196a2004290300370000200041226a2002280160360100200041266a200241e4006a2f01003b0100200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0f200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410c3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241386a200110452002280238450d14200228023c2101200020022f0094023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024196026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241286a200110452002280228450d14200228022c2107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d222003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1c0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241306a200110452002280230450d1320022802342107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d212003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1b0b200041113a0000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241206a200110452002280220450d1220022802242101200020022f0094023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024194026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241003602940220024194026a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d0a2002280294022101200041063a0000200041046a2001360200200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0a200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410e3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b4100210320024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a36020002402006411f4d0d00200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024188016a41186a200129030037030020024188016a41106a200429030037030020024188016a41086a2005290300370300200220022903a80137038801410121030b20024180036a41186a220120024188016a41186a29030037030020024180036a41106a220420024188016a41106a29030037030020024180036a41086a220520024188016a41086a2903003703002002200229038801370380032003450d0a200241e8006a41186a22032001290300370300200241e8006a41106a22012004290300370300200241e8006a41086a220420052903003703002002200229038003370368200041093a000020002002290368370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b200241d0006a200110462002290350a7450d0e20022903582109200241c8006a200110452002280248450d11200228024c2104200241c0006a200110452002280240450d1520022802442101200020022f0094023b00012000410b3a0000200041106a2009370300200041086a2001360200200041046a2004360200200041186a200229038003370300200041036a20024196026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1820052004360200200541046a200241a8016a41ec001094041a200141046a22072802002104200241003a00940220024194026a20012802002208200441004722031094041a20042003490d192007200420036b22063602002001200820036a22033602002004450d0c20022d009402220841034f0d0c200242003703800320024180036a20032006410820064108491b22041094041a200141046a220a200620046b22073602002001200320046a2204360200200641074d0d122002290380032109200242003703800320024180036a20042007410820074108491b22031094041a200a200720036b3602002001200420036a360200200741074d0d13200041106a200229038003370300200041086a2009370300200041046a2005360200200020083a0001200041053a0000200041186a200229038801370300200041206a20024188016a41086a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1920042001360200200441046a200241a8016a41ec001094041a200041083a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1920052004360200200541046a200241a8016a41ec001094041a200241086a200110472002290308a7450d0e200241086a41106a29030021092002290310210b200020022f00683b0001200041013a0000200041086a200b370300200041046a2005360200200041186a200229038801370300200041106a2009370300200041036a200241ea006a2d00003a0000200041206a20024188016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1720042001360200200441046a200241a8016a41ec001094041a200041073a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c100b200041113a0000200241f0036a24000f0b200041033a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a00002005102420051023200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0a0b200041113a00000c090b200520041048000b200520041048000b200520041048000b200520031048000b41f0004108102a000b200320041048000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2005102420051023200241f0036a24000bc35c05067f057e047f027e087f230041d0086b22022400200241003a00f006200241f0066a200128020022032001280204220441004722051094041a0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00f0062204410d4b0d0e024020040e0e00090607030a0c080e050d02040b000b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6a200141046a200620046b22033602002001200520046a22043602002006450d6620022d00ff05220541044b0d66024020050e050025232422000b200241086a200110452002280208450d66200228020c2204417f4c0d682004450d4f200410ac012206450d870120062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d88012003200720056b3602002001200128020020056a36020020052004470d500c9a010b2000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b3602002001200520046a3602002006450d1e20022d00ff05220441044b0d1e024020040e05001d1b1c1a000b200241d0036a2001104720022903d003a7450d1e200241e0036a290300210820022903d8032109200241f0066a200110950220022d00f00622044102460d1e2002418c076a290200210a20024184076a290200210b20022f00f106210120022d00f306210520022902f406210c2002200241fc066a290200370388062002200c370380062002200b3703900620012005411074722101410121050c1d0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b22033602002001200520046a22043602002006450d5520022d00ff050d55200241f0066a2003412020034120491b22056a41004100412020056b2005411f4b1b1093041a200241f0066a200420051094041a200141046a2207200320056b22063602002001200420056a22053602002003411f4d0d5520024188076a22032903002109200229038007210a20022903f0062108200220022903f806370388062002200837038006200241f0066a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a2007200620046b3602002001200520046a3602002006411f4d0d552003290300210820024180076a290300210b200241f0066a41086a290300210c20022802f406210320022802f0062107200241d0046a41086a20024180066a41086a29030037030020022002290380063703d00420024198016a20011045200228029801450d55200228029c012204417f4c0d652004450d53200410ac012206450d880120062001280200200141046a220d2802002205200420052004491b22051094041a200d280200220e2005490d8901200d200e20056b3602002001200128020020056a36020020052004470d540c95010b200241e0076a200110c30220022d00e0072101200241f0066a200241e0076a41017241e7001094041a20014107470d0b2000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d920120022d00f006450d0c0c92010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0f20022d00ff0522044101460d0d20040d0f200241e0076a200110950220022d00e00722044102460d0f20022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a200241d0006a200110472002280250450d0f20072003411074722101200241d0006a41106a290300210b410121032002290358210c0c0e0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d3120022d00ff05220441094b0d31024020040e0a00252223202829242b21000b200241f0066a200110a50220022802f0062204450d3120022902f4062108200241a8026a200110452008a7210520022802a802450d3020022802ac022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d30200842208821082005410876210e2004410876210f20022802f0062110410121010c250b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d8d0120022d00f006450d090c8d010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6841042103200141046a200620046b220f3602002001200520046a22103602002006450d850120022d00ff05220d410c4b0d85010240200d0e0d0036388901323a3b393c343d3133000b200241f0066a200110950220022d00f00622044102460d850120022d00f306210f20022f00f1062110200241fc066a290200210a2002418c076a290200210920024188076a280200210720024184076a280200210520022902f4062108200241a0016a2001104720022903a001a7450d8501200241a0016a41106a290300210c20022903a801210b200141046a220d2802002106200241003a00ff05200241ff056a2001280200220e200641004722031094041a20062003490d8301200d200620036b3602002001200e20036a3602002006450d850120022d00ff05220641034f0d85012010200f41107472210e410121030c88010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0d20022d00f00622044101460d0c20040d0d200241e0076a2001104420022802e0072104200241f0066a200241e0076a41047241ec001094041a2004410e460d0d20024180066a200241f0066a41ec001094041a41f00010262201450d7520012004360200200141046a20024180066a41ec001094041a200241b8056a41186a200241d8056a41186a290200370300200241b8056a41106a200241d8056a41106a290200370300200241b8056a41086a200241d8056a41086a290200370300200220022902d8053703b80520014108762105410121040c1b0b200241f0066a20011043200220022f01f2063b018006200220024192076a2f01003b01d80520022d00f00622014111470d042000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d67200141046a200620046b3602002001200520046a3602002006450d880120022d00f006450d060c88010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6741042103200141046a200620046b22073602002001200520046a22053602002006450d4620022d00ff0522044102460d0c20044101460d0b20040d46200241e0076a200110444104210320022802e0072101200241f0066a200241e0076a41047241ec001094041a2001410e460d4620024180066a200241f0066a41ec001094041a41f00010262204450d7520042001360200200441046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01d8053b01ce04410121030c470b2000410e360200200241d0086a24000f0b20024180066a200241f0066a41e7001094041a200041086a20013a00002000410c360200200041096a20024180066a41e7001094041a200241d0086a24000f0b200241f0066a41196a2900002108200241f0066a41116a2900002109200241f0066a41216a2d00002104200241f0066a41106a2d00002105200241f0066a410c6a2802002106200241f0066a41086a280200210320022802f406210720022d00f106210d200220022f0180063b01d004200220022f01d8053b01b80520024194076a280200210e200041216a2008370000200041196a20093700002000200d3a0009200041086a20013a000020004106360200200020043a0029200041186a20053a0000200041146a2006360200200041106a20033602002000410c6a20073602002000412c6a200e360200200020022f01d0043b000a200020022f01b8053b012a200041306a20022903e007370300200041386a200241e0076a41086a290300370300200041c0006a200241e0076a41106a290300370300200041c8006a200241e0076a41186a290300370300200041d0006a20024180086a290300370300200041d8006a20024188086a290300370300200041e0006a200241e0076a41306a290300370300200041e8006a200241e0076a41386a290300370300200241d0086a24000f0b200241b8036a2001104620022903b803a7450d850120022903c003210820004109360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c0006a200110462002290340a7450d83012002290348210820004101360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c8036a2001104520022802c803450d810120022802cc032204417f4c0d542004450d22200410ac012206450d6d20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d6e2003200720056b3602002001200128020020056a36020020052004470d230c80010b200241e0076a200110950220022d00e00722044102460d0120022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a20024180016a20011047200229038001a7450d0120024180016a41106a290300210b200229038801210c200241e8006a200110472002290368a7450d0120072003411074722101200241f8006a290300211120022903702112410221030b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a2012370200200041386a200b370200200041306a200c370200200041186a2008370000200041106a200a370000200041286a2009370000200041246a2005360000200041206a20063600002000410c6a20043a0000200041086a2003360200200041d0006a20022903f006370300200041d8006a200241f0066a41086a290300370300200041e0006a200241f0066a41106a290300370300200041e8006a200241f0066a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241e0076a2001109502200241f0066a41086a2206200241ec076a290200370300200241f0066a41106a2203200241f4076a290200370300200241f0066a41186a2207200241fc076a290200370300200220022902e4073703f0064102210420022d00e00722014102470d0d0b2000410e360200200241d0086a24000f0b200241a8036a2001104520022802a803450d3a20022802ac032104200241e0076a200110444104210320022802e0072105200241f0066a200241e0076a41047241ec001094041a2005410e460d3a20024180066a200241f0066a41ec001094041a41f00010262201450d6a20012005360200200141046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01ea053b01ce04410221030c3b0b200241f0066a2007412020074120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a41042103200141046a200720046b3602002001200520046a3602002007411f4d0d3920024188076a2902002109200229028007210820022902f806210a20022802f406210720022802f0062105200241b0036a2001104520022802b003450d3920022802b4032106200141046a220d2802002104200241003a00e007200241e0076a2001280200220e200441004722031094041a20042003490d6a200d200420036b3602002001200e20036a3602002004450d3820022d00e007210e20022005360280062002200736028406200220022f0081063b0198052002200a37038806200a423888a7210d200a421888a7210720022800870621012002280083062104410321030c3a0b200241c0046a2001104520022802c004450d0420022802c40422044108762101410521054200210a0c030b200241b0046a2001104520022802b004450d0320022802b404210420024198046a20011047200229039804a7450d03200241a8046a290300210820022903a004210920024188046a20011046200229038804a7450d03200229039004210a20024180046a20011045200228028004450d03200228028404210120024190066a20083703002002200937038806200220013602800620044108762101410321050c020b200241b8046a2001104520022802b804450d0220022802bc0422044108762101410421054200210a0c010b200241e8036a2001104720022903e803a7450d01200241f8036a2903002108200220022903f003370380062002200837038806410221050b200241f0066a41106a20024180066a41106a290300220b370300200241f0066a41086a20024180066a41086a290300220c370300200241d0046a41086a2206200c370300200241d0046a41106a2203200b3703002002200229038006220b3703d0042002200b3703f006200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410b360200200041286a200a370200200041106a20022903d004370200200041186a2006290300370200200041206a2003290300370200200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b200241f0066a41106a20024180066a41106a290300370300200241f0066a41086a20024180066a41086a29030037030020022002290380063703f0062000410e360200200241d0086a24000f0b200241386a200110452002280238450d44200228023c2213ad420c7e2208422088a70d462008a72204417f4c0d462004450d272004102622060d2820044104102a000b200241106a200110452002280210450d4320022802142204417f4c0d452004450d28200410ac012206450d6620062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d672003200720056b3602002001200128020020056a36020020052004470d290c700b200241286a200110452002280228450d42200228022c2214ad42187e2208422088a70d442008a72204417f4c0d442004450d2d2004102622060d2e20044104102a000b200242003703f006200241f0066a20042003410820034108491b22051094041a200141046a200320056b3602002001200420056a360200200341074d0d4120022903f0062108410221010c760b20022f00e10720022d00e307411074722105200241b8056a41186a2007290300370300200241b8056a41106a2003290300370300200241b8056a41086a2006290300370300200220022903f0063703b8050b20024198056a41186a2206200241b8056a41186a29030037030020024198056a41106a2203200241b8056a41106a29030037030020024198056a41086a2207200241b8056a41086a290300370300200220022903b80537039805200041086a2005410874200141ff017172360200200020043602042000410d3602002000410c6a200229039805370200200041146a20072903003702002000411c6a2003290300370200200041246a20062903003702002000412c6a200241d0046a41c4001094041a200241d0086a24000f0b200241d8026a2001104520022802d802450d1120022802dc022204410876210f410521010c090b20024198036a20011046200229039803a7450d1020022903a003220942208821082009a72205410876210e410a21010c0a0b200241c8026a2001104520022802c802450d0f20022802cc022104200241f0066a200110950220022d00f00622054102460d0f20022d00f306210320022f00f1062107200241fc066a290200210b2002418c076a290200210920024188076a280200210f20024184076a280200210620022902f4062108200241c0026a2001104520022802c002450d0f20022802c402210d200241b8026a2001104520022802b802450d0f2007200341107472210e20022802bc0221012002200f360280062004410876210f2008422088a7210320022009370284062009422088a72113200b422088a7210720022903800621092001ad210a200ba721104200210b410321010c0b0b200241d0026a2001104520022802d002450d0e20022802d4022204410876210f410421010c060b200241f0066a200110950220022d00f00622044102460d0d20022902f40622094220882108410821012009a72205410876210e20022f00f10620022d00f30641107472210f200241fc066a290200220a422088a7211020024184076a280200210720024188076a28020021062002418c076a2902002109200aa721030c020b200241f0066a200110a50220022802f0062204450d0c20022902f4062108200241b0026a200110452008a7210520022802b002450d0b20022802b4022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d0b200842208821082005410876210e2004410876210f20022802f0062110410221010b0b0c060b200241f0066a200110950220022d00f00622044102460d0920022d00f306210520022f00f1062103200241fc066a290200210c2002418c076a290200210920024188076a280200210620024184076a280200210720022902f4062112200241e8026a2001104720022903e802a7450d09200241e8026a41106a290300210b20022903f002210a200241e0026a2001104520022802e002450d092003200541107472210f20022802e4022113201242208821082012a72205410876210e200c422088a72110200ca72103410621010c050b20024180036a20011045200228028003450d082002280284032204410876210f410721010b420021084100210e0c020b20024188036a20011046200229038803a7450d06200229039003220942208821082009a72205410876210e410921010b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200d360200200041306a2013360200200041286a2009370200200041246a2006360200200041206a20073602002000411c6a2010360200200041186a2003360200200041086a2001360200200041c8006a20022903e0073703002000410c6a200f410874200441ff017172360200200041d0006a200241e0076a41086a290300370300200041d8006a200241e0076a41106a290300370300200041e0006a200241e0076a41186a290300370300200041e8006a200241e0076a41206a290300370300200041106a2008422086200ead42ffffff07834208862005ad42ff01838484370200200241d0086a24000f0b4101210641002004460d5d0b2004450d5d200610230c5d0b2005450d00200410230b2000410e360200200241d0086a24000f0b20024198026a20011045200228029802450d54200228029c022104200220022f01b8053b01d0042004410876210e410c21030c030b20024180026a20011045200228028002450d532002280284022105200241e8016a2001104720022903e801a7450d53200241f8016a290300210a20022903f0012108200220022f01f0063b01d004410521034100210e0c040b200241a0026a2001104520022802a002450d5220022802a4022215ad2208421b88a70d2b2008420586a72205417f4c0d2b2005450d1e2005102622040d1f20054101102a000b20024190026a20011045200228029002450d512002280294022104200220022f01f0063b01d0042004410876210e410a21030b4200210a0c090b200241b8016a2001104720022903b801a7450d4f200241c8016a290300210a20022903c0012108200220022f01f0063b01d004200228028006210520022802840621072002290388062109410221034100210e0b0c500b200241d0016a2001104720022903d001a7450d4d200241e0016a290300210a20022903d8012108200220022f01f0063b01d004410321034100210e0c4e0b200241003a00ff05200241ff056a2010200f41004722041094041a200f2004490d43200141046a200f20046b3602002001201020046a360200200f450d4c20022d00ff05220641034f0d4c200220022f01f0063b01d004410821034200210a4100210e0c4f0b20024188026a20011045200228028802450d4b200228028c022214ad42247e2208422088a70d242008a72205417f4c0d242005450d192005102622040d1a20054104102a000b410721030c020b200241f0066a200110950220022d00f00622044102460d49200241fc066a290200210a20022902f406210820024184076a280200210520024188076a28020021072002418c076a290200210920022f00f106210120022d00f3062106200220022f0180063b01d0042001200641107472210e410921030c4b0b410b21030b0b0c470b410421060b2013450d02420021084100210d4100210541002107201321100340200241306a200110452002280230450d1020022802342204417f4c0d1e024002402004450d00200410ac01220e450d2e200e2001280200200141046a220f2802002203200420032004491b22031094041a200f28020022162003490d2f200f201620036b3602002001200128020020036a36020020032004460d010c110b4101210e41002004470d100b200741016a2103024020072010470d00200d20032003200d491b2210ad420c7e2209422088a70d202009a7220f4100480d2002402007450d0020062005200f102722060d010c300b200f10262206450d2f0b200620056a2207200e360200200741046a2004ad220942208620098437020020084280808080107c2108200d41026a210d2005410c6a21052003210720032013490d000c040b0b4101210641002004460d470b20040d180c190b41002110420021080b2006450d1720082010ad842108410521010c4c0b4101210641002004460d4a0b20040d140c150b410421060b024002402014450d00420021084100210e4100210441002107201421130340200241206a200110452002280220450d1420022802242203417f4c0d18024002402003450d00200310ac01220f450d30200f2001280200200141046a220d2802002205200320052003491b22051094041a200d28020022102005490d31200d201020056b3602002001200128020020056a36020020052003460d010c150b4101210f41002003470d140b200241186a200110452002280218450d13200228021c2205417f4c0d18024002402005450d00200510ac012210450d2e20102001280200200141046a2216280200220d2005200d2005491b220d1094041a20162802002217200d490d2f20162017200d6b36020020012001280200200d6a360200200d2005460d010c140b4101211041002005470d130b200741016a210d024020072013470d00200e200d200d200e491b2213ad42187e2209422088a70d1a2009a722164100480d1a02402007450d00200620042016102722060d010c2b0b201610262206450d2a0b200620046a2207200f360200200741146a2005360200200741106a20053602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200441186a2104200d2107200d2014490d000c020b0b41002113420021080b2006450d1320082013ad842108410421010c480b410421030b0b200220022f0198053b018006200220022f01ce043b01d805024020034104470d002000410e360200200241d0086a24000f0b200220022f0180063b01cc04200220022f01d8053b01ca042000411d6a2009370000200041156a2008370000200020053a0005200020033a0004200041083602002000200e3a0025200041146a200d3a0000200041106a20073602002000410c6a2001360200200041086a2004360200200041286a2006360200200020022f01cc043b0006200020022f01ca043b01262000412c6a200241d0046a41c4001094041a200241d0086a24000f0b4101210641002004460d410b2004450d00200610230b200241f0066a41086a200241d8056a41086a290300370300200220022903d8053703f0060c400b2004450d00200e10230b02402007450d002006210103400240200141046a280200450d00200128020010230b2001410c6a2101200541746a22050d000b0b20100d0a0c0b0b410121040b024002402015450d00200241f0066a41186a210f200241f0066a41106a2110200241f0066a41086a2113200141046a210e420021084100210d4100210741002103201521170340200f42003703002010420037030020134200370300200242003703f006200241f0066a20012802002216200e2802002205412020054120491b22061094041a200e200520066b3602002001201620066a3602002005411f4d0d06200341016a2106200f29030021092010290300210a2013290300210b20022802f406211620022802f0062114024020032017470d00200d20062006200d491b2217ad420586220c422088a70d10200ca722054100480d1002402003450d00200420072005102722040d010c220b200510262204450d210b200420076a22052014360000200541186a2009370000200541106a200a370000200541086a200b370000200541046a201636000020084280808080107c2108200d41026a210d200741206a21072006210320062015490d000c020b0b41002117420021080b2004450d3220082017ad842108200220022f01b8053b01d0042004410876210e410d21030c020b410421040b024002402014450d0042002108200241f0066a410c6a2117200241f0066a411c6a2115200241f0066a41186a2118200241f0066a41146a2119410021074100210341002105201421160340200241f0066a200110950220022d00f006220d4102460d05200541016a210620022d00f306210e20022f00f106210f201729020021092015290200210a201828020021102019280200211320022902f406210b024020052016470d002007200620062007491b2216ad42247e220c422088a70d0e200ca7221a4100480d0e02402005450d0020042003201a102722040d010c210b201a10262204450d200b200420036a2205200d3a0000200541036a200f200e41107472220d4110763a0000200541016a200d3b00002005410c6a2009370000200541046a200b3700002005411c6a200a370000200541186a2010360000200541146a201336000020084280808080107c2108200741026a2107200341246a21032006210520062014490d000c020b0b41002116420021080b2004450d3020082016ad842108200220022f0180063b01d0042004410876210e410621030b0c300b2017450d2e0c2d0b20160d2c0c2d0b2005450d00201010230b2003450d00200f10230b02402007450d002006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200441686a22040d000b0b2013450d010b200610230b2000410e360200200241d0086a24000f0b200520041048000b101d000b101e000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b20044101102a000b200320161048000b200f4104102a000b20164104102a000b20054101102a000b201a4104102a000b20054101102a000b200d20171048000b20034101102a000b200520101048000b41f0004108102a000b20044101102a000b200520071048000b41f0004108102a000b41f0004108102a000b200320041048000b2004200f1048000b20044101102a000b200520071048000b20044101102a000b200520071048000b20044101102a000b2005200e1048000b200320061048000b200410230b200220022f01d0043b01f0062000410e360200200241d0086a24000f0b0b0b200220022f01d00422013b01f006200220013b019805200041386a200c370000200041306a200b370000200041186a200a370000200041106a2008370000200020063a0009200041086a20033a000020004105360200200041286a2009370000200041246a2007360000200041206a20053600002000410c6a200e410874200441ff017172360000200020022f0198053b000a200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b2004ad22084220862008842108410321010c070b200020063602042000410a360200200041086a2004ad2208422086200884370200200041106a200241e0076a41e0001094041a200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241d8056a41086a2201200241d0046a41086a290300370300200220022903d0043703d805200241f0066a41086a22052001290300370300200220022903d8053703f0062006450d00200241b8056a41086a22012005290300370300200220022903f0063703b805200041c8006a2008370200200041c0006a200b370200200041286a2009370200200041206a200a370200200041086a2004ad22084220862008843702002000200636020420004104360200200041386a200c370200200041346a2003360200200041306a2007360200200041106a20022903b805370200200041186a2001290300370200200041d0006a20022903e007370300200041d8006a200241e0076a41086a290300370300200041e0006a200241e0076a41106a290300370300200041e8006a200241e0076a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b2004ad22084220862008842108410121010b20004100360200200041106a20083702002000410c6a2006360200200041086a2001360200200041186a200241e0076a41d8001094041a200241d0086a24000bdd0301077f230041106b22022400200241003a0003200241036a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a22033602000240024002402004450d000240024020022d0003220741037122044102460d00024020044101460d0020040d0220074102762105410121040c080b200241003a000f2002410f6a2003200641004722041094041a20062004490d06200141046a200620046b3602002001200320046a3602002006450d0420022d000f4108742007724102762105410121040c070b41002105200241003a000a200241003b0108200241086a200320064103200641034922081b22041094041a200141046a200620046b3602002001200320046a3602004100210420080d0620022f010820022d000a411074724108742007724102762105410121040c060b200741034b0d004100210420024100360204200241046a20032006410420064104491b22051094041a200141046a200620056b3602002001200320056a360200200641034d0d0120022802042105410121040c050b410021040b0c030b41002105410021040c020b200520041048000b200420061048000b2000200536020420002004360200200241106a24000bcb0503057f037e047f230041106b22022400200241003a0000200220012802002203200128020422044100472205109404210202400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00002204ad210702400240024002400240200441037122034102460d00024020034101460d0020030d022004410276ad2108420121090c080b200241003a00002002200520064100472204109404210320062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220033100004208862007844202882108420121090c070b200241003a000e200241003b010c2002410c6a200520064103200641034922031b22041094041a200141046a200620046b3602002001200520046a360200420021084200210920030d06200233010c200231000e421086844208862007844202882108420121090c060b200441027622044104460d0120040d0220024100360200200220052006410420064104491b22041094042103200141046a200620046b3602002001200520046a360200200641034d0d0020033502002108420121090c050b42002108420021090c040b4200210920024200370300200220052006410820064108491b22041094042103200141046a200620046b3602002001200520046a360200200641074d0d0220032903002108420121090c030b200441046a220a41084b0d0042002108200141046a210b410021030340200241003a00002002200520064100472204109404210c20062004490d05200b200620046b220d3602002001200520046a22053602002006450d01200c3100002003410374413871ad86200884210842012109200d2106200341016a22042103200441ff0171200a490d000c030b0b420021090b0b2000200837030820002009370300200241106a24000f0b200520041048000b200420061048000b200420061048000be90605057f017e017f027e037f230041306b22022400200241003a0018200241186a200128020022032001280204220441004722051094041a02400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0002400240024002400240024020022d0018220341037122044102460d00024020044101460d0020040d022003410276ad21070c0d0b200241003a0018200241186a2005200641004722041094041a20062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220022d001841087420037241fcff0371410276ad21070c0c0b200241003a002e200241003b012c2002412c6a200520064103200641034922081b22041094041a200141046a200620046b3602002001200520046a36020020080d0120022f012c20022d002e41107472410874200372410276ad21070c0b0b20034102762204410c460d0220044104460d0120040d0320024100360218200241186a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d00200235021821070c0a0b420021070c080b4200210720024200370318200241186a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d07200229031821070c080b4200210a2002420037032020024200370318200241186a20052006411020064110491b22041094041a200141046a200620046b3602002001200520046a3602002006410f4d0d02200241206a2903002109200229031821074201210a0c080b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0018200241186a2005200641004722041094041a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100184200200341037441f80071109904200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c080b0b4200210a0b0c050b200520041048000b200420061048000b200420061048000b420021094200210a0c010b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c2002419489c5003602082002200241046a360228200220023602202002200241206a360218200241086a41a489c5001061000b832702087f027e230041f0036b22022400200241003a0090022001280200200128020420024190026a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d0090022203410f4b0d10024020030e10000b0709040c0e0a0f061003050d0208000b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a220828020020024190026a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d0f200241a0016a41186a22042005290300370300200241a0016a41106a22052006290300370300200241a0016a41086a2206200729030037030020022002290390023703a00120024180036a41186a2207200429030037030020024180036a41106a2204200529030037030020024180036a41086a22052006290300370300200220022903a0013703800320024180016a41186a200729030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903800337038001200241003a0090022001280200200828020020024190026a410120091001210120032003280200200141016a41014b22016a3602002001450d1820022d009002220141064f0d18200241e0006a41186a220320024180016a41186a290300370300200241e0006a41106a220420024180016a41106a290300370300200241e0006a41086a220520024180016a41086a29030037030020022002290380013703602000410f3a0000200041216a20013a000020002002290360370001200041096a2005290300370000200041116a2004290300370000200041196a2003290300370000200041226a2002280158360100200041266a200241dc006a2f01003b0100200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0f200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410c3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241306a2001104a2002280230450d1520022802342101200020022f0090023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024192026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241206a2001104a2002280220450d1620022802242104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1d0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241286a2001104a2002280228450d15200228022c2104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1c0b200041113a0000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241186a2001104a2002280218450d14200228021c2101200020022f0090023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024190026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200141046a28020021032002410036029002200141086a220541002001280200200320024190026a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0a2002280290022101200041063a0000200041046a2001360200200020022f00a0013b0001200041036a200241a2016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0a200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410e3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b20024190026a41186a2206420037030020024190026a41106a2207420037030020024190026a41086a22084200370300200242003703900241002103200141086a220541002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20052802006a36020002402001411f4d0d00200241a0016a41186a22012006290300370300200241a0016a41106a22032007290300370300200241a0016a41086a2204200829030037030020022002290390023703a00120024180016a41186a200129030037030020024180016a41106a200329030037030020024180016a41086a2004290300370300200220022903a00137038001410121030b20024180036a41186a220120024180016a41186a29030037030020024180036a41106a220420024180016a41106a29030037030020024180036a41086a220520024180016a41086a2903003703002002200229038001370380032003450d0a200241e0006a41186a22032001290300370300200241e0006a41106a22012004290300370300200241e0006a41086a220420052903003703002002200229038003370360200041093a000020002002290360370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280058360000200041246a200241db006a280000360000200241f0036a24000f0b200241c8006a2001104b2002290348a7450d102002290350210a200241c0006a2001104a2002280240450d1120022802442103200241386a2001104a2002280238450d15200228023c2101200020022f0090023b00012000410b3a0000200041106a200a370300200041086a2001360200200041046a2003360200200041186a200229038003370300200041036a20024192026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a200241003a0090022001280200200141046a28020020024190026a4101200141086a22032802001001210520032003280200200541016a41014b22056a22063602002005450d0820022d009002220741034f0d082002420037038003200141086a220341002001280200200141046a220828020020024180036a41082006100122052005417f461b2205410820054108491b20032802006a2206360200200541074d0d12200229038003210a2002420037038003200341002001280200200828020020024180036a41082006100122012001417f461b2201410820014108491b20032802006a360200200141074d0d13200041106a200229038003370300200041086a200a370300200041046a2004360200200020073a0001200041053a0000200041186a200229038001370300200041206a20024180016a41086a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1420032001360200200341046a200241a0016a41ec001094041a200041083a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a20022001104c2002290300a7450d0c200241106a290300210a2002290308210b200020022f00603b0001200041013a0000200041086a200b370300200041046a2004360200200041186a200229038001370300200041106a200a370300200041036a200241e2006a2d00003a0000200041206a20024180016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1220032001360200200341046a200241a0016a41ec001094041a200041073a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00002004102420041023200241f0036a24000f0b200041033a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c050b200041113a00000c040b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2004102420041023200241f0036a24000bd00301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081001210420012001280208200441016a41014b22046a2205360208024002402004450d00024002400240024020022d000f220641037122044102460d0020044101460d0120040d0320064102762104410121030c050b4100210420024100360208200220063a000841012103200141086a220641002001280200200141046a280200200241086a41017241032005100122012001417f461b2201410320014103491b20062802006a360200200141024d0d01200228020841027621040c040b41002104200241003b010c200220063a000c2001280200200141046a2802002002410c6a4101724101200510012103200141086a22012001280200200341016a41014b22016a3602002001450d0020022f010c4102762104410121030c030b410021030c020b200641034b0d01200141046a28020021044100210320024100360204200141086a2206410020012802002004200241046a41042005100122012001417f461b2201410420014104491b20062802006a360200200141034d0d0020022802042104410121030c010b0b2000200436020420002003360200200241106a24000bc50503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081001210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c080b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100122012001417f461b2201410320014103491b20042802006a360200200141024d0d022002280208410276ad2106420121070c070b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0108410276ad2106420121070c060b200541027622044104460d0120040d02200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0020023502082106420121070c050b42002106420021070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100122012001417f461b2201410820014108491b20042802006a360200200141074d0d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031001210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000be40603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002402003450d000240024002400240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c060b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100122012001417f461b2201410320014103491b20032802006a360200200141024d0d022002280210410276ad21060c050b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0110410276ad21060c040b20054102762203410c460d0120034104460d0220030d04200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d00200235021021060c030b420021060c060b420021082002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100122012001417f461b2201411020014110491b20032802006a3602002001410f4d0d04200241106a41086a290300210720022903102106420121080c060b4200210620024200370310200141086a220341002001280200200141046a280200200241106a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d04200229031021060b42002107420121080c040b200341046a220941104b0d00200141046a210a200141086a21054200210642002107410021030340200241003a00102001280200200a280200200241106a410120041001210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f80071109904200241086a29030020078421072002290300200684210642012108200341016a220341ff01712009490d000c040b0b420021080b0c010b42002107420021080b2000200637030820002008370300200041106a2007370300200241206a24000bfb0601017f0240024002400240024020012d0000417f6a2202410f4b0d00024002400240024002400240024002400240024002400240024002400240024020020e10000a0608030b0d090e050f02040c0107000b41f00010262202450d102002200141046a280200104e200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b2000410f3a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b2000410c3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d0e2002200141046a280200104e200041046a2002360200200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200020012d00013a00010f0b2000410d3a00000f0b2000410a3a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041103a00000f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b41f00010262202450d092002200141046a280200104e200041083a0000200041046a20023602000f0b200041023a0000200041046a200141046a2802003602000f0b200041063a0000200041046a200141046a2802003602000f0b2000410e3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d062002200141046a280200104e200041073a0000200041046a20023602000f0b200041093a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041106a200141106a290300370300200041046a200141046a2902003702000f0b4184bfc000104f000b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000bca1904027f027e077f027e230041c0016b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d272003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a2003450d0620012802042106200310262201450d1e2001200620031094041a0c070b2001410c6a2802002203417f4c0d192003450d0720012802042106200310262201450d1e2001200620031094041a0c080b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121010b200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121010b200020013602042000410a3602002000410c6a2003360200200041086a2003360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b20034101102a000b20034101102a000b41f0004108102a000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141a886c500360210200142013702042001200141186a36020020012003370328200120023703202001200141206a1061000be21904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a2802002106410021070c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241d0006a41086a200141186a290200370300200241d0006a41106a200141206a290200370300200241d0006a41186a200141286a2d00003a00002002200141106a290200370350200141096a2f00002001410b6a2d00004110747241087421072001410c6a2802002106410021030b200241106a41186a200241d0006a41186a280200360200200241106a41106a200241d0006a41106a290300370300200241106a41086a200241d0006a41086a2903003703002002200229035037031020032007722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290310370200200041186a200241106a41086a290300370200200041206a200241106a41106a290300370200200041286a200241106a41186a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041002103410221010c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000bbe0703037f017e077f024002400240024002400240024002400240024002402001280200417f6a220241044b0d000240024002400240024002400240024002400240024020020e050004020301000b2001410c6a2802002202417f4c0d13200128020421034101210102402002450d00200210262201450d0c0b20012003200210940421012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002204ad420c7e2205422088a70d122005a72202417f4c0d12200128020421032002450d03200210262206450d0b410c21072004450d040c100b2001410c6a2802002202417f4c0d11200128020421012002450d042002102622030d0520024101102a000b2001410c6a2802002206ad42187e2205422088a70d102005a72203417f4c0d10200128020421022003450d0520031026220c450d0a2006450d060c0b0b20004102360200200041086a200141086a2903003703000f0b41042106410c210720040d0c0b410021090c0c0b410121030b20032001200210940421012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210c20060d050b4100210b0c050b41b89ac300104f000b20024101102a000b20024104102a000b20034104102a000b2002200641186c6a21044100210b200c21010340200241086a2802002203417f4c0d050240024002402003450d0020022802002107200310262209450d012009200720031094041a200241146a2802002207417f4c0d080c020b41012109200241146a2802002207417f4a0d010c070b20034101102a000b024002402007450d002002410c6a280200210820071026220a450d04200a200820071094041a0c010b4101210a0b20012009360200200141146a2007360200200141106a20073602002001410c6a200a360200200141086a2003360200200141046a2003360200200141186a2101200b41016a210b200241186a22022004470d000b0b2000200c360204200041043602002000410c6a200b360200200041086a20063602000f0b20074101102a000b2003200420076c6a210841002109200621020340200341086a2802002201417f4c0d022003280200210a024002402001450d0020011026220b0d010c050b4101210b0b200b200a2001109404210a200241086a2001360200200241046a20013602002002200a360200200220076a2102200941016a2109200320076a22032008470d000b0b2000200636020420004105360200200020076a2009360200200041086a20043602000f0b101d000b20014101102a000bae0a01047f230041206b220224000240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d12200128020421044101210502402003450d00200310262205450d140b20052004200310940421052000410c6a2003360200200041086a20033602002000200536020420004101360200200041106a200141106a290200370300200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210541012103200141086a22042d00004101470d062001410c6a28020021040c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c200128020421052003450d092003102622040d0a20034101102a000b4101210320012d00044101470d06200141086a28020021050c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030b200020033a0004200020022f011c3b0005200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20042005200310940421052000410c6a2003360200200041086a20033602002000200536020420004102360200200041106a200141106a290200370300200241206a24000f0b41d8b8c200104f000b101d000b20034101102a000b900201027f024002400240024020012d000022024103460d00024020024102460d0020024101470d0241f00010262202450d032002200141046a28020010b703200041013a0000200041046a20023602000f0b200141046a280200210341f00010262202450d032002200141086a28020010b703200041086a2002360200200041046a2003360200200041023a00000f0b200041033a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b41f496c400104f000b41f0004108102a000b41f0004108102a000b840f02057f037e230041c0006b220224000240024002400240024020012d0000417f6a220341054b0d000240024002400240024002400240024002400240024002400240024020030e06000402030105000b200041e0006a200141e0006a280200360200200041d8006a200141d8006a290300370300200041d0006a200141d0006a290300370300200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041e4006a200141e4006a2d00004100473a0000200041013a0000200241c0006a24000f0b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2005290300370000200041096a20062903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a0000200241c0006a24000f0b41012104200141046a2d00004101470d03200141086a28020021050c040b200141386a2903002107200141306a2903002108200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d0b2003450d04200141246a2802002104200310262201450d0c2001200420031094041a0c050b2001410c6a2802002203417f4c0d0a200141106a29030021072003450d05200141046a2802002104200310262201450d0c2001200420031094041a0c060b200241186a200141196a290000370300200241106a200141116a290000370300200241086a200141096a29000037030020022001290001370300200241206a41186a200141396a290000370300200241206a41106a200141316a290000370300200241206a41086a200141296a2900003703002002200141216a290000370320200141cc006a2802002203ad2207421b88a70d092007420586a72204417f4c0d09200141d8006a2903002107200141d0006a2903002108200141c4006a28020021012004450d062004102622050d0720044101102a000b200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002105410021040b200141306a2802002203417f4c0d07200141c0006a2903002107200141386a2903002108200141c8006a2903002109024002402003450d00200141286a2802002106200310262201450d0c2001200620031094041a0c010b410121010b200041c0006a2007370300200041386a2008370300200041056a20022f01003b0000200041046a20043a0000200041086a20053602002000410c6a2002290320370200200041c8006a2009370300200041306a20033602002000412c6a2003360200200041286a2001360200200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a0000200241c0006a24000f0b410121010b20002002290320370001200041043a0000200041386a2007370300200041306a2008370300200041c0006a20093703002000412c6a2003360200200041286a2003360200200041246a2001360200200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a290300370000200241c0006a24000f0b410121010b200041023a00002000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2007370300200241c0006a24000f0b410121050b2005200120034105741094042101200041d8006a2007370300200041d0006a2008370300200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000020002002290300370001200041216a2002290320370000200041296a200241206a41086a290300370000200041316a200241206a41106a290300370000200041396a200241206a41186a290300370000200041cc006a2003360200200041c8006a2003360200200041c4006a2001360200200041063a0000200241c0006a24000f0b41a48fc300104f000b101d000b20034101102a000b20034101102a000b20034101102a000b940d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410c4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b41012103200141046a2d00004101470d0c200141086a28020021040c0d0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2001410c6a2802002205ad2206421b88a70d122006420586a72203417f4c0d12200141046a28020021072003450d0d200310262208450d132005450d0e0c170b2000410a3a0000200041046a200141046a280200360200200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0c2006a72204417f4c0d0c200141046a28020021032004450d0920041026220b450d0e200a450d0a0c0f0b200041073a0000200241206a24000f0b2000410b3a0000200241206a24000f0b41012103200141046a2d00004101470d02200141086a28020021010c030b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41e89dc100104f000b101d000b20034101102a000b20044104102a000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a00419896c400104f000bd9b40107027f027e017f017e0f7f017e077f230041b0066b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410f4b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e10000a0608030b0d0910050e02040c0107000b200141106a2903002105200141086a2903002106200141046a28020021072002411a6a2901002108200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d1e200320083702f403200320093a00f3032003200a3a00f2032003200b3b01f003410121020c1f0b200141216a2d0000210b200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d0f200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c100b200341d8006a41186a200141196a290000370300200341d8006a41106a200141116a290000370300200341d8006a41086a200141096a29000037030020032001290001370358200241166a2f01002104200241186a2d00002116200241196a2d000021072002411a6a290100210820022d0000450d11200320083702f403200320073a00f303200320163a00f203200320043b01f0030c230b2002410c6a280200210a200241086a280200210b200241046a2802002115200141106a2903002105200141086a2903002108200141046a2802002117200241036a2d0000211620022d0000210420012d0001210920022f00012107200341f0036a41086a2002411c6a2802003602002003200241146a2902003703f0032004450d1141012102201541ff01710d12200b200a4f0d130c120b2002411a6a2901002108200241196a2d00002116200241186a2d00002107200241166a2f0100211720022d0000450d14200320083702f403200320163a00f303200320073a00f203200320173b01f0030c210b20022d000120022d0000720d09200141046a28020010350c98010b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100211720022d0000450d13200320083702f403200320043a00f303200320163a00f203200320173b01f0030c1f0b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211320022d0000450d13200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c140b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d15200320083702f403200320043a00f303200320163a00f203200320073b01f0030c1d0b200141046a280200210741ef94c4002104410e211620022d0000450d9101200241046a2d00000d9101200241086a28020041036c2002410c6a280200410174490d910120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d37419fc1c0002104411521160c91010b200141046a280200210b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d17200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c180b41ef94c4002104410e21164101210720022d0000450d8d01200241046a2d00000d8d0141012107200241086a28020041036c2002410c6a280200410174490d8d01200341e8026a200141046a2802002216103820032802f002410e470d3441cac2c0002104410d21160c8d010b200341e8056a41186a200141196a290000370300200341e8056a41106a200141116a290000370300200341e8056a41086a200141096a290000370300200320012900013703e8052002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d18200320083702f403200320043a00f303200320163a00f203200320073b01f0030c190b200141046a280200210741ef94c4002104410e211620022d0000450d8c01200241086a2802004101742002410c6a280200490d8c01200241046a28020041ff01710d8c0120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d25419fc1c0002104411521160c8c010b20022d000120022d000072450d180b41b394c3002104412821160c92010b200341e0056a200141196a290000370300200341c8056a41106a200141116a290000370300200341c8056a41086a200141096a290000370300200320012900013703c805024020022d0000450d00200241236a2d00002116200241216a2f000021072002411f6a2d000021172002411d6a2f000021152002410f6a2d000021092002410d6a2f0000210a2002410b6a2d0000210b200241096a2f0000210c200241076a2d0000210d200241056a2f0000210e200241246a3502002106200241206a3100002118200241116a2900002108200241106a2d0000210f2002410c6a2d00002110200241086a2d00002111200241046a2d000021042003200241196a2800003602f803200320083703f0032004450d00200320032902f40322054238883c00ff05200320054230883c00fe05200320054220883d01fc05200320054218883c00fb05200320054210883c00fa05200320053d01f8052003200f3a00f3052003200a2009411074724108742010723600ef052003200c200b411074724108742011723600eb05200320083d01f405200320084218883c00f7052003200e200d4110747222023b01e805200320024110763a00ea0520032008a74110763a00f605200320184218862015201741107472ad42ffffff0783842007201641107472ad42ffffff0783422086842006423886843703800620034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d212003421037028c062003200341a8056a36028806200341e8026a20034188066a102f20032802e802410e460d4c200341d8006a200341e8026a41f0001094041a200341003a00af06200328028806200328028c06200341af066a410120034190066a22022802001001210420022002280200200441016a41014b22046a3602002004450d4b20032d00af0641034f0d4b20032802582102200341e0016a200341d8006a41047241ec001094041a2002410e460d4c200341f0036a200341e0016a41ec001094041a200320023602e802200341e8026a410472200341f0036a41ec001094041a2003410036026020034201370358200341e8026a200341d8006a1039200328025c2104200328026021072003280258210220034188066a41186a221742003703004110211620034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002200720034188066a1002200341d8006a41186a2017290300370300200341d8006a41106a2015290300370300200341d8006a41086a2009290300370300200320032903880637035802402004450d00200210230b200341c8056a200341d8006a41201096042102200341e8026a10244181c2c000210420020d8801200341e8026a200341c8056a105820032802f002220b450d364100210220032902f4022208422088a72204450d37024020044101460d004100210203402004410176221620026a22072002200b20074105746a200341e8056a41201096044101481b2102200420166b220441014b0d000b0b200b20024105746a200341e8056a41201096042204450d442004411f7620026a21020c370b41ef94c4002104410e21160c87010b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d84012003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200c3a00fb042003200d3a00fa042003200e3b01f8042003200f3a00f704200320103a00f604200320113b01f404200320123a00f304200320163600ef04200320043600eb04200320133a00ea04200320143b01e80420034188056a41186a20032903800537030020034188056a41106a20032903f80437030020034188056a41086a200341e8046a41086a290300370300200320032903e80437038805200341e0016a41186a200341186a41186a290300370300200341e0016a41106a200341186a41106a290300370300200341e0016a41086a200341186a41086a2903003703002003200b3a008002200320032903183703e001411510262202450d432002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d4420022003290388053700152002412d6a20034188056a41186a290300370000200241256a20034188056a41106a2903003700002002411d6a20034188056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d172003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322044102460d4a200341386a41186a200341a2036a290100370300200341386a41106a2003419a036a290100370300200341386a41086a20034192036a290100370300200341d8006a41086a200341b3036a290000370300200341d8006a41106a200341bb036a290000370300200341d8006a41186a200341c3036a2900003703002003200329018a033703382003200341ab036a290000370358200341aa036a2d000021070c82010b200241026a2f01002115200241046a2d00002109200241056a2d0000210a200241066a2f0100210b200241086a2d0000210c200241096a2d0000210d2002410a6a2f0100210e2002410c6a2d0000210f2002410d6a2d000021102002410e6a2f01002111200241106a2d00002112200241116a2d00002113200241126a2f01002114200241146a2d00002119200241156a2d0000211a20022d00012102200320083703f003200241ff01714101470d11410f10262202450d4f200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d502002200329035837000f200241276a200341d8006a41186a221c2903003700002002411f6a200341d8006a41106a221d290300370000200241176a200341d8006a41086a221e29030037000020034188066a41186a2217420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062002412f20034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003200341f0036a412041a886c5004100410010012117200210232017417f460d284191c2c0002104410f21160c83010b410021020b200220072016411074727241ff0171450d00201710244128211641b394c30021040c010b4200210620034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d3f20032903e80221060b200341e8026a201741f0001094041a200341d8006a2006200842c0ca01200842c0ca01561b7c200341e8026a20092005102d4101210720032802584101470d10200328025c2204450d10200341d8006a41086a28020021160b201710234100211541012107410121170c84010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a20022d00012102200320083703f003200241ff01714101470d0c410f10262202450d4c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d4d20022008370027200220163a0026200220073a0025200220173b0023200220153a0022200220093a00212002200a3b001f2002200b3a001e2002200c3a001d2002200d3b001b2002200e3a001a20022010410874201172200f4118747236001620022013410874201472201241187472360012200220193a00112002201a3b000f20034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c85010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a200141026a2d0000211b200141046a280200211f20022d0001210220012d0001211c200320083703f00341012107200241ff01714101470d0b2003200837038003200320043a00ff02200320163a00fe02200320173b01fc02200320153a00fb02200320093a00fa022003200a3b01f8022003200b3a00f7022003200c3a00f6022003200d3b01f4022003200e3a00f302200320193a00ea022003201a3b01e80220032010410874200f411874722011723600ef02200320134108742014722012411874723600eb02200341e8026a201f201c41ff0171410047201b105a2104412221160c7e0b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002114200241066a2f01002119200241056a2d0000211a20022d00012104200320083703f00341012102200441ff01714101470d002019410874201a722014411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d7a2003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200b3a00fb042003200c3a00fa042003200d3b01f8042003200e3a00f7042003200f3a00f604200320103b01f404200320113a00f304200320163600ef04200320043600eb04200320123a00ea04200320133b01e804411510262202450d3b2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3c200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0f411510262202450d412002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d42200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d162003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322164102460d45200341d8006a41086a20034192036a290100370300200341d8006a41106a2003419a036a290100370300200341d8006a41186a200341a2036a290100370300200341e0016a41086a200341b3036a290000370300200341e0016a41106a200341bb036a290000370300200341e0016a41186a200341c3036a2900003703002003200329018a033703582003200341ab036a2900003703e001200341aa036a2d0000211720032d0088032115200341f0036a412010030c170b200141026a2d0000211a200141046a280200211b20012d0001211f200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d0720032008370370200320043a006f200320163a006e200320073b016c200320173a006b200320153a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320143a005a200320193b01582003200f410874200e4118747220107236005f2003201241087420137220114118747236005b200341e8026a200341d8006a104220032d00e8024101470d17200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a29000037038003200320043602fc02200320083702f402200320023a00f302200320053700eb02200320073a00ea02200320163b01e802200341e8026a201b201f41ff0171410047201a105a2104412221160c790b2002410c6a2d000021162002410a6a2f01002117200241096a2d00002115200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21154100211641db94c3002104410021170b201741ffff0371410874201641187472201541ff017172211620020d0820032008370370200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200642ffffe883b1de165620054200522005501b0d0741f0bfc0002104410d21160c080b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21174100211641db94c3002104410021070b200741ffff0371410874201641187472201741ff017172211620020d7320032008370370200320153a006f200320093a006e2003200a3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200341e8026a200b102220032802f8022217450d0720034184036a2802002116200341e8026a41186a280200210420032802fc022102200341106a200341d8006a20032902ec02220842208620033502e802842205200341f4026a3502004220862008422088842208105b2003280210450d0d41d4c0c0002104411a21162002450d73201710230c730b200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d00200320083703f801200320043a00f701200320163a00f601200320073b01f401200320173a00f301200320153a00f201200320093b01f0012003200a3a00ef012003200b3a00ee012003200c3b01ec012003200d3a00eb01200320143a00e201200320193b01e0012003200f410874201072200e411874723600e701200320124108742013722011411874723600e301200341e8026a200341e8056a104220032d00e8024101470d12200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a2900003703702003200436026c20032008370264200320023a00632003200537005b200320073a005a200320163b015841a0c2c0002104200341d8006a200341e0016a41201096040d13200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e802410f10262202450d5c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d5d200220032903e80237000f200241276a200341e8026a41186a2903003700002002411f6a200341e8026a41106a290300370000200241176a200341e8026a41086a29030037000020034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c790b41db94c3002104412a21160c710b200141086a2802002107200141046a2802002102200341d8006a200141106a29030022081036200328025821162003280260220420024d0d062016200241f8006c6a2217280200410e460d072016200241f8006c6a41f0006a2802002007470d07201710242017410e360200200341e8026a41086a200341d8006a41086a280200360200200320032903583703e802411710262202450d572002410f6a41002900cb8740370000200241086a41002900c48740370000200241002900bc874037000020024117412e10272202450d582002200837001720034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002411f20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341203602e4012003200341f0036a3602e001200341e8026a200341e0016a105c2002102320032802e8022116024020032802f0022202450d00200241f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b20032802ec02450d76201610230c760b2017102341002115410121170c210b200341086a200341d8006a20062005105b2003280208450d0d41fdbfc0002104411a21160b2007102420071023410021094101210741012117410121150c760b200442003703002007420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341e8026a41186a2004290300370300200341e8026a41106a2007290300370300200341e8026a41086a201729030037030020032003290388063703e802200341e8026a412041a886c500410041001001417f460d1020034188046a420037030020034180046a4200370300200341f0036a41086a4200370300200342003703f003200341e8026a4120200341f0036a4120410010012204417f460d362004411f4d0d36200341a8056a41186a2204200341f0036a41186a290300370300200341a8056a41106a2207200341f0036a41106a290300370300200341a8056a41086a2217200341f0036a41086a290300370300200320032903f0033703a805200341c8056a41186a2004290300370300200341c8056a41106a2007290300370300200341c8056a41086a2017290300370300200320032903a8053703c805411510262204450d3d2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272207450d3e200720032903c8053700152007412d6a200341c8056a41186a290300370000200741256a200341c8056a41106a2903003700002007411d6a200341c8056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2215420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a201529030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3f200342203702ec052003200341f0036a3602e805200341e8026a200341e8056a105920032d00890322094102460d4020034188066a41186a2204200341e8026a41186a29030037030020034188066a41106a2215200341e8026a41106a29030037030020034188066a41086a2217200341e8026a41086a290300370300200320032903e8023703880620032d008803210a200341d8006a2003418a036a220c41c1001094041a200341e8056a41186a220b2004290300370300200341e8056a41106a220d2015290300370300200341e8056a41086a220e201729030037030020032003290388063703e805200320093a00e802200341e8026a410172200341d8006a41c1001094041a200341d8006a41186a2209200b290300370300200341d8006a41106a220b200d290300370300200341d8006a41086a220d200e290300370300200320032903e80537035820032d008903210e20044200370300201542003703002017420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a201729030037030020032003290388063703f00320034201370388062003410036029006412010262204450d41200342a0808080800437028c06200320043602880620042003290358370000200441086a200d290300370000200441106a200b290300370000200441186a2009290300370000200a20034188066a103f200341013a00af06200328028c0620172802002217470d13201741016a22042017490d6520174101742215200420042015491b22154100480d652017450d212003280288062017201510272204450d220c630b41b0c0c0002104412421160c6b0b41abc2c0002104410d21160c6a0b2004450d010b200441f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b0240200328025c450d00201610230b41b8c2c0002104411221160c670b4114211641edc1c00021040c660b200341386a41186a200341d8006a41186a290300370300200341386a41106a2207200341d8006a41106a290300370300200341386a41086a2215200341d8006a41086a2903003703002003200329035837033820022004470d0b200241016a22092002490d5e2002410174220a20092009200a491b2209ad4205862206422088a70d5e2006a7220a4100480d5e2002450d1820172002410574200a102722170d190c4b0b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2a20032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c660b410221160b200341a8056a41186a200341d8006a41186a290300370300200341a8056a41106a200341d8006a41106a290300370300200341a8056a41086a2207200341d8006a41086a29030037030020034188056a41086a2204200341e0016a41086a29030037030020034188056a41106a200341e0016a41106a29030037030020034188056a41186a200341e0016a41186a290300370300200320032903583703a805200320032903e00137038805200210234100210220164102460d55200341e8056a41186a200341a8056a41186a290300370300200341e8056a41106a200341a8056a41106a290300370300200341e8056a41086a2007290300370300200341c8056a41086a2004290300370300200341c8056a41106a20034188056a41106a290300370300200341c8056a41186a20034188056a41186a290300370300200320032903a8053703e80520032003290388053703c805410021020240201741ff01714101470d00411510262202450d3a2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3b200220032903c8053700152002412d6a200341e0056a290300370000200241256a200341d8056a2903003700002002411d6a200341c8056a41086a2903003700000b20164101470d05411510262204450d3b2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d3c200420032903e8053700152004412d6a200341e8056a41186a290300370000200441256a200341e8056a41106a2903003700002004411d6a200341e8056a41086a29030037000020034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062004413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3d2003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322094102460d3e200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a220a200341e8026a41186a290300370300200341d8006a41106a220b200341e8026a41106a290300370300200341d8006a41086a220c200341e8026a41086a220d290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a20032900e00137010020034182016a200341e0016a41086a2900003701002003418a016a200341e0016a41106a29000037010020034192016a200341e0016a41186a290000370100200320093a00792003419a016a20173a00002003419b016a20032903c805370000200341a3016a200341c8056a41086a290300370000200341ab016a200341c8056a41106a290300370000200341b3016a200341c8056a41186a29030037000020034188066a41186a2217420037030020034188066a41106a2209420037030020034188066a41086a220e420037030020034200370388062004413520034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a2009290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262217450d3f20172003290358370000201741086a200c290300370000201741106a200b290300370000201741186a200a290300370000200342a080808080043702ec02200320173602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022117200341f0036a412020032802e8022209200d280200100402402017450d00200910230b20041023410121172002450d0d0c520b4194bac2002104410b21160c610b20034188066a41086a2202420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a200229030037030020032003290388063703a805410021160240200341a8056a411041a886c500410041001001417f460d00200341003602e802200341a8056a4110200341e8026a41044100100141016a41044d0d2a20032802e80221160b20034188066a41086a2204420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a2217200429030037030020032003290388063703a8052003201641016a3602e802200341a8056a4110200341e8026a41041004412010262202450d3620022003290358370000200341fc026a428180808010370200200241186a200341d8006a41186a290300370000200241106a200341d8006a41106a290300370000200241086a200341d8006a41086a290300370000200320063703e802200320023602f802200320053703f0022016200341e8026a105e20044200370300200342003703880641fc88c000411520034188066a10002017200429030037030020032003290388063703a80541002102200341a8056a411041a886c500410041001001417f460d0c200342103702e4012003200341a8056a3602e001200341e8026a200341e0016a102020032802e8022217450d43200341f0026a280200210220032802ec0221150c0d0b4194bac20021040b410b21160c5e0b200341e8026a200741f0001095041a41002117200341003a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a102420071023410121070c0e0b20034188066a41186a2204420037030020034188066a41106a2209420037030020034188066a41086a220a4200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2009290300370300200341f0036a41086a200a29030037030020032003290388063703f003201741ff01714101470d06412010262204450d45200420032903c805370000200441186a200341c8056a41186a290300370000200441106a200341c8056a41106a290300370000200441086a200341c8056a41086a290300370000200341f0036a412020044120100420041023410021044100211720020d4c0c070b20034188066a41186a2204420037030020034188066a41106a2207420037030020174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d3a2004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023410021070c580b200341e8026a41186a201c290300370300200341e8026a41106a201d290300370300200341e8026a41086a201e290300370300200320032903583703e802410f10262202450d3a200241076a41002900a78640370000200241002900a086403700002002410f412f10272217450d3b201720032903e80237000f201741276a200341e8026a41186a2903003700002017411f6a200341e8026a41106a290300370000201741176a200341e8026a41086a29030037000020034188066a41186a2202420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062017412f20034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003412010262202450d3c20022008370018200220073a0017200220163a0016200220043b00142002201a3a0013200220193a0012200220143b0010200220133a000f200220123a000e200220113b000c200220103a000b2002200e410874200d72200f411874723600072002200b410874200a72200c41187472360003200220093a0002200220153b0000200341f0036a41202002412010042002102320171023410021040c5a0b200221090c0d0b4101211520032802880621040c500b20032802e8022102200341e0016a200341e8026a4104724184011094041a20032002360258200341d8006a410472200341e0016a4184011094041a200341003602f002200342013703e802200341d8006a41086a2217200341e8026a103920032802ec02210420032802f002211520032802e802210220034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002201520034188066a1002200341e0016a41186a22152009290300370300200341e0016a41106a2209200a290300370300200341e0016a41086a220a200b29030037030020032003290388063703e00102402004450d00200210230b200341e8026a41186a2015290300370300200341e8026a41106a2009290300370300200341e8026a41086a200a290300370300200320032903e0013703e802411710262202450d3b2002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d3c200220032903e8023700172002412f6a200341e8026a41186a220a290300370000200241276a200341e8026a41106a220b2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0e2017102441d7c2c0002104412521160c580b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2720032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c590b200341f0036a41201003410021044100211720020d450b41002116201720044572450d450c460b41082117410021150b200341e8026a2007104e200341386a41186a2209200341d8006a41186a290300370300200341386a41106a220a200341d8006a41106a290300370300200341386a41086a220b200341d8006a41086a2903003703002003200329035837033820152002470d41200241016a22042002490d4b20024101742215200420042015491b2215ad4298017e2208422088a70d4b2008a722044100480d4b2002450d0a201720024198016c200410272217450d0b0c410b410021024101210b420021080b200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e80220022008422088a722044b0d2e20042008a7470d3e200441016a22162004490d4920044101742207201620162007491bad22084205862205422088a70d492005a722164100480d492004450d0a200b200441057420161027220b450d0b0c3e0b200341e8026a200741f0001095041a200341023a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a10242007102341002107410121170b410121150b41012109410021040c560b200a10262217450d320b201720044105746a22022003290338370000200241186a200341386a41186a290300370000200241106a2007290300370000200241086a201529030037000041012107200341e8026a41186a200441016a360200200341fc026a2009360200200320083703f002200320053703e8022003201636028403200320173602f802200b200341e8026a105e410021040c530b2015102622040d410b20154101102a000b200a200341e0016a41186a290300370300200b200341e0016a41106a290300370300200341e8026a41086a200341e0016a41086a290300370300200320032903e0013703e802200341013a00e805411710262202450d34410021042002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d35200220032903e8023700172002412f6a200341e8026a41186a290300370000200241276a200341e8026a41106a2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2207420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2007290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f00341012107200341f0036a4120200341e8056a410110042002102320161035201710240c500b2004102622170d360b20044108102a000b20161026220b0d330b20164101102a000b41b4c1c0002104412621162008a7450d43200b10230c430b200341fc026a41013602002003410136025c2003418898c400360258200342013702ec02200341d497c4003602e8022003200341d8006a3602f802200341e8026a41e0bfc0001061000b41d4aac10041331021000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b200341d8006a10240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41154101102a000b41354101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41154101102a000b41354101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b41204101102a000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b4180e4c400104f000b41204101102a000b410f4101102a000b412f4101102a000b41204101102a000b41d4aac10041331021000b41174101102a000b41374101102a000b200a4101102a000b41174101102a000b412e4101102a000b41204101102a000b410f4101102a000b412f4101102a000b41174101102a000b41374101102a000b200b20024105746a221641206a2016200420026b4105741095041a201641186a200341e8026a41186a290300370000201641106a200341e8026a41106a290300370000201641086a200341e8026a41086a290300370000201620032903e80237000020034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240024002400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0220032903e8024280e90f7c21054101211641132107411310262202450d010c030b4280e90f210541012116411321074113102622020d020b20072016102a000b41d4aac10041331021000b2002410f6a41002800e9c140360000200241086a41002900e2c140370000200241002900dac140370000024002402002200741331027220c450d00200c20032903c805370013200c412b6a200341c8056a41186a290300370000200c41236a200341c8056a41106a290300370000200c411b6a200341c8056a41086a29030037000020034188066a41186a2202420037030020034188066a41106a2207420037030020034188066a41086a221742003703002003420037038806200c413320034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341003602f002200342013703e802410810262202450d01200220053700002003428880808080013702ec02200320023602e8022003200420166a2202360258200341d8006a200341e8026a10410240024002402002450d00200441057441206a21154100200341e8026a41086a28020022046b210720032802e802210920032802ec022117200b210203400240201720076a411f4b0d00200441206a22162004490d112017410174220a20162016200a491b22164100480d11024002402017450d00200920172016102722090d010c060b201610262209450d050b201621170b200920046a22162002290000370000201641186a200241186a290000370000201641106a200241106a290000370000201641086a200241086a290000370000200741606a2107200441206a2104200241206a2102201541606a22150d000b200341f0026a2004360200200320173602ec02200320093602e8020c010b200341f0026a280200210420032802ec02211720032802e80221090b2008a72102200341f0036a412020092004100402402017450d00200910230b200c102302402002450d00200b10230b200341e8026a41086a410a3a0000200341f1026a20032903e80537000020034191036a20032903c805370000200341f9026a200341e8056a41086a29030037000020034181036a200341e8056a41106a29030037000020034189036a200341e8056a41186a29030037000020034199036a200341c8056a41086a290300370000200341a1036a200341c8056a41106a290300370000200341a9036a200341c8056a41186a290300370000200341053a00e802200341b8036a20053703004100210441a886c5004100200341e8026a102c20034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411010030c1b0b20164101102a000b41334101102a000b41084101102a000b201720024198016c220c6a200341e8026a41f000109404220420163602702004418c016a200929030037020020044184016a200a290300370200200441fc006a200b290300370200200420032903383702742003200241016a22023602f002200320153602ec02200320173602e80220034188066a41086a22044200370300200342003703880641fc88c000411520034188066a1000200341a8056a41086a200429030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a102502402002450d00200c4198016a21042017210203402002102420024198016a2102200441e87e6a22040d000b0b02402015450d00201710230b20034180036a2005370300200341f8026a2006370300200341f4026a201636020041002109200341f0026a41003a0000200341053a00e80241a886c5004100200341e8026a102c2007102420071023410121074101211741012115410021040c190b20034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d032003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d0089034102460d04200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a2209200341e8026a41186a290300370300200341d8006a41106a220a200341e8026a41106a290300370300200341d8006a41086a220b200341e8026a41086a220c290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a200341e0016a41c10010940420032903e80537010020034182016a200341e8056a41086a2903003701002003418a016a200341e8056a41106a29030037010020034192016a200341e8056a41186a290300370100200320163a007920034188066a41186a2216420037030020034188066a41106a220d420037030020034188066a41086a220e420037030020034200370388062002413520034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a200d290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262216450d0520162003290358370000201641086a200b290300370000201641106a200a290300370000201641186a2009290300370000200342a080808080043702ec02200320163602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022116200341f0036a412020032802e8022209200c280200100402402016450d00200910230b20021023410121162017200445720d010b200410230b02402002452016720d00200210230b201521020b4200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a10002007200429030037030020032003290388063703a80502400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0120032903e80221080b200342e4cab5fbb6ccdcb0e300370338200341386a200341e8046a427f427f200241187441187541027441a8f9c4006a3502004280e90f7e20087c41021062200341e8026a41086a41093a0000200341e8026a41096a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c140b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b2003201536028c06200320043602880620032d00af0621150b20034188066a41086a2209201741016a360200200420176a20153a000002400240024002400240200328028c06220a200928020022156b411f4b0d00201541206a22172015490d05200a410174220b20172017200b491b22174100480d05200a450d012004200a201710272204450d020c030b200a21170c030b2017102622040d010b20174101102a000b2003201736028c0620032004360288060b2009201541206a220b360200200420156a220941086a20034188056a41086a290300370000200941106a20034188056a41106a290300370000200941186a20034188056a41186a290300370000200920032903880537000002400240024002400240024002400240024002400240200c4100200e4101461b2209450d004101210c200341013a00af062017200b470d01201741016a220a2017490d0b2017410174220c200a200a200c491b220a4100480d0b2017450d0320042017200a10272204450d040c090b41002109200341003a00af062017200b470d01201741016a22092017490d0a2017410174220a20092009200a491b220c4100480d0a2017450d0420042017200c10272204450d050c060b2017210a0c080b2017210c0c050b200a102622040d050b200a4101102a000b200c102622040d010b200c4101102a000b2003200c36028c06200320043602880620032d00af0621090b20034190066a201541216a22153602002004200b6a20093a00000c050b2003200a36028c06200320043602880620032d00af06210c0b20034188066a41086a220d201541216a3602002004200b6a200c3a0000024002400240200a200d28020022176b411f4b0d00201741206a22152017490d03200a410174220b20152015200b491b220c4100480d03200a450d012004200a200c10272204450d020c040b200a210c0c040b200c102622040d020b200c4101102a000b101e000b2003200c36028c0620032004360288060b200d201741206a2215360200200420176a221741086a200941086a290000370000201741106a200941106a290000370000201741186a200941186a290000370000201720092900003700000b200341f0036a41202004201510040240200c450d00200410230b2007102320034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d022004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023200341d8006a41186a200341c8056a41186a290300370300200341d8006a41106a200341c8056a41106a290300370300200341d8006a41086a200341c8056a41086a290300370300200320032903c805370358410121070b410021040b2003418d036a20073a00002003418e036a2003290358370100200341f5026a200341386a41086a290300370000200341fd026a200341386a41106a29030037000020034185036a200341386a41186a29030037000020034196036a200341d8006a41086a2903003701002003419e036a200341d8006a41106a290300370100200341a6036a200341d8006a41186a290300370100200320043a00ec02200320032903383700ed022003200341e0016a3602e80220034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a200729030037030020032003290388063703f003200341003602900620034201370388060240412010262204450d00200420032903e001370000200441186a200341e0016a41186a290300370000200441106a200341e0016a41106a290300370000200441086a200341e0016a41086a290300370000200342a0808080800437028c062003200436028806200341e0016a41206a2d000020034188066a103f200341e8026a41047220034188066a105d200328028c062104200341f0036a412020032802880622172007280200100402402004450d00201710230b20021023200342e4cab5fbb6ccdcb0e3003703e004200341e0046a200341e8046a427f1063200341e8026a41086a41083a0000200341f1026a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a29030037000020034191036a200329031837000020034199036a200341186a41086a290300370000200341a1036a200341186a41106a290300370000200341a9036a200341186a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c020b41204101102a000b41204101102a000b410121070b410121170c020b200710242007102341002117410121070c010b200710242007102341012117410021070b410121150b410121090c030b410021040b410121070b4101211741012115410121090b0240024002400240024002400240024020012d0000417f6a2202410e4b0d0020020e0f030000000400010200000008000808030b200241074b0d07024020020e080008080806080507000b200141046a22022802001024200228020010230c070b2017450d06200141046a22022802001024200228020010230c060b2007450d05200141046a22022802001024200228020010230c050b2009450d04200141046a22022802001024200228020010230c040b2015450d03200141046a22022802001024200228020010230c030b200141046a22022802001024200228020010230c020b200141046a22022802001024200228020010230c010b200141046a22022802001024200228020010230b2000201636020420002004360200200341b0066a24000bc40302047f017e230041d0006b2202240002400240411310262203450d002003410f6a41002800e9c140360000200341086a41002900e2c140370000200341002900dac14037000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034133200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d002002200236022020024120360224200242003703302002410020024120200241306a41084100100122012001417f461b2201410820014108491b360228200141074d0d0220022903302106200241306a200241206a102820022802302201450d022000200229023437020c20002001360208200020063703000c010b200041003602080b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000b960d01097f23004180026b22022400200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e0012001410020012802002001280204200241e0016a41202001280208100122062006417f461b22064120200641204922061b20012802086a22073602080240024020060d00200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e0012001280200200141046a280200200241e0016a4101200710012106200141086a22032003280200200641016a41014b22066a22033602002006450d0020022d00e001220641064f0d00200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c00137030041002105200241003a00e0012001280200200141046a280200200241e0016a4101200310012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220541002001280200200141046a280200200241e0016a41202004100122032003417f461b2203412020034120491b20052802006a22043602002003411f4d0d02200241c0016a41186a22032007290300370300200241c0016a41106a22052008290300370300200241c0016a41086a22072009290300370300200220022903e0013703c001200241a0016a41186a22082003290300370300200241a0016a41106a22032005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200329030037030020024180016a41086a2005290300370300200220022903a00137038001410121050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a290300370300200220022903800137036041002107200241003a00e0012001280200200141046a280200200241e0016a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220341002001280200200141046a280200200241e0016a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d02200241c0016a41186a22012007290300370300200241c0016a41106a22032008290300370300200241c0016a41086a22042009290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121070b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220420024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200020053a0021200020063a0020200041c2006a20073a0000200020022903403700222000412a6a200a290300370000200041326a20092903003700002000413a6a2008290300370000200041c3006a2002290320370000200041cb006a2004290300370000200041d3006a2003290300370000200041db006a200129030037000020024180026a24000f0b200041023a002120024180026a24000f0b200041023a002120024180026a24000bc70f030a7f017e057f230041f0006b220424000240024002400240024002400240024002400240024002400240024002400240411a10262205450d00200541186a41002f00dc86403b0000200541106a41002900d48640370000200541086a41002900cc8640370000200541002900c486403700002005411a413410272205450d012005200136001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c50041004100100121062005102302400240024002402006417f460d00200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411010262205450d06200541086a4100290098864037000020054100290090864037000020054110412010272205450d07200520013600102005412041c00010272205450d08200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c500410041001001210c20051023200c417f470d0b200441086a200110302006200041186a2900003703002007200041106a2900003703002008200041086a2900003703002004200029000037034820042802102206200428020c220d470d01200641016a22052006490d0c20064101742207200520052007491b220dad420586220e422088a70d0c200ea722074100480d0c2006450d022004280208200641057420071027220f450d030c090b200441f0006a240041fcc2c0000f0b200641016a21052004280208210f0c080b20071026220f0d060b20074101102a000b411a4101102a000b41344101102a000b41104101102a000b41204101102a000b41c0004101102a000b2004200d36020c2004200f3602080b200441086a41086a2005360200200f20064105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a290300370000411310262206450d072006410f6a41002800e28740360000200641086a41002900db8740370000200641002900d3874037000020064113412610272210450d0820102001360013200441c8006a41186a22074200370300200441c8006a41106a22084200370300200441c8006a41086a220642003703002004420037034820104117200441c8006a1002200441286a41186a2007290300370300200441286a41106a2008290300370300200441286a41086a20062903003703002004200429034837032820044100360250200442013703482004200536026c200441ec006a200441c8006a1041024002402005450d00200541057421114100200628020022066b210820042802482112200428024c210c200f210503400240200c20086a411f4b0d00200641206a22072006490d05200c4101742213200720072013491b22074100480d0502400240200c450d002012200c2007102722120d010c080b200710262212450d070b2007210c0b201220066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b200441d0006a20063602002004200c36024c200420123602480c010b20062802002106200428024c210c200428024821120b200441286a41202012200610040240200c450d00201210230b20101023200d450d00200f10230b2009200041186a290000370300200a200041106a290000370300200b200041086a29000037030020042000290000370308411010262205450d02200541086a4100290098864037000020054100290090864037000020054110412010272205450d03200520013600102005412041c00010272205450d04200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110262206450d05200641807f410020021b2003723a0000200441286a41202006410110042006102320051023200441f0006a240041000f0b101e000b20074101102a000b41104101102a000b41204101102a000b41c0004101102a000b41014101102a000b41134101102a000b41264101102a000ba80704027f017e037f037e230041d0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310024002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d022007410f4d0d02200441386a290300210a200429033021060c010b4200210a0b2005102302400240200620025a200a20035a200a2003511b0d0041a9b8c2002105411521010c010b200441086a20014104200620027d220b200a20037d2006200254ad7d2206108302024020042802082205450d00200428020c21010c010b411810262205450d05200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a2900003700004200210a200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054138200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429033037031002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d062007410f4d0d06200441386a290300210c2004290330210a0c010b4200210c0b200510232001200a20027c2202200c20037c2002200a54ad7c10fe012001200b200610df01410021050b2000200136020420002005360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b9c0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021041024002400240024002402000450d00200041f8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410e470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007102722060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007102722060d060c0c0b200228020021060c030b200228020021060c050b200710262206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341f8006a2103200441887f6a22040d030c040b200710262206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a0000200320021039200341f0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c090b200228020021060c020b200010262206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341f8006a2103200441887f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100402402000450d00200310230b200241106a24000f0b101e000b20074101102a000b20074101102a000b20004101102a000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0420012802002003200410272202450d050c060b200128020021020c080b200128020021020c050b2004102622020d050b20044101102a000b2004102622020d010b20044101102a000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d0120012802002002200310272202450d020c030b200128020021020c030b2003102622020d010b20034101102a000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d0420012802002003200210272200450d050c060b200128020021020c080b200128020021000c050b2004102622020d050b20044101102a000b2002102622000d010b20024101102a000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d0120012802002002200310272202450d020c040b200128020021020c040b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000bbe0503047f027e057f230041d0006b22022400024002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272204450d0120042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1002200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a290300210620012903002107411010262203450d02200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a104102400240024002402003450d0020034105742109200241286a41086a28020021002002280228210a200228022c210b2008210303400240024002400240200b20006b41204f0d00200041206a22052000490d07200b410174220c20052005200c491b220c4100480d07200b450d01200a200b200c1027220a0d020c080b200041206a21050c020b200c1026220a450d060b200c210b0b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b200241306a20053602002002200b36022c2002200a3602280c010b200241306a2802002105200228022c210b2002280228210a0b200241086a4120200a200510040240200b450d00200a10230b200410230240200141146a280200450d00200810230b200241d0006a24000f0b101e000b200c4101102a000b41134101102a000b41264101102a000b41104101102a000bdf0401037f230041106b220224002002410036020820024201370300200020021039024002400240024002400240024002400240024002400240024002400240024002400240024020002d007022004101460d0020004102470d012002280204200241086a2802002200470d03200041016a22032000490d0b20004101742204200320032004491b22044100480d0b2000450d0720022802002000200410272203450d080c100b2002280204200241086a2802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420022802002000200410272203450d050c0d0b2002280204200241086a2802002200470d02200041016a22032000490d0920004101742204200320032004491b22044100480d092000450d0720022802002000200410272203450d080c0a0b200228020021030c0c0b200228020021030c0d0b200228020021030c080b2004102622030d080b20044101102a000b2004102622030d080b20044101102a000b2004102622030d020b20044101102a000b101e000b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41003a00000c040b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41013a00000c020b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41023a00000b200228020421002001280200200128020420022802002201200241086a280200100402402000450d00200110230b200241106a24000b110020012000280200200028020410b3010b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241a886c500360204200241a886c500360200200210f503000b831005017f017e077f027e057f230041a0016b2206240042002107200641086a41086a220842003703002006420037030841af98c300410d200641086a1000200641f8006a41086a2008290300370300200620062903083703780240024002400240024002400240024002400240200641f8006a411041a886c500410041001001417f460d0020064200370308200641f8006a4110200641086a41084100100141016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210420064201370308200641f8006a20011080022006280278210a200628027c210b200628028001220c450d02200641f8006a41186a220d2000460d01200c41286c210e42012104200a21050340200541086a2903002102200541106a2903002103200541186a290300210f20052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a200f370300200641f8006a41106a22112003370300200641f8006a41086a2002370300200620103703780240024002400240200d2900002000290000510d0020112903002007580d01200641e8006a41086a200d41086a2903003703002006200d2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c060b200541286a2105200e41586a220e0d000c030b0b41d4aac10041331021000b200c41286c210e200a41286a2105200641206a2903002102200629031821032006290310210f200629030821040340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d02200541286a210542002104200e41586a220e0d000b0b4100210c0240200b450d00200a10230b410821124100211320044201510d020c050b420021040b200641d8006a41086a220e200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2211200e29030037030020062006290358370348200641386a41086a220e201129030037030020062006290348370338024002400240412810262212450d00201220062903383703182012200f37030020122003370308201241206a200e290300370300201241106a20023703002005200a200c41286c6a220d460d01200641f8006a41186a210e4101210c41012113034002400240200e2000460d000340200641f8006a41206a200541206a290300370300200e200541186a290300370300200641f8006a41106a2211200541106a290300370300200641f8006a41086a200541086a290300370300200620052903003703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c030b200d200541286a2205470d000c060b0b200641086a41186a2903002102200629031821032006290310210f2006290308210402400340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d0142002104200d200541286a2205470d000c060b0b200541286a2105420021040b200641d8006a41086a2211200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2214201129030037030020062006290358370348200641f8006a41086a2215201429030037030020062006290348370378024002402013200c470d00200c41016a2211200c490d07200c4101742213201120112013491b2213ad42287e2210422088a70d072010a722114100480d070240200c450d002012200c41286c2011102722120d010c020b201110262212450d010b2012200c41286c6a221120033703082011200f37030020112006290378370318201141106a2002370300201141206a2015290300370300200c41016a210c2005200d470d010c040b0b20114108102a000b41284108102a000b4101210c410121130b0240200b450d00200a10230b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a2200200841186a290300370300200641f8006a41106a220e200841106a290300370300200641f8006a41086a2211200841086a29030037030020062008290300370378200c2013470d01200c41016a2205200c490d00200c410174220d20052005200d491b2213ad42287e2204422088a70d002004a722054100480d0002400240200c450d002012200c41286c200510272212450d010c030b2005102622120d020b20054108102a000b101e000b2012200c41286c6a22052006290378370300200541206a2009290300370300200541186a2000290300370300200541106a200e290300370300200541086a2011290300370300200c41016a210c0b2006200c360280012006201336027c200620123602782001200641f8006a108702200641a0016a24000bf31107017f017e087f047e017f037e057f23004180016b2203240042002104200341086a41086a220542003703002003420037030841af98c300410d200341086a1000200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041a886c500410041001001417f460d0020034200370308200341d8006a4110200341086a41084100100141016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110800220032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210802402007450d00200610230b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b2003200328024036023841281026220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2211460d00200341d8006a41186a210b200341f9006a221641036a21174101210841012115034002400240024002400240200b2000460d000340200341d8006a41206a2218200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2209200c41106a290300370300200341d8006a41086a2219200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002009290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2011200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022011200c41286a220c470d000c070b0b2003201628000036025020032017280000360053200c41286a210c2019290300211020182d00002118200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22091b21102013200f20091b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722118200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336005b20032003280240360258024020152008470d00200841016a22092008490d0620084101742219200920092019491b2215ad42287e2213422088a70d062013a722094100480d0602402008450d00200a200841286c20091027220a0d010c080b20091026220a450d070b200a200841286c6a220920183a0020200920103703082009200f3703002009200e3703182009200d370310200941246a200328005b36000020092003280258360021200841016a2108200c2011470d000c020b0b41012108410121150b02402007450d00200610230b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2209200541086a2903003703002003200529030037035820082015470d04200841016a220c2008490d0120084101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402008450d00200a200841286c200c1027220a450d010c060b200c1026220a0d050b200c4108102a000b41d4aac10041331021000b101e000b20094108102a000b41284108102a000b200a200841286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2009290300370300200841016a21080b200320083602602003201536025c2003200a3602582001200341d8006a10870220034180016a24000bf20a03027f027e077f23004190026b22022400200241206a2001104a024002402002280220450d0020022802242103200241086a2001104c2002290308a7450d00200241186a29030021042002290310210541002106200241003a00f00120012802002001280204200241f0016a410120012802081001210720012001280208200741016a41014b22076a22083602082007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220641002001280200200141046a280200200241f0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241d0016a41186a22072009290300370300200241d0016a41106a2206200a290300370300200241d0016a41086a2209200b290300370300200220022903f0013703d001200241b0016a41186a220a2007290300370300200241b0016a41106a22072006290300370300200241b0016a41086a22062009290300370300200220022903d0013703b00120024190016a41186a200a29030037030020024190016a41106a200729030037030020024190016a41086a2006290300370300200220022903b00137039001410121060b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a290300370300200220022903900137037041002109200241003a00f0012001280200200141046a280200200241f0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220741002001280200200141046a280200200241f0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241d0016a41186a22012009290300370300200241d0016a41106a2207200a290300370300200241d0016a41086a2208200b290300370300200220022903f0013703d001200241b0016a41186a22092001290300370300200241b0016a41106a22012007290300370300200241b0016a41086a22072008290300370300200220022903d0013703b00120024190016a41186a200929030037030020024190016a41106a200129030037030020024190016a41086a2007290300370300200220022903b00137039001410121090b200241306a41186a220120024190016a41186a290300370300200241306a41106a220720024190016a41106a290300370300200241306a41086a220820024190016a41086a2903003703002002200229039001370330200241d0006a41186a220a200241f0006a41186a290300370300200241d0006a41106a220b200241f0006a41106a290300370300200241d0006a41086a220c200241f0006a41086a290300370300200220022903703703502000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290350370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a2002290330370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a2002412e6a2f01003b0100200041da006a200228012a36010020024190026a24000f0b200041023a001820024190026a24000f0b200041023a001820024190026a24000bf90801067f230041106b220224002002410036020820024201370300200041106a200210412002200036020c2002410c6a2002106620022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d0320022802002004200310272205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d0420022802002004200310272205450d050c060b200228020021050c080b200228020021050c050b2003102622050d050b20034101102a000b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d0120052003200710272205450d020c030b200441206a21060c030b2007102622050d010b20074101102a000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d0120052003200410272205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d0220052003200010272205450d030c040b2004102622050d050b20044101102a000b2000102622050d010b20004101102a000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010042004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d0120022802002005200610272203450d020c040b200228020021030c040b2006102622030d020b20064101102a000b101e000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610042005450d010b200310230b200241106a24000b960a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d0520012802002000200610272205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d0820012802002005200010272205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000102722050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005102722080d0a0c110b2006102622050d130b20064101102a000b200128020021050c050b200128020021080c070b2000102622050d0d0b20004101102a000b200010262205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b200510262208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009102722060d020c060b200128020021060c020b200910262206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b101e000b20094101102a000b41b8a8c400104f000b20022002360240200241d0a8c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4105360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002410536022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0a8c4001061000b20004101102a000b20054101102a000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000bae0201027f230041106b2202240020024100360208200242013703000240412010262203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210662002200041106a36020c2002410c6a20021066200028022021032002200041286a280200220036020c2002410c6a2002104102402000450d002003200041186c6a210003402002200336020c2002410c6a20021066200341106a200210412000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100402402003450d00200010230b200241106a24000f0b41204101102a000b860100024002400240024002400240200041ff017122004101460d0020004102470d01410110262200450d03200041023a00000c020b410110262200450d03200041013a00000c010b410110262200450d03200041003a00000b20012802002001280204200041011004200010230f0b41014101102a000b41014101102a000b41014101102a000b13002000410d360204200041d0c7c0003602000b130020004107360204200041faf4c0003602000b890501077f230041b0016b22022400024002400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a22054200370300200242003703602003412e200241e0006a1002200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a20052903003703002002200229036037033002400240200241306a412041a886c500410041001001417f460d00200242203702542002200241306a360250200241e0006a200241d0006a106c2002280280012201450d0420002002290360370300200041186a200241e0006a41186a290300370300200041106a200241e0006a41106a290300370300200041086a200241e0006a41086a290300370300200241086a2204200241e0006a412c6a290200370300200241106a2205200241e0006a41346a290200370300200241186a2206200241e0006a413c6a290200370300200241206a2207200241e0006a41c4006a290200370300200241286a2208200241e0006a41cc006a280200360200200220022902840137030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b20031023200241b0016a24000f0b410e4101102a000b412e4101102a000b41d4aac10041331021000bb60709057f047e017f017e037f027e017f017e017f230041c0016b22022400200241a0016a41186a22034200370300200241a0016a41106a22044200370300200241a0016a41086a22054200370300200242003703a0012001410020012802002001280204200241a0016a41202001280208100122062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d0020024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200241c8006a2001104c2002290348a7450d01200241c8006a41106a290300210720022903502108200241306a2001104c2002290330a7450d02200241c0006a29030021092002290338210a200241286a2001104a2002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d0320061026220d450d06200b450d040c070b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b101d000b20064108102a000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a2001104c2002290310a7450d01200e290300211020022903182111200241086a2001104a2002280208450d01200341016a2106200228020c211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d200420141027220d0d010c070b20141026220d450d060b200d20046a2203201037030820032011370300200341106a2012360200200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d10230c010b200d450d00200241e0006a41186a220120024180016a41186a290300370300200241e0006a41106a220620024180016a41106a290300370300200241e0006a41086a220320024180016a41086a2903003703002002200229038001370360200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a2002290360370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241c0016a24000f0b20004100360220200241c0016a24000f0b101e000b20144108102a000bc10906047f047e017f017e097f037e230041e0016b220224000240024002400240024002400240024002400240410f10262203450d00200341076a4100290097f64037000020034100290090f6403700002003410f412f10272204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a290000370000200241f0006a41186a22014200370300200241f0006a41106a22034200370300200241f0006a41086a22054200370300200242003703702004412f200241f0006a1002200241d0006a41186a2001290300370300200241d0006a41106a2003290300370300200241d0006a41086a2005290300370300200220022903703703500240024002400240200241d0006a412041a886c500410041001001417f460d0020024220370294012002200241d0006a36029001200241386a20024190016a104c2002290338a7450d0b200241386a41106a290300210620022903402107200241206a20024190016a104c2002290320a7450d0b200241306a290300210820022903282109200241186a20024190016a104a2002280218450d0b200228021c220aad42307e220b422088a70d03200ba72201417f4c0d032001450d0120011026220c450d06200a450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210c200a0d050b410021104200210b200c450d080c050b101d000b410f4101102a000b412f4101102a000b20014108102a000b200241f0006a41186a210d200241f0006a41106a210e4200210b4100210f4100210541002101200a21100340200d4200370300200e4200370300200241f0006a41086a221142003703002002420037037020024190016a41086a2203200328020022034100200228029001200228029401200241f0006a41202003100122032003417f461b2203412020034120491b6a3602002003411f4d0d03200241c0016a41186a2212200d290300370300200241c0016a41106a2213200e290300370300200241c0016a41086a22142011290300370300200220022903703703c001200220024190016a104c2002290300a7450d03200141016a2103200241106a290300211520022903082116200241a0016a41186a22112012290300370300200241a0016a41106a22122013290300370300200241a0016a41086a22132014290300370300200220022903c0013703a001024020012010470d00200f20032003200f491b2210ad42307e2217422088a70d062017a722144100480d0602402001450d00200c200520141027220c0d010c080b20141026220c450d070b200c20056a2201201537030820012016370300200141286a2011290300370300200141206a2012290300370300200141186a2013290300370300200141106a20022903a001370300200b4280808080107c210b200f41026a210f200541306a2105200321012003200a490d000b200c450d030b200020093703102000200637030820002007370300200041246a200b2010ad843702002000200c360220200041186a20083703000b20041023200241e0016a24000f0b2010450d00200c10230b41d4aac10041331021000b101e000b20144108102a000b8b0401047f230041e0006b2202240002400240410e10262203450d00200341066a4100290094c7403700002003410029008ec7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412e200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410e4101102a000b412e4101102a000b130020004114360204200041e8f6c0003602000bf00301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10662002200336023c2002413c6a200241306a10662002280220210320022004280200220436023c2002413c6a200241306a10410240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009102722070d020c070b200441206a2108200228023021070c020b200910262207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a1066200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a28020010230b200241c0006a24000f0b101e000b20094101102a000b7001017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10412002200241086a36022c2002412c6a200241206a1066200041086a200228022836020020002002290320370200200241306a24000b3401017f0240410410262202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c000370204200020023602002002413c3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241043600000f0b41044101102a000be8dd013f017f017e037f057e107f017e037f027e037f017e037f077e207f027e027f017e027f017e087f017e067f027e247f027e057f037e017f017e287f027e037f057e117f017e017f017e0b7f027e047f017e027f027e047f017e027f017e177f017e297f027e367f017e037f027e157f027e0c7f027e077f017e087f017e037f230041b00f6b220224004200210320024190086a41086a22044200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8060240024002400240024002400240024002400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012206417f460d022006410f4d0d0220024198086a290300210720022903900821080c010b42002108420021070b20044200370300200242003703900841f798c100411820024190086a10002005200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d032004410f4d0d0320024198086a290300210920022903900821030c010b420021090b20024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8062002200320087c2208370390082002200920077c2008200354ad7c37039808200241a8066a411020024190086a41101004200442003703002002420037039008418f99c100411320024190086a10002005200429030037030020022002290390083703a806410221040240200241a8066a411041a886c500410041001001417f460d00200241003a009008200241a8066a411020024190086a41014100100141016a41014d0d0320022d0090082104200241a8066a411010030b0240200141016a410670450d00200441ff01714102472004710d0020004100360200200241b00f6a24000f0b4200210320024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a200429030037030020022002290390083703a8060240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d042004410f4d0d0420024198086a290300210a200229039008210b200241a8066a4110100342012103200b200a84500d060c070b420042008450450d060c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410121040c020b410121040c010b024002402003a7450d0020024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100210c02400240024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008220d450d02200228029408210e20024198086a280200220c41057422040d010c040b4101210d4100210e41004105742204450d020b200d20046a210f4108211020024190086a41086a2111200241a8066a41086a21124120211341122114411021154100211641322117412a2118411821194122211a411a211b4200211c41a886c500211d417f211e4101211f427f212042012121200241b8086a212241302123200241b4086a212442202125200d2126410021270c040b41d4aac10041331021000b410021040c030b410021040c020b410121040c010b410321040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e040001020f0f0b200241a0036a200b200a200cad22084200109804200241a8086a200a37030020024190086a41106a200b37030020024190086a41086a220441003a0000200241043a00900841a886c500410020024190086a102c20044200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a200429030037030020022002290390083703a806200241a8066a411041a886c5004100410010012104200241a0036a41086a290300210320022903a0032107024002402004417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0c2004410f4d0d0c20024198086a2903002109200229039008212f0c010b4200212f420021090b20024190036a202f20092008420010980402402007200384500d00200229039003220920024190036a41086a290300222d84500d004200210820024190086a41086a22044200370300200242003703900841ecb5c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0e2004410f4d0d0e20024198086a290300212f20022903900821080c010b4200212f0b200820097d222e200856202f202d7d2008200954ad7d2208202f562008202f511b0d0020024180036a202e20082009202d10970442002108200241d0026a20024180036a41086a2903002209420020074200109804200241e0026a20034200200229038003222f4200109804200241f0026a202f420020074200109804200942005220034200527120022903d8024200527220022903e80242005272200241f0026a41086a290300220320022903d00220022903e0027c7c2207200354720d0020022903f002210920024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d102004410f4d0d1020024198086a290300210320022903900821080c010b420021030b20024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a8062002427f200320077c200820097c22092008542204ad7c22072004200720035420072003511b22041b370398082002427f200920041b37039008200241a8066a411020024190086a411010040b200e450d0f200d1023410121040c4c0b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900841016a21010c010b410121010b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a2230200429030037030020022002290390083703a8062002200136029008200241a8066a411020024190086a4104100420044200370300200242003703900841f399c100411620024190086a10002030200429030037030020022002290390083703a806410021310240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900821310b20024190086a41086a22044200370300200242003703900841899ac100411d20024190086a1000200241a8066a41086a200429030037030020022002290390083703a806024002400240200241a8066a411041a886c500410041001001417f460d00200241003602900841012132200241a8066a411020024190086a41044100100141016a41044d0d06200228029008220441024f0d010c020b410421040b200421320b200241d0046a41186a22044200370300200241d0046a41106a22014200370300200241d0046a41086a22304200370300200242003703d00441a69ac100411a200241d0046a1002200241a8066a41186a2004290300370300200241a8066a41106a2001290300370300200241a8066a41086a2030290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00200241a0056a41186a4200370300200241a0056a41106a4200370300200241a0056a41086a4200370300200242003703a005200241a8066a4120200241a0056a4120410010012204417f460d052004411f4d0d0520024190086a41186a2204200241a0056a41186a220129030037030020024190086a41106a2230200241a0056a41106a223329030037030020024190086a41086a2205200241a0056a41086a2234290300370300200220022903a0053703900820012004290300370300203320302903003703002034200529030037030020022002290390083703a005410121010b412810262204450d07200420013a0004200441a886c500360200200420022903a005370005200420022f00e8053b00252004410d6a200241a0056a41086a2205290300370000200441156a200241a0056a41106a22342903003700002004411d6a200241a0056a41186a2235290300370000200441276a200241ea056a2d00003a0000200241d0046a41186a22014200370300200241d0046a41106a22304200370300200241d0046a41086a22334200370300200242003703d00441c09ac100411a200241d0046a1002200241a8066a41186a2001290300370300200241a8066a41106a2030290300370300200241a8066a41086a2033290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00203542003703002034420037030020054200370300200242003703a005200241a8066a4120200241a0056a4120410010012201417f460d062001411f4d0d0620024190086a41186a2201200241a0056a41186a223029030037030020024190086a41106a2233200241a0056a41106a220529030037030020024190086a41086a2234200241a0056a41086a2235290300370300200220022903a0053703900820302001290300370300200520332903003703002035203429030037030020022002290390083703a005410121010b412810262233450d08203320013a0004203341a886c500360200203320022903a005370005203320022f00e8053b00252033410d6a200241a0056a41086a290300370000203341156a200241a0056a41106a2903003700002033411d6a200241a0056a41186a290300370000203341276a200241e8056a41026a2d00003a0000200242003702e407200241f098c4003602e0072002410036028008200242083703f80720024190076a411c6a200241e0076a36020020024190076a41186a20024188086a360200200241003602a007200241dc9ac1003602940720022004360290072002200241f8076a3602a407200220024188086a36029c07200220024188086a3602980720024190086a20024190076a1076024002400240024020022d00d00822014102470d00200241023a00e8060c010b200241e8056a41386a223020024190086a41386a290300370300200241e8056a41306a220520024190086a41306a290300370300200241e8056a41286a223420024190086a41286a290300370300200241e8056a41206a223520024190086a41206a290300370300200241e8056a41186a220620024190086a41186a290300370300200241e8056a41106a223620024190086a41106a290300370300200241e8056a41086a222720024190086a41086a290300370300200241f0066a41086a2237200241d9086a2228290000370300200241ff066a2238200241e0086a29000037000020022002290390083703e805200220022900d1083703f00620024190076a41106a4101360200200241cc086a2030290300370200200241c4086a2005290300370200200241bc086a2034290300370200200241b4086a203529030037020020024190086a411c6a200629030037020020024190086a41146a20362903003702002002419c086a2027290300370200200220022903e80537029408200241a0056a20024190086a41c4001094041a200241003602900820024190086a410472200241a0056a41c4001094041a20024190086a41c8006a20013a0000202820022903f006370000200241e1086a2037290300370000200241e8086a2038290000370000200241a8066a20024190076a41146a20024190086a107720022d00e8064102470d010b2004102341082136410021374108213441082130410021350c010b20024190086a2004107841c80010262236450d0c2036200241a8066a41c8001094041a200241b0076a41186a20024190076a41186a290300370300200241b0076a41106a223920024190076a41106a290300370300200241b0076a41086a20024190076a41086a29030037030020022002290390073703b00720024190086a200241b0076a1076024002400240024020022d00d00822274102470d0041012135410121370c010b20024190086a41046a2104200241d9086a210520024190086a410472213a200241c4076a213b200241d1086a21342039280200213c200241a8066a41c0006a213d4102213541c800213041002101410121370340200241e8056a41386a220620024190086a41386a290300370300200241e8056a41306a222820024190086a41306a290300370300200241e8056a41286a223820024190086a41286a290300370300200241e8056a41206a223e20024190086a41206a290300370300200241e8056a41186a223f20024190086a41186a290300370300200241e8056a41106a224020024190086a41106a290300370300200241e8056a41086a224120024190086a41086a290300370300200241f0066a41086a2242203441086a290000370300200241f0066a410f6a22432034410f6a29000037000020022002290390083703e805200220342900003703f0062039203c20016a224441016a360200200441386a2006290300370200200441306a2028290300370200200441286a2038290300370200200441206a203e290300370200200441186a203f290300370200200441106a2040290300370200200441086a2041290300370200200420022903e805370200200241a0056a20024190086a41c4001094041a2002204436029008203a200241a0056a41c4001094041a20024190086a41c8006a20273a0000200520022903f006370000200541086a20422903003700002005410f6a2043290000370000200241a8066a203b20024190086a1077203d2d00004102460d0220024190086a200241a8066a41c8001094041a0240200141016a22062037470d00200241a0056a20022802b00720022802b407280210110000200641016a22272006490d362035202720272035491b2237ad42c8007e2203422088a70d362003a722274100480d3602402001417f460d00203620302027102722360d010c0d0b202710262236450d0c0b203620306a20024190086a41c8001094041a203541026a2135203041c8006a213020024190086a200241b0076a10762006210120024190086a41c0006a2d000022274102470d000b200641016a21350b20362134200241e8066a41023a00000c010b200141016a2135203621340b20022802b007220120022802b407220428020011010002402004280204450d00200110230b203421300b200241a8066a2033107920022802c806223e450d2441012145200241a0056a410172214641282147200241a8066a41286a214841242149200241a8066a41246a214a4118214b4110214c4108214d4120214e20024190086a41206a214f42c800215042202151417f21524105215342d00021544100215541d00021564200215741342158413c215941c400215a4102215b419403215c4160215d41e802215e41c800215f427f2160412c2161410121270c110b024020a101450d0020a1012092016a21a10120a201207e6a210420a20120756a227121a20120042d00000d0f20712092016a21a201207120a001470d1a0c190b209901219f010c240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20274108102a000b41284104102a000b41284104102a000b41d4aac10041331021000b41d4aac10041331021000b41c8004108102a000b41d4aac10041331021000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020270e09000102030405060708080b20262206450d1b201410262204450d0f200420156a20162f00bec7403b0000200420106a20162900b6c740370000200420162900aec74037000020042014201710272204450d1020042006290000370012200420186a200620196a2900003700002004201a6a200620156a2900003700002004201b6a200620106a290000370000200241d0046a20196a2201201c370300200241d0046a20156a2205201c370300200241d0046a20106a2228201c3703002002201c3703d00420042017200241d0046a1002200241a0056a20196a2001290300370300200241a0056a20156a2005290300370300200241a0056a20106a2028290300370300200220022903d0043703a00502400240200241a0056a2013201d201620161001201e460d0020022025370294082002200241a0056a36029008200241b8046a20024190086a104a20022802b804450d10200241a0046a20024190086a104c20022903a004a7450d10200241a0046a20156a290300210320022903a80421070c010b42002107420021030b200410230240024002400240200b2007200b2007200b542003200a542003200a511b22041b22297d222a200a2003200a20041b222b7d200b202954ad7d222c84500d0020024190086a2006106d42002109201129030022034200200229039008220720215620034200522003501b22041b212d2007202120041b212e20024190086a20136a280200212820222802002204450d01202e202d84500d192028200420236c6a210142002109420021082028210402400340200241f8036a2004290300200420106a290300202a202c109804200241e8036a20022903f803200241f8036a20106a290300202e202d10970420024188046a200420156a220420022903e803200241e8036a20106a290300107a20022903880421032002290390042107200241a8066a20156a20024188046a20156a290300222f37030020122007370300200220033703a80602402003a7201f470d0020202008202f7c200920077c22072009542205ad7c22032005200320085420032008511b22051b21082020200720051b2109200420136a22042001470d010c020b024020032021520d00200220123602a005200241a0056a107b0b200420136a22042001470d000b0b202e202d84201c520d020c160b420021094200210842002103420021070c020b42002108202e202d84201c510d140b200241d8036a20024190086a20156a29030020024190086a20196a290300202a202c109804200241c8036a20022903d803200241d8036a20106a290300202e202d109704200241c8036a20106a290300210720022903c80321032024280200450d00202810230b200620136a2126200241b0036a2006200320297c222f2007202b7c202f200354ad7c107a20022903b003210320022903b803210720024190086a20156a200241b0036a20156a290300222f370300201120073703002002200337039008024002402003a7201f470d0020202008202f7c200920077c22072009542204ad7c22032004200320085420032008511b22041b21082020200720041b21090c010b20032021520d00200220113602a806200241a8066a107b0b20022008370398082002200937039008200220024190086a3602a806200241a8066a107b2026200f470d16410021040c590b20482802002162204a2802002163200241b0076a204b6a2264200241a8066a204b6a290300370300200241b0076a204c6a2265200241a8066a204c6a290300370300200241b0076a204d6a2266200241a8066a204d6a290300370300200220022903a8063703b007200241a0056a200241b0076a106e02400240024020022d00a0052045470d00200241e8056a204b6a2046204b6a290000370300200241e8056a204c6a2046204c6a290000370300200241e8056a204d6a2046204d6a290000370300200220462900003703e80520024190086a200241e8056a106b204f2802002204450d0120024190086a204d6a2903002167200229039008216820024190086a20496a280200450d02200410230c020b204f20553602000b42002168420021670b2062ad20507e2203205188a70d3e2003a7220420524c0d3e0240024002402004450d00200410262269450d0d20622053742204450d020c010b4108216920622053742204450d010b203e20046a216a4100216b203e216c4100216d0c290b4100216b0c300b02402035450d0020762104034002402030207e6a2d0000450d00203020756a213020042092016a22040d010c020b2030208a016a290300220320980120032098015620302087016a2903002203209501522003501b22011b2207200320950120011b220384209501510d0a200241c0026a209601209601200720031097042030200241c0026a207a6a290300370308203020022903c002370300203020756a213020042092016a22040d000b0b20022802f807229b01207b280200229c01207c6c6a219d01209c01450d24209b01219e014101216d0c280b200220a70120ab016a2d00003a00aa06200220a7012f002c3b01a806200220a70120ac016a29000037039008200220a70120ad016a2900003700950820a7012802282204450d2d20a70128022022ce01200420ae016c6a21cf0120a70120af016a28000021d00120a70120b0016a28000021d10120a70120b1016a28000021d20120a70120b2016a28000021d30120a70120b3016a21d401410021d501410821d601410021d7014103216d0c280b200241d0046a20e2016a224020fb0120e2016a290200370300200241d0046a20e3016a224120fb0120e3016a290200370300200241d0046a20e4016a224220fb0120e4016a290200370300200220fb012902003703d004200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002204450d0120024190086a20e4016a290300212b20022903900821fc0120e801280200450d02200410230c020b20e70120e1013602000b420021fc014200212b0b20fb0120e6016a280200210141082138410021064100213f024020fb01280228220420e9016c222720e901490d002004ad20ea0186220320eb0188a70d3b2003a7220520e101480d3b200510262238450d102004213f0b02402001200120276a460d0041002106203821040340200120ee016a2903002107200120e6016a2903002103200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002205450d0120024190086a20e4016a2903002108200229039008210920e801280200450d02200510230c020b20e70120e1013602000b42002109420021080b200241e0006a200720f00120092008107c220820f001109804200241f0006a200320f001200820f00110980420024190086a20e4016a220520f001370300200220f0013703900820f20120f10120024190086a1000200241d0006a20f00120f001200320f001109804200241a8066a20e4016a200529030037030020022002290390083703a8062002290358212f2002290368212d200229035021092002290360212e200241f0006a20e4016a29030021082002350274212a02400240200241a8066a20e30120f50120e10120e101100120f601460d00200220f00137039808200220f00137039008200241a8066a20e30120024190086a20e30120e1011001222820f601460d08202820f8014d0d08200241c0006a200229039008200529030020f40120f001109704200241c0006a20e4016a290300222c20f0012002290340222920f90156202c20f00152202c501b22051b212c202920f90120051b21290c010b4200212c420121290b200241306a2029202c20f401202a2008202e20097c7c220920eb018684202d202f8420f0015220092008547222051b20f301200920eb018820051b1098042004200337030020042007370308200420ee016a200120e2016a290300370300200420e6016a200120e3016a290300370300200420e2016a200120e4016a290300370300200420e3016a2001290300370300200420ec016a200241306a20e4016a290300370300200420e9016a2002290330370300200420ef016a2104200620df016a2106200120e9016a2101202720f7016a22270d000b0b20fa0120fc0137030020fa01202b37030820fa01203836023020fa0120ec016a200636020020fa0120ed016a203f36020020fa0120ee016a204029030037030020fa0120e6016a204129030037030020fa0120e2016a204229030037030020fa0120022903d00437031020da0120df016a21da0120fa0120ef016a21fa0120fb0120e5016a22fb0120db01470d130c340b200241a8066a20bd02106e02400240024020022d00a806208202470d00200241a0056a2085026a2083022085026a290000370300200241a0056a2086026a2083022086026a290000370300200241a0056a2087026a2083022087026a29000037030020022083022900003703a00520024190086a200241a0056a106b20024190086a2084026a2802002204450d0120024190086a2087026a29030021be0220022903900821bf02208802280200450d02200410230c020b20024190086a2084026a2092023602000b420021bf02420021be020b200241a8066a2085026a22c00220bd022085026a290000370300200241a8066a2086026a22c10220bd022086026a290000370300200241a8066a2087026a22c20220bd022087026a290000370300200220bd022900003703a8060240024020022802c00422c30220fd01460d0020022802c40421c4020c010b208902102622c302450d10410021c40220c30241003b010620c302410036020020c3022087026a20024190086a208a021094041a200241003602c404200220c3023602c0040b20bd022084026a21bd020c200b20fd02450d3420fd022802382204450d2920fd0228023022fe02200420e602746a21ff0220fd0220e9026a2180034106216d0c270b208803208e036a220429030021032088032903002107200241a8066a208f036a2238208903208f036a290000370300200241a8066a208c036a2240208903208c036a290000370300200241a8066a208e036a2241208903208e036a29000037030020022089032900003703a8062088032802282227ad2091037e220820920388a70d382008a722012090034c0d38208803208f036a290300210820042903002109208803290310212f208803290300212d208803280220210402400240024002402001450d00200110262228450d0e2027450d020c010b410821282027450d010b200420272093036c6a2106410021052028210103402001200429030037030020012004208e036a29030037030820012094036a20042094036a2903003703002001208b036a2004208b036a2903003703002001208f036a2004208f036a2903003703002001208c036a2004208c036a29030037030020012093036a2101200520a1036a210520042093036a22042006470d000c020b0b410021050b20024190086a208f036a2008370300208d03202f3703002095032005360200209603202736020020970320283602002002202d37039008200220093703980820980310262204450d0520042099036a209a03290097f6403700002004209a03290090f6403700002004209803209b031027223f450d06203f20022903a80637000f203f209c036a2038290300370000203f209d036a2040290300370000203f209e036a2041290300370000200241d0046a208f036a2204209f03370300200241d0046a208c036a2201209f03370300200241d0046a208e036a2205209f033703002002209f033703d004203f209b03200241d0046a1002200241a0056a208f036a2004290300370300200241a0056a208c036a2001290300370300200241a0056a208e036a2005290300370300200220022903d0043703a005200241e8056a208e036a2206209a03360200200220a0033703e805200220024190086a3602b007200241b0076a200241e8056a10662002208d033602b007200241b0076a200241e8056a10662097032802002104200220950328020022013602b007200241b0076a200241e8056a104102402001450d0020012093036c21270340024002400240024020022802ec052205200628020022016b208b034f0d002001208b036a22282001490d3d200520a103742238202820282038491b2228209a03480d3d2005450d0120022802e80520052028102722050d020c080b20022802e80521050c020b202810262205450d060b200220283602ec05200220053602e8050b20062001208b036a360200200520016a2201208e036a2004208f036a2900003700002001208c036a2004208b036a2900003700002001208f036a20042094036a29000037000020012004208c036a290000370000200220043602b007200241b0076a200241e8056a106620042093036a2104202720a6036a22270d000b0b200720dc01542104200320de01512101200320de0154210520022802ec052127200241a0056a208b0320022802e80522282006280200100402402027450d00202810230b2004200520011b21042087032090036a218703203f10230240209603280200450d0020970328020010230b200320de0120041b21de01200720dc0120041b21dc01208703450d340240208a032085032f01064f0d00208503208a032093036c6a20a2036a218803208503208a0320a303746a208e036a218903208a0320a1036a218a03410721270c1b0b4101210102402085032f0104220520850328020022042f0106490d00410121010340200120a1036a210120042f01042205200428020022042f01064f0d000b0b200420052093036c6a20a2036a2188032004200520a303746a208e036a2189032004200520a403746a20a5036a2802002185034100218a03200120a103460d1120a10320016b210403402085032802f806218503200420a1036a22040d000c130b0b0240024020b40320aa032f01064f0d0020aa0320b40320ae036c6a220420af036a280200210620b40320ad036a21b403200420b0036a2802002201450d360c010b0240024020aa032802002204450d0020aa0333010420b1038620ab03ad842103410121050c010b20ab03ad2103410021050b20aa0310232003a721ab030240200320b10388a7220620042f0106490d0003400240024020042802002201450d00200520ad036a2105200433010420b1038620ab03ad8421030c010b20ab03ad21030b200410232003a721ab0320012104200320b10388a7220620012f01064f0d000b0b2004200620b203746a20b3036a28020021aa032004200620ae036c6a220420af036a2802002106200420b0036a28020021010240200520ad03460d0020ad0320056b2104034020aa032802f80621aa03200420ad036a22040d000b0b410021b4032001450d350b20a90320ac036a21a90302402006450d00200110230b20a9030d120c340b41d4aac10041331021000b20284101102a000b41f8fec400104f000b20044108102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41124101102a000b41324101102a000b20014108102a000b41b899c100104f000b20054108102a000b41f8064108102a000b41b899c100104f000b410021270c070b410421270c080b410721270c090b410721270c090b410821270c090b410021040c3d0b410121040c3c0b410221040c3b0b410321040c3a0b410321040c390b410321040c380b410321040c370b410321040c360b410321040c350b410321040c340b4104216d0c060b410021040c070b410221040c060b410121040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20990120796a219f012034203520756c6a21a001207621a101203421710240024002400340207121a20120a00120716b207d4d0d0620a201207e6a2d0000450d0120a201207f6a2d0000450d0220a2012081016a2d0000450d0320a1012083016a21a10120a2012084016a217120a2012085016a2d00000d000b20a201410320756c6a21a201207120a001470d2e0c2d0b20a20120756a227120a001470d290c280b20a2012080016a217120a201410120756c6a21a201207120a001470d2a0c290b20a2012082016a217120a201410220756c6a21a201207120a001460d2c410121040c390b20a201207a6a290300210320a20129030021070340207120756a210402402071207e6a2d0000450d002004217120772004470d010c2e0b2071207a6a2903002208200320712903002209200754200820035420082003511b22011b21032009200720011b2107207120a20120011b21a2012004217120772004470d000b410221040c380b20a20120793a0040209c01450d0220a2012090016a21a30120a2012091016a21a4014102216d0c2d0b410221040c610b024002400240206d0e070001020405060a0a0b206c226e204e6a216c200241e0076a216f20022802e40721700c340b0240209e012802282204450d00200420756c2105209e012802202091016a210403402035200428020022014d0d0b02402034200120756c6a22012d00400d002001290310220320012087016a290300220784500d0020024180026a209e01207a6a290300209501209401209501109804200241b0026a209e012903002208209501209401209501109804200241f0016a2095012095012008209501109804200241a0026a20960120022903b00220022903880220022903f8018420950152200241b0026a207a6a290300220820022903800220022903f0017c7c22092008547222061b209601200920061b2003200710970420024190026a209e012097016a350200209e012087016a2903002203208e0186842003208e018820022903a002200241a0026a207a6a2903001098042001207a6a22062096012006290300220320024190026a207a6a2903007c200129030022072002290390027c22082007542206ad7c22072006200720035420072003511b22061b3703002001209601200820061b3703000b200420756a210420052092016a22050d000b0b209e01207c6a229e01209d01470d1e410021040c360b209b01207c6a21380240209b012802282201450d00209b012802202104200120756c21010340024020a3012004460d0020042093016a20a401209101109604450d00200420756a210420012092016a22010d010c020b209b012087016a2205290300210320a201207a6a22062903002107200420a2012903002208209b01208a016a222829030022097d3703002004200720037d2008200954ad7d37030820a20129030021032005200629030037030020282003370300200420756a210420012092016a22010d000b0b2038219b012038209d01470d1e0b20880120a2012086016a290000370300208b0120a2012089016a29000037030020024190086a207a6a220120a201208c016a290000370300200220a201290020370390080240209a01209901470d002099012079742204209f01209f012004491b229a01ad208d01862203208e0188a70d452003a722042078480d450240209901450d002073209901208f01742004102722730d010c0f0b200410262273450d0e0b2073209901208f01746a220420022903900837000020042087016a2088012903003700002004208a016a208b012903003700002004207a6a200129030037000020342130209f01219901209f012072490d100c390b20ce01220620b4016a2101200620ae016a21ce01207321040240024002400240024002400240034020a90120046b20b5014d0d0120042001460d022004200120b601109604450d020240200420b6016a22052001460d002005200120b601109604450d00200420b7016a22052001460d002005200120b601109604450d00200420b8016a22052001460d00200420b9016a21042005200120b6011096040d010b0b20d4012005460d030c020b200420a901460d02034020012004460d012004200120b601109604450d0120a901200420b6016a2204470d000c030b0b20d40120042205460d010b200520d40120b601109604450d00024020a70120bb016a2903002208200629030022038520a70120ba016a2903002207200620a5016a2903002209858450450d004200210342808080801021070c030b200241d0016a200920c70120c60120c701109804200241e0016a200320c70120c60120c701109804200241c0016a20c70120c701200320c70110980420022903d80120022903c8018420c70152200241e0016a20a5016a290300222f20022903d00120022903c0017c7c222d202f5472450d01200820c20188200720c20186842208200720c20188220784500d0c200241a0016a2003200920082007109704200241a0016a20a5016a290300210320022903a00121070c020b20ce0120cf01470d200c020b200820c801200820c80156200720c701522007501b22041b2203200720c70120041b220784500d0b200241b0016a20022903e001202d20032007109704200241b0016a20a5016a290300210320022903b00121070b20062007370310200620ba016a20033703002002200620bc016a2d00003a008205200220062f00243b0180052002200620b0016a2900003703f0042002200620bd016a2900003700f504200620b1016a2800002101200620b2016a2800002105200620be016a2800002128200620bf016a2800002106024020d50120d701470d0020d50120c0016a220420d501490d4520d50120c001742238200420042038491b2204ad20c1017e220820c20188a70d452008a7223820aa01480d450240024020d501450d0020d60120d50120c3016c2038102722d6010d010c0b0b2038102622d601450d0a0b200421d5010b20022d008205213820022f018005213f20d60120d70120c3016c6a2204200136000f2004200536000b20042028360007200420063600032004203f3b0100200420c4016a20383a000020042007370320200420c5016a2003370300200420ba016a20022900f504370000200420022903f00437001320d70120c0016a21d70120ce0120cf01470d1f0b02400240024020d701450d0020d70120c3016c2201450d0120d60120b6016a210442002103420021070340200420a5016a29030020077c2004290300220720037c2203200754ad7c2107200420c3016a2104200120cc016a22010d000c030b0b20d501450d3720d60110230c370b42002103420021070b20024190016a20c70120c60120037d2208200820c6015620c70120077d200320c60156ad7d220320c701522003501b22041b222d20c701200320041b220320d701ad222e20c70110970420022903900121090240202d202e5420aa012003501b0d0020024190016a20a5016a290300212f20d60120b6016a210420d70121010340200420a5016a220520ca0120052903002203202f7c2004290300220720097c22082007542205ad7c22072005200720035420072003511b22051b370300200420ca01200820051b370300200420c3016a2104200120cb016a22010d000b0b20024180016a20092003202e20031098040240202d2002290380017da72206450d0041002104034020d601200420d7017020c3016c6a220120c5016a220520ca01200529030022082001290320220320c8017c22072003542205ad7c220920052009200854200720035a1b22051b370300200120ca01200720051b370320200420c0016a22042006490d000b0b200220022d00aa063a009e05200220022f01a8063b019c05200220022903900837038805200220022900950837008d050240207220cd01470d00207220c0016a22042072490d44207220c001742201200420042001491b2204ad20c9017e220320c20188a70d442003a7220120aa01480d44024002402072450d002074207220b3016c2001102722740d010c0d0b200110262274450d0c0b200421720b20022d009e05210120022f019c052105207420cd0120b3016c6a220420d00136000f200420d10136000b200420d201360007200420d301360003200420053b0100200420c4016a20013a0000200420ba016a200229008d053700002004200229038805370013200420d701360228200420d501360224200420d60136022020cd0120c0016a21cd0120a70120a6016a22a70120a801470d100c390b20c3022087026a210520c302208b026a213820c3022f0106222820fe01742101417f21040240024002400240024003402001450d0120042082026a210420ab02208202200241a8066a20052084021096042206209202481b20920220061b2206450d04200120bb026a210120052084026a21052006208202460d000b20c4020d010c020b2028210420c402450d010b20c40220ab026a21c40220c302200420a502746a2089026a28020021c3024104216d0c2f0b20024190076a2085026a220120c00229030037030020024190076a2086026a220520c10229030037030020024190076a2087026a220620c202290300370300200220022903a80637039007200241c0046a2087026a222820282802002082026a360200200241e8056a2085026a22c5022001290300370300200241e8056a2086026a22c6022005290300370300200241e8056a2087026a22c702200629030037030020022002290390073703e80520382f01002205208c024f0d0120c302200420fe01746a2201208d026a20012087026a2206200520046b20fe01741095041a20012084026a20c50229030037000020012085026a20c60229030037000020012086026a20c702290300370000200620022903e80537000020c3022004208e026c6a22012090026a2001208f026a220620c302208b026a22052f010020046b208e026c1095041a20012091026a20920236020020012093026a20940237030020012095026a20be0237030020012096026a20bf0237030020012097026a20be02370300200620bf02370300200520052f01002082026a3b010020bd0220ff01470d150c3f0b20c3022004208e026c6a22042095026a20be0237030020042096026a20bf0237030020042097026a20be023703002004208f026a20bf0237030020042091026a209202360200200420bc026a280200210520042093026a22012802002104200120940237030002402004450d002005450d00200410230b20bd0220ff01470d110c3e0b20890210262205450d0c20052092023b0106200520920236020020052087026a20024190086a208a02109404210620024190086a208d026a22c80220c3022098026a29030037030020024190086a2084026a22c90220c3022099026a29030037030020024190086a2085026a22ca0220c302209a026a29030037030020024190086a2086026a22cb0220c302209b026a29030037030020024190086a2087026a22cc0220c302209c026a290300370300200241f0066a2085026a22cd0220c302209d026a290000370300200241f0066a2086026a22ce0220c302209e026a290000370300200241f0066a2087026a22cf0220c302209f026a290000370300200220c3022903880537039008200220c3022900c8013703f006200620c30220a0026a20c302208b026a22282f010020a1026a220120fe017410940421062005208f026a20c30220a2026a2001208e026c109404213f2028208b023b0100200520013b0106200220022d00f2063a009e05200220022f01f0063b019c05200220810229000037038805200220810220fe016a22d00229000037008d05200241f0066a208c026a22d10228000021d20220a40228000021d30220022800f30621d40220022800f70621d502200241a8066a208d026a22d60220c802290300370300200241a8066a2084026a22d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806024002402004208b024b0d0020c3022087026a200420fe01746a22012084026a200120382f010020046b20fe01741095041a20012085026a20c50229030037000020012086026a20c60229030037000020012087026a20c702290300370000200120022903e80537000020c302208f026a2004208e026c6a2201208e026a200120382f010020046b208e026c1095041a20012085026a20be02370300200120bf02370310200120be02370308200120bf023703002001208d026a20920236020020012094023703200c010b2006200420fe01746a20ba026a2006200420a1026a222820fe01746a2206200120a9027120286b20fe01741095041a20062085026a20c50229030037000020062086026a20c60229030037000020062087026a20c702290300370000200620022903e805370000203f2004208e026c6a220420b2026a200420b1026a22012005208b026a22382f010020286b208e026c1095041a200420b5026a20be02370300200420b6026a20bf02370300200420b7026a20be02370300200120bf02370300200420b3026a209202360200200420b4026a2094023703000b203820382f01002082026a3b010020a60220022d009e053a0000200241a0056a2087026a22d80220c202290300370300200241a0056a2086026a22d90220c102290300370300200241a0056a2085026a22da0220c002290300370300200241a0056a2084026a22db0220d702290300370300200241a0056a208d026a22dc0220d602290300370300200220022f019c053b01f80720022002290388053703d0042002200229008d053700d504200220022903a8063703a005200241b0076a208d026a22dd0220dc02290300370300200241b0076a2084026a22de0220db02290300370300200241b0076a2085026a22df0220da02290300370300200241b0076a2086026a22e00220d902290300370300200241b0076a2087026a22e10220d802290300370300200220022903a0053703b007200220a6022d00003a008205200220022f01f8073b018005200220022903d0043703f004200220022900d5043700f50420c30228020022e202450d0120c3022f010421e302410021e402200521e5020c1e0b20024188086a20a5026a224120022d0082053a0000200220022f0180053b018808200220022903f0043703f807200220022900f5043700fd0720dc0220dd0229030037030020db0220de0229030037030020da0220df0229030037030020d90220e00229030037030020d80220e102290300370300200220022903b0073703a00520e30220a90271212820e2022f0106220420aa024d0d0220a70210262206450d0920062092023b0106200620920236020020062087026a20024190086a20a802109404210120cd0220e202209d026a29000037030020ce0220e202209e026a29000037030020cf0220e202209f026a290000370300200220e2022900c8013703f00620c80220e2022098026a29030037030020c90220e2022099026a29030037030020ca0220e202209a026a29030037030020cb0220e202209b026a29030037030020cc0220e202209c026a290300370300200220e2022903880537039008200120e20220a0026a20e202208b026a223f2f0100220520a1026a220420fe017410940421422006208f026a20e20220a2026a2004208e026c109404214420062089026a20e20220ae026a200520af026a223820a502741094042140203f208b023b0100200620043b010602402038450d00410021042040210103402001280200220520043b010420052006360200200120ad026a2101203820042082026a2204470d000b0b20d60220c80229030037030020d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806200220022f01f0063b019c05200220022d00f2063a009e0520d102290000210320022900f3062107200220d00229000037008d05200220810229000037038805200241d0046a208c026a2238200337000020800220022903880537000020800220fe016a2243200229008d05370000200220073700d304200220022d009e053a00d204200220022f019c053b01d00420c80220d60229030037030020c90220d70229030037030020ca0220c00229030037030020cb0220c10229030037030020cc0220c202290300370300200220022903a806370390080240024020e30220a902712201208b024b0d0020e2022087026a220420282082026a220520fe01746a2004202820fe01746a2204203f2f0100224020286b224220fe01741095041a200420d30236000f200420d20236000b200420d502360007200420d402360003200420a5026a20412d00003a0000200420022f0188083b0000200420022903f80737001320042085026a20022900fd0737000020e202208f026a2028208e026c6a2204208e026a20042042208e026c1095041a2004208d026a20dc0229030037030020042084026a20db0229030037030020042085026a20da0229030037030020042086026a20d90229030037030020042087026a20d802290300370300200420022903a005370300203f20402082026a22043b010020e2022089026a2240202820a5027422416a2087026a2040200520a502746a2240200420a9027120056b20a502741095041a204020e5023602002001203f2f010022054f0d0120e20220416a20b0026a210403402004280200220120282082026a22283b0104200120e202360200200420ad026a210420052028470d000c020b0b2042202820af026a220520fe01746a2042202820a1026a220420fe01746a22012006208b026a223f2f010020046b20fe01741095041a20012085026a20022900fd07370000200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320442028208e026c6a220120b2026a200120b1026a2241203f2f0100224220046b208e026c1095041a200120b3026a20dc02290300370300200120b4026a20db02290300370300200120b5026a20da02290300370300200120b6026a20d902290300370300200120b7026a20d802290300370300204120022903a005370300203f20422082026a22013b01002040202820a5027422416a20b8026a2040200520a502746a2228200120a9027120056b20a502741095041a202820e5023602002005203f2f010022284b0d00200620416a20b9026a210103402001280200220520042082026a22043b010420052006360200200120ad026a210120282004470d000b0b20e4022082026a2128200241f4076a20a5026a220420022d00d2043a000020c70220cc0229030037030020c60220cb0229030037030020c50220ca02290300370300200241e8056a2084026a220120c902290300370300200241e8056a208d026a220520c802290300370300200220022f01d0043b01f40720022002290390083703e80520022080022900003703e007200220432900003700e507203828000021d202200241d0046a20a3026a28000021d30220022800d30421d40220022800d70421d50220dd02200529030037030020de02200129030037030020df0220c50229030037030020e00220c60229030037030020e10220c702290300370300200220022903e8053703b007200220042d00003a008205200220022f01f4073b018005200220022903e0073703f004200220022900e5073700f504024020e2022802002204450d0020e2022f010421e302200241c0046a1a20e2021a200421e202200621e502202821e4024105216d0c2e0b20e2021a200241c0046a22011a2006210520a702102622040d010c0c0b200241c0046a21012005210520a70210262204450d0b0b200441003b01062004410036020020042087026a20024190086a20a80210940421272004200128020022063602f80620012004360200200120012802042082026a360204200641003b010420062004360200202720042f0106220620fe01746a220120022f0180053b0000200120d30236000f200120d20236000b200120d502360007200120d402360003200120022903f004370013200120a5026a20022d0082053a000020012085026a20022900f50437000020042006208e026c6a22012091026a20dd0229030037030020012093026a20de0229030037030020012095026a20df0229030037030020012096026a20e00229030037030020012097026a20e1022903003703002001208f026a20022903b00737030020042089026a20062082026a220120a502746a2005360200200420013b0106200520013b01042005200436020020c3021a20bd0220ff01470d0f0c3a0b20e2022087026a220120282082026a220520fe01746a2001202820fe01746a2201200420286b220620fe01741095041a200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320012085026a20022900fd0737000020e2022028208e026c6a22012090026a2001208f026a22272006208e026c1095041a20012091026a20dc0229030037030020012093026a20db0229030037030020012095026a20da0229030037030020012096026a20d90229030037030020012097026a20d802290300370300202720022903a00537030020e202208b026a220120042082026a22043b010020e2022089026a2206202820a502746a2087026a2006200520a502746a2206200420a9027120056b20a502741095041a200620e5023602000240202820012f010022044f0d0020e50220053b010420e50220e20236020020052004460d00200420ab026a210620e202200520ab026a220420a502746a20ac026a2101034020012802002205200420a5026a3b0104200520e202360200200120ad026a2101200620042082026a2204470d000b0b41001a200241c0046a1a20c3021a20bd0220ff01470d0d0c390b20fe0222810320e9026a21820320810320e8026a21fe02200241c0046a21830320022802c4042184030c2b0b41c8eec300200120351029000b20384108102a000b41d8eec300104f000b41f0eec300104f000b20014104102a000b41a8074108102a000b20044101102a000b41f8064108102a000b41a8074108102a000b410221270c050b410321270c050b410521270c050b410521270c050b410521270c050b410521270c050b410321040c480b410321040c470b410321040c460b410321040c450b410321040c440b410321040c430b4101216d0c0c0b4102216d0c0d0b4103216d0c0d0b4103216d0c0d0b4105216d0c0e0b410221040c120b410121040c110b410221040c100b410121040c0f0b410221040c0e0b410121040c0d0b410221040c0c0b410221040c0b0b410321040c0a0b410321040c090b410321040c080b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410021040c010b410121040b0240024002400240024002400240024002400240024003400240024020040e020001010b206f2802002206204d6a210520062f010622382053742101417f2104024002400240024003402001450d01200420456a210420522045206e2005204e10960422282055481b205520281b2228450d042001205d6a21012005204e6a210520282045460d000b20700d010c020b203821042070450d010b207020526a217020062004205b746a205c6a216f410021040c030b206c206a470d080c110b203520062004205b746a205e6a220428020022014d0d0320342001205f6c6a220129031021032001204b6a290300210720682067107c21082035200428020022014d0d0420342001205f6c6a2201204b6a20602007200320087c22082003542205ad7c220920052009200754200820035a1b22051b37030020012060200820051b370310200241f0066a204b6a2201206e204b6a290000370300200241f0066a204c6a2205206e204c6a290000370300200241f0066a204d6a2206206e204d6a2900003703002002206e2900003703f0062004280200212802402062206b470d00206220456a22042062490d1e20622045742238200420042038491b2204ad20507e2203205188a70d1e2003a722382055480d1e024002402062450d0020692062205f6c2038102722690d010c080b203810262269450d070b200421620b2069206b205f6c6a22042057370300200420283602202004204b6a20573703002004204c6a20573703002004204d6a2057370300200420596a2001290300370200200420586a2005290300370200200420616a2006290300370200200420022903f006370224206b20456a216b206c206a470d080c100b208303280200220620ea026a210520062f0106223820eb02742101417f210402400240024003402001450d01200420f1026a210420ec0220f102208203200520ef02109604222820f002481b20f00220281b2228450d03200120f2026a2101200520ef026a2105202820f102460d000b2084030d010c040b20382104208403450d030b20840320ec026a2184032006200420ed02746a20ee026a218303410121040c010b0b200620f4026a200420f3026c6a2204450d00200420ea026a220120f6022001290300220320810320f5026a22012903007c2004290300220720810320f3026a22052903007c22082007542206ad7c22072006200720035420072003511b22061b370300200420f602200820061b37030020024190086a20f7026a20800320f7026a290000220337030020024190086a20e9026a20800320e9026a290000220737030020024190086a20ea026a20800320ea026a290000220837030020022080032900002209370390082001290300212f2005290300212d200241a8066a20ea026a22282008370300200241a8066a20f7026a22382003370300200241a8066a20e9026a223f2007370300200220093703a806200420f9026a2105200420ef026a2106024002400240024020042802282201200420f8026a280200470d00200120f1026a22042001490d1f200120f102742240200420042040491b2240ad20fa027e220320fb0288a70d1f2003a7224120f002480d1f2001450d012006280200200120f3026c2041102722040d020c080b200628020021040c020b204110262204450d060b20062004360200200620fc026a2040360200200528020021010b2004200120f3026c6a2204202f3703082004202d370300200420022903a806370310200420f9026a2038290300370300200420ef026a203f290300370300200420f7026a20282903003703002005200528020020f1026a3602000b20fe0220ff02470d060c0b0b41a889c400200120351029000b41c8eec300200120351029000b20384108102a000b20414108102a000b4100216d0c020b4100216d0c020b4106216d0c020b410321040c020b410321040c010b410321040c000b0b20fd0220e8026a22fd0220e702460d0a41062127410321040c290b20a70120a6016a22a70120a801460d0341032127410321040c280b200241d0046a204b6a22042064290300370300200241d0046a204c6a22012065290300370300200241d0046a204d6a22052066290300370300200220022903b0073703d00420682067107c210320024190076a204b6a2206200429030037030020024190076a204c6a2204200129030037030020024190076a204d6a22012005290300370300200220022903d0043703900702402063450d00203e10230b2069450d0020024190086a204b6a2227200629030037030020024190086a204c6a2206200429030037030020024190086a204d6a222820012903003703002002200229039007370390080240200241f8076a204d6a2205280200220120022802fc07470d00200241a8066a2033107820022802fc072204200528020022386b205220022802a806223e20456a223f203f203e491b223e4f0d002038203e6a223e2038490d0d20042045742238203e203e2038491b223ead20547e2207205188a70d0d2007a722382055480d0d024002402004450d0020022802f807200420566c2038102722040d010c1a0b203810262204450d190b2002203e3602fc07200220043602f8070b20022802f807200120566c6a22042069360220200420022903900837022c200420476a206b360200200420496a20623602002004205737031020042057370308200420033703002004204b6a2057370300200420586a2028290300370200200420596a20062903003702002004205a6a20272903003702002005200120456a360200200241a8066a20331079200241a8066a204e6a280200223e0d1d0b203310230240203520324f0d0002402037450d00203610230b024020024180086a2802002271450d00207141d0006c210420022802f80741206a217103400240207141046a280200450d00207128020010230b207141d0006a2171200441b07f6a22040d000b0b024020022802fc07450d0020022802f80710230b20022802e00720022802e407200241e8076a280200107d0c030b2035203120352031491b2272ad2203421b88a70d0c2003420586a72204417f4c0d0c024002402004450d002004102622730d0120044101102a000b410121730b2003422c7e2203422088a70d0c2003a72204417f4c0d0c0240024002402004450d00200410262274450d1b2072450d020c010b410421742072450d010b41c80021752034203541c8006c22766a217741002178410121794108217a200241f8076a41086a217b41d000217c419f02217d41c000217e418801217f41900121800141d00121810141d80121820141e07d21830141a0022184014198022185014138218601411821870120024190086a41186a21880141302189014110218a0120024190086a41106a218b014128218c014205218d014220218e014105218f01417c219001412021910141b87f21920141242193014280808080102194014200219501427f2196014114219701420121980141002199012072219a01410221270c200b4100219f014100219a010b410821a5010240200241f8076a41086a2802002204450d0041d00021a60120022802f80722a701200441d0006c6a21a8012073209f014105746a21a901410021aa01412e21ab01413f21ac0141c40021ad0141c80021ae01413b21af01413721b001413321b101412f21b201412c21b301412421b40141ff0021b501412021b60141c00021b70141e00021b80141800121b901411821ba01411021bb01412621bc01413c21bd01412b21be01412721bf01410121c001423021c101422021c201413021c301410221c401412821c50142808080801021c601420021c701420121c801422c21c901427f21ca01417f21cb01415021cc01410021cd01410321270c200b410021cd010b02402037450d00203610230b024020024180086a2802002204450d00200441d0006c210120022802f80741206a210403400240200441046a280200450d00200428020010230b200441d0006a2104200141b07f6a22010d000b0b024020022802fc07450d0020022802f80710230b410821d80120022802e00720022802e407200241e0076a41086a280200107d2073450d0020cd01412c6c2204412c6e21d901410021da012004412c490d0120d901ad4206862203422088a70d092003a722014100480d092001102622d801450d192074207420046a22db01470d020c030b420021dc0120024190086a41086a22714200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a207129030037030020022002290390083703a806410021dd0102400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012271417f460d162071410f4d0d1620024198086a29030021de0120022903900821dc010c010b420021de010b0c070b410021d9012074207420046a22db01460d010b410121df01200241a8066a41017221e001410021e101411821e201411021e301410821e401412c21e501412021e60120024190086a41206a21e701200241b4086a21e801413021e901420621ea01422021eb01413821ec01413421ed01412821ee0141c00021ef01420021f001411621f10141ecb5c10021f20142ffffffff0f21f301427f21f40141a886c50021f501417f21f601415021f701410f21f801420121f901410021da0120d80121fa01207421fb01410421270c1c0b200242003702c40441f098c40021fd01200241f098c4003602c004209f01450d00410521fe012073209f014105746a21ff01200241d0046a41136a218002200241f0066a41136a2181024101218202200241a8066a4101722183024120218402411821850241102186024108218702200241b4086a21880241f80621890241f006218a024106218b02410b218c024128218d024130218e0241e802218f024198032190024190032191024100219202418803219302420821940241800321950241f80221960241f00221970241b00521980241a80521990241a005219a02419805219b02419005219c0241e001219d0241d801219e0241d001219f0241e80121a002417921a10241b80521a202410f21a302200241f0066a410f6a21a402410221a502200241f8076a41026a21a60241a80721a70241a00721a80241ffff0321a902410a21aa02417f21ab0241800721ac02410421ad0241940721ae02417a21af0241fc0621b00241b07d21b10241e07d21b20241d87d21b30241d07d21b40241c87d21b50241c07d21b60241b87d21b702416c21b80241e00621b90241c07e21ba02416021bb02418c0321bc02207321bd02410521270c1c0b410621e60220da014106742204450d0020d80120046a21e70241c00021e802411021e902410821ea02410521eb02417f21ec02410221ed0241f80621ee02412021ef02410021f002410121f102416021f202413021f30241e80221f402413821f502427f21f602411821f702412421f802412821f902423021fa02422021fb02410421fc0220d80121fd02410621270c1c0b20024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100213a024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008223b450d14200228029408213a20024198086a28020041057422420d010c020b4101213b41004105742242450d010b203b21040340410f10262201450d08200141076a4100290097f64037000020014100290090f6403700002001410f412f10272201450d092001200429000037000f200141276a200441186a223f2900003700002001411f6a200441106a2240290000370000200141176a200441086a2241290000370000200241d0046a41186a22054200370300200241d0046a41106a22064200370300200241d0046a41086a22274200370300200242003703d0042001412f200241d0046a1002200241a0056a41186a22432005290300370300200241a0056a41106a22442006290300370300200241a0056a41086a2285032027290300370300200220022903d0043703a005200241a0056a4120100320011023411210262201450d0a200141106a41002f00a6f54022393b0000200141086a410029009ef540220337000020014100290096f540220737000020014112413210272201450d0b200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a1002200241f0066a41186a2005290300370300200241f0066a41106a2006290300370300200241f0066a41086a2027290300370300200220022903d0043703f006410021280240200241f0066a412041a886c500410041001001417f460d002002410036029008200241f0066a412020024190086a41044100100141016a41044d0d082002280290082138200241f0066a41201003410121280b2001102302402038410020281b222841014d0d00411210262201450d0d200141106a20393b0000200141086a20033700002001200737000020014112413210272201450d0e200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a100220432005290300370300204420062903003703002085032027290300370300200220022903d0043703a00520022028417f6a36029008200241a0056a412020024190086a41041004200110230b200441206a2104204241606a22420d000b0b0240203a450d00203b10230b20022802c004218503024020022802c4042204450d002004210103402085032802f8062185032001417f6a22010d000b03402004417f6a22040d000b0b4108218603024002400240200241c0046a41086a280200228703450d002085032f0106450d0120850341e8026a21880320850341086a2189034101218a030c020b427f21dc01427f21de010c020b024002402085032f0104228b0320850328020022042f01064f0d00410121010c010b410121010340200141016a210120042f0104228b03200428020022042f01064f0d000b0b2004208b0341306c6a41e8026a2188032004208b034105746a41086a2189032004208b034102746a41fc066a2802002185034100218a0320014101460d00410120016b210403402085032802f806218503200441016a22040d000b0b4110218c0320024190086a41106a218d03427f21dc014108218e034118218f03417f219003423021910342202192034130219303412821940320024190086a41286a219503200241b4086a2196034120218b0320024190086a41206a219703410f21980341072199034100219a03412f219b034127219c03411f219d034117219e034200219f03420121a003410121a10341e80221a203410521a303410221a40341fc0621a503415021a603427f21de010c150b20024190086a2086036a22044200370300200242003703900841d099c100411120024190086a1000200241a8066a2086036a2201200429030037030020022002290390083703a806200220de0137039808200220dc0137039008200241a8066a411020024190086a4110100420044200370300200242003703900841a299c100411620024190086a10002001200429030037030020022002290390083703a806200241003602980820024201370390082002209f013602a005200241a0056a20024190086a104102400240209f01450d00209f014105742128410020024190086a41086a28020022016b2106200228029008213820022802940821272073210403400240202720066a411f4b0d00200141206a22052001490d062027410174223f20052005203f491b22054100480d06024002402027450d00203820272005102722380d010c110b200510262238450d100b200521270b203820016a22052004290000370000200541186a200441186a290000370000200541106a200441106a290000370000200541086a200441086a290000370000200641606a2106200141206a2101200441206a2104202841606a22280d000b20024198086a2001360200200220273602940820022038360290080c010b20024198086a2802002101200228029408212720022802900821380b200241a8066a411020382001100402402027450d00203810230b02400240024002400240209f014105742204450d00200441057522a703ad4205862203422088a70d072003a722014100480d072001102622dd01450d16207320046a2073460d020c010b410121dd01410021a703207320046a2073460d010b209f01410574220541606a410576212720024190086a410172210620dd012104207321010340200241a8066a41186a200141186a290000370300200241a8066a41106a200141106a290000370300200241a8066a41086a200141086a290000370300200220012900003703a80620024190086a200241a8066a106e0240024020022d0090084101470d00200241d0046a41186a200641186a290000370300200241d0046a41106a200641106a290000370300200241d0046a41086a200641086a290000370300200220062900003703d0040c010b200241d0046a41186a4200370300200241d0046a41106a4200370300200241d0046a41086a4200370300200242003703d0040b200141206a2101200420022903d004370000200441186a200241d0046a41186a290300370000200441106a200241d0046a41106a290300370000200441086a200241d0046a41086a290300370000200441206a2104200541606a22050d000b202741016aad42208621a803209a01450d020c010b420021a803209a01450d010b207310230b200241c8046a28020021a90320022802c00421aa03024020022802c4042204450d00034020aa032802f80621aa032004417f6a22040d000b0b20a903450d00410021ab03417f21ac03410121ad03413021ae03418c0321af0341880321b003422021b103410221b20341fc0621b303410021b403410821270c1c0b024020aa0341f098c400460d0020aa03280200217120aa0310232071450d0020712802002104207110232004450d00024020042802002271450d0003402004102320712104207128020022a201217120a2010d000b0b200410230b024020da01450d0020da01410674210420d80141306a217103400240207141046a280200450d00207128020010230b207141c0006a2171200441406a22040d000b0b024020d901450d0020d80110230b20a703ad2103024020cd01450d0020cd01412c6c2104207441206a217103400240207141046a280200450d00207128020010230b2071412c6a2171200441546a22040d000b0b20a80320038421032072450d00207410230b20024190086a41086a22714200370300200242003703900841d49cc100411520024190086a1000200241a8066a41086a207129030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0c20022802900821710c010b413c21710b200241206a20dc0120de01428094ebdc034200109704200241106a200229032022f001200241206a41086a29030022074280ec94a37c427f109804200220f00120072071ad2208420010980420024190086a41086a22714200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a207129030037030020022002290390083703a8062002200229030022f001200820dc0120022903107c7e428094ebdc038042ffffffff0f837c2207370390082002200241086a290300200720f00154ad7c37039808200241a8066a411020024190086a4110100420002003370204200020dd01360200200241b00f6a24000f0b101e000b101d000b41d4aac10041331021000b410f4101102a000b412f4101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b20054101102a000b41d4aac10041331021000b20384108102a000b41d4aac10041331021000b20044104102a000b41d4aac10041331021000b20014101102a000b20014108102a000b410121270c010b410721270c060b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040c000b0bae07020b7f077e230041b0026b22022400200241086a2001280200200128020428020c1100000240024020022903084201520d00200241e8016a4101722103200241086a41086a2104200241b8016a2105200241bc016a2106200141046a2107200241fb006a21080340200241f8006a41186a2209200441186a290000370300200241f8006a41106a220a200441106a290000370300200241f8006a41086a220b200441086a29000037030020022004290000370378200241e8016a200241f8006a106e02400240024020022d00e8014101470d0020024190026a41186a200341186a29000037030020024190026a41106a200341106a29000037030020024190026a41086a200341086a290000370300200220032900003703900220024198016a20024190026a106b2005280200220c450d0120024198016a41086a290300210d200229039801210e2006280200450d02200c10230c020b200541003602000b4200210e4200210d0b200241e8016a41186a220c2009290300370300200241e8016a41106a2209200a290300370300200241e8016a41086a220a200b290300370300200220022903783703e80120024198016a41186a220b200c29030037030020024198016a41106a220c200929030037030020024198016a41086a2209200a290300370300200220022903e8013703980102400240200e200d107c220f4200510d0020024190026a41186a200b29030037030020024190026a41106a200c29030037030020024190026a41086a200929030037030020022002290398013703900220022002280078360270200220082800003600734200211041002109200f2111200e2112200d21130c010b410221090b200241d0006a41186a20024190026a41186a290300370300200241d0006a41106a20024190026a41106a290300370300200241d0006a41086a20024190026a41086a2903003703002002200229039002370350200220022802703602482002200228007336004b20094102470d02200241086a2001280200200728020028020c11000020022903084201510d000b0b200041023a0040200241b0026a24000f0b20002011370310200042003703082000420037030020002002290350370320200020093a004020002002280248360041200041186a2010370300200041d0006a2013370300200041c8006a2012370300200041c4006a200228004b360000200041286a200241d8006a290300370300200041306a200241e0006a290300370300200041386a200241d0006a41186a290300370300200241b0026a24000be01f03017f027e397f23004180066b22032400200241d8006a2903002104200241d0006a2903002105200228020021062003410c6a200241046a41cc001094041a200341d8006a2003410c6a41046a41c8001094041a20012802002107200341c0026a41186a220820034190016a290300370300200341c0026a41106a220920034188016a290300370300200341c0026a41086a220a20034180016a290300370300200320032903783703c00202400240024041c80010262202450d002002420037030020022006360220200241186a4200370300200241106a4200370300200241086a42003703002002200341f8006a220b2902003702242002412c6a200b41086a290200370200200241346a200b41106a2902003702002002413c6a200b41186a29020037020020052004107c2104200341e8016a41186a2008290300370300200341e8016a41106a2009290300370300200341e8016a41086a200a290300370300200320032903c0023703e8010240024002400240200741046a28020020072802082208470d00200841016a22092008490d032008410174220a20092009200a491b220aad42d0007e2205422088a70d032005a7220c4100480d032008450d012007280200200841d0006c200c10272209450d020c050b200728020021090c050b200c102622090d030b200c4108102a000b101e000b41c8004108102a000b20072009360200200741046a200a360200200741086a28020021080b2009200841d0006c6a22084200370310200842003703082008200437030020082002360220200820032903e80137022c200841186a4200370300200841246a428180808010370200200841c4006a200341e8016a41186a22022903003702002008413c6a200341e8016a41106a2209290300370200200841346a200341e8016a41086a2208290300370200200741086a2207200728020041016a3602002001280208210d2002200b41186a2900003703002009200b41106a2900003703002008200b41086a2900003703002003200b2900003703e8010240024002400240200d280200220a41f098c400460d00200d280204210e0c010b4194031026220a450d014100210e200a41003b0106200a4100360200200a41086a200341c0026a418c031094041a200d4100360204200d200a3602000b0c010b4194034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200a41086a210b200a41066a2109200a2f010622014105742108417f21020240024002400240024003402008450d01200241016a2102417f4101200341e8016a200b412010960422074100481b410020071b2207450d04200841606a2108200b41206a210b20074101460d000b200e0d010c020b20012102200e450d010b200e417f6a210e200a20024102746a4194036a280200210a410021020c0a0b200341a0016a41186a2207200341e8016a41186a2208290300370300200341a0016a41106a220f200341e8016a41106a220b290300370300200341a0016a41086a2201200341e8016a41086a2210290300370300200320032903e8013703a001200d200d28020841016a36020820082007290300370300200b200f29030037030020102001290300370300200320032903a0013703e80120092f0100220f410b4f0d01200a41086a2207200241016a22014105746a200720024105746a2207200f20026b4105741095041a200741186a2008290300370000200741106a200b290300370000200741086a2010290300370000200720032903e801370000200a41e8026a220820014102746a200820024102746a220b200a41066a22082f010020026b4102741095041a200b2006360200200820082f010041016a3b01000c0a0b200a20024102746a41e8026a20063602000c090b41940310262211450d04201141003b010620114100360200201141086a200341c0026a418c03109404210b2003200a41e0016a2900003700ad022003200a2900db013703a8022003200a41ca016a2d00003a00be022003200a2f00c8013b01bc02200a41cb016a2800002112200a41cf016a2800002113200a41d3016a2800002114200a41d7016a2800002115200a280280032116200b200a41e8016a200a41066a22102f010041796a2208410574109404210b201141e8026a200a4184036a20084102741094042107201041063b0100201120083b0106200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad023700950202400240200241064b0d00200a41086a2208200241016a220b4105746a200820024105746a220820092f010020026b4105741095041a200841186a200341e8016a41186a290300370000200841106a200341e8016a41106a290300370000200841086a200341e8016a41086a290300370000200820032903e801370000200a41e8026a2208200b4102746a200820024102746a220820092f010020026b4102741095041a0c010b200b2002417a6a220f4105746a200b200241796a22104105746a2202200841ffff037120106b4105741095041a200241186a200341e8016a41186a290300370000200241106a200341e8016a41106a290300370000200241086a200341e8016a41086a290300370000200220032903e8013700002007200f4102746a200720104102746a2208201141066a22092f010020106b4102741095041a0b2008200636020041012110200920092f010041016a3b0100410221172003418c026a41026a221820032d00a6023a0000200320032f01a4023b018c0220032003290390023703d80120032003290095023700dd01200341d4016a41026a221920182d00003a0000200320032900dd013700c501200320032903d8013703c001200320032f018c023b01d401200a280200221a450d01200a2f0104211b41ffff03211c410a211d41c403211e4100211f4108212041bc03212141ca01212241db01212341e001212441cb01212541cf01212641d301212741d7012128418003212941e801212a4106212b4179212c4105212d418403212e41e802212f41b00321304194032131417a21324118213341980321344104210f416c213541fc0221360c060b201820192d00003a0000200320032f01d4013b018c02200320032903c0013703e801200320032900c5013700ed01201b201c712101201a2f01062202201d4d0d01201e10262207450d022007201f3b01062007201f360200200720206a200341c0026a202110940421082003201a20226a2d00003a00be022003201a2f00c8013b01bc022003201a20236a2900003703a8022003201a20246a2900003700ad02201a20256a2800002137201a20266a280000213a201a20276a2800002139201a20286a2800002138201a20296a280200213b2008201a202a6a201a202b6a220c2f0100220b202c6a2202202d74109404213c2007202f6a201a202e6a2002201774109404213d200720316a201a20306a200b20326a2209201774109404213e200c202b3b0100200720023b010602402009450d0041002102203e210803402008280200220b20023b0104200b20073602002008200f6a21082009200220106a2202470d000b0b200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad0237009502200341d8016a20176a220920032d00a6023a0000200320032f01a4023b01d80120032003290390023703c00220032003290095023700c50202400240201b201c712208202b4b0d00201a20206a2202200120106a221b202d746a20022001202d746a2202200c2f010020016b202d741095041a200220336a20032900ed013700002002201536000f2002201436000b2002201336000720022012360003200220176a20182d00003a0000200220032f018c023b0000200220032903e801370013201a202f6a220b201b20177422136a200b200120177422026a220b200c2f0100221420016b2017741095041a200b2016360200200c201420106a220b3b0100201a20316a220c20026a20206a200c20136a220c200b201c71220b201b6b2017741095041a200c20113602002008200b4f0d01201a20026a20346a2102034020022802002208200120106a22013b01042008201a3602002002200f6a2102200b2001470d000c020b0b203c200120326a220b202d746a203c2001202c6a2202202d746a22082007202b6a221b2f010020026b202d741095041a200820336a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200820176a20182d00003a0000200820032f018c023b0000200820032903e801370013203d200b20177422086a203d20022017746a220c201b2f0100221320026b2017741095041a200c2016360200201b201320106a220c3b0100203e2001201774221b6a20356a203e20086a2208200c201c712201200b6b2017741095041a20082011360200200b20014b0d002007201b6a20366a210803402008280200220b200220106a22023b0104200b20073602002008200f6a210820012002470d000b0b201920092d00003a0000200320032f01d8013b01d401200320032903c0023703c001200320032900c5023700c5010240201a2802002202450d00201a2f0104211b203721122038211520392114203a21132002211a203b211620072111410121020c070b203721122038211520392114203a211320072111203b21160b41c40310262202450d03200241003b010620024100360200200241086a200341c0026a41bc0310940421102002200d280200220836029403200d2002360200200d200d28020441016a360204200841003b010420082002360200201020022f0106220b4105746a220820032903c001370013200820032f01d4013b00002008201536000f2008201436000b2008201336000720082012360003200841186a20032900c501370000200841026a200341d4016a41026a2d00003a00002002200b4102746a41e8026a201636020020024194036a200b41016a22084102746a2011360200200220083b0106201120083b0104201120023602000c060b201a41086a2208200141016a220b4105746a200820014105746a2208200220016b4105741095041a200841186a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200841026a2003418c026a41026a2d00003a0000200820032f018c023b0000200820032903e801370013201a41e8026a2202200b41027422086a2002200141027422106a2202201a41066a22072f0100220f20016b4102741095041a200220163602002007200f41016a22023b0100201a4194036a220720106a41086a200720086a2208200241ffff03712210200b6b4102741095041a20082011360200201b41ffff037120104f0d05201a200b417f6a22024102746a4198036a210803402008280200220b200241016a22023b0104200b201a360200200841046a210820102002470d000c060b0b41c4034104102a000b4194034104102a000b41c4034104102a000b410121020c000b0b2000200341d8006a41c8001094041a20034180066a24000b0900200042003702000bc70703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903d801370200200141146a22042902002106200420022903d0013702002001410c6a22042902002107200420022903c801370200200241003a00c00120012902042108200120022903c00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241c0016a41176a22042002290038370000200241c0016a41106a220a2002290031370300200241c0016a41086a220b2002290029370300200220022900213703c001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903c001370300411210262204450d01200441106a41002f00acc7403b0000200441086a41002900a4c7403700002004410029009cc74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241c0016a41186a220a4200370300200241c0016a41106a220b4200370300200241c0016a41086a220c4200370300200242003703c00120044132200241c0016a100220024190016a41186a200a29030037030020024190016a41106a200b29030037030020024190016a41086a200c290300370300200220022903c0013703900120024190016a412041a886c500410041001001417f460d03200242203702b401200220024190016a3602b001200241c0016a200241b0016a10880120022d00cc014102460d0420024180016a41086a220a200241c0016a41086a280200360200200220022903c00137038001200241206a200241cd016a41c3001094041a20024190016a41086a220b200a280200360200200220022903800137039001200241c0016a200241206a41c1001094041a200141246a20024180026a2d00003a00002001411c6a200241f8016a290000370000200141146a200241f0016a2900003700002001410c6a200241c0016a41286a290000370000200120022900e00137000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200020093a001f200041286a200b280200360200200020022903900137022020041023200324000f0b20004100360220200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000b9c0d04057f017e197f027e230041f0026b2204240002400240410d10262205450d00200541056a41002900ee9c41370000200541002900e99c413700002005410d412d10272205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1002200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001024002400240024002400240200441e0016a412041a886c500410041001001417f460d00200441003a00a002200441e0016a4120200441a0026a41014100100141016a41014d0d0520042d00a002220641034f0d052005102320064101460d0320064102470d01200441a0026a2001106e20042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a20022003107e20043502384201852102200441386a41106a2903002103200441386a41086a29030021090c040b200510230b200441f8006a2001106e20042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a106b200441c0016a41186a22082005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2007290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2008290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2007290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002007201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002008200729030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220082008290300220920027c22233703002011201129030020037c2023200954ad7c37030020062903002109200420042903a002222320027c22243703a0022006200920037c2024202354ad7c370300200441c0016a200120022003107e20043502c0012102200a2903002103200b2903002109200441f8006a200441a0026a107f02402005280200450d00200441a0026a41206a28020010230b200242018521020c020b420021020c010b200441a0026a200120022003107e20043502a0024201852102200441b0026a2903002103200441a8026a29030021090b2000200937030820002002370300200041106a2003370300200441f0026a24000f0b41d4aac10041331021000b410d4101102a000b412d4101102a000bcc0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a100020032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000baa0204017f017e017f017e230041c0006b2202240042002103200241306a41086a220442003703002002420037033041ecb5c1004116200241306a1000200241206a41086a200429030037030020022002290330370320024002400240200241206a411041a886c500410041001001417f460d002002420037033820024200370330200241206a4110200241306a4110410010012204417f460d022004410f4d0d02200241106a2002290330200241306a41086a290300427f42001097042002290310220342012003420156200241106a41086a29030022034200522003501b22041b22052003420020041b22038450450d0141a0c9c300104f000b420121050b2002200020012005200310970420022903002103200241c0006a240020030f0b41d4aac10041331021000b920303017f017e027f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d00410021034100210103402002417f6a21020240200120002f01064f0d00200141016a210120020d010c020b0240024020002802002201450d0020003301044220862003ad842104410121050c010b2003ad210441002105410021010b200010232004a72103024002402004422088a7220620012f01064f0d00200121000c010b03400240024020012802002200450d00200541016a210520013301044220862003ad8421040c010b2003ad2104410021000b200110232004a72103200021012004422088a7220620002f01064f0d000b0b200020064102746a4198036a2802002100024020054101460d00410120056b210103402000280294032100200141016a22010d000b0b4100210120020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002100200110232000450d00024020002802002201450d000340200010232001210020012802002203210120030d000b0b200010230b0b8b0404027f017e037f027e230041d0006b2204240020042001103402400240024002400240024002402004290300200441086a290300844200510d00411410262205450d05200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310200441106a412041a886c500410041001001417f460d012004420037033820044200370330200441106a4120200441306a4110410010012207417f460d042007410f4d0d04200441386a290300210a200429033021060c020b20004193b5c100360204200041086a4122360200410121010c020b4200210a0b200510232001200620027c220b200a20037c200b200654ad7c10df01200041106a2003370300200041086a2002370300410021010b20002001360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bd90201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f106202400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1002200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a106720031023200241d0006a24000f0b410e4101102a000b412e4101102a000b02000bec0301087f23004180016b22032400200341c0006a20011082010240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110820120032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000bbf0703037f047e047f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300411210262204450d01200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a1002200241f0006a41186a200a290300370300200241f0006a41106a200b290300370300200241f0006a41086a200c290300370300200220022903a001370370200241f0006a412041a886c500410041001001417f460d0320024220370294012002200241f0006a36029001200241a0016a20024190016a106420022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c7001094041a200241a0016a200241206a41c1001094041a200241206a200241a0016a41c1001094041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a00272000420137030020041023200324000f0b20004200370300200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000be7d00106037f037e107f017e0f7f057e230041e0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410c4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0d0008050602090a070e040c0103000b200141306a2903002106200141286a29030021072001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002113200141086a2802002114200141076a2d00002115200141056a2f00002116200141046a2d0000211720012d000121182002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d144101212641002127410021280c150b4101212620022d000120022d0000720d0b200141046a2802002102200341e0036a41086a22054200370300200342003703e00341a8f5c0004119200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c720b200141106a2903002108200141086a2903002106200141186a28020021142002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f0100212541db94c3002105412a210420022d0000450d0c4101212641002127410021280c0d0b200141086a280200211b200141046a280200211c20022d000120022d000072450d0d41002126201b450d09201c102320012d000021040c090b4101212620022d000120022d0000720d08200141046a2802002102200341e0036a41086a22054200370300200342003703e00341f399c1004116200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c6f0b200141106a2903002108200141086a29030021062002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d0c4101212641002127410021280c0d0b20022d00000d0420022d00014101470d04200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703e801200320053a00e701200320043a00e601200320263b01e401200320273a00e301200320283a00e2012003201a3b01e0012003201b3a00df012003201c3a00de012003201d3b01dc012003201e3a00db01200320253a00d201200320143b01d001200320212020410874201f41187472723600d701200320242023410874722022411874723600d301200341e0036a200341d0016a106b2003280280042228450d0d200341c0046a41086a220220034194046a290200370300200341c0046a41106a22052003419c046a290200370300200341c0046a41186a2204200341a4046a29020037030020032003418c046a2902003703c004200341e0036a41186a290300212920034188046a280200211b200341ec036a350200211920032903f003212a200328028404211c20033502e003210620032902e4032108200341a0026a41186a2004290300370300200341a0026a41106a2005290300370300200341a0026a41086a2002290300370300200320032903c0043703a002200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880141002126024020034188016a411041a886c500410041001001417f460d00200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d3c20032802e00321260b20194220862008422088842119200842208620068421080240201b41186c2202450d00202820026a2127200241686a2105202821020340200241086a2903002107200229030021062026200241106a2802002204490d264200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22041b21194200200620041b2108200541686a2105200241186a22022027470d000b0b4108211a41002104201c450d28202810234100211b0c2f0b20022d00000d0320022d00014101470d0320012d00012109200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703a001200320053a009f01200320043a009e01200320263b019c01200320273a009b01200320283a009a012003201a3b0198012003201b3a0097012003201c3a0096012003201d3b0194012003201e3a009301200320253a008a01200320143b01880120032021202041087472201f4118747236008f012003202420234108747220224118747236008b01200341e0036a20034188016a106b2003280280042205450d0c200341c0046a41086a220220034194046a290200370300200341c0046a41106a22042003419c046a290200370300200341c0046a41186a2226200341a4046a29020037030020032003418c046a2902003703c0042003280284042127200341d0016a41186a2026290300370300200341d0016a41106a2004290300370300200341d0016a41086a2002290300370300200320032903c0043703d001410d10262202450d3f200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d40200220032903d00137000d200241256a200341d0016a41186a2903003700002002411d6a200341d0016a41106a290300370000200241156a200341d0016a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22284200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032009200341e0036a1068200210232027450d6c200510230c6c0b20022d00000d0220022d00014101470d02200141106a2903002119200141086a2903002108200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703d803200320053a00d703200320043a00d603200320263b01d403200320273a00d303200320283a00d2032003201a3b01d0032003201b3a00cf032003201c3a00ce032003201d3b01cc032003201e3a00cb03200320253a00c203200320143b01c003200320212020410874201f41187472723600c703200320242023410874722022411874723600c303200341e0036a200341c0036a106e20032d00e0034101470d1c200341e0036a410c6a22272d00002102200341ed036a2900002106200341f5036a280000210520032f00e103210420032d00e303212620032902e40321072003200341f9036a290000370358200320053602542003200637024c200320023a004b20032007370043200320263a0042200320043b0140200341e0036a200341c0006a106b2003280280042205450d0b200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a280200211b20273502002106200341e0036a41186a290300212920032802e003212720032902e403210720032903f003212a200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a22042029370300200341d0016a410c6a20063e0200200341d0016a41286a201b360200200341f4016a221b2002360200200341d0016a41346a2026290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320073702d401200320053602f001200320273602d0012003201a36029c0220032003290388013702fc01200341186a200341c0036a10840102402003290318220620032903d001222b7d222c200656200341186a41086a2903002207200341d0016a41086a290300222d7d2006202b54ad7d220620075620062007511b0d00200341d0016a41106a2008202c202c200856200620195620062019511b22021b2208202a7c220737030020042019200620021b221920297c2007200854ad7c37030020032008202b7c22063703d00120032019202d7c2006200854ad7c3703d801200341c0006a200341d0016a107f201b28020021020b2002450d6b200341f0016a28020010230c6b0b2001410c6a280200211c200141086a280200211b200141046a28020021282002411a6a2901002119200241196a2d0000211d200241186a2d0000211e200241166a2f0100211f200241156a2d00002120200241146a2d00002121200241126a2f01002122200241116a2d00002123200241106a2d000021242002410e6a2f010021252002410d6a2d00002114200241046a2d00002109200241026a2f0100210a41db94c3002105412a210420022d0000450d0d41012126410021274100211a0c0e0b20022d00000d0020022d00014101470d00200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a290100370358200320053a0057200320043a0056200320263b0154200320273a0053200320283a00522003201a3b01502003201b3a004f2003201c3a004e2003201d3b014c2003201e3a004b200320253a0042200320143b014020032021202041087472201f4118747236004720032024202341087472202241187472360043200341e0036a200341c0006a106b2003280280042202450d09200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211b20032902e403210620032903f0032107200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c290300370200200320073703e001200320063702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc01200341d0016a412c6a220410850120041086012005450d69200210230c690b41db94c3002105412a21020c82010b4101212620022d000120022d000072450d0c0b41b394c300210541282102200441ff01712204410d4b0d11410120047441be3f710d840120044106460d102004410d470d112026450d8401200141086a280200450d8401200141046a28020010230c84010b2001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002117200141086a280200211a200141076a2d00002115200141056a2f00002116200141046a2d000021132002411a6a2901002119200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d00002124200241046a2d00002125200241026a2f0100211441db94c3002105412a210420022d0000450d0b4101212641002127410021280c0c0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d7d200320193703d8022003201a3a00d7022003201b3a00d6022003201c3b01d4022003201d3a00d3022003201e3a00d2022003201f3b01d002200320203a00cf02200320213a00ce02200320223b01cc02200320233a00cb02200320023600c702200320053600c302200320243a00c202200320253b01c002200341e0036a200341c0026a106b2003280280042202450d03200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210720032802e003211b20032902e403212920032903f003212a200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2007370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320293702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc012014410a4d0d0f02402005450d00200210230b41bf9fc1002105411b21020c7d0b2001410c6a2802002102200341e0036a41086a22054200370300200342003703e0034181f5c0004115200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200341003602e803200342013703e003200320023602d001200341d0016a200341e0036a10412002450d1020024105742127200341e0036a41086a280200210520032802e003212820032802e4032126201c210203400240024002400240202620056b41204f0d00200541206a22042005490d7a2026410174221a20042004201a491b221a4100480d7a2026450d0120282026201a102722280d020c320b200541206a21040c020b201a10262228450d300b201a21260b202820056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102202741606a22270d000b200341e8036a2004360200200320263602e403200320283602e0030c110b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d7a200320193703582003201a3a00572003201b3a00562003201c3b01542003201d3a00532003201e3a00522003201f3b0150200320203a004f200320213a004e200320223b014c200320233a004b2003200236004720032005360043200320243a0042200320253b0140200341e0036a200341c0006a106b2003280280042204450d00200341c0046a41086a2226200341e0036a41346a290200370300200341c0046a41106a2227200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a2802002105200341e0036a410c6a3502002129200341e0036a41186a290300211920032802e003211b20032902e403212a20032903f0032107200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202729030037030020034188016a41086a22272026290300370300200320032903c00437038801200341d0016a41186a2019370300200341d0016a410c6a20293e0200200341d0016a41286a2005360200200341f4016a2002360200200341d0016a41346a2027290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c290300370200200320073703e0012003202a3702d401200320043602f0012003201b3602d0012003201a36029c0220032003290388013702fc012005411f4d0d0d02402002450d00200410230b419c9fc1002105412321020c7a0b41819fc1002105411021020c790b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d77200320193703a0012003201a3a009f012003201b3a009e012003201c3b019c012003201d3a009b012003201e3a009a012003201f3b019801200320203a009701200320213a009601200320223b019401200320233a0093012003200236008f012003200536008b01200320243a008a01200320253b018801410e10262202450d29200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d2a200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f460d0641ed9ec1002105411421020c770b41012126410021274100211a20022d00014101470d002002410c6a2d0000211a2002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172201a41187472210220260d7320032019370398032003201d3a0097032003201e3a0096032003201f3b019403200320203a009303200320213a009203200320223b019003200320233a008f03200320243a008e03200320253b018c03200320143a008b0320032002360087032003200536008303200320093a0082032003200a3b018003200341e0036a20034180036a106b200328028004221a450d03200341c0046a41086a2202200341e0036a41346a290200370300200341c0046a41106a2205200341e0036a413c6a290200370300200341c0046a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002126200341e0036a41286a2802002127200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211d20032902e403210620032903f0032107200328028404211e20034188016a41186a221f200429030037030020034188016a41106a2204200529030037030020034188016a41086a22052002290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a2027360200200341d0016a41246a201e360200200341d0016a41346a2005290300370200200341d0016a413c6a2004290300370200200341d0016a41c4006a201f290300370200200320073703e001200320063702d4012003201a3602f0012003201d3602d0012003202636029c0220032003290388013702fc01201c450d0b201c41246c2202450d0d200341a0026a41026a2205202841036a2d00003a0000200341c0046a41086a2227202841146a290000370300200341c0046a410d6a221d202841196a290000370000200320282f00013b01a0022003202829000c3703c004202841246a210420282d0000221f4102460d0e2028280008212020282800042126200341e0026a41026a20052d00003a000020034188016a41086a202729030037030020034188016a410d6a201d290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d15200341a0036a202641067610870120032802a003212720032802a8032026413f7122054d0d1a200341c0026a41026a202720054105746a220541026a2d00003a0000200341c8006a200541136a290000370300200341cd006a200541186a290000370000200320052f00003b01c0022003200529000b37034020052800072120200528000321264101210520032802a403450d680c670b41012126200341013a00d001200341e0036a41086a22024200370300200342003703e003418f99c1004113200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a4110200341d0016a41011004410021050c5b0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d72200320193703b8022003201b3a00b7022003201c3a00b6022003201d3b01b4022003201e3a00b3022003201f3a00b202200320203b01b002200320213a00af02200320223a00ae02200320233b01ac02200320243a00ab02200320023600a702200320053600a302200320253a00a202200320143b01a002200341e0036a200341a0026a106e41012126024020032d00e0034101470d00200341ec036a2d00002102200341ed036a2900002119200341f5036a280000210520032f00e103210420032d00e303212620032902e40321062003200341f9036a2900003703d802200320053602d402200320193702cc02200320023a00cb02200320063700c302200320263a00c202200320043b01c002201341ff01714101470d56200341e0036a201a41067610870120032802e003210520032802e803201a413f7122024d0d0d200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d550c540b41919fc1002105410b21024101212720012d00002204410d4d0d740c750b4110210241819fc10021054100212741012126201b0d700c720b201741ff01714101470d50200341e0036a201441067610870120032802e003210520032802e8032014413f7122024d0d0c200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d4f0c4e0b200141086a280200450d73200141046a28020010230c730b200141086a280200450d72200141046a28020010230c720b200341d0016a412c6a2205108601200320083703302003200637032820032014360238411210262202450d23200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d24200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d082003422037028c012003200341c0036a36028801200341e0036a20034188016a106420032d00f80322264102460d28200341a0026a41186a20034191046a290000370300200341a0026a41106a20034189046a290000370300200341a0026a41086a20034181046a290000370300200341e0026a41086a200341a2046a290100370300200341e0026a41106a200341aa046a290100370300200341e0026a41186a200341b2046a290100370300200320032900f9033703a00220032003419a046a2901003703e00220034199046a2d000021280c440b200720062007200654201920085420192008511b22051b22062019200820051b220884500d34200341d0016a41106a200720067d370300200341e8016a201920087d2007200654ad7d370300200341e0036a41086a22024200370300200342003703e0034182b6c100411b200341e0036a100020034188016a41086a2002290300370300200320032903e00337038801024020034188016a411041a886c500410041001001417f460d00200342003703e803200342003703e00320034188016a4110200341e0036a4110410010012202417f460d252002410f4d0d25200341e0016a2202290300220720032903e0035a200341e8016a22052903002219200341e8036a29030022295a20192029511b0d002005420037030020024200370300201920087c200720067c2206200754ad7c21080b200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a411041a886c500410041001001417f460d0a200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d2120032802e00341a0056a21040c0b0b200341e8036a280200210420032802e403212620032802e00321280b20034188016a411020282004100402402026450d00202810230b410121270240201b450d00201c10230b410021260c620b41f9a0c10021054117210241012104201e450d660c650b41919fc1002105410b21020c680b202821040b41002126410121054100211f410021024100450d5b0c5c0b4100210420032802e4030d460c470b20044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a100220034188016a41186a200429030037030020034188016a41106a202629030037030020034188016a41086a2027290300370300200320032903c0043703880120034188016a412041a886c500410041001001417f460d06200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012204417f460d202004411f4d0d20200341e0036a41186a2204200341c0036a41186a290300370300200341e0036a41106a2226200341c0036a41106a290300370300200341e0036a41086a2227200341c0036a41086a290300370300200320032903c0033703e00320034180036a41186a2228200429030037030020034180036a41106a2204202629030037030020034180036a41086a22262027290300370300200320032903e00337038003200341a0036a41186a2028290300370300200341a0036a41106a2004290300370300200341a0036a41086a202629030037030020032003290380033703a003411210262204450d23200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d24200420032903a0033700122004412a6a200341a0036a41186a290300370000200441226a200341a0036a41106a2903003700002004411a6a200341a0036a41086a290300370000200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d25200342203702442003200341c0036a360240200341e0036a200341c0006a106420032d00f80322264102460d26200341e0036a41086a290300211920032802f003212720032903e003210820034188016a200341f9036a41c7001094041a200341c0006a20034188016a41c1001094041a200320263a00e003200341e0036a410172200341c0006a41c1001094041a200341a4016a20034182046a410020032d0081044101461b36020020032019370390012003200837038801200320053602a0012003202736029801200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341003602482003420137034020034188016a41106a200341c0006a1041200320034188016a3602c004200341c0046a200341c0006a1066200328024421262003280248212720032802a001221b450d0d20262027470d0e202741016a22262027490d5d20274101742228202620262028491b22264100480d5d2027450d1020032802402027202610272228450d110c2d0b4100210420032802e4030d410c420b41181026221a450d20201a2006370300201a2004360210201a20073703082005450d08200241186a211d2028201b41186c6a41686a211f410121044101211b0340201d210202400340200241086a2903002107200229030021062026200241106a2802002205490d014200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22051b21194200200620051b2108200241186a22022027470d000c0c0b0b0240201b2004470d00200441016a221b2004490d5d2004410174221d201b201b201d491b221bad42187e222b422088a70d5d202ba7221d4100480d5d02402004450d00201a200441186c201d1027221a0d010c220b201d1026221a450d210b200241186a211d201a200441186c6a221e2007370308201e2006370300201e2005360210200441016a2104201f2002470d000c0a0b0b41a00521040b0240200341f8016a2802002202200341f4016a280200470d00200241016a22052002490d5a20024101742226200520052026491b2226ad42187e2219422088a70d5a2019a722274100480d5a2002450d04200341f0016a280200200241186c202710272205450d050c270b200341f0016a28020021050c270b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c530b4100211b0c060b200341c0046a41186a220442003703002026420037030020274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d2020042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023410021280c330b2027102622050d220b20274108102a000b4100210520032802a4030d4c0c4d0b410121044101211b0b201c450d00202810230b200341e0036a41186a202937030020034188046a200436020020034184046a2202201b360200200341a4046a200341a0026a41186a2903003702002003419c046a200341b0026a29030037020020034194046a200341a8026a2903003702002003202a3703f003200320083703e003200320032903a00237028c042003201a36028004200320193703e803200341d0016a200341e0036a107f2002280200450d3d20034180046a28020010230c3d0b20262027470d01202741016a22262027490d4f20274101742228202620262028491b22264100480d4f2027450d0420032802402027202610272228450d050c1a0b200328024021280c1f0b200328024021280c190b2026102622280d1c0b20264101102a000b2026102622280d150b20264101102a000b200341f4036a4101360200200341013602d4012003418898c4003602d001200342013702e403200341d497c4003602e0032003200341d0016a3602f003200341e0036a41c49ec1001061000b201a4101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41d4aac10041331021000b410d4101102a000b412d4101102a000b41d4aac10041331021000b41d4aac10041331021000b201d4108102a000b41184108102a000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b20032026360244200320283602400b200341c8006a202741016a221a360200202820276a41003a0000200341a4016a28020022270d050c060b200341f4016a2026360200200341f0016a2005360200200341f8016a28020021020b2005200241186c6a220220083703082002200637030020022004360210200341f8016a2202200228020041016a360200200341c0006a200341d0016a107f200341f4016a28020021020b2002450d1d200341f0016a28020010230c1d0b20032026360244200320283602400b200341c0006a41086a221c202741016a360200202820276a41013a0000024002400240024002402003280244221a201c28020022276b411f4b0d00202741206a22262027490d33201a410174221d20262026201d491b22264100480d33201a450d012028201a202610272228450d020c030b201a21260c030b2026102622280d010b20264101102a000b20032026360244200320283602400b201c202741206a221a360200202820276a222741086a201b41086a290000370000202741106a201b41106a290000370000202741186a201b41186a2900003700002027201b290000370000200341a4016a2802002227450d010b2026201a470d08202641016a221b2026490d2d2026410174221c201b201b201c491b221b4100480d2d2026450d0120282026201b10272228450d020c070b2026201a470d05202641016a22272026490d2c2026410174221b20272027201b491b22274100480d2c2026450d0220282026202710272228450d030c040b201b102622280d050b201b4101102a000b2027102622280d010b20274101102a000b20032027360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41003a00002026280200211b20032802442128200328024021260c020b2003201b360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41013a000002400240024002400240200328024422282026280200221a6b41204f0d00201a41206a2226201a490d292028410174221b20262026201b491b221b4100480d292028450d0120032802402028201b10272226450d020c030b200328024021260c030b201b102622260d010b201b4101102a000b2003201b36024420032026360240201b21280b200341c0006a41086a201a41206a221b3602002026201a6a221a41086a202741086a290000370000201a41106a202741106a290000370000201a41186a202741186a290000370000201a20272900003700000b200341c0036a41202026201b100402402028450d00202610230b20041023200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d0220042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023200341e0026a41186a200341a0036a41186a290300370300200341e0026a41106a200341a0036a41106a290300370300200341e0026a41086a200341a0036a41086a290300370300200320032903a0033703e002410121280b410021260b200341e0036a41186a200341a0026a41186a290300370300200341e0036a41106a200341a0026a41106a290300370300200341e0036a41086a200341a0026a41086a29030037030020034188016a41086a200341e0026a41086a29030037030020034188016a41106a200341e0026a41106a29030037030020034188016a41186a200341e0026a41186a290300370300200320032903a0023703e003200320032903e00237038801200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2027290300370300200320032903c0043703c0032003410036024820034201370340200341286a41106a200341c0006a10412003200341286a3602c004200341c0046a200341c0006a10662003280244210520032802482104024002400240024002400240024020264101470d0020052004470d01200441016a22052004490d2820044101742226200520052026491b22054100480d282004450d0320032802402004200510272226450d040c0a0b20052004470d01200441016a22052004490d2720044101742226200520052026491b22054100480d272004450d0420032802402004200510272226450d050c070b200328024021260c090b200328024021260c060b2005102622260d060b20054101102a000b2005102622260d020b20054101102a000b41204101102a000b20032005360244200320263602400b200341c8006a200441016a2227360200202620046a41003a00000c020b20032005360244200320263602400b200341c0006a41086a221a200441016a360200202620046a41013a00000240024002400240024020032802442227201a28020022046b411f4b0d00200441206a22052004490d212027410174221b20052005201b491b22054100480d212027450d0120262027200510272226450d020c030b202721050c030b2005102622260d010b20054101102a000b20032005360244200320263602400b201a200441206a2227360200202620046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240202841ff01714101470d0020052027470d08200541016a22042005490d2520054101742228200420042028491b22044100480d252005450d0120262005200410272226450d020c070b20052027470d05200541016a22042005490d2420054101742228200420042028491b22044100480d242005450d0220262005200410272226450d030c040b2004102622260d050b20044101102a000b2004102622260d010b20044101102a000b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41003a00002005280200212720032802442104200328024021050c020b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41013a00000240024002400240024020032802442204200528020022266b41204f0d00202641206a22052026490d2120044101742227200520052027491b22274100480d212004450d0120032802402004202710272205450d020c030b200328024021050c030b2027102622050d010b20274101102a000b2003202736024420032005360240202721040b200341c0006a41086a202641206a2227360200200520266a222641086a20034188016a41086a290300370000202641106a20034188016a41106a290300370000202641186a20034188016a41186a29030037000020262003290388013700000b200341c0036a412020052027100402402004450d00200510230b20021023200341f4016a280200450d08200341f0016a28020010230c080b200510230b202741d9cac40020041b21052026411520041b21022004450d2020052114200221130b200320083703e801200320093a00e7012003200a3a00e6012003200b3b01e4012003200c3a00e3012003200d3a00e2012003200e3b01e0012003200f3a00df01200320103a00de01200320113b01dc01200320123a00db01200320133600d701200320143600d301200320153a00d201200320163b01d0010240024002400240024002400240410e10262202450d00200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d01200220032903d00137000e200241266a200341d0016a41186a22272903003700002002411e6a200341d0016a41106a2228290300370000200241166a200341d0016a41086a221a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d0a200341e0036a41186a2027290300370300200341e0036a41106a2028290300370300200341e0036a41086a201a290300370300200320032903d0013703e003410e10262202450d02200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d03200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341c0036a41202005412010042005102320021023410d10262202450d05200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d06200220032903880137000d200241256a20034188016a41186a22052903003700002002411d6a20034188016a41106a2204290300370000200241156a20034188016a41086a2226290300370000200341c0046a41186a22274200370300200341c0046a41106a22284200370300200341c0046a41086a221a4200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2027290300370300200341c0036a41106a2028290300370300200341c0036a41086a201a290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032018200341e0036a106820021023200341086a20034188016a108401200341086a41086a29030021192003290308210820034188046a4100360200200341e0036a41186a201920062008200754201920065420192006511b22021b2219370300200341a4046a20052903003702002003419c046a200429030037020020034194046a2026290300370200200342083703800420032008200720021b22083703f003200320193703e803200320083703e003200320032903880137028c04200341d0016a200341e0036a107f20034184046a280200450d0c200341e0036a41206a28020010230c0c0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410d4101102a000b412d4101102a000b200510230b202741d9cac40020041b21052026411520041b21022004450d1d2005211a200221170b200320083703f802200320093a00f7022003200a3a00f6022003200b3b01f4022003200c3a00f3022003200d3a00f2022003200e3b01f0022003200f3a00ef02200320103a00ee02200320113b01ec02200320123a00eb02200320173600e7022003201a3600e302200320153a00e202200320163b01e002410e10262202450d04200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d05200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d00200341e0026a200341c0026a4120109604450d02410e10262202450d06200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d07200220032903a00237000e200241266a200341a0026a41186a2903003700002002411e6a200341a0026a41106a290300370000200241166a200341a0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d08200520032903e002370000200541186a200341e0026a41186a290300370000200541106a200341e0026a41106a290300370000200541086a200341e0026a41086a290300370000200341c0036a41202005412010042005102320021023410e10262202450d0941002105200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0a200220032903c00237000e200241266a200341c0026a41186a2903003700002002411e6a200341c0026a41106a290300370000200241166a200341c0026a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037022c2003200341c0036a360228200341e0036a200341286a106c2003280280042205450d0c200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341d0016a41086a2003418c046a290200370300200341d0016a41106a20034194046a290200370300200341d0016a41186a2003419c046a290200370300200341d0016a41206a200341a4046a290200370300200341f8016a200341ac046a280200360200200320032903e0033703c00420032003290284043703d001200341c0036a412010030b200341a0036a41186a2004290300370300200341a0036a41106a2026290300370300200341a0036a41086a202729030037030020034188016a41086a200341d0016a41086a29030037030020034188016a41106a200341d0016a41106a29030037030020034188016a41186a200341d0016a41186a29030037030020034188016a41206a200341d0016a41206a29030037030020034188016a41286a2204200341d0016a41286a280200360200200320032903c0043703a003200320032903d001370388012005450d0120034180036a41186a2226200341a0036a41186a29030037030020034180036a41106a2227200341a0036a41106a29030037030020034180036a41086a2228200341a0036a41086a290300370300200341c0006a41086a221a20034188016a41086a290300370300200341c0006a41106a221b20034188016a41106a290300370300200341c0006a41186a221c20034188016a41186a290300370300200341c0006a41206a221d20034188016a41206a290300370300200341c0006a41286a221e2004280200360200200320032903a00337038003200320032903880137034020021023200341e0036a41186a2026290300370300200341e0036a41106a2027290300370300200341e0036a41086a202829030037030020034184046a20032903403702002003418c046a201a29030037020020034194046a201b2903003702002003419c046a201c290300370200200341a4046a201d290300370200200341ac046a201e280200360200200320053602800420032003290380033703e003410e10262202450d0c200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0d200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341203602d4012003200341c0036a3602d001200341e0036a200341d0016a10672002102320034184046a280200450d02200341e0036a41206a28020010230c020b41d49ec1002105411921020c1b0b200210230b41002105410121260b4101212720012d00002204410d4d0d1a0c1b0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b410e4101102a000b412e4101102a000b202710230b20050d0041d9cac4002126410121054100211f4100210241d9cac4000d020c010b200341286a41026a2227200341c0026a41026a2d00003a0000200341e0036a41086a2205200341c0006a41086a290300370300200341e0036a410d6a221d200341c0006a410d6a290000370000200320032f01c0023b0128200320032903403703e003200341c0036a410d6a221f201d290000370000200341c0036a41086a221d2005290300370300200320032903e0033703c0030240024002400240412010262205450d00200520032f01283b00002005202036000720052026360003200520032903c00337000b200541026a20272d00003a0000200541136a201d290300370000200541186a201f2900003700000240024002400240202820026a22152004460d00200341a0026a41026a2202202841276a2d00003a0000200341c0046a41086a2226202841386a290000370300200341c0046a410d6a22272028413d6a290000370000200320282f00253b01a002200320282900303703c004202841c8006a2104202841246a2d0000221f4102460d01202828002c21092028280028211d200341e0026a41026a20022d00003a000020034188016a41086a202629030037030020034188016a410d6a2027290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d02200341e0036a201d41067610870120032802e003212620032802e803201d413f7122024d0d03200341c0026a41026a202620024105746a220241026a2d00003a0000200341c8006a200241136a290000370300200341cd006a200241186a290000370000200320022f00003b01c0022003200229000b370340200228000721092002280003211d4101210220032802e403450d060c050b201521040b4101211f410021264101210241000d070c060b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c040b410021022020210920032802e4030d010c020b41204101102a000b202610230b20020d004101211f41d9cac40021264101210241d9cac4000d020c010b200341286a41026a2224200341c0026a41026a220d2d00003a0000200341c0036a41086a2225200341c0006a41086a220e290300370300200341c0036a410d6a2214200341c0006a410d6a220f290000370000200320032f01c0023b0128200320032903403703c003201c41246c41b87f6a2112200341cb046a212141022122412021204102211f410021274101210202400240024002400340202120032903c003370000202141086a20252903003700002021410d6a2014290000370000200320093600c7042003201d3600c304200320032f01283b01c004200320242d00003a00c2040240201f417f6a2002470d002022201f201f2022491b2202ad4205862219422088a70d0a2019a722264100480d0a20052020202610272205450d050b200520206a222620032903c004370000202641186a200341c0046a41186a290300370000202641106a200341c0046a41106a290300370000202641086a200341c0046a41086a2223290300370000202741f803460d02024020122027460d00200341a0026a41026a220a202820276a222641cb006a2d00003a00002023202641dc006a290000370300200341c0046a410d6a220b202641e1006a2900003700002003202641c9006a2f00003b01a0022003202641d4006a2900003703c004202641c8006a2d0000220c4102460d02202641d0006a2800002110202641cc006a280000211d200341e0026a41026a2211200a2d00003a000020034188016a41086a220a202329030037030020034188016a410d6a2223200b290000370000200320032f01a0023b01e002200320032903c0043703880102400240200c4101470d00200341a0036a201d410676108701201d413f7121234100210a20032802a003210b0240200341a0036a41086a28020020234d0d00200d200b20234105746a221d41026a2d00003a0000200e201d41136a290000370300200f201d41186a2900003700002003201d2f00003b01c0022003201d29000b370340201d2800072109201d280003211d4101210a0b024020032802a403450d00200b10230b200a0d010c060b200d20112d00003a0000200e200a290300370300200f2023290000370000200320032f01e0023b01c0022003200329038801370340201021090b200441246a21042024200d2d00003a0000200341e0036a41086a2226200e290300370300200341e0036a410d6a2223200f290000370000200320032f01c0023b0128200320032903403703e0032014202329000037000020252026290300370300200320032903e0033703c003202241026a2122202041206a2120201f41016a211f202741246a21270c010b0b201521044100212641000d050c040b202641ec006a21040b4100212641000d030c020b202641ec006a210441d9cac400212641d9cac4000d020c010b20264101102a000b410021200c010b4101212002402002450d00200510230b20262105411521020b200341d0016a412c6a211d2028201c41246c6a21270240034020272004460d0120042d00002126200441246a210420264102470d000b0b0240201b450d00202810230b02402020450d0041002104201e0d050c060b201d1085012003201f3602c802200320023602c402200320053602c0020240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221c450d01201c201d290000370012201c412a6a201d41186a290000370000201c41226a201d41106a290000370000201c411a6a201d41086a290000370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037028c012003200341c0036a36028801200341e0036a20034188016a10880120032d00ec0322024102460d03200341a0026a41086a200341f5036a290000370300200341a0026a41106a200341fd036a290000370300200341a0026a41186a20034185046a290000370300200341e0026a41086a20034196046a290100370300200341e0026a41106a2003419e046a290100370300200341e0026a41186a200341a6046a290100370300200320032900ed033703a00220032003418e046a2901003703e0022003418d046a2d0000210520032802e403450d0d20032802e00310230c0d0b20024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a100220034188016a41186a200229030037030020034188016a41106a200529030037030020034188016a41086a2004290300370300200320032903c00437038801024002400240024020034188016a412041a886c500410041001001417f460d00200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012202417f460d072002411f4d0d07200341e0036a41186a2202200341c0036a41186a290300370300200341e0036a41106a2205200341c0036a41106a290300370300200341e0036a41086a2204200341c0036a41086a290300370300200320032903c0033703e003200341a0036a41186a22262002290300370300200341a0036a41106a22022005290300370300200341a0036a41086a22052004290300370300200320032903e0033703a003200341c0006a41186a2026290300370300200341c0006a41106a2002290300370300200341c0006a41086a2005290300370300200320032903a003370340411210262202450d08200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221b450d09201b2003290340370012201b412a6a200341c0006a41186a290300370000201b41226a200341c0006a41106a290300370000201b411a6a200341c0006a41086a290300370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d0a200342203702c4042003200341c0036a3602c004200341e0036a200341c0046a10880120032d00ec0322054102460d0b20032802e403211f20032802e003211e20032802e803210220034188016a200341ed036a41c3001094041a200320053a00e003200341e0036a41017220034188016a41c1001094041a20032d0081042120200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c00320034201370388012003410036029001200320023602c004200341c0046a20034188016a104120032802900121052002450d012002410574211a410020056b2104200328028c012126201e210203400240024002400240202620046a41204f0d00200541206a22272005490d1720264101742228202720272028491b22284100480d172026450d0120032802880120262028102722270d020c080b20032802880121270c020b202810262227450d060b2003202836028c012003202736028801202821260b20034188016a41086a200541206a2228360200202720056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a210420282105200241206a2102201a41606a221a0d000c030b0b200341c0046a41186a220242003703002005420037030020044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d0b2002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023410021050c0e0b200521280b024002400240200328028c012028470d00202841016a22022028490d1220284101742205200220022005491b22054100480d122028450d012003280288012028200510272202450d020c0d0b20032802880121020c0d0b2005102622020d0b0b20054101102a000b20284101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b2003200536028c0120032002360288010b20034188016a41086a2226202841016a360200200220286a41013a000002400240024002400240200328028c012227202628020022046b411f4b0d00200441206a22052004490d0820274101742228200520052028491b22054100480d082027450d0120022027200510272202450d020c030b202721050c030b2005102622020d010b20054101102a000b2003200536028c0120032002360288010b2026200441206a2228360200200220046a222641086a201d41086a290000370000202641106a201d41106a290000370000202641186a201d41186a2900003700002026201d29000037000002400240024002400240024002400240024002400240024020034182046a410020204101461b2226450d0020052028470d01200541016a22272005490d0f2005410174221a20272027201a491b22274100480d0f2005450d0320022005202710272202450d040c090b20052028470d01200541016a22262005490d0e20054101742227202620262027491b221a4100480d0e2005450d0420022005201a10272202450d050c060b200521270c080b2005211a0c050b2027102622020d050b20274101102a000b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b20034190016a200441216a2204360200200220286a41003a00000c020b2003202736028c0120032002360288010b20034188016a41086a2220200441216a2205360200200220286a41013a000002400240024002400240202720056b411f4b0d00200541206a22282005490d092027410174221a20282028201a491b221a4100480d092027450d0120022027201a10272202450d020c030b2027211a0c030b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b2020200441c1006a2204360200200220056a220541086a202641086a290000370000200541106a202641106a290000370000200541186a202641186a290000370000200520262900003700000b200341c0036a41202002200410040240201a450d00200210230b0240201f450d00201e10230b201b1023200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d052002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023200341e0026a41186a200341c0006a41186a290300370300200341e0026a41106a200341c0006a41106a290300370300200341e0026a41086a200341c0006a41086a290300370300200320032903403703e002410121050b410021020b20034185046a20053a000020034186046a20032903e002370100200341ed036a200341a0026a41086a290300370000200341f5036a200341a0026a41106a290300370000200341fd036a200341a0026a41186a2903003700002003418e046a200341e0026a41086a29030037010020034196046a200341e0026a41106a2903003701002003419e046a200341e0026a41186a290300370100200320023a00e403200320032903a0023700e5032003200341c0026a3602e003200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0032003410036029001200342013703880120032802c00221022003200341c0026a41086a2802002205360240200341c0006a20034188016a104102402005450d0020054105742128410020034188016a41086a28020022056b2126200328028801211a200328028c01212703400240202720266a411f4b0d00200541206a22042005490d042027410174221b20042004201b491b22044100480d04024002402027450d00201a202720041027221a0d010c070b20041026221a450d060b200421270b201a20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000202641606a2126200541206a2105200241206a2102202841606a22280d000b20034190016a20053602002003202736028c012003201a360288010b200341e0036a41047220034188016a105d200328028c012102200341c0036a4120200328028801220520034188016a41086a280200100402402002450d00200510230b201c1023024020032802c402450d0020032802c00210230b0240200341f4016a280200450d00200341f0016a28020010230b41002127410121260b4100210520012d00002204410d4d0d090c0a0b101e000b20044101102a000b41204101102a000b201a10230b20040d00410021274101212620012d00002204410d4d0d040c050b4100212741012126201b450d020b2028102320012d00002204410d4d0d020c030b41012126410121270b20012d00002204410d4b0d010b410120047441be3f710d01024020044106460d002004410d470d012026450d02200141086a280200450d02200141046a28020010230c020b2027450d01200141086a280200450d01200141046a28020010230c010b200141086a280200450d00200141046a28020010230b2000200236020420002005360200200341e0046a24000b9a0304027f017e027f017e230041c0006b2202240002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a2903002107200229032021040c010b420021070b200310232000200737030820002004370300200241c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b9c1501077f230041c0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e0026a41186a22004200370300200141e0026a41106a22034200370300200141e0026a41086a22044200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2003290300370300200141b0026a41086a2004290300370300200120012903e0023703b00202400240200141b0026a412041a886c500410041001001417f460d002001422037026c2001200141b0026a360268200141e0026a200141e8006a106420012d00f80222034102460d0420014188016a41186a20014191036a29000037030020014188016a41106a20014189036a29000037030020014188016a41086a20014181036a290000370300200141e8016a41086a200141a2036a290100370300200141e8016a41106a200141aa036a290100370300200141e8016a41186a200141b2036a290100370300200120012900f9023703880120012001419a036a2901003703e80120014199036a2d00002104200141b0026a412010030c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002102320034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d00411210262202450d06200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210262200450d09200041106a41002f00bec7403b0000200041086a41002900b6c740370000200041002900aec74037000020004112413210272200450d0a200020012903683700122000412a6a200141e8006a41186a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d0b200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f80222074102460d0c20014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a200120073a00a00120014188016a41196a200141e8016a41c7001094041a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141c8006a41186a290300370100200141e0026a41186a220442003703002005420037030020064200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2004290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a1065200010234101210420020d010c0e0b200141e0026a41186a22004200370300200141e0026a41106a22054200370300200141e0026a41086a22064200370300200142003703e00241a69ac100411a200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b0020240200441ff01714101470d00412010262200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a412020004120100420001023410021004100210420020d010c0e0b200141b0026a4120100341002100410021042002450d0d0b200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d03200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f8024102460d0420014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a20014188016a41196a200141e8016a41c7001094042001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a200141e8006a41186a290300370000200120033a00a001200141e0026a41186a220342003703002005420037030020064200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2003290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a106520021023410121032004200045720d0e0c0d0b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b410021032004200045720d010b200010230b2002452003720d00200210230b200141c0036a24000bf41a010f7f230041a0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141d0026a41186a22004200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00220024132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a00202400240200141a0026a412041a886c500410041001001417f460d002001422037026c2001200141a0026a360268200141d0026a200141e8006a10880120012d00dc0222054102460d0420014188016a41086a200141e5026a29000037030020014188016a41106a200141ed026a29000037030020014188016a41186a200141f5026a290000370300200141d8016a41086a20014186036a290100370300200141d8016a41106a2001418e036a290100370300200141d8016a41186a20014196036a290100370300200120012900dd02370388012001200141fe026a2901003703d801200141fd026a2d0000210020012802d402210620012802d0022107200141a0026a412010030c010b410221050b200141286a41186a20014188016a41186a290300370300200141286a41106a220320014188016a41106a290300370300200141286a41086a220420014188016a41086a290300370300200141086a41086a2208200141d8016a41086a290300370300200141086a41106a2209200141d8016a41106a290300370300200141086a41186a200141d8016a41186a2903003703002001200129038801370328200120012903d8013703082002102320054102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200141c8006a41086a2008290300370300200141c8006a41106a2009290300370300200141c8006a41186a200141086a41186a29030037030020012001290328370368200120012903083703484100210a0240200041ff01714101470d00411210262202450d06200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220a450d07200a2001290348370012200a412a6a200141e0006a290300370000200a41226a200141c8006a41106a290300370000200a411a6a200141c8006a41086a2903003700000b0240024002400240024020054101470d00411210262202450d0c200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220b450d0d200b2001290368370012200b412a6a200141e8006a41186a290300370000200b41226a200141e8006a41106a290300370000200b411a6a200141e8006a41086a290300370000200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d0e200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc0222024102460d0f20014188016a41086a2203200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a200120023a00940120014188016a410d6a200141d8016a41c3001094041a200141b5016a20003a0000200141b6016a2001290348370100200141be016a200141c8006a41086a290300370100200141c6016a200141c8006a41106a290300370100200141ce016a200141c8006a41186a290300370100200141d0026a41186a22024200370300200141d0026a41106a22004200370300200c4200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d002200128028801210d2001200328020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d4022108200d210203400240200820046a411f4b0d00200041206a22032000490d052008410174220f20032003200f491b22034100480d05024002402008450d00200e200820031027220e0d010c090b20031026220e450d080b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200d10230b200b10234101210d200a0d010c110b200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00241c09ac100411a200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a0020240200041ff01714101470d00412010262202450d1020022001290348370000200241186a200141c8006a41186a290300370000200241106a200141c8006a41106a290300370000200241086a200141c8006a41086a290300370000200141a0026a4120200241201004200210234100210b4100210d200a0d010c110b200141a0026a412010034100210b4100210d200a450d100b200141d0026a41186a22024200370300200141d0026a41106a22004200370300200141d0026a41086a22034200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a2003290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d06200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc024102460d0720014188016a41086a2202200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a20014188016a410d6a200141d8016a41c30010940420012903683700002001419d016a200141e8006a41086a290300370000200141a5016a200141e8006a41106a290300370000200141ad016a200141e8006a41186a290300370000200120053a009401200141d0026a41186a22004200370300200141d0026a41106a22034200370300200c4200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d00220012802880121052001200228020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d40221082005210203400240200820046a411f4b0d00200041206a22032000490d032008410174220f20032003200f491b22034100480d03024002402008450d00200e200820031027220e0d010c060b20031026220e450d050b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200510230b200a102341012102200d200b45720d110c100b101e000b20034101102a000b20034101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b41002102200d200b45720d010b200b10230b02400240200a45200272450d002006450d020c010b200a10232006450d010b200710230b200141a0036a24000bc30201047f230041d0006b22022400024002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b410f4101102a000b411e4101102a000b41d4aac10041331021000bb80a010b7f230041f0016b22022400200220011028024020022802002203450d00200241086a28020021042002280204210541002106200241003a00d00120012802002001280204200241d0016a410120012802081001210720012001280208200741016a41014b22076a220836020802402007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220641002001280200200141046a280200200241d0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d01200241b0016a41186a22072009290300370300200241b0016a41106a2206200a290300370300200241b0016a41086a2209200b290300370300200220022903d0013703b00120024190016a41186a220a200729030037030020024190016a41106a2207200629030037030020024190016a41086a22062009290300370300200220022903b00137039001200241f0006a41186a200a290300370300200241f0006a41106a2007290300370300200241f0006a41086a20062903003703002002200229039001370370410121060b200241d0006a41186a200241f0006a41186a290300370300200241d0006a41106a200241f0006a41106a290300370300200241d0006a41086a200241f0006a41086a2903003703002002200229037037035041002109200241003a00d0012001280200200141046a280200200241d0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220741002001280200200141046a280200200241d0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d01200241b0016a41186a22012009290300370300200241b0016a41106a2207200a290300370300200241b0016a41086a2208200b290300370300200220022903d0013703b00120024190016a41186a2209200129030037030020024190016a41106a2201200729030037030020024190016a41086a22072008290300370300200220022903b00137039001200241f0006a41186a2009290300370300200241f0006a41106a2001290300370300200241f0006a41086a20072903003703002002200229039001370370410121090b200241106a41186a2201200241f0006a41186a290300370300200241106a41106a2207200241f0006a41106a290300370300200241106a41086a2208200241f0006a41086a29030037030020022002290370370310200241306a41186a220a200241d0006a41186a290300370300200241306a41106a220b200241d0006a41106a290300370300200241306a41086a220c200241d0006a41086a29030037030020022002290350370330200020063a000c2000200436020820002005360204200020033602002000412d6a20093a00002000200229033037000d200041156a200c2903003700002000411d6a200b290300370000200041256a200a2903003700002000412e6a2002290310370000200041366a20082903003700002000413e6a2007290300370000200041c6006a2001290300370000200241f0016a24000f0b200041023a000c02402005450d00200310230b200241f0016a24000f0b200041023a000c200241f0016a24000bae23032a7f037e257f230041c0026b2205240002400240024020014115490d00410121064102210741032108413221094105210a417f210b4120210c4100210d411f210e410b210f41602110411821114110211241082113419fc000211441807f2115416821164170211741782118412821194130211a4138211b4101211c4101211d4100211e0c010b410021200c010b410121200b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e020001010b20014102490d0c41602149200041606a214a4101214b4105214c417f214d4120214e4118214f411021504108215141002152413821534130215441282155410121564101211e0c010b024002400240201e0e03000d01010b201c201d71211f0c010b203b203e200a746a212002400340203d203e200b6a223e4f0d01200541c0016a2020200c1096042122202020106a222121202022200d480d000c100b0b200020052903c00137000020332038290300370000203520392903003700002037203a2903003700002001203d20066a2220490d0820002020200a746a2100200120206b22014115490d020b2004450d090240201c2006710d0020002001108a012004200b6a21040b2001200776222020086c21212020200674212241002123024020012009490d0020202020200b6a222320002020200a746a20002023200a746a200c1096042224200d4822251b2226202020066a22272023202020251b222020002027200a746a20002020200a746a200c109604200d4822271b222020002020200a746a20002026200a746a200c1096042226200d481b212020222022200b6a222320002022200a746a20002023200a746a200c1096042228200d4822291b222a2022200672222b2023202220291b22222000202b200a746a20002022200a746a200c1096042229200d481b222220002022200a746a2000202a200a746a200c109604222a200d481b212220212021200b6a222320002021200a746a20002023200a746a200c109604222b200d48222c1b222d202120066a222e20232021202c1b22212000202e200a746a20002021200a746a200c1096042223200d481b222120002021200a746a2000202d200a746a200c109604222c200d481b21212007200620251b2024200e7620271b2026200e766a2028200e766a2029200e766a202a200e766a202b200e766a2023200e766a202c200e766a21230b20002022200a746a20002020200a746a200c1096042225200e7620236a20002021200a746a2000202020222025200d4822251b2224200a746a200c1096042226200e766a21230240024002402000202120242026200d481b2221200a746a20002022202020251b222c200a746a200c109604200b4a0d00202320066a2223200f4b0d0120234521200c020b2021212c20234521200c010b024020012006762221450d0020002001200a746a20106a2120200021220340200541206a20116a2223202220116a2225290000370300200541206a20126a2224202220126a2226290000370300200541206a20136a2227202220136a222829000037030020052022290000370320202020136a2229290000212f202020126a222a2900002130202029000021312025202020116a222b290000370000202620303700002028202f370000202220313700002020200529032037000020292027290300370000202a2024290300370000202b2023290300370000202020106a21202022200c6a21222021200b6a22210d000b0b2001202c200b736a212c410121200b0240201f200b73202045722006710d0020002001108b010d0c0b024002402003450d00202c20014f0d0a20032000202c200a746a2220200c109604200d480d01200541206a20116a2232200020116a2233290000370300200541206a20126a2234200020126a2235290000370300200541206a20136a2236200020136a223729000037030020052000290000370320202020136a2222290000212f202020126a22212900002130202029000021312033202020116a2223290000370000203520303700002037202f3700002000203137000020232032290300370000202120342903003700002022203629030037000020202005290320370000200541c0016a20116a22382033290000370300200541c0016a20126a22392035290000370300200541c0016a20136a223a2037290000370300200520002900003703c001200020106a213b2000200c6a213c4100213d41002001223e200b6a22224f0d040c100b2001450d070b202c20014f0d05200541206a20116a221d200020116a223f290000370300200541206a20126a222d200020126a2240290000370300200541206a20136a222e200020136a2241290000370300200520002900003703202000202c200a746a2220290000212f202020136a22222900002130202020126a22212900002131203f202020116a222329000037000020402031370000204120303700002000202f370000202020052903203700002022202e2903003700002021202d2903003700002023201d290300370000200520116a2242203f290000370300200520126a22432040290000370300200520136a22442041290000370300200520002900003703002000200c6a21264100214502402001200b6a2221450d0020262120034020202005200c109604200b4a0d012020200c6a2120204520066a22452021490d000b0b20002001200a746a21202021212202400340202021232022224620454d0d012046200b6a2122202320106a22202005200c109604200d4e0d000b0b20462045490d0420212046490d03418001212c410021244100212a4100212541002129418001211c20262045200a746a2247212603400240024002400240024002400240202320266b222020144b22480d002020200a76222020156a2020202a202449202920254922227222211b21202021450d01201c202020221b211c2020202c20221b212c0b20292025470d020c010b20202020200676221c6b212c20292025470d010b201c450d0141002120200541c0006a22292125202621220340202520203a0000202520222005200c109604200b73200e766a21252022200c6a2122201c202020066a2220470d000b0b202a2024470d020c010b200541c0006a22252129202a2024470d010b0240202c450d00202320106a212041002122200541c0016a222a21240340202420223a0000202420202005200c109604200e766a2124202020106a2120202c202220066a2222470d000c020b0b200541c0016a2224212a0b02402024202a6b2220202520296b2222202220204b1b222b450d00201d202620292d0000200a746a222020116a290000370300202d202020126a290000370300202e202020136a29000037030020052020290000370320202620292d0000200a746a22202023202a2d0000200b73200a746a2222290000370000202020116a202220116a290000370000202020126a202220126a290000370000202020136a202220136a2900003700000240202b2006460d004100212003402023202a20206a22272d0000200b73200a746a22222026202920206a20066a22282d0000200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202620282d0000200a746a22222023202720066a2d0000200b73200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202020076a2122202020066a222121202022202b490d000b202a20216a212a202920216a21290b2023202a2d0000200b73200a746a22202005290320370000202020116a201d290300370000202020126a202d290300370000202020136a202e290300370000202a20066a212a202920066a21290b2023202c200a746b2023202a2024461b21232026201c200a746a202620292025461b212620480d000b02400240202920254f0d000340201d20262025200b6a22252d0000200a746a222220116a2221290000370300202d202220126a2224290000370300202e202220136a222729000037030020052022290000370320202320106a2220290000212f202320166a22282900002130202320176a222a29000021312021202320186a222329000037000020242031370000202720303700002022202f370000202020052903203700002028202e290300370000202a202d2903003700002023201d2903003700002020212320292025490d000c020b0b0240202a20244f0d002026212003402024200b6a22242d00002122201d202020116a2221290000370300202d202020126a2225290000370300202e202020136a22262900003703002005202029000037032020232022200b73200a746a2222290000212f202220136a22272900002130202220126a222829000021312021202220116a222929000037000020252031370000202620303700002020202f370000202220052903203700002027202e2903003700002028202d2903003700002029201d2903003700002020200c6a2120202a2024490d000c020b0b202621200b203f20422903003700002040204329030037000020412044290300370000200020052903003700000240024002402001202020476b200a7620456a22224d0d00201d203f290000370300202d2040290000370300202e20412900003703002005200029000037032020002022200a746a2220290000212f202020136a22212900002130202020126a22232900002131203f202020116a222529000037000020402031370000204120303700002000202f370000202020052903203700002021202e2903003700002023202d2903003700002025201d290300370000200120226b2221450d0120212022202220214b1b2123200120087621252020200c6a21240240024020222021200b6a22014f0d002000202220022003200410890120202103202421000c010b20242001200220202004108901202221010b202320254f211c204620454d211d200141154f0d02410021200c160b41f4a1c100202220011029000b4184a2c100104f000b4100211e410121200c130b410121200c120b410021200c110b4102211e410121200c100b20462021108c01000b204520461048000b41f4a1c100202c20011029000b41e4a1c100410041001029000b202020011048000b419ca2c100202c20011029000b20002001108d01200541c0026a24000f0b2056204c7421202056204d6a21222056204b6a21560240200020206a222020002022204c746a2221204e109604204d4a0d00200541c0016a204f6a22232020204f6a2225290000370300200541c0016a20506a2224202020506a2226290000370300200541c0016a20516a2227202020516a2228290000370300200520202900003703c001202020212900003700002028202120516a2900003700002026202120506a29000037000020252021204f6a2900003700004100212102402022450d00204a212002400340200541c0016a2020204e10960420524e0d012020204e6a2020290000370000202020536a2020204f6a290000370000202020546a202020506a290000370000202020556a202020516a290000370000202020496a21202022204d6a22220d000c020b0b202221210b20002021204c746a222020052903c0013700002020204f6a2023290300370000202020506a2024290300370000202020516a20272903003700000b204a204e6a214a20562001470d010b200541c0026a24000f0b4101211e410121200c060b2032203c203d200a746a222020116a22222900003703002034202020126a22232900003703002036202020136a2225290000370300200520202900003703202021200c6a2224290000212f202120196a222629000021302021201a6a2227290000213120222021201b6a222129000037000020232031370000202520303700002020202f37000020212032290300370000202720342903003700002026203629030037000020242005290320370000203d20066a223d203e200b6a22224f0d010b203c203d200a746a212002400340200541c0016a2020200c109604200b4c0d012020200c6a2120203d20066a223d2022490d000b4102211e0c020b4102211e0c020b4102211e0c020b410121200c020b410121200c010b410121200c000b0bd40608077f027e017f017e017f017e017f017e230041206b22022400024002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d032001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c370300200320014f0d022006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c3703002003410172220420014f0d032006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a220141186a22042900002109200020054105746a2200290000210a200041086a2205290000210c200041106a2203290000210e2004200041186a2206290000370000200141106a220429000021102004200e370000200141086a2204290000210e2004200c3700002001290000210c2001200a370000200241186a2009370300200241106a2010370300200241086a200e37030020062009370000200320103700002005200e3700002000200c3700002002200c3703000b200241206a24000f0b41f4a1c100200520011029000b200321040b41e4a1c100200420011029000b970909077f017e037f017e027f017e027f017e047f230041206b220224000240200141324f0d00410121030240200141014d0d00200041206a200041201096044100480d00200041c0006a21044102210503402005220320014f0d01200341016a21052004200441606a41201096042106200441206a2104200641004e0d000b0b200241206a240020032001460f0b200041a07f6a210741012103410021080240024003400240024002400240200320014f0d00200020034105746a210403402004200441606a41201096044100480d02200441206a2104200341016a22032001490d000b0b4100210420032001460d010c020b4101210420032001470d010b200241206a240041010f0b2003417f6a220520014f0d012004450d02200020054105746a22042900002109200420002003410574220a6a220529000037000020052009370000200241186a220b200441186a220c290000220d370300200241106a220e200441106a220f2900002210370300200241086a2211200441086a221229000022133703002012200541086a221429000037000020142013370000200f200541106a221529000037000020152010370000200c200541186a22162900003700002016200d37000020022009370300024020034102490d00200420002003417e6a22064105746a22174120109604417f4a0d002004290000210920042017290000370000200b200c290000370300200e200f290000370300201120122900003703002012201741086a290000370000200f201741106a290000370000200c201741186a290000370000200220093703004100210c02402006450d002007200a6a21040240034020022004412010960441004e0d01200441206a2004290000370000200441386a200441186a290000370000200441306a200441106a290000370000200441286a200441086a290000370000200441606a21042006417f6a22060d000c020b0b2006210c0b2000200c4105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b200841016a21080240200120036b220f4102490d00200541206a220420054120109604417f4a0d002005290000210920052004290000370000200b2016290000370300200e2015290000370300201120142900003703002014200441086a2900003700002015200441106a2900003700002016200441186a29000037000020022009370300410121120240200f4103490d00200541c0006a20024120109604417f4a0d00410321064102210c024003402005200c4105746a220441606a2004290000370000200441786a200441186a290000370000200441706a200441106a290000370000200441686a200441086a2900003700002006200f4f0d0120064105742104200c21122006210c200641016a2106200520046a200241201096044100480d000c020b0b200c21120b200520124105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b20084105490d000b200241206a240041000f0b41e4a1c100200520011029000b41f4a1c100200320011029000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241b488c5003602082002200241046a360228200220023602202002200241206a360218200241086a41c488c5001061000be308090d7f017e027f017e017f027e017f017e0d7f230041206b2202240002400240024020014101762203450d00417f210441022105410521064120210741002108411821094108210a4110210b4100210c0c010b410021180c010b410121180b0340024002400240024002400240024002400240024002400240024020180e020001010b4102211920014102490d01417f211a4118211b4105211c4108211d4110211e4101211f4120212041002121200121224101210c0c0a0b02400240200c0e020001010b200320046a2203210d0340200d410174221041017221180240201020056a221020014f0d00201820014f0d0620102018200020182006746a200020102006746a20071096042008481b21180b0240201820014f0d00200d20014f0d042000200d2006746a220d200020182006746a2210200710960420044a0d00200d20096a220e290000210f2010200a6a221129000021122010200b6a2213290000211420102900002115200e201020096a2216290000370000200d200b6a220e2900002117200e2014370000200d200a6a220e2900002114200e2012370000200d2900002112200d2015370000200220096a200f3703002002200b6a20173703002002200a6a20143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b20030d07410021180c0c0b2022201a6a222220014f0d052000201b6a220d290000210f20002022201c746a221829000021152018201d6a221029000021122018201e6a220e2900002114200d2018201b6a22112900003700002000201e6a220d2900002117200d20143700002000201d6a220d2900002114200d201237000020002900002112200020153700002002201b6a220c200f3703002002201e6a222320173703002002201d6a222420143703002011200f370000200e20173700002010201437000020182012370000200220123703004100210d0340200d201f742210201f7221180240201020196a221020224f0d00201820224f0d062010201820002018201c746a20002010201c746a20201096042021481b21180b0240201820224f0d00200d20224f0d042000200d201c746a220d20002018201c746a22102020109604201a4a0d00200d201b6a220e290000210f2010201d6a221129000021122010201e6a2213290000211420102900002115200e2010201b6a2216290000370000200d201e6a220e2900002117200e2014370000200d201d6a220e2900002114200e2012370000200d2900002112200d2015370000200c200f37030020232017370300202420143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b2022201f4b0d070b200241206a24000f0b41f8a3c100200d20011029000b41f8a3c100200d20221029000b41e8a3c100201820011029000b41e8a3c100201820221029000b41f4a1c100202220011029000b4100210c0c010b4101210c0c020b410121180c020b410121180c010b410121180c000b0baa23032a7f037e257f230041c0026b2204240002400240024020014115490d004101210541022106410321074132210841052109417f210a4120210b4100210c411f210d410b210e4160210f411821104110211141082112419fc000211341807f211441682115417021164178211741282118413021194138211a4101211b4101211c4100211d0c010b4100211f0c010b4101211f0b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240201f0e020001010b20014102490d0c41602148200041606a21494101214a4105214b417f214c4120214d4118214e4110214f4108215041002151413821524130215341282154410121554101211d0c010b024002400240201d0e03000d01010b201b201c71211e0c010b203a203d2009746a211f02400340203c203d200a6a223d4f0d01200441c0016a201f200b1096042121201f200f6a2220211f2021200c480d000c100b0b200020042903c0013700002032203729030037000020342038290300370000203620392903003700002001203c20056a221f490d082000201f2009746a21002001201f6b22014115490d020b2003450d090240201b2005710d0020002001108a012003200a6a21030b2001200676221f20076c2120201f200574212141002122024020012008490d00201f201f200a6a22222000201f2009746a200020222009746a200b1096042223200c4822241b2225201f20056a22262022201f20241b221f200020262009746a2000201f2009746a200b109604200c4822261b221f2000201f2009746a200020252009746a200b1096042225200c481b211f20212021200a6a2222200020212009746a200020222009746a200b1096042227200c4822281b22292021200572222a2022202120281b22212000202a2009746a200020212009746a200b1096042228200c481b2221200020212009746a200020292009746a200b1096042229200c481b212120202020200a6a2222200020202009746a200020222009746a200b109604222a200c48222b1b222c202020056a222d20222020202b1b22202000202d2009746a200020202009746a200b1096042222200c481b2220200020202009746a2000202c2009746a200b109604222b200c481b21202006200520241b2023200d7620261b2025200d766a2027200d766a2028200d766a2029200d766a202a200d766a2022200d766a202b200d766a21220b200020212009746a2000201f2009746a200b1096042224200d7620226a200020202009746a2000201f20212024200c4822241b22232009746a200b1096042225200d766a21220240024002402000202020232025200c481b22202009746a20002021201f20241b222b2009746a200b109604200a4a0d00202220056a2222200e4b0d01202245211f0c020b2020212b202245211f0c010b024020012005762220450d00200020012009746a200f6a211f200021210340200441206a20106a2222202120106a2224290000370300200441206a20116a2223202120116a2225290000370300200441206a20126a2226202120126a222729000037030020042021290000370320201f20126a2228290000212e201f20116a2229290000212f201f29000021302024201f20106a222a2900003700002025202f3700002027202e37000020212030370000201f20042903203700002028202629030037000020292023290300370000202a2022290300370000201f200f6a211f2021200b6a21212020200a6a22200d000b0b2001202b200a736a212b4101211f0b0240201e200a73201f45722005710d0020002001108b010d0c0b024002402002450d00202b20014f0d0a20022000202b2009746a221f200b109604200c480d01200441206a20106a2231200020106a2232290000370300200441206a20116a2233200020116a2234290000370300200441206a20126a2235200020126a223629000037030020042000290000370320201f20126a2221290000212e201f20116a2220290000212f201f29000021302032201f20106a22222900003700002034202f3700002036202e37000020002030370000202220312903003700002020203329030037000020212035290300370000201f2004290320370000200441c0016a20106a22372032290000370300200441c0016a20116a22382034290000370300200441c0016a20126a22392036290000370300200420002900003703c0012000200f6a213a2000200b6a213b4100213c41002001223d200a6a22214f0d040c100b2001450d070b202b20014f0d05200441206a20106a221c200020106a223e290000370300200441206a20116a222c200020116a223f290000370300200441206a20126a222d200020126a2240290000370300200420002900003703202000202b2009746a221f290000212e201f20126a2221290000212f201f20116a22202900002130203e201f20106a2222290000370000203f20303700002040202f3700002000202e370000201f20042903203700002021202d2903003700002020202c2903003700002022201c290300370000200420106a2241203e290000370300200420116a2242203f290000370300200420126a22432040290000370300200420002900003703002000200b6a21254100214402402001200a6a2220450d002025211f0340201f2004200b109604200a4a0d01201f200b6a211f204420056a22442020490d000b0b200020012009746a211f2020212102400340201f21222021224520444d0d012045200a6a21212022200f6a221f2004200b109604200c4e0d000b0b20452044490d0420202045490d03418001212b41002123410021294100212441002128418001211b202520442009746a2246212503400240024002400240024002400240202220256b221f20134b22470d00201f200976221f20146a201f2029202349202820244922217222201b211f2020450d01201b201f20211b211b201f202b20211b212b0b20282024470d020c010b201f201f200576221b6b212b20282024470d010b201b450d014100211f200441c0006a222821242025212103402024201f3a0000202420212004200b109604200a73200d766a21242021200b6a2121201b201f20056a221f470d000b0b20292023470d020c010b200441c0006a2224212820292023470d010b0240202b450d002022200f6a211f41002121200441c0016a222921230340202320213a00002023201f2004200b109604200d766a2123201f200f6a211f202b202120056a2221470d000c020b0b200441c0016a222321290b0240202320296b221f202420286b22212021201f4b1b222a450d00201c202520282d00002009746a221f20106a290000370300202c201f20116a290000370300202d201f20126a2900003703002004201f290000370320202520282d00002009746a221f202220292d0000200a732009746a2221290000370000201f20106a202120106a290000370000201f20116a202120116a290000370000201f20126a202120126a2900003700000240202a2005460d004100211f034020222029201f6a22262d0000200a732009746a222120252028201f6a20056a22272d00002009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000202520272d00002009746a22212022202620056a2d0000200a732009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000201f20066a2121201f20056a2220211f2021202a490d000b202920206a2129202820206a21280b202220292d0000200a732009746a221f2004290320370000201f20106a201c290300370000201f20116a202c290300370000201f20126a202d290300370000202920056a2129202820056a21280b2022202b2009746b202220292023461b21222025201b2009746a202520282024461b212520470d000b02400240202820244f0d000340201c20252024200a6a22242d00002009746a222120106a2220290000370300202c202120116a2223290000370300202d202120126a2226290000370300200420212900003703202022200f6a221f290000212e202220156a2227290000212f202220166a222929000021302020202220176a2222290000370000202320303700002026202f3700002021202e370000201f20042903203700002027202d2903003700002029202c2903003700002022201c290300370000201f212220282024490d000c020b0b0240202920234f0d002025211f03402023200a6a22232d00002121201c201f20106a2220290000370300202c201f20116a2224290000370300202d201f20126a22252900003703002004201f29000037032020222021200a732009746a2221290000212e202120126a2226290000212f202120116a222729000021302020202120106a2228290000370000202420303700002025202f370000201f202e370000202120042903203700002026202d2903003700002027202c2903003700002028201c290300370000201f200b6a211f20292023490d000c020b0b2025211f0b203e2041290300370000203f204229030037000020402043290300370000200020042903003700000240024002402001201f20466b20097620446a22214d0d00201c203e290000370300202c203f290000370300202d204029000037030020042000290000370320200020212009746a221f290000212e201f20126a2220290000212f201f20116a22222900002130203e201f20106a2224290000370000203f20303700002040202f3700002000202e370000201f20042903203700002020202d2903003700002022202c2903003700002024201c290300370000200120216b2220450d0120202021202120204b1b212220012007762124201f200b6a21230240024020212020200a6a22014f0d002000202120022003108e01201f2102202321000c010b20232001201f2003108e01202121010b202220244f211b204520444d211c200141154f0d024100211f0c160b41f4a1c100202120011029000b4184a2c100104f000b4100211d4101211f0c130b4101211f0c120b4100211f0c110b4102211d4101211f0c100b20452020108c01000b204420451048000b41f4a1c100202b20011029000b41e4a1c100410041001029000b201f20011048000b419ca2c100202b20011029000b20002001108d01200441c0026a24000f0b2055204b74211f2055204c6a21212055204a6a215502402000201f6a221f20002021204b746a2220204d109604204c4a0d00200441c0016a204e6a2222201f204e6a2224290000370300200441c0016a204f6a2223201f204f6a2225290000370300200441c0016a20506a2226201f20506a22272900003703002004201f2900003703c001201f20202900003700002027202020506a29000037000020252020204f6a29000037000020242020204e6a2900003700004100212002402021450d002049211f02400340200441c0016a201f204d10960420514e0d01201f204d6a201f290000370000201f20526a201f204e6a290000370000201f20536a201f204f6a290000370000201f20546a201f20506a290000370000201f20486a211f2021204c6a22210d000c020b0b202121200b20002020204b746a221f20042903c001370000201f204e6a2022290300370000201f204f6a2023290300370000201f20506a20262903003700000b2049204d6a214920552001470d010b200441c0026a24000f0b4101211d4101211f0c060b2031203b203c2009746a221f20106a22212900003703002033201f20116a22222900003703002035201f20126a22242900003703002004201f2900003703202020200b6a2223290000212e202020186a2225290000212f202020196a2226290000213020212020201a6a2220290000370000202220303700002024202f370000201f202e37000020202031290300370000202620332903003700002025203529030037000020232004290320370000203c20056a223c203d200a6a22214f0d010b203b203c2009746a211f02400340200441c0016a201f200b109604200a4c0d01201f200b6a211f203c20056a223c2021490d000b4102211d0c020b4102211d0c020b4102211d0c020b4101211f0c020b4101211f0c010b4101211f0c000b0bed0b05077f017e027f017e027f23004190026b22022400200241f0016a41186a22034200370300200241f0016a41106a22044200370300200241f0016a41086a22054200370300200242003703f001200241f0016a2001280200220620012802042207412020074120491b22081094041a2001200720086b3602042001200620086a360200024002402007411f4d0d00200241d0016a41186a22072003290300370300200241d0016a41106a22082004290300370300200241d0016a41086a22062005290300370300200220022903f0013703d001200241b0016a41186a2007290300370300200241b0016a41106a2008290300370300200241b0016a41086a2006290300370300200220022903d0013703b001410121070c010b410021070b200241f0016a41186a2208200241b0016a41186a290300370300200241f0016a41106a2206200241b0016a41106a290300370300200241f0016a41086a2203200241b0016a41086a290300370300200220022903b0013703f001024002400240024002402007450d00200241f0006a41186a2008290300370300200241f0006a41106a2006290300370300200241f0006a41086a2003290300370300200220022903f0013703702002200110462002290300a7450d0120022903082109200241f0016a41186a22054200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200241f0016a20012802002204200141046a22032802002207412020074120491b22081094041a2003200720086b22063602002001200420086a22083602002007411f4d0d02200241d0016a41186a22072005290300370300200241d0016a41106a2204200a290300370300200241d0016a41086a2205200b290300370300200220022903f0013703d00120024190016a41186a200729030037030020024190016a41106a200429030037030020024190016a41086a2005290300370300200220022903d00137039001200241f0016a2006412020064120491b22076a41004100412020076b2007411f4b1b1093041a200241f0016a200820071094041a2003200620076b3602002001200820076a3602002006411f4d0d03200241d0016a41186a2207200241f0016a41186a290300370300200241d0016a41106a2208200241f0016a41106a290300370300200241d0016a41086a2206200241f0016a41086a290300370300200220022903f0013703d001200241b0016a41186a22032007290300370300200241b0016a41106a22072008290300370300200241b0016a41086a22082006290300370300200220022903d0013703b001200241f0016a200110900120022802f0012201450d0420022902f401210c200241d0006a41186a2206200241f0006a41186a290300370300200241d0006a41106a2204200241f0006a41106a290300370300200241d0006a41086a2205200241f0006a41086a290300370300200241306a41086a220a20024190016a41086a290300370300200241306a41106a220b20024190016a41106a290300370300200241306a41186a220d20024190016a41186a290300370300200241106a41086a220e2008290300370300200241106a41106a22082007290300370300200241106a41186a22072003290300370300200220022903703703502002200229039001370330200220022903b0013703102000200c37020c2000200136020820002009370300200041146a20022903503702002000411c6a2005290300370200200041246a20042903003702002000412c6a2006290300370200200041346a20022903303702002000413c6a200a290300370200200041c4006a200b290300370200200041cc006a200d290300370200200041ec006a2007290300370200200041e4006a2008290300370200200041dc006a200e290300370200200041d4006a200229031037020020024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000b9d0d03027f017e137f230041f0006b22022400200241106a2001104502400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b4100210e4100210d0c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200241e3006a220a41056a210b4100210c2003210d4100210e0340200141046a220f2802002105200241003a0050200241d0006a20012802002210200541004722111094041a02400240024002400240024020052011490d00200f200520116b22123602002001201020116a221336020002400240024002400240024002402005450d004105211120022d0050220541064b0d0a024020050e07000d030d020405000b200241086a200110452002280208450d0a200228020c2210417f4c0d122010450d05201010ac012212450d0820122001280200200f2802002205201020052010491b22051094041a200f28020022132005490d09200f201320056b3602002001200128020020056a36020020052010470d060c0b0b410521110c090b200241d0006a200110a30220022802542210450d0820022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410221110c0a0b200241d0006a2012412020124120491b22056a41004100412020056b2005411f4b1b1093041a200241d0006a201320051094041a200f201220056b3602002001201320056a3602002012411f4d0d07200241c0006a41086a200941086a280000360200200220092900003703402002200a2900003703302002200b29000037003520022f0150210520022d0052211120022800532115200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201541087621142005201141107472211741002111200228024021100c090b200241d0006a200110a30220022802542210450d0620022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410321110c080b200241d0006a200110a30220022802542210450d0520022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410121110c070b4101211241002010460d050b2010450d03201210230c030b201120051048000b20104101102a000b200520131048000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022010ad22044220862004843703402012410876211441042111201221150b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020114105460d022002280244210f200241186a41106a2212200241d0006a41106a280200360200200241186a41086a2213200241d0006a41086a290200370300200220022902503703180240200e200d470d00200d41016a2205200d490d04200d4101742216200520052016491b2205ad42247e2204422088a70d042004a722164100480d0402400240200d450d002006200d41246c2016102722060d010c070b201610262206450d060b2005210d0b2006200c6a220520113a00002005410c6a200f360200200541086a2010360200200541046a2014410874201541ff017172360200200541036a20174110763a0000200541016a20173b0000200541206a2012280200360200200541186a2013290300370200200541106a2002290318370200200c41246a210c200e41016a220e2003490d000b0b2000200d36020420002006360200200041086a200e360200200241f0006a24000f0b200041003602000240200e450d002006210503400240024020052d0000221141034b0d0002400240024020110e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200c415c6a220c0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200c415c6a220c0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200c415c6a220c0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200c415c6a220c0d000b0b0240200d450d00200610230b200241f0006a24000f0b101e000b20164104102a000b101d000bf71c09017f017e037f017e057f037e027f027e027f230041c0006b2200240020004188a4c10041101092012000290308210120002802002102200041306a41086a220342003703002000420037033041f3a6c1004115200041306a1000200041106a41086a2003290300370300200020002903303703100240024002400240024002400240024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200041003a0030200041106a4110200041306a41014100100141016a41014d0d0120002d00300d050b410810262204450d0120044200370300200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412004290300210502400240024020002802342206200028023822076b41084f0d00200741086a22082007490d0820064101742203200820082003491b22094100480d082006450d0120002802302006200910272203450d020c050b200741086a2108200028023021030c050b2009102622030d030b20094101102a000b41d4aac10041331021000b41084108102a000b2000200936023420002003360230200921060b200041306a41086a2008360200200320076a2005370000200041106a411020032008100402402006450d00200310230b20041023024002400240410810262208450d0020084200370300200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412008290300210502400240024020002802342207200028023822066b41084f0d00200641086a22032006490d0720074101742204200320032004491b22034100480d072007450d0120002802302007200310272204450d020c040b200028023021040c040b2003102622040d020b20034101102a000b41084108102a000b2000200336023420002004360230200321070b200041306a41086a2203200641086a2209360200200420066a2005370000200041106a411020042009100402402007450d00200410230b200810232003420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020004200370330200041106a4110200041306a41081004200041013a0020200342003703002000420037033041f3a6c1004115200041306a10002004200329030037030020002000290330370310200041106a4110200041206a410110040b4108210a4200210b200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a1093012000280230220a450d012000290234210b0b410821074200210c200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a2003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a10930120002802302207450d022000290234210c0b200041306a41086a220342003703002000420037033041aea7c1004114200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d014201200029033022052005501b210d200b422088a7210e20020d050c040b42e500210d200b422088a7210e2002450d030c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200e417f6a2203200e4b0d012003200e4f0d01200a20034103746a2203450d01200329030021010b4100200e41016a2203200da7417f200d428080808010541b6b2204200420034b1b220f200e4b0d01200a200f4103746a21090240024002400240200f450d00200c4220882110200a21020340200229030021054100210302402010a722044101460d002004450d0341002103034020032004410176220820036a22062005200720064103746a290300541b2103200420086b220441014b0d000b0b2005200720034103746a22042903002211520d0320102003ad580d042004200441086a2003417f732010a76a4103741095041a200c42ffffffff0f8320104220864280808080707c84210c2010427f7c2110200241086a22022009470d000b0b200b42ffffffff0f8321100240200e200f6b2203450d000240200f450d00200a200920034103741095041a0b2003ad42208620108421100b410021030240200c4220882205a72202450d00024020024101460d004100210320022104034020032004410176220820036a22062001200720064103746a290300541b2103200420086b220441014b0d000b0b200320032001200720034103746a2903002211566a20012011511b220320024b0d060b2002200ca7470d06200241016a22042002490d072005a722064101742208200420042008491bad220c4203862211422088a70d072011a722044100480d07024002402002450d0020072006410374200410272207450d010c080b2004102622070d070b20044108102a000b4100109401000b200320052011566a109401000b41fcc3c200104f000b41c2a7c10041261021000b41cce3c400104f000b4180e4c400104f000b200720034103746a220441086a2004200220036b4103741095041a2004200137030002402010a72010422088220ba72203470d00200341016a22042003490d0120034101742208200420042008491bad22104203862211422088a70d012011a722044100480d01024002402003450d00200a200341037420041027220a450d010c020b20041026220a0d010b20044108102a000b200a20034103746a20013703002005a7221241016a2213450d052013410176220320134f0d06200720034103746a2903002111024020134101710d002003417f6a220320134f0d08200720034103746a29030020117c42018821110b200041306a41086a220f4200370300200042003703304198a4c1004115200041306a1000200041106a41086a200f2903003703002000200029033037031020004100360238200042013703302000200b42017c2201a72203360220200041206a200041306a1041024002402003450d002003410374210e4100200f28020022036b210420002802342106200a21080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d0720064101742209200220022009491b22094100480d072006450d01200028023020062009102722020d020c090b200028023021020c020b200910262202450d070b2000200936023420002002360230200921060b200841086a2108200f200341086a2209360200200220036a2005370000200441786a210420092103200e41786a220e0d000c020b0b200f280200210920002802342106200028023021020b200041106a411020022009100402402006450d00200210230b02402010a7450d00200a10230b200041306a41086a220f4200370300200042003703304188a7c1004116200041306a1000200041106a41086a200f29030037030020002000290330370310200042013703302000410036023820002013360220201241037441086a2109200041206a200041306a10414100200028023822036b210420002802342106200721080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d052006410174220e20022002200e491b220e4100480d052006450d0120002802302006200e102722020d020c060b200028023021020c020b200e10262202450d040b2000200e36023420002002360230200e21060b200841086a2108200f200341086a220e360200200220036a2005370000200441786a2104200e2103200941786a22090d000b200041106a41102002200e100402402006450d00200210230b0240200ca7450d00200710230b42002105200041306a41086a2203420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020002011370330200041106a4110200041306a410810040240200d200142ffffffff0f83520d00200342003703002000420037033041af98c300410d200041306a100020042003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d05200029033021050b200041306a41086a220342003703002000420037033041c0a8c1004117200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d07200029033021100c010b42e80721100b2011200d4201887c20107c2005560d00200041306a41086a220342003703002000420037033041aec8c3004117200041306a1000200041106a41086a200329030037030020002000290330370310410810262203450d092003200d427f7c37000020034108411010272203450d0a20032011370008200041106a4110200341101004200310230b200041c0006a24000f0b101e000b200e4101102a000b20094101102a000b41d4aac10041331021000b41d4aac10041331021000b4198a8c100104f000b41b0a8c100200320131029000b41b0a8c100200320131029000b41084101102a000b41104101102a000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1000200341086a2005290300370300200320032903103703000240024002402003411041a886c500410041001001417f460d002003420037031020034110200341106a41084100100141016a41084d0d0220032903102106200341101003420121040c010b0b2000200437030020002006370308200341206a24000f0b41d4aac10041331021000bc10304027f017e087f017e230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b101d000b20054108102a000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001001220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c102722060d010c060b200c10262206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200c4108102a000b7d01017f230041c0006b220124002001412e36020c200141e8a7c100360208200120003602142001413c6a41063602002001412c6a4102360200200141013602342001420237021c2001419083c5003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41a083c5001061000b1300200041013602042000419ca9c1003602000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce0042001097042002200229031022072006290300220842f0b17f427f109804200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441ea86c5006a2f00003b00002003417e6a200a419c7f6c20096a41017441ea86c5006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441ea86c5006a2f00003b0000200941094a0d030c040b20004180011048000b20004180011048000b2003220941094c0d010b200241206a2000417e6a22006a200941017441ea86c5006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141a886c5004100200241206a20006a412720006b1097012100200241a0016a240020000bd70601067f024002400240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b20002007200220031082040d012000280218200420052000411c6a28020028020c1102000f0b024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b210b410120002d0030220120014103461b2201410371450d0220014102460d03200b21094100210b0c040b20002007200220031082040d072000280218200420052000411c6a28020028020c1102000f0b41012101200041013a00302000413036020420002007200220031082040d06200920086b21084101200041306a2d0000220120014103461b2201410371450d0320014102460d0420082109410021080c050b410021090c010b200b4101762109200b41016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110300450d000b41010f0b200041046a280200210a4101210120002007200220031082040d03200041186a2209280200200420052000411c6a220328020028020c1102000d0320092802002100417f2109200328020041106a21030340200941016a2209200b4f0d05410121012000200a2003280200110300450d000c040b0b410021090c010b20084101762109200841016a41017621080b417f2101200041046a210a200041186a21032000411c6a210202400340200141016a220120094f0d012003280200200a2802002002280200280210110300450d000b41010f0b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1102000d0020092802002100417f2109200328020041106a21030340200941016a220920084f0d03410121012000200a2003280200110300450d000b0b20010f0b41000f0b41000b11002000280200200028020420011099010b951102167f017e230041206b22032400410121040240200228021841222002411c6a2802002802101103000d00024002402001450d00200020016a2105200241186a21062002411c6a210720002108410021094100210a024003402008210b200841016a210c024002400240024002400240024002400240024020082c0000220d4100480d00200d41ff0171210d0c010b024002400240200c2005460d00200c2d0000413f71210e200841026a2208210c200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20052108200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020082005460d00200841016a220c211020082d0000413f71200e41067472210e200d41f001490d010c030b200521104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b200c21084102210c200d41776a220f411e4d0d010c020b0240024020102005460d00201041016a210820102d0000413f71210d0c010b4100210d200c21080b200e410674200f411274418080f0007172200d72220d418080c400460d084102210c200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d1086040d0002400240200d41ffff034b0d00200d4180fe0371410876211141a098c5002112410021134100210c0c010b0240200d41ffff074b0d00200d4180fe0371410876211641db9dc5002117410021184101210c0c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b0240034002400240200c0e020001010b201241026a2114201320122d0001220c6a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341f098c5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441f098c500470d030c010b2010211320142112201441f098c500470d010b200d41ffff0371210e419f9bc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041db9dc500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41db9dc500470d000b0b200f410171450d070c0a0b4100210c0c040b4100210c0c030b201041af02108c01000b201320101048000b201741026a2114201820172d0001220c6a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d052018419d9ec5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d0120102118201421172014419d9ec500470d030c010b20102118201421172014419d9ec500470d010b200d41ffff0371210e41bb9fc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041b8a2c500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41b8a2c500470d000b0b200f410171450d050c080b4101210c0c020b4101210c0c010b0b2010419e01108c01000b201820101048000b200d41017267410276410773ad4280808080d0008421194103210c0b200d210e0b2003200136020420032000360200200320093602082003200a36020c02400240200a2009490d0002402009450d0020092001460d00200920014f0d01200020096a2c000041bf7f4c0d010b0240200a450d00200a2001460d00200a20014f0d012000200a6a2c000041bf7f4c0d010b2006280200200020096a200a20096b200728020028020c1102000d0103400240024002400240024002400240200c4101460d0041dc0021090240200c4102460d00200c4103470d062019422088a741ff0171417f6a220c41044b0d060240200c0e050006040503000b201942ffffffff8f608321194103210c41fd0021090c070b4101210c0c060b4100210c200e21090c050b201942ffffffff8f60834280808080c0008421194103210c0c040b201942ffffffff8f60834280808080208421194103210c41fb0021090c030b201942ffffffff8f60834280808080308421194103210c41f50021090c020b200e2019a7220f410274411c7176410f71220c413072200c41d7006a200c410a491b21090240200f450d002019427f7c42ffffffff0f832019428080808070838421194103210c0c020b201942ffffffff8f60834280808080108421194103210c0c010b4101210c0240200d418001490d004102210c200d418010490d0041034104200d41808004491b210c0b200c200a6a2109200a200b6b20086a210a20052008470d050c060b200628020020092007280200280210110300450d000b200341206a240041010f0b20032003410c6a3602182003200341086a36021420032003360210200341106a108a04000b200341206a240041010f0b200a200b6b20086a210a20052008470d000b0b2009450d0120092001460d010240200920014f0d00200020096a2c000041bf7f4a0d020b2000200120092001108304000b410021090b200241186a220c280200200020096a200120096b2002411c6a220a28020028020c1102000d00200c2802004122200a28020028021011030021040b200341206a240020040bc9bb02092b7f017efa017f027e7d7f017e797f027e057f230041e0006b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5a2004410174220c200b200b200c491b220c4100480d5a2004450d2d20022802002004200c1027220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d0001210d200241046a280200200241086a2802002204470d0d200441016a22062004490d592004410174220e20062006200e491b220e4100480d592004450d1c20022802002004200e10272206450d1d0c540b2001410c6a280200210f200141086a2802002110200141046a2802002111200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d2002280200200420051027220b450d1e0c510b2001410c6a2802002112200141086a2802002113200141046a2802002114200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1e2002280200200420051027220b450d1f0c4e0b200141146a2802002115200141106a28020021162001410c6a2802002117200141086a2802002118200141056a2d00002119200141046a2d0000211a200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1f2002280200200420051027220b450d200c4b0b2001410c6a280200211b200141086a280200211c200141046a280200211d200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d202002280200200420051027220b450d210c480b2001410c6a2802002106200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d212002280200200420051027220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d222002280200200420051027220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d232002280200200420051027220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d262002280200200420051027220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5020044101742205200b200b2005491b22054100480d502004450d272002280200200420051027220b450d280c390b200141286a2802002108200141246a2802002129200141206a280200212a2001411c6a280200212b200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a280200212f200141046a2802002130200241046a280200200241086a2802002231470d0e203141016a22042031490d5020314101742232200420042032491b22324100480d502031450d2820022802002031203210272204450d290c360b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d292002280200200420051027220b450d2a0c330b2001410c6a2802002136200141086a2802002137200141046a2802002138200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a2002280200200420051027220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4c200b4101742206200520052006491b22064100480d4c200b450d2b2002280200200b200610272205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b200228020021040c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200e102622060d370b200e4101102a000b20051026220b0d330b20054101102a000b20051026220b0d2f0b20054101102a000b20051026220b0d2b0b20054101102a000b20051026220b0d270b20054101102a000b20051026220b0d230b20054101102a000b20051026220b0d1f0b20054101102a000b20051026220b0d1b0b20054101102a000b200c1026220b0d290b200c4101102a000b20051026220b0d150b20054101102a000b20051026220b0d110b20054101102a000b2032102622040d0d0b20324101102a000b20051026220b0d090b20054101102a000b20051026220b0d050b20054101102a000b2006102622050d010b20064101102a000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210e410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d23024002402006450d00200e200620051027220e0d010c040b20051026220e450d030b200521060b200e200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a2109200241086a2107200241046a2139200b210503400240024002400240203928020020072802002204470d00200441016a220d2004490d2620044101742208200d200d2008491b22084100480d262004450d012002280200200420081027220d0d020c060b2002280200210d0c020b20081026220d450d040b2002200d36020020392008360200200728020021040b2007200441016a360200200d20046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b20094d0d00200228020021050c040b2004200b6a22072004490d2120054101742204200720072004491b22044100480d21024002402005450d0020022802002005200410272205450d010c040b2004102622050d030b20044101102a000b20054101102a000b20084101102a000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200e200b1094041a4101213902402006450d00200e10230b4101210e4101210d410621040c1c0b2002200b360200200241046a2005360200200241086a28020021040b41012196024108219702200241086a200441016a360200200b20046a410a3a000041002198022003412c6a229902410036020020034201370224200320023602202038203641186c6a219a024107219b0241ff00219c0241807f219d024100219e024100219f02203621a0020240024041004100460d00411621450c010b41152145410e21040c1b0b410e21040c1a0b2002200b360200200241046a2005360200200241086a28020021040b41012189024108218a02200241086a200441016a360200200b20046a41063a00004100218b02200341dc006a228c0241003602002003420137025420032002360250203520334104746a218d024107218e0241ff00218f0241807f2190024100219102410021920220332193020240024041004100460d00411221450c010b41112145410e21040c190b410e21040c180b20022004360200200241046a2032360200200241086a28020021310b200241086a203141016a360200200420316a41003a0000202e422088a72106410121324100210b4100213141002104202ea722880221050240024002400340024020312004470d00200441016a220b2004490d1d20044101742207200b200b2007491b220b4100480d1d024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200541807f72200541ff0071200541077622071b3a0000203141016a21312007210520070d000b200420316b2088024f0d0220312088026a220b2031490d1b20044101742205200b200b2005491b220b4100480d1b024002402004450d0020322004200b10272232450d010c030b200b102622320d020b200b4101102a000b200b4101102a000b200b21040b203220316a20302088021094041a0240202f450d0020301023200b21040b20880220316a2131024002400240024002400340024020312004470d00200441016a220b2004490d1f20044101742205200b200b2005491b220b4100480d1f024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200641807f72200641ff0071200641077622051b3a0000203141016a21312005210620050d000b024002400240202d450d00202b210503400240024002400240200b2031470d00200b41016a2231200b490d25200b4101742204203120312004491b22044100480d25200b450d012032200b2004102722320d020c090b200b21040c020b200410262232450d070b200b21312004210b0b203220316a200541807f72200541ff0071200541077622061b3a0000203141016a21312006210520060d000b200420316b202b4f0d062031202b6a220b2031490d2020044101742205200b200b2005491b220b4100480d202004450d0120322004200b10272232450d020c050b200b21044101212f0c060b200b102622320d030b200b4101102a000b200b4101102a000b20044101102a000b200b21040b203220316a202d202b1094041a2031202b6a21314100212f202c450d00202d10230b202a20084104746a21302008210b024002400340024002400240024020042031470d00200441016a22312004490d1f20044101742205203120312005491b222b4100480d1f2004450d0120322004202b102722320d020c050b2004212b0c020b202b10262232450d030b20042131202b21040b203220316a200b41807f72200b41ff0071200b41077622051b3a0000203141016a21312005210b20050d000b02402008450d0041102184034108218503410c218603417f218703410621880341012189034100218a034107218b0341ff00218c0341807f218d034102218e034103218f0341c00021900341ff0121910341042192034105219303202a218802412121450c020b202a218802410821040c180b202b4101102a000b410e21040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a000020282026410c6c6a21f9014100210b410021fa01410021fb01410121fc0120262104024002400340024020fa0120fb01470d00200b20fa0141016a22052005200b491b22fb014100480d190240200b450d0020fc0120fa0120fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120fa016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20fa0141016a21fa012005210420050d000b02402026450d00410c21fd01410221fe01410121ff01410821800241002181024104218202410721830241ff0021840241807f2185022028218602411021450c020b2028218702410721040c160b20fb014101102a000b410e21040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21e9014100210b410021ea01410021eb01410121ec0120062104024002400340024020ea0120eb01470d00200b20ea0141016a22052005200b491b22eb014100480d170240200b450d0020ec0120ea0120eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120ea016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ea0141016a21ea012005210420050d000b02402006450d00411021ed01410521ee01410121ef01410021f001410421f101410221f201410721f30141ff0021f40141807f21f501410321f601202521f701410f21450c020b202521f801410521040c140b20eb014101102a000b410e21040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21d9014100210b410021da01410021db01410121dc0120062104024002400340024020da0120db01470d00200b20da0141016a22052005200b491b22db014100480d150240200b450d0020dc0120da0120db01102722dc010d010c030b20db01102622dc01450d020b20dc0120da016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20da0141016a21da012005210420050d000b02402006450d00411421dd01410421de01410121df01411021e001410721e10141ff0021e20141807f21e301410021e401410221e501202321e601410e21450c020b202321e701410421040c120b20db014101102a000b410e21040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21cd014100210b410021ce01410021cf01410121d001200621040240024002400340024020ce0120cf01470d00200b20ce0141016a22052005200b491b22cf014100480d140240200b450d0020d00120ce0120cf01102722d0010d010c030b20cf01102622d001450d020b20d00120ce016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ce0141016a21ce012005210420050d000b2006450d01410121d101410721d20141ff0021d30141807f21d401410021d501410221d601410421d701202121d801410d21450c020b20cf014101102a000b410121040c0f0b410e21040c0e0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41023a0000201f200641286c6a21aa014100210b410021ab01410021ac01410121ad0120062104024002400340024020ab0120ac01470d00200b20ab0141016a22052005200b491b22ac014100480d110240200b450d0020ad0120ab0120ac01102722ad010d010c030b20ac01102622ad01450d020b20ad0120ab016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ab0141016a21ab012005210420050d000b02402006450d00412821ae01410421af01412421b001412021b101411c21b201411a21b301411921b401411421b501411021b601410721b70141ff0021b80141807f21b901410121ba01410021bb01410221bc0141f00021bd01410321be01417f21bf01413f21c00141c00021c10141ff0121c201201f21c301410c21450c020b201f21c301410321040c0e0b20ac014101102a000b410e21040c0c0b2002200b360200200241046a2005360200200241086a28020021040b41012181014108218201200241086a200441016a360200200b20046a41093a00004100218301200341dc006a22840141003602002003420137025420032002360250201d201b411c6c6a218501410721860141ff0021870141807f21880141002189014100218a01201b218b010240024041004100460d00410821450c010b41072145410e21040c0b0b410e21040c0a0b2002200b360200200241046a2005360200200241086a28020021040b4101216d200241086a200441016a3602004100216e200b20046a41003a0000024002400240024002400240024041041026226f450d00206f41eec2b5ab063600000240024002400240024002400240201a4101460d000240201a4102460d002018217020172171201621724101217341012174201a4103460d0e41012170410021044100210b20162105034002400240024002402004200b470d00200441016a220b2004490d1e20044101742206200b200b2006491b22714100480d1e2004450d01207020042071102722700d020c0b0b200421710c020b207110262270450d090b2004210b207121040b2070200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2071200b6b20164f0d0d200b20166a2204200b490d1920714101742205200420042005491b22044100480d192071450d0420702071200410272270450d050c0c0b2003410036024820034201370340200341c8006a2194034101210741002105410021042018210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006102722070d010c0a0b200610262207450d090b2003200636024420032007360240200621050b209403200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201720154104746a2194032018450d0120172195032015450d0220940341706a2196034100219703410121980341102199034104219a03417f219b034108219c034107219d0341ff00219e0341807f219f03411a21a003200341dc006a21a103410021a203201821a303201721a403410621450c0a0b4100216d2003410036024820034201370340200341086a410c6a2015360200200341086a41086a20163602002003201736020c20032018360208200341d0006a200341086a200341c0006a109b01024020032d00502279411a470d00200341c0006a41086a2802002172200328024421712003280240217041012173410021744100216e41012119410121754101102622760d080c190b200341d0006a41086a35020021a803200328025421a90320032d005321a50320032d005221a60320032d005121a703200341d0006a410c6a350200422086212e02402003280244450d00200328024010230b202e20a8038421a803410b21040c150b20172195030b209503209403460d06410c21040c130b2004102622700d070b20044101102a000b20714101102a000b20064101102a000b41044101102a000b410021040c0d0b410d21040c0c0b410e21040c0b0b200421710b2070200b6a201820161094041a200b20166a21724101216d02402017450d00201810230b41002174410121734101216e410021190b41012175410110262276450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a000020142012410c6c6a215d4100210b4100215e4100215f41012160201221040240024003400240205e205f470d00200b205e41016a22052005200b491b225f4100480d0b0240200b450d002060205e205f102722600d010c030b205f10262260450d020b2060205e6a200441807f72200441ff0071200441077622051b3a0000200b41026a210b205e41016a215e2005210420050d000b02402012450d00410c21614102216241082163410121644100216541f0002166410421674107216841ff00216941807f216a2014216b410521450c020b2014216c410221040c080b205f4101102a000b410e21040c060b2002200b360200200241046a2005360200200241086a28020021040b4101213a4108213b200241086a200441016a360200200b20046a410b3a00004100213c200341dc006a223d410036020020034201370254200320023602502011200f411c6c6a213e4107213f41ff00214041807f21414100214241002143200f21440240024041004100460d00410121450c010b41002145410e21040c050b410e21040c040b20022006360200200241046a200e360200200241086a28020021040b200241086a220e200441016a360200200620046a200d3a000002400240024002400240200241046a2802002206200e28020022046b200b4f0d002004200b6a220d2004490d0820064101742204200d200d2004491b22044100480d082006450d0120022802002006200410272206450d020c030b200228020021060c030b2004102622060d010b20044101102a000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b1094041a4100210e4101213902402007450d00200510230b4101210d410621040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021e801200b20046a41003a00002003411c6a2005360200200341186a200636020020032007360214200320083602102003200936020c2003200a360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004702400240024020032d00502204411a470d004101210e410021394101210d0c010b20002003290340370001200020043a0000200041086a20032900473700000c010b410621040c010b410a21040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0f000102030405060708090a2324252c2c0b207620193a0000410121044101210b20722105034002400240024002402004200b470d00200420756a220b2004490d8c0220042075742206200b200b2006491b22774100480d8c022004450d01207620042077102722760d020c2e0b200421770c020b207710262276450d2c0b2004210b207721040b2076200b6a200541807f72200541ff0071200541077622061b3a0000200b20756a210b2006210520060d000b2077200b6b20724f0d1c200b20726a2204200b490d870220774101742205200420042005491b22044100480d87022077450d1a20762077200410272276450d1d0c1b0b02402020450d00202110230b200241086a2105200241046a210720ce01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d8a022004410174220d20062006200d491b220d4100480d8a022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ce014f0d00200420ce016a22052004490d8602200b4101742204200520052004491b22044100480d8602200b450d122002280200200b20041027220b450d150c130b2002280200210b0c130b20142012410c6c6a206c6b2104024003402004450d01200441746a2104206c280204210b206c410c6a216c200b4102470d000b0b02402013450d00201410230b200241086a2105200241046a2107205e210b03400240024002400240200728020020052802002204470d00200441016a22062004490d89022004410174220d20062006200d491b220d4100480d89022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b205e4f0d002004205e6a22052004490d8502200b4101742204200520052004491b22044100480d8502200b450d0d2002280200200b20041027220b450d100c0e0b2002280200210b0c0e0b20c30120aa01460d9101034020c30141186a2d00004104460d920120c30141106a280200210420c301410c6a280200210b024020c30141046a280200450d0020c30128020010230b02402004450d00200b10230b20c30141286a22c30120aa01470d000c92010b0b20e70120d901460d8f01034020e701410c6a2802004104460d9001024020e70141046a280200450d0020e70128020010230b20e70141146a22e70120d901470d000c90010b0b20f80120e901460dd801034020f801410d6a2d00004105460dd901024020f80141046a280200450d0020f80128020010230b20f80141106a22f80120e901470d000cd9010b0b410121c4010c8f010b20282026410c6c6a2087026b2104024003402004450d01200441746a2104208702280204210b208702410c6a218702200b4102470d000b0b02402027450d00202810230b200241086a2105200241046a210720fa01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20fa014f0d00200420fa016a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d042002280200200b20041027220b450d070c050b2002280200210b0c050b024003402030208802460d01208802280200210420880241106a21880220044108470d000b0b02402029450d00202a10230b200241086a2105200241046a21072031210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20314f0d00200420316a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d0f2002280200200b20041027220b450d120c100b2002280200210b0c100b02402034450d00203510230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22072802002204470d00200441016a22062004490d82022004410174220e20062006200e491b220e4100480d82022004450d0120052802002004200e102722060d020c260b200528020021060c020b200e10262206450d240b20052006360200200d200e360200200728020021040b2007200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490dfe01200b4101742204200620062004491b22044100480dfe01200b450d162005280200200b20041027220b450d190c170b2005280200210b0c170b410121050c6f0b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420fa016a360200200b20046a20fc0120fa011094041a4100210841012139024020fb01450d0020fc0110230b4101210e4101210d410121c401410121cc01410121070c8b010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a2004205e6a360200200b20046a2060205e1094041a41002107410121390240205f450d00206010230b4101210e4101210d410121c401410121cc010c86010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ce016a360200200b20046a20d00120ce011094041a410021cc0141012139024020cf01450d0020d00110230b4101210e4101210d410121c4010c81010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420316a360200200b20046a203220311094041a0240202b450d00203210230b410021c901410121390240202d450d00202f450d00202c450d00202d10230b4101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a410121060ccf010b20044101102a000b200410262276450d020b200421770b2076200b6a207020721094041a02402071450d00207010230b200b20726a2178024002400240201a450d000240201a4101460d00201a4102470d02411a21792073450d692015450d684104217a201720154104746a217b4110217c410c217d4108217e4174217f2017218001412521450c130b411a2179206d450d682015450d672015410c6c210b201721040340024020042802002205450d00200441046a280200450d00200510230b2004410c6a2104200b41746a220b0d000c680b0b411a2179201745206e720d670c010b411a21792017452074720d660b201810230c650b20044101102a000b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002145410121394101210e4101210d410121c401410121cc0141012107410121080c780b20044101102a000b4100217741012176410021780c600b4110218f04410c21900441742191044104219204412321450c090b02402016450d00201710230b200341c8006a2802002172200328024421712003280240217041022119410021734101216d410021744100216e410121754101102622760d140ce3010b200d4101102a000b200d4101102a000b200d4101102a000b200d4101102a000b20774101102a000b200e4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024020450e280100030562076b0a090c0e5d0f101112bf01b201b3016766a801a90187018601797877765958575675555453085251510b200328025421040c010b2042203a6a22042042490dec012042203a74220b20042004200b491b220b203c480dec01024002402042450d0020032802542042200b102722040d010c3f0b200b10262204450d3e0b200341d0006a203b6a200b36020020032004360254203d28020021430b203d2043203a6a360200200420436a204420417220442040712044203f7622041b3a000002402004450d0020042144200341d0006a203b6a2802002242203d2802002243470d29410021450c180b20112146200f450d01411c214741182148411421494108214a4107214b41ff00214c41807f214d200341dc006a214e4101214f41002150411a215120112152410221450c160b205220476a214620522802042209450d00205220486a2802002108205220496a280200210a2052204a6a290200212e2052280200210b2052280210214503400240024002400240200341d0006a204a6a2205280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c4a0b200328025421060c020b200710262206450d480b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b2003202e37024420032009360240200341086a200341c0006a200341d0006a109d0120032d000822532051470d5f2008210b034002400240024002402005280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c480b200328025421060c020b200710262206450d460b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b02400240024002402005280200220b204e28020022046b20084f0d00200420086a22062004490dee01200b204f742204200620062004491b22042050480dee01200b450d012003280254200b20041027220b0d020c350b2003280254210b0c020b20041026220b450d330b200520043602002003200b360254204e28020021040b204e200420086a360200200b20046a204520081094041a0240200a450d00204510230b204621522046203e470d260c020b2046203e460d01411c215441142155410c21564108215741042158411021594109215a41ffffffff03215b4170215c410321450c130b20462802042205450d00204620556a2802002106204620576a2802002107204628021021080240204620566a2802002204450d002004205874210b200521040340024020042d0000205a470d00200420576a280200205b71450d00200420586a28020010230b200420596a2104200b205c6a220b0d000b0b02402007450d00200510230b204620546a214602402006450d00200810230b2046203e470d230b02402010450d00201110230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490dec012004410174220e20072007200e491b220e4100480dec012004450d0120052802002004200e102722070d020c3b0b200528020021070c020b200e10262207450d390b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20394f0d7d200420396a22062004490de701200b4101742204200620062004491b22044100480de701200b450d532005280200200b20041027220b450d550c540b206b20616a216c206b28020422092062460d16206b20636a2802002107206b2802002104024002400240205f205e470d00205e20646a220b205e490de801205e2064742205200b200b2005491b220b2065480de801205e450d012060205e200b102722600d020c370b205f210b0c010b200b10262260450d350b2060205e6a20663a00000240024002400240200b205e20646a2205470d00200b20646a2205200b490de901200b206474225e20052005205e491b225f2065480de901200b450d012060200b205f102722600d020c370b200b215f0c020b205f10262260450d350b200b21050b206020056a20092064463a0000200520646a215e2005206474220b20676a2108200b20626a210503402008210b0240205e205f470d00205e20646a2206205e490de7012005200620062005491b225f2065480de7010240205e450d002060205e205f102722600d010c450b205f10262260450d440b2060205e6a2004206a722004206971200420687622061b3a0000200b20626a2108200520626a2105205e20646a215e2006210420060d000b024020092064470d0003400240205e205f470d00205e20646a2204205e490de801200b20042004200b491b225f2065480de8010240205e450d002060205e205f102722600d010c410b205f10262260450d400b2060205e6a2007206a722007206971200720687622041b3a0000200b20626a210b205e20646a215e2004210720040d000b0b206c216b206c205d470d20205d216c0c170b2080012206207c6a218001024020062802042204450d0002402006207d6a280200220b450d00200b207d6c210b0340024020042802002205450d002004207a6a280200450d00200510230b2004207d6a2104200b207f6a220b0d000b0b2006207e6a280200450d002006207a6a28020010230b208001207b470d180c5f0b200328025421040c010b2089012081016a2204208901490de30120890120810174220b20042004200b491b220b208301480de30102400240208901450d002003280254208901200b102722040d010c350b200b10262204450d340b200341d0006a2082016a200b36020020032004360254208401280200218a010b208401208a012081016a3602002004208a016a208b0120880172208b0120870171208b012086017622041b3a000002402004450d002004218b01200341d0006a2082016a280200228901208401280200228a01470d1c410721450c0c0b201d218c01201b450d01411c218d014118218e014114218f014108219001410721910141ff0021920141807f219301200341dc006a21940141012195014100219601411a21970141022198014104219901201d219a01410921450c0a0b209a01208d016a218c01209a012802042208450d00209a01208e016a2802002107209a01208f016a280200219b01209a012090016a290200212e209a01280210219c01209a01280200210b03400240024002400240200341d0006a2090016a229d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c400b200328025421050c020b200610262205450d3e0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2003202e37024420032008360240200341086a200341c0006a200341d0006a109d0120032d0008229e01209701470d51209c012007209801746a219f012007210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c3e0b200328025421050c020b200610262205450d3c0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2007450dbc01209c0121a001410021040c7b0b208c01208501460dbc01411c21a101411421a201410c21a301410821a401410421a501411021a601410921a70141ffffffff0321a801417021a901410a21450c070b208c012802042205450dbb01208c0120a2016a2802002106208c0120a4016a2802002107208c0128021021080240208c0120a3016a2802002204450d00200420a50174210b200521040340024020042d000020a701470d00200420a4016a28020020a80171450d00200420a5016a28020010230b200420a6016a2104200b20a9016a220b0d000b0b02402007450d00200510230b208c0120a1016a218c0102402006450d00200810230b208c01208501470d170cbb010b20c301220420ae016a21c30120042d001822c40120af01460d0d200420b0016a2800002109200420b1016a28000021c501200420b2016a2800002107200420b3016a2d000021c601200420b4016a2c000021c701200420b5016a280200210a200420b6016a28020021c801200428020c21c901200428020421ca01200428020021cb014101214520ab01410174210620ab01210b200428020822cc0121050340204521040240200b20ac01470d00200b20ba016a22ac01200b490ddf01200620ac0120ac012006491b22ac0120bb01480ddf010240200b450d0020ad01200b20ac01102722ad010d010c420b20ac01102622ad01450d410b20ad01200b6a200520b90172200520b80171200520b7017622081b3a0000200420ba016a2145200620bc016a2106200b20ba016a210b2008210520080d000b024020ac01200b6b20cc014f0d00200b20cc016a2205200b490dde0120ac0120ba01742206200520052006491b220520bb01480dde010240024020ac01450d0020ad0120ac012005102722ad010d010c2d0b2005102622ad01450d2c0b200521ac010b20ad01200b6a20cb0120cc011094041a024020ca01450d0020cb0110230b20ab0120cc016a210620bb0120ab016b20cc016b2108200a210b03400240200620046a220520ac01470d00200520ba016a22ab012005490ddf01200520ba017422ac0120ab0120ab0120ac01491b22ac0120bb01480ddf01024020082004470d0020ac01102622ad010d010c410b20ad01200520ac01102722ad01450d400b20ad0120066a20046a200b20b90172200b20b80171200b20b7017622051b3a0000200420ba016a21042005210b20050d000b024002400240200820ac016a20046b200a4f0d00200620046a2205200a6a220b2005490de00120ac0120ba01742205200b200b2005491b220b20bb01480de00120ac01450d0120ad0120ac01200b102722ad010d020c2c0b20ac01210b0c010b200b102622ad01450d2a0b20ad0120066a20046a20c901200a1094041a2006200a6a2205200b6b21ab01024020c801450d0020c90110230b200520046a210520ab0120046a2104024002400240024002400240024002400240024002400240024002400240024002400240024020c40120ba01460d00024020c40120bc01460d0020c40120be01470d022004450d05200b21ab010c0f0b2004450d02200b21040c080b2004450d02200b21ab010c0a0b2004450d03200b21ac010c0f0b200b20ba016a2204200b490ded01200b20ba01742205200420042005491b220420bb01480ded01200b450d0320ad01200b2004102722ad010d040c2f0b200b20ba016a2204200b490dec01200b20ba01742205200420042005491b22ab0120bb01480dec01200b450d0520ad01200b20ab01102722ad010d060c2d0b200b20ba016a2204200b490deb01200b20ba01742205200420042005491b22ab0120bb01480deb01200b450d0720ad01200b20ab01102722ad010d080c2b0b200b20ba016a2204200b490dea01200b20ba01742205200420042005491b22ac0120bb01480dea01200b450d0920ad01200b20ac01102722ad010d0a0c290b2004102622ad01450d2b0b200b21050b20ad0120056a20bc013a000002400240024002402004200520ba016a220b470d00200420ba016a220b2004490deb01200420ba01742205200b200b2005491b22ac0120bb01480deb012004450d0120ad01200420ac01102722ad010d020c320b200421ac010c020b20ac01102622ad01450d300b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de901200b20052005200b491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c410b20ac01102622ad01450d400b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d090340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de9012004200b200b2004491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c3e0b20ac01102622ad01450d3d0b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c0a0b0b20ab01102622ad01450d270b200b21050b20ad0120056a20ba013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de80120ab0120ba0174220b20042004200b491b220420bb01480de80120ab01450d0120ad0120ab012004102722ad010d020c2e0b20ab0121040c020b2004102622ad01450d2c0b20ab01210b0b20ad01200b6a20bd013a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de801200420ba01742205200b200b2005491b22ac0120bb01480de8012004450d0120ad01200420ac01102722ad010d020c2d0b200421ac010c020b20ac01102622ad01450d2b0b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de601200b20052005200b491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3d0b20ac01102622ad01450d3c0b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d060340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de6012004200b200b2004491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3a0b20ac01102622ad01450d390b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c070b0b20ab01102622ad01450d230b200b21050b20ad0120056a20be013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de50120ab0120ba0174220b20042004200b491b220420bb01480de50120ab01450d0120ad0120ab012004102722ad010d020c290b20ab0121040c020b2004102622ad01450d270b20ab01210b0b20ad01200b6a20c70120bf0173220520c0017120c10172200520c70120bf014a1b3a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de501200420ba01742205200b200b2005491b22ac0120bb01480de5012004450d0120ad01200420ac01102722ad010d020c280b200421ac010c020b20ac01102622ad01450d260b2004210b0b20ad01200b6a20c60120c2017120bb01473a0000200b20ba016a21ab0120c30120aa01470d180c6f0b20ac01102622ad01450d1f0b200b21050b20ad0120056a20bb013a0000200520ba016a21ab01200520ba017420bc016a21040340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de0012004200b200b2004491b22ac0120bb01480de001024020ab01450d0020ad0120ab0120ac01102722ad010d010c360b20ac01102622ad01450d350b20ad0120ab016a200720b90172200720b80171200720b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2107200b0d000b0b20c30120aa01470d150c6b0b20ce0120d10174210b20d80128020021040340024020ce0120cf01470d0020ce0120d1016a220520ce01490dde01200b20052005200b491b22cf0120d501480dde01024020ce01450d0020d00120ce0120cf01102722d0010d010c420b20cf01102622d001450d410b20d00120ce016a200420d40172200420d30171200420d2017622051b3a0000200b20d6016a210b20ce0120d1016a21ce012005210420050d000b20d80120d7016a22d80120cd01470d12410121040cdb010b20e60120dd016a21e70120e60128020c220920de01460d0a20e601280204214520e601280200210820da0120df0174210520e60120e0016a280200210420e6012802082207210b0340024020da0120db01470d0020da0120df016a220620da01490ddd012005200620062005491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3e0b20db01102622dc01450d3d0b20dc0120da016a200b20e30172200b20e20171200b20e1017622061b3a0000200520e5016a210520da0120df016a21da012006210b20060d000b02400240024020db0120da016b20074f0d0020da0120076a220b20da01490dde0120db0120df01742205200b200b2005491b220b20e401480dde0120db01450d0120dc0120db01200b102722dc010d020c290b20db01210b0c010b200b102622dc01450d270b20dc0120da016a200820071094041a2007200b6b20da016a210502402045450d00200810230b024002402005450d00200720da016a2105200b21db010c010b200b20df016a2205200b490ddc01200b20df017422da012005200520da01491b22db0120e401480ddc0102400240200b450d0020dc01200b20db01102722dc010d010c270b20db01102622dc01450d260b200b21050b20dc0120056a20093a0000200520df016a21da01200520df017420e5016a210b0340024020da0120db01470d0020da0120df016a220520da01490ddd01200b20052005200b491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3d0b20db01102622dc01450d3c0b20dc0120da016a200420e30172200420e20171200420e1017622051b3a0000200b20e5016a210b20da0120df016a21da012005210420050d000b20e70121e60120e70120d901470d100c680b20f70120ed016a21f80120f7012d000d220920ee01460d0820f7012d000c210420f701280208210820f701280204210a20f70128020021f701024020eb0120ea01470d0020ea0120ef016a220b20ea01490ddb0120ea0120ef01742205200b200b2005491b22eb0120f001480ddb01024020ea01450d0020ec0120ea0120eb01102722ec010d010c260b20eb01102622ec01450d250b20ec0120ea016a20043a000020ea0120ef016a210420ea0120ef0174220b20f1016a2107200b20f2016a21052008210b0340200721060240200420eb01470d00200420ef016a22ea012004490ddc01200520ea0120ea012005491b22eb0120f001480ddc0102402004450d0020ec01200420eb01102722ec010d010c3b0b20eb01102622ec01450d3a0b20ec0120046a200b20f50172200b20f40171200b20f3017622ea011b3a0000200620f2016a2107200520f2016a2105200420ef016a210420ea01210b20ea010d000b2008450dad014100210502400340200420056a210b20f70120056a2d0000220720f6014b0db00141ff0021ea0102400240024002400240024020070e0401000203010b41fe0021ea010b200b20eb01470d030c020b41fd0021ea01200b20eb01460d010c020b41fc0021ea01200b20eb01470d010b200b20ef016a2207200b490ddd012006200720072006491b22eb0120f001480ddd010240200b450d0020ec01200b20eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120046a20056a20ea013a0000200620f2016a21062008200520ef016a2205470d000b200420056a210b200a0db0010cb1010b20eb014101102a000b410e21040cd8010b410e21040cd7010b410e21040cd6010b410e21040cd5010b410e21040cd4010b410e21040cd3010b410e21040cd2010b410e21040cd1010b410521040cd0010b410421040ccf010b410321040cce010b410221040ccd010b410221040ccc010b410021040ccb010b41252145410e21040cca010b410e2145410e21040cc9010b410d2145410e21040cc8010b410c2145410e21040cc7010b410c2145410e21040cc6010b410a2145410e21040cc5010b41082145410e21040cc4010b41052145410e21040cc3010b41032145410e21040cc2010b41022145410e21040cc1010b41012145410e21040cc0010b20ac014101102a000b20ab014101102a000b20ab014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20db014101102a000b20eb014101102a000b200b4101102a000b200b4101102a000b20054101102a000b205f4101102a000b200b4101102a000b200e4101102a000b200b4101102a000b200b4101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b205f4101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b205f4101102a000b20eb014101102a000b20db014101102a000b20db014101102a000b20ac014101102a000b20ac014101102a000b20cf014101102a000b20a504220420a4046a21a504024020042802042206450d00200428020821070240200420a6046a2802002204450d00200420a6046c210b200621040340024020042802002205450d00200420a8046a280200450d00200510230b200420a6046a2104200b20a7046a220b0d000b0b2007450d00200610230b20a504209403460d1a41272145410e21040c9a010b209c042206209e046a219c04024020062802042204450d0002402006209b046a280200220b450d00200b209b046c210b0340024020042802002205450d00200420a0046a280200450d00200510230b2004209b046a2104200b20a1046a220b0d000b0b2006209f046a280200450d00200620a0046a28020010230b209c04209d04460d4e41262145410e21040c99010b20a102280200220b450d3520a1022094046a280200210420a1022095046a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420960474210b200521040340024020042d0000209704470d0020042098046a28020020990471450d0020042096046a28020010230b20042095046a2104200b209a046a220b0d000b0b20a1022093046a21a10202402006450d00200510230b20a102209a02460d3541242145410e21040c98010b2095032204208f046a219503024020042802042206450d0020042802082107024020042090046a2802002204450d0020042090046c210b200621040340024020042802002205450d0020042092046a280200450d00200510230b20042090046a2104200b2091046a220b0d000b0b2007450d00200610230b0240209503209403470d00410d21040c98010b41232145410e21040c97010b2089042206208b046a218904024020062802042204450d00024020062088046a280200220b450d00200b2088046c210b0340024020042802002205450d002004208d046a280200450d00200510230b20042088046a2104200b208e046a220b0d000b0b2006208c046a280200450d002006208d046a28020010230b208904208a04460d8d0141222145410e21040c96010b024020800420fd036a280200220b450d002080042802042104200b20ff0374210b0340024020042d0000208504470d0020042082046a28020020860471450d00200420ff036a28020010230b20042084046a2104200b2087046a220b0d000b0b02402080042082046a280200450d0020800420ff036a28020010230b20800420fe036a210402402080042083046a280200450d0020800428021010230b20042180042004208104460d4641202145410e21040c95010b024020f603280208220b450d0020f6032802002104200b20f50374210b0340024020042d000020f903470d00200420fa036a28020020fb0371450d00200420f5036a28020010230b200420f8036a2104200b20fc036a220b0d000b0b20f60320f8036a2104024020f60320f5036a280200450d0020f60328020010230b200421f603200420f703460d43411f2145410e21040c94010b024020ed0320ea036a280200220b450d0020ed032802042104200b20ec0374210b0340024020042d000020f203470d00200420ef036a28020020f30371450d00200420ec036a28020010230b200420f1036a2104200b20f4036a220b0d000b0b024020ed0320ef036a280200450d0020ed0320ec036a28020010230b20ed0320eb036a2104024020ed0320f0036a280200450d0020ed0328021010230b200421ed03200420ee03460d3c411e2145410e21040c93010b024020e20320e1036a280200450d0020e20328020010230b024020e20320e4036a280200220b450d0020e20328020c2104200b20e10374210b0340024020042d000020e603470d00200420e7036a28020020e80371450d00200420e1036a28020010230b200420e5036a2104200b20e9036a220b0d000b0b20e20320e0036a2104024020e20320e5036a280200450d0020e20320df036a28020010230b200421e203200420e303460d36411d2145410e21040c92010b20041026220b450d010b2005200b360200200541046a2004360200200541086a28020021040c290b20044101102a000b208c012802042205450d01208c0120d7036a2802002106208c0120d9036a2802002107208c0128021021080240208c0120d8036a2802002204450d00200420da0374210b200521040340024020042d000020dc03470d00200420d9036a28020020dd0371450d00200420da036a28020010230b200420db036a2104200b20de036a220b0d000b0b02402007450d00200510230b208c0120d6036a218c0102402006450d00200810230b208c01208501460d01410b2145410e21040c8e010b200341146a28020021d003200341106a28020021d103200328020c21d20320032d000b21d30320032d000a21d40320032d000921d5030240209b01450d00209c0110230b208c01208501460d00411c21d603411421d703410c21d803410821d903410421da03411021db03410921dc0341ffffffff0321dd03417021de03410b21450c020b0240201c450d00201d10230b0240200341d0006a41086a280200450d00200328025410230b200020d5033a00012000209e013a00002000410c6a20d003360000200041086a20d103360000200041046a20d203360000200041036a20d3033a0000200041026a20d4033a000041002105410121e8014101210c0b410121060c290b410e21040c8a010b20462802042205450d01204620c8036a2802002106204620ca036a2802002107204628021021080240204620c9036a2802002204450d00200420cb0374210b200521040340024020042d000020cd03470d00200420ca036a28020020ce0371450d00200420cb036a28020010230b200420cc036a2104200b20cf036a220b0d000b0b02402007450d00200510230b204620c7036a214602402006450d00200810230b2046203e460d0141042145410e21040c89010b200341146a28020021c103200341106a28020021c203200328020c21c30320032d000b21c40320032d000a21c50320032d000921c6030240200a450d00204510230b2046203e460d00411c21c703411421c803410c21c903410821ca03410421cb03411021cc03410921cd0341ffffffff0321ce03417021cf03410421450c010b02402010450d00201110230b0240200341d0006a41086a280200450d00200328025410230b200020c6033a0001200020533a00002000410c6a20c103360000200041086a20c203360000200041046a20c303360000200041036a20c4033a0000200041026a20c5033a000041002107410121e8014101210c41012105410121060c260b410e21040c86010b20bb0320bc036a2d000020bd03460d4e20bb03280204210620bb032802002105024020bb032802082204450d00200420b80374210b200521040340024020042d000020be03470d00200420bf036a28020020c00371450d00200420b8036a28020010230b200420ba036a2104200b20b9036a220b0d000b0b20bb0320ba036a21bb0302402006450d00200510230b20bb03208d02460d4e41142145410e21040c85010b0240024020940220ab036a2d000020ac03460d002094022802042106209402280200210502402094022802082204450d00200420ad0374210b200521040340024020042d000020ae03470d00200420af036a28020020b00371450d00200420ad036a28020010230b200420aa036a2104200b20b1036a220b0d000b0b20940220aa036a21940202402006450d00200510230b0240209402208d02470d00410921040c87010b411321450c010b410921040c85010b410e21040c84010b2016450d00201710230b0b0240024002402079411a470d002003411c6a2078360200200341086a41106a20773602002003207636021420034284808080c00037020c2003206f360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004720032d00502204411a470d0141002106410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a0c660b20a50341ff017141107420a60341ff01714108747220a70341ff017172210402402077450d00207610230b200041086a20a803370200200041046a20a90336020020002004410874207972360200206f10230c010b20002003290340370001200020043a0000200041086a20032900473700000b4100210b410121e8014101210c41012105410121064101210720012d00002204410e4b0d220c210b20a4032105024003402005209a036a28020022080d0120a2032098036a21a20320940320052099036a2205470d000c080b0b20052099036a21a40320a2032098036a210a20a303209b036a21a3032005209c036a290200212e20052802002109200341c0006a209c036a227928020021042003280244210b034002400240024002402004200b470d00200b2098036a2206200b490d8701200b209803742207200620062007491b2207209703480d8701200b450d012003280240200b2007102722060d020c060b200328024021060c020b200710262206450d040b20032007360244200320063602402007210b0b207920042098036a2207360200200620046a20a203209f037220a203209e037120a203209d037622061b3a000020072104200621a20320060d000b200341086a209c036a202e3703002003200836020c20032009360208200341d0006a200341086a200341c0006a109b01024020032d0050227920a003470d00024020a303450d00200a21a2032096032005470d040b200541106a229503209403470d060c050b20a10335020021a204200341d0006a209c036a35020021a304200328025421a90320032d005321a50320032d005221a60320032d005121a70320940341706a2005460d00411021a404200541106a21a504410c21a604417421a704410421a804412721450c080b02402016450d00201710230b20a20442208621a80302402003280244450d00200328024010230b20a80320a3048421a8030c020b20074101102a000b410621450c040b410b21040c7c0b410d21040c7b0b410c21040c7a0b410d21040c790b410e21040c780b410e21040c770b20880222052084036a2188020240024002400240024020052802002206208503460d0020052085036a28020021042005280204210b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020062087036a22062088034b0d0020052086036a2802002108024002400240024020060e0700050203010607000b202b2031470d0b202b2089036a2231202b490dd201202b208903742205203120312005491b2206208a03480dd201202b450d1b2032202b2006102722320d1c0c490b202b2031470d06202b2089036a2231202b490dd101202b208903742205203120312005491b2206208a03480dd101202b450d0e2032202b2006102722320d0f0c450b202b2031470d06202b2089036a2231202b490dd001202b208903742205203120312005491b2206208a03480dd001202b450d102032202b2006102722320d110c450b202b2031470d06202b2089036a2231202b490dcf01202b208903742205203120312005491b2206208a03480dcf01202b450d122032202b2006102722320d130c450b202b2031470d06202b2089036a2231202b490dce01202b208903742205203120312005491b2206208a03480dce01202b450d142032202b2006102722320d150c410b202b2031470d07202b2089036a2231202b490dcd01202b208903742205203120312005491b2206208a03480dcd01202b450d192032202b2006102722320d1a0c450b202b2031470d07202b2089036a2231202b490dcc01202b208903742205203120312005491b2206208a03480dcc01202b450d1b2032202b2006102722320d1c0c450b202b2031470d07202b2089036a2231202b490dcb01202b208903742205203120312005491b2206208a03480dcb01202b450d1d2032202b2006102722320d1e0c450b202b21060c090b202b21060c0b0b202b21060c0d0b202b21060c0f0b202b21060c110b202b21060c130b202b21060c150b202b21060c170b200610262232450d360b202b21310b203220316a2093033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc5012006208903742205203120312005491b2205208a03480dc5012006450d01203220062005102722320d020c270b200621050c020b200510262232450d250b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc501200520890374220b20312031200b491b220b208a03480dc5012005450d0120322005200b102722320d020c280b2005210b0c020b200b10262232450d260b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc801200b208903742205203120312005491b2205208a03480dc801200b450d012032200b2005102722320d020c380b200b21050c020b200510262232450d360b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dc1012005208903742204203120312004491b222b208a03480dc1012005450d1720322005202b102722320d180c3c0b2005212b0c180b200610262232450d340b202b21310b203220316a208f033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc2012006208903742205203120312005491b2205208a03480dc2012006450d01203220062005102722320d020c260b200621050c020b200510262232450d240b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc201200520890374220b20312031200b491b220b208a03480dc2012005450d0120322005200b102722320d020c270b2005210b0c020b200b10262232450d250b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc501200b208903742205203120312005491b2205208a03480dc501200b450d012032200b2005102722320d020c360b200b21050c020b200510262232450d340b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbe012005208903742204203120312004491b222b208a03480dbe012005450d1720322005202b102722320d180c3a0b2005212b0c180b200610262232450d320b202b21310b203220316a2092033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbf012006208903742205203120312005491b2205208a03480dbf012006450d01203220062005102722320d020c250b200621050c020b200510262232450d230b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbf01200520890374220b20312031200b491b220b208a03480dbf012005450d0120322005200b102722320d020c260b2005210b0c020b200b10262232450d240b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc201200b208903742205203120312005491b2205208a03480dc201200b450d012032200b2005102722320d020c340b200b21050c020b200510262232450d320b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbb012005208903742204203120312004491b222b208a03480dbb012005450d1720322005202b102722320d180c380b2005212b0c180b200610262232450d2c0b202b21310b203220316a208a033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbc012006208903742205203120312005491b2205208a03480dbc012006450d01203220062005102722320d020c1c0b200621050c020b200510262232450d1a0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbc01200520890374220b20312031200b491b222b208a03480dbc012005450d0120322005202b102722320d020c1d0b2005212b0c020b202b10262232450d1b0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0d0b0b200610262232450d2d0b202b21310b203220316a2089033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db9012006208903742205203120312005491b2205208a03480db9012006450d01203220062005102722320d020c210b200621050c020b200510262232450d1f0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db901200520890374220b20312031200b491b222b208a03480db9012005450d0120322005202b102722320d020c220b2005212b0c020b202b10262232450d200b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0a0b0b200610262232450d2b0b202b21310b203220316a208e033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db6012006208903742205203120312005491b2205208a03480db6012006450d01203220062005102722320d020c200b200621050c020b200510262232450d1e0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db601200520890374220b20312031200b491b222b208a03480db6012005450d0120322005202b102722320d020c210b2005212b0c020b202b10262232450d1f0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c070b0b200610262232450d290b202b21310b203220316a2088033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db3012006208903742205203120312005491b2205208a03480db3012006450d01203220062005102722320d020c1f0b200621050c020b200510262232450d1d0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db301200520890374220b20312031200b491b222b208a03480db3012005450d0120322005202b102722320d020c200b2005212b0c020b202b10262232450d1e0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c040b0b200610262232450d270b202b21310b203220316a208b033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db0012006208903742205203120312005491b2205208a03480db0012006450d01203220062005102722320d020c1e0b200621050c020b200510262232450d1c0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db001200520890374220b20312031200b491b222b208a03480db0012005450d0120322005202b102722320d020c1f0b2005212b0c020b202b10262232450d1d0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000b0b2088022030470d280c090b202b10262232450d240b200521310b203220316a20093a000020312089036a21312088022030470d260c060b202b10262232450d220b200521310b203220316a20093a000020312089036a21312088022030470d250c030b202b10262232450d200b200521310b203220316a20093a000020312089036a21312088022030470d210b20302188020c220b20054101102a000b202b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b20054101102a000b20054101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b202b4101102a000b202b4101102a000b202b4101102a000b412121450c050b412121450c050b412121450c050b412121450c050b410821040c7b0b410821040c7a0b410e21040c790b410e21040c780b410e21040c770b410e21040c760b024020fc0220f9026a280200220b450d0020fc022802042104200b20fb0274210b0340024020042d0000208103470d00200420fe026a28020020820371450d00200420fb026a28020010230b20042080036a2104200b2083036a220b0d000b0b024020fc0220fe026a280200450d0020fc0220fb026a28020010230b20fc0220fa026a2104024020fc0220ff026a280200450d0020fc0228021010230b200421fc02200420fd02460d66411c2145410e21040c750b024020f202280208220b450d0020f2022802002104200b20f10274210b0340024020042d000020f502470d00200420f6026a28020020f70271450d00200420f1026a28020010230b200420f4026a2104200b20f8026a220b0d000b0b20f20220f4026a2104024020f20220f1026a280200450d0020f20228020010230b200421f202200420f302460d63411b2145410e21040c740b024020e90220e6026a280200220b450d0020e9022802042104200b20e80274210b0340024020042d000020ee02470d00200420eb026a28020020ef0271450d00200420e8026a28020010230b200420ed026a2104200b20f0026a220b0d000b0b024020e90220eb026a280200450d0020e90220e8026a28020010230b20e90220e7026a2104024020e90220ec026a280200450d0020e90228021010230b200421e902200420ea02460d5c411a2145410e21040c730b024020de0220dd026a280200450d0020de0228020010230b024020de0220e0026a280200220b450d0020de0228020c2104200b20dd0274210b0340024020042d000020e202470d00200420e3026a28020020e40271450d00200420dd026a28020010230b200420e1026a2104200b20e5026a220b0d000b0b20de0220dc026a2104024020de0220e1026a280200450d0020de0220db026a28020010230b200421de02200420df02460d5641192145410e21040c720b02402022450d00202310230b200241086a2105200241046a210720da01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d782004410174220d20062006200d491b220d4100480d782004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20da014f0d00200420da016a22052004490d78200b4101742204200520052004491b22044100480d78200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420da016a360200200b20046a20dc0120da011094041a4100210541012139024020db01450d0020dc0110230b4101210e4101210d410121c401410121cc014101210741012108410121450c080b20044101102a000b200d4101102a000b0240201e450d00201f10230b200241086a2105200241046a210720ab01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d762004410174220d20062006200d491b220d4100480d762004450d0120022802002004200d102722060d020c0c0b200228020021060c020b200d10262206450d0a0b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b20ab014f0d00200420ab016a22052004490d75200b4101742204200520052004491b22044100480d75200b450d012002280200200b20041027220b450d0a0c020b2002280200210b0c020b20041026220b450d080b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ab016a360200200b20046a20ad0120ab011094041a410021c40141012139024020ac01450d0020ad0110230b4101210e4101210d0b410121cc010b410121070b410121080b410121450b410121050b410121090c490b20044101102a000b200d4101102a000b2005280200210b0b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210a410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b0c470b20a102280200220b450d2520a10220d4026a280200210420a10220d5026a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420d60274210b200521040340024020042d000020d702470d00200420d8026a28020020d90271450d00200420d6026a28020010230b200420d5026a2104200b20da026a220b0d000b0b20a10220d3026a21a10202402006450d00200510230b20a102209a02460d2541182145410e21040c650b20c00220a4026a21a10220c00228020022c102450d2320c00220a5026a28020021c20220c00220a6026a28020021c30220c00228020c21c40220c002290204212e410021c50220a8024100360200200320a90237024420c102202e20aa0288a722c60220ab02746a21c7022003200341206a360240202ea721c802410021c902024041004100460d00410121040c010b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b20a001280200210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490d84012004209501742206200520052006491b2206209601480d84012004450d01200328025420042006102722050d020c0d0b200328025421050c020b200610262205450d0b0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b20a0012099016a22a001209f01470d130c5a0b200328024421040c010b20c50220a2026a220420c502490d7d20c50220a20274220b20042004200b491b220b20af02480d7d0240024020c502450d00200328024420c502200b102722040d010c0a0b200b10262204450d090b20b102200b3602002003200436024420a80228020021c9020b20a80220c90220a2026a360200200420c9026a20c60220ae027220c60220ad027120c60220ac027622041b3a000002402004450d00200421c60220b10228020022c50220a80228020022c902470d12410221040c170b20c70220c102460d0120c10221ca02410321040c160b20ca0220b0026a21cb0220ca02290200222e20aa0288a7220420bc027120b202460d13200420a4027420a402752107202ea7210b0340024002400240024020b10228020020a8022802002204470d00200420a2026a22052004490d8001200420a202742206200520052006491b220620af02480d80012004450d01200328024420042006102722050d020c0a0b200328024421050c020b200610262205450d080b20b10220063602002003200536024420a80228020021040b20a802200420a2026a360200200520046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b024002400240024020b10228020020a8022802002204470d00200420a2026a220b2004490d7f200420a202742205200b200b2005491b220520af02480d7f2004450d012003280244200420051027220b0d020c0c0b2003280244210b0c020b20051026220b450d0a0b20b10220053602002003200b36024420a80228020021040b20a802200420a2026a360200200b20046a200720bd0273220420be027120bf02722004200720bd024a1b3a000020cb0221ca0220cb0220c702470d1120c70220c70222cb02470d140c030b20c10221cb02410421040c140b20c70220cb02460d01410521040c130b20cb022d0004210420cb0220b0026a21cb02200420b202470d0f0b024020c802450d0020c10210230b20c40220c20220b2027422046a210602400240024002400240024002400240024020c202450d0020c40220a4026a210b200420b6026a210720c4022104034020042d0000210520b802200420ab026a2d00003a00002003200420a2026a2f00003b0108200520b502460d02200341306a20b7026a220820b8022d00003a0000200320032f01083b0130200420b2026a290200212e200341086a20a7026a200420a7026a28020036020020a30220032f01303b000020a30220b7026a20082d00003a0000200320053a00082003202e37020c200341d0006a200341086a200341c0006a109e0120032d005022cc0220b902462205450d05200b20a6026a210b200720b6026a2107200420a6026a22042006470d000c040b0b20c40222042006460d020c010b200420a6026a22042006460d010b03400240024020042d0000220b20b302460d00200b20b502470d010c030b200420b0026a28020020b40271450d00200420b2026a28020010230b200420a6026a22042006470d000b0b024020c302450d0020c40210230b20b102280200210a200328024421092003280240210520a80228020022c002210b03400240024002400240200520b0026a2208280200200520a7026a22062802002204470d00200420a2026a22072004490d8101200420a202742245200720072045491b224520af02480d81012004450d01200520b2026a28020020042045102722070d020c0d0b200520b2026a28020021070c020b204510262207450d0b0b20082045360200200520b2026a2007360200200628020021040b2006200420a2026a360200200720046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b02402008280200220b200628020022046b20c0024f0d00200420c0026a22072004490d7d200b20a202742204200720072004491b220420af02480d7d200b450d02200520b2026a280200200b20041027220b0d030c0b0b200520b2026a280200210b0c030b200341d0006a20a7026a28020021cd02200341d0006a20b0026a28020021ce02200328025421cf0220032d005321d00220032d005221d10220032d005121d20202402007450d00034002400240200b20ba026a22042d0000220720b302460d00200720b502470d010c030b200b28020020b40271450d00200b20bb026a28020010230b200b20a6026a210b200420a6026a2006470d000b0b024020c302450d0020c40210230b024020b102280200450d00200328024410230b2005450d0320a10221c00220a102209a02470d0b0c390b20041026220b450d080b20082004360200200520b2026a200b360200200628020021040b2006200420c0026a360200200b20046a200920c0021094041a0240200a450d00200910230b20a10221c00220a102209a02470d070c360b20a102209a02460d1241182193044114219404411021950441042196044109219704410821980441ffffffff032199044170219a04412421450c0a0b20064101102a000b20064101102a000b200b4101102a000b20454101102a000b20054101102a000b20044101102a000b411721450c010b411721450c010b410e21040c6c0b410e21040c6b0b410e21040c6a0b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b02402037450d00203810230b0240200341206a41086a280200450d00200328022410230b200020d2023a0001200020cc023a00002000410c6a20cd02360000200041086a20ce02360000200041046a20cf02360000200041036a20d0023a0000200041026a20d1023a000041002106410121e8014101210c410121050b410121070b4101210b20012d00002204410e4b0d010b024020040e0f000c0b0a05070d0e12011003080602000b200141086a280200450d63200141046a2802001023200341e0006a24000f0b2001109f01200341e0006a24000f0b0240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d61200141206a2802001023200341e0006a24000f0b2006450d60410c21df032001410c6a2802002204450d00411821e003410421e103200141046a28020022e203200441186c6a21e303411421e403411021e503410921e603410821e70341ffffffff0321e803417021e903411d21450c130b200141086a280200450d5f200141046a2802001023200341e0006a24000f0b200141086a280200450d5e200141046a2802001023200341e0006a24000f0b200b450d5d200141046a2d000022044102460d0d20044101460d0c20040d0f2001410c6a280200450d5d200141086a2802001023200341e0006a24000f0b200141086a280200450d5c200141046a2802001023200341e0006a24000f0b2007450d5b410c21ea032001410c6a2802002204450d00411c21eb03410421ec03200141046a28020022ed032004411c6c6a21ee03410821ef03411421f003411021f103410921f20341ffffffff0321f303417021f403411e21450c0f0b200141086a280200450d5a200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d59200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d58200141046a2802001023200341e0006a24000f0b20e801450d570240200141086a280200450d00200141046a28020010230b200141146a280200450d57200141106a2802001023200341e0006a24000f0b200141086a280200450d56200141046a2802001023200341e0006a24000f0b200c450d552001410c6a2802002204450d00410421f503200141046a28020022f60320044104746a21f703411021f803410921f903410821fa0341ffffffff0321fb03417021fc03411f21450c0a0b200141086a280200450d54200141046a2802001023200341e0006a24000f0b2005450d53410c21fd032001410c6a2802002204450d00411c21fe03410421ff03200141046a2802002280042004411c6c6a218104410821820441142183044110218404410921850441ffffffff032186044170218704412021450c090b200141086a280200450d52200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d51200141046a2802001023200341e0006a24000f0b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d502001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c219b042001410c6a280200229c0420044104746a219d044110219e044108219f04410421a004417421a104412621450c060b200141106a280200450d4e2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d4d200141086a2802001023200341e0006a24000f0b410e21040c480b410e21040c470b410e21040c460b410e21040c450b410e21040c440b209e022096026a2204209e02490d45209e0220960274220b20042004200b491b220b209802480d45024002400240209e02450d002003280224209e02200b102722040d010c020b200b10262204450d010b200341206a2097026a200b36020020032004360224209902280200219f020c020b200b4101102a000b200328022421040b209902209f022096026a3602002004209f026a20a002209d027220a002209c027120a002209b027622041b3a000002402004450d00200421a002200341206a2097026a280200229e02209902280200229f02470d03411521450c040b203821a1022036450d00410121a202200341086a41017221a302411821a402411421a502411021a602410c21a702200341c0006a410c6a21a802420121a902422021aa02410321ab02410721ac0241ff0021ad0241807f21ae02410021af02410821b002200341c0006a41086a21b102410421b202410921b30241ffffffff0321b40241ac0121b502417021b602410221b702200341086a41026a21b802411a21b902417821ba02417c21bb0241ff0121bc02417f21bd02413f21be0241c00021bf02203821c002411721450c050b20a102209a02460d00411821d302411421d402411021d502410421d602410921d702410821d80241ffffffff0321d902417021da02411821450c050b02402037450d00203810230b200341206a41086a2802002145200328022421082003280220220541046a210d2003412c6a2802002239210b024003400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d472004410174220e20072007200e491b220e4100480d472004450d0120052802002004200e102722070d020c050b200528020021070c020b200e10262207450d030b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d47200b4101742204200620062004491b22044100480d47200b450d012005280200200b20041027220b450d040c020b2005280200210b0c020b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210b410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121090c210b20044101102a000b200e4101102a000b411621450c010b410e21040c3d0b410e21040c3c0b410e21040c3b0b410e21040c3a0b2091022089026a2204209102490d3a20910220890274220b20042004200b491b220b208b02480d3a024002400240209102450d002003280254209102200b102722040d010c020b200b10262204450d010b200341d0006a208a026a200b36020020032004360254208c022802002192020c020b200b4101102a000b200328025421040b208c022092022089026a36020020042092026a20930220900272209302208f0271209302208e027622041b3a000002402004450d002004219302200341d0006a208a026a280200229102208c02280200229202470d04411121450c070b2035219402024002402033450d004100210602400340200341086a41086a2209203520066a220b41086a2802003602002003200b290200370308200b410d6a2d0000220a4102460d01200341306a41086a2204200928020036020020032003290308370330200b410c6a2d0000219502200341206a41086a22cc012004280200360200200320032903303703200240024002400240200341d0006a41086a2207280200200341d0006a410c6a22052802002204470d00200441016a22082004490d40200441017422c4012008200820c401491b22c4014100480d402004450d012003280254200420c401102722080d020c090b200328025421080c020b20c40110262208450d070b200720c40136020020032008360254200528020021040b2005200441016a360200200820046a41fdf9ff7720950241037441187141107376413f7141c000723a00000240024002400240200728020020052802002204470d00200441016a22082004490d40200441017422950220082008209502491b2295024100480d402004450d0120032802542004209502102722080d020c0a0b200328025421080c020b20950210262208450d080b200720950236020020032008360254200528020021040b2005200441016a360200200820046a200a4100473a0000200341c0006a41086a20cc0128020036020020032003290320370340200341086a200341c0006a200341d0006a109d0120032d0008229502411a470d03200641106a2106200b41106a208d02470d000c090b0b200b41106a2194020b209402208d02460d05411021aa03410d21ab03410221ac03410421ad03410921ae03410821af0341ffffffff0321b003417021b103411321450c090b200341086a410c6a28020021b203200928020021b303200328020c21b40320032d000b21b50320032d000a21b60320032d000921b703410421b803417021b903203341047441706a2006460d00411021ba03200b41106a21bb03410d21bc03410221bd03410921be03410821bf0341ffffffff0321c003411421450c090b02402034450d00203510230b0240200341d0006a41086a280200450d00200328025410230b200020b7033a000120002095023a00002000410c6a20b203360000200041086a20b303360000200041046a20b403360000200041036a20b5033a0000200041026a20b6033a00004100210c410121e801410a21040c360b20c4014101102a000b2095024101102a000b411221450c030b410921040c320b410921040c310b410e21040c300b410e21040c2f0b410e21040c2e0b410e21040c2d0b20860220fd016a218702024002400240208602280204220920fe01460d002086022080026a2802002107208602280200210b0240024002400240024020fb0120fa01470d0020fa0120ff016a220420fa01490d3520fa0120ff01742205200420042005491b22fb01208102480d35024020fa01450d0020fc0120fa0120fb01102722fc010d010c020b20fb01102622fc01450d010b20fc0120fa016a200920ff01463a000020fa0120ff016a210420fa0120ff017422052082026a2108200520fe016a21fa01024002400340200821050240200420fb01470d00200420ff016a22062004490d3820fa012006200620fa01491b22fb01208102480d3802402004450d0020fc01200420fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120046a200b20850272200b20840271200b2083027622061b3a0000200520fe016a210820fa0120fe016a21fa01200420ff016a21042006210b20060d000b02400240200920ff01470d00200421fa010340024020fa0120fb01470d0020fa0120ff016a220420fa01490d3a2005200420042005491b22fb01208102480d3a024020fa01450d0020fc0120fa0120fb01102722fc010d010c060b20fb01102622fc01450d050b20fc0120fa016a20072085027220072084027120072083027622041b3a0000200520fe016a210520fa0120ff016a21fa012004210720040d000b20870221860220870220f901470d050c010b200421fa0120870221860220870220f901470d050b20f9012187020c050b20fb014101102a000b20fb014101102a000b20fb014101102a000b411021450c030b411021450c030b410721040c2f0b410721040c2e0b410e21040c2d0b410e21040c2c0b2004210b0b200a450d010b20f70110230b024002400240024002400240200920f101470d0020eb01200b470d02200b20ef016a2204200b490d2f200b20ef01742205200420042005491b22eb0120f001480d2f200b450d0120ec01200b20eb01102722ec010d020c070b024020eb01200b470d00200b20ef016a2204200b490d2f200b20ef01742205200420042005491b220420f001480d2f200b450d0320ec01200b2004102722ec010d040c080b20eb0121040c030b20eb01102622ec01450d050b20ec01200b6a20f0013a00000c020b2004102622ec01450d040b20ec01200b6a20ef013a000002400240024002402004200b20ef016a220b470d00200420ef016a220b2004490d2e200420ef01742205200b200b2005491b22eb0120f001480d2e2004450d0120ec01200420eb01102722ec010d020c080b200421eb010c020b20eb01102622ec01450d060b2004210b0b20ec01200b6a200920f3017120f401733a00000b200b20ef016a21ea0120f80121f70120f80120e901470d040b02402024450d00202510230b200241086a2105200241046a210720ea01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d2e2004410174220d20062006200d491b220d4100480d2e2004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20ea014f0d00200420ea016a22052004490d2e200b4101742204200520052004491b22044100480d2e200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ea016a360200200b20046a20ec0120ea011094041a4100210d41012139024020eb01450d0020ec0110230b4101210e410621040c290b20044101102a000b200d4101102a000b20eb014101102a000b20044101102a000b20eb014101102a000b410f2145410e21040c230b0240209b01450d00209c0110230b208c01219a01208c01208501470d1c0b0240201c450d00201d10230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d282004410174220e20072007200e491b220e4100480d282004450d0120052802002004200e102722070d020c1f0b200528020021070c020b200e10262207450d1d0b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d27200b4101742204200620062004491b22044100480d27200b450d012005280200200b20041027220b450d190c020b2005280200210b0c020b20041026220b450d170b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002109410121394101210e4101210d410121c401410121cc01410121074101210841012145410121050b4101210b0b4101210a0b410121060b410121c9010b2000411a3a000020012d00002204410e4b0d0f02400240024020040e0f000b0a0904060c0d11120f02070501000b200e450d22200141086a280200450d22200141046a2802001023200341e0006a24000f0b20c901450d210240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d21200141206a2802001023200341e0006a24000f0b200b450d20410c21db022001410c6a2802002204450d00411821dc02410421dd02200141046a28020022de02200441186c6a21df02411421e002411021e102410921e202410821e30241ffffffff0321e402417021e502411921450c170b200141086a280200450d1f200141046a2802001023200341e0006a24000f0b20cc01450d1e200141086a280200450d1e200141046a2802001023200341e0006a24000f0b2006450d1d200141046a2d000022044102460d0f20044101460d0e20040d112001410c6a280200450d1d200141086a2802001023200341e0006a24000f0b2007450d1c200141086a280200450d1c200141046a2802001023200341e0006a24000f0b200a450d1b410c21e6022001410c6a2802002204450d00411c21e702410421e802200141046a28020022e9022004411c6c6a21ea02410821eb02411421ec02411021ed02410921ee0241ffffffff0321ef02417021f002411a21450c130b200141086a280200450d1a200141046a2802001023200341e0006a24000f0b20c401450d1902402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d19200141046a2802001023200341e0006a24000f0b200d450d1802402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d18200141046a2802001023200341e0006a24000f0b2039450d170240200141086a280200450d00200141046a28020010230b200141146a280200450d17200141106a2802001023200341e0006a24000f0b2008450d16200141086a280200450d16200141046a2802001023200341e0006a24000f0b2045450d152001410c6a2802002204450d00410421f102200141046a28020022f20220044104746a21f302411021f402410921f502410821f60241ffffffff0321f702417021f802411b21450c0e0b200141086a280200450d14200141046a2802001023200341e0006a24000f0b2009450d13410c21f9022001410c6a2802002204450d00411c21fa02410421fb02200141046a28020022fc022004411c6c6a21fd02410821fe02411421ff024110218003410921810341ffffffff032182034170218303411c21450c0d0b200141086a280200450d12200141046a2802001023200341e0006a24000f0b2005450d1102402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d11200141046a2802001023200341e0006a24000f0b2001109f010c100b20044101102a000b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d0e2001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c2188042001410c6a28020022890420044104746a218a044110218b044108218c044104218d044174218e04412221450c080b200141106a280200450d0c2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d0b200141086a2802001023200341e0006a24000f0b200e4101102a000b41092145410e21040c050b410e21040c040b410e21040c030b410e21040c020b410e21040c010b410e21040c000b0b101e000b101e000b41014101102a000b200341e0006a24000bf807030e7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009102722080d020c060b200228020021080c020b200910262208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a2107024002402006450d00200a21072005450d00200b41746a210d200241086a210341002107200a210e0340200e2108024003402008280200220f0d01200741016a2107200b2008410c6a2208470d000c040b0b2008410c6a210e200741016a21102005417f6a2105200841046a290200211103400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001102722090d020c0a0b200228020021090c020b200110262209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2011422088a72212210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001102722090d020c0b0b200228020021090c020b200110262209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20124f0d00200720126a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007102722060d020c0b0b200228020021060c020b200710262206450d090b2002200636020020042007360200200328020021070b2003200720126a360200200620076a200f20121094041a02402011a7450d00200f10230b0240200d2008460d002010210720050d010b0b2008410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d00200610230b2007410c6a2207200b470d000b0b0240200c450d00200a10230b2000411a3a00000f0b101e000b20094101102a000b20014101102a000b20014101102a000b20074101102a000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a102722060d010c040b200a10262206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d0020062005200910272206450d010c030b2009102622060d020b20094101102a000b200a4101102a000b200921050b200620076a200420081094041a02402003450d00200410230b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a10272206450d020c030b200820096a20076a21030c030b200a102622060d010b200a4101102a000b200a21050b200620086a20076a200c20091094041a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d012002280200200720041027220b0d020c060b2002280200210b0c020b20041026220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d0120022802002009200710272209450d020c050b200228020021090c050b2007102622090d030b20074101102a000b101e000b20044101102a000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a200620031094041a02402005450d00200610230b2000411a3a00000240200141106a280200450d00200c10230b0bbd04020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421082004210102400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d02400340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d012003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a200210ae022003200c2900003703102003200d29000037001720032d0020220e411a470d042006200a41106a220a470d000c030b0b200141106a21010b20012007460d0003400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a22012007470d000b0b02402008450d00200410230b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a28020010230b200141106a2101200a41106a2007470d000b0b2008450d0020041023200341c0006a24000f0b200341c0006a24000bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a28020010230f0b0240200041086a280200450d00200041046a28020010230b0240200041146a2802002201450d00200041186a280200450d00200110230b200041246a280200450d12200041206a28020010230f0b0240200041086a280200450d00200041046a28020010230b200041146a280200450d11200041106a28020010230f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a28020010230f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a28020010230f0b200041086a280200450d0e200041046a28020010230f0b200041086a280200450d0d200041046a28020010230f0b200041086a280200450d0c200041046a28020010230f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a28020010230f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a28020010230f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d00200610230b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a28020010230f0b2000410c6a280200450d06200041086a28020010230f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a28020010230b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d00200428020010230b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a28020010230b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a28020010230b200e200c6a21010240200e20116a280200450d00200e28021010230b2001210e2001200f470d040c0c0b0240201920186a280200450d00201928020010230b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a28020010230b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a28020010230b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a28020010230b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a28020010230b202420226a21010240202420276a280200450d00202428021010230b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d00203410230b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a28020010230b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a28020010230c040b200041086a280200450d03200041046a28020010230f0b200041086a280200450d02200041046a28020010230f0b200041086a280200450d01200041046a28020010230f0b200041086a280200450d00200041046a28020010230f0b0be3da012d067f017e017f017e027f017e027f017e3b7f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041f080046b2202240002400240200141046a280200220320012802082204470d00200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802dc8004210120022802d88004210420004101360200200041003a00042001450d01200410230c010b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d01200128020020046a2d00002104200141086a20053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b200241c0006a200110a301410121062002280244210720022802404101470d1220074108762101200241d0006a2802002104200241c0006a41086a29030021080cb0010b200241c0006a200110a40120022802404101470d0b200228024422014108762109200241c0006a41086a290300220a4220882108200241d0006a280200210b0cc3010b200241c0006a200110a40120022802404101470d0b200228024422044108762103200241c0006a41086a2903002208422088210a200241d0006a28020021010cc0010b200241c0006a200110a40120022802404101470d0b20022802442201410876210c200241c0006a41086a290300220d4220882108200241d0006a280200210e0cbd010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cba010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb7010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb4010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb1010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cae010b200241c0006a200110a40120022802404101470d0c2002280244220f4108762101200241c0006a41086a29030022104220882108200241d0006a28020021110cab010b200241c0006a200110a40120022802404101470d0c200228024422124108762101200241c0006a41086a2903002208422088210a200241d0006a28020021130ca8010b200241c0006a200110a40120022802404101470d0c200041013602002000200241c0006a41047222012902003702042000410c6a200141086a290200370200200241f080046a24000f0b200041123a000420004101360200200041056a20043a0000200241f080046a24000f0b200241386a200241d4006a280200360200200241306a2214200241c0006a410c6a2902003703002002200229024437032841002109410021014100211503402001411f4b0d0c20142802002205200241286a410c6a22162802002204460d1d200441016a21032004417f460d5820052003490d59200228022820046a2d0000210420162003360200200441ff00712001411f71742015722115200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a41002109410d21170c0c0b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021034100210420022802e48004210120022802d8800421184100211903402004411f4b0d0d20032001460d1d2001417f460d592003200141016a2207490d5a201820016a2d0000220541ff00712004411f71742019722119200441076a2104200721012005418001710d000b200241e480046a200736020020044120490d2a20056741686a41ff017141044f0d2a41002104410d21070c0d0b200241e880046a200241d4006a280200360200200241e080046a221a200241c0006a410c6a290200370300200220022902443703d880044100210c410021014100211b03402001411f4b0d0e201a2802002205200241d880046a410c6a221c2802002204460d1d200441016a21032004417f460d5a20052003490d5b20022802d8800420046a2d00002104201c2003360200200441ff00712001411f7174201b72211b200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a4100210c410d211d0c0e0b200241e880046a200241d4006a280200360200200241e080046a221e200241c0006a410c6a290200370300200220022902443703d880044100211f410021014100210603402001411f4b0d0f201e2802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5b20052003490d5c20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742006722106200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070cad010b200241d4006a2802002121200241d0006a2802002101200241cc006a2802002122200241c8006a28020021232002280244212441002120410021044100212503402004411f4b0d0f20222001460d1d2001417f460d5c2022200141016a2226490d5d202420016a2d0000220341ff00712004411f71742025722125200441076a2104202621012003418001710d000b20044120490d2a20036741686a41ff017141044f0d2a410d2101410021040caa010b200241e880046a200241d4006a280200360200200241e080046a2227200241c0006a410c6a290200370300200220022902443703d8800441002128410021014100212903402001411f4b0d0f20272802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5d20052003490d5e20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742029722129200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070ca7010b200241c0006a4100418080011093041a410021184100210502402007450d00200141086a2125200141046a21294101210641002118410021034100211903402029280200221b202528020022056b200720196b220441808001200441808001491b2204490d25200520046a22222005490d69201b2022490d6a200241c0006a200128020020056a20041094041a202520223602000240024002400240201820036b20044f0d00200320046a22052003490d890120184101742222200520052022491b22224100480d89012018450d01200620182022102722060d020c6f0b200420036a21050c020b202210262206450d6d0b202221180b200620036a200241c0006a20041094041a200521032007200420196a22194b0d000b0b200241003602d08004200220053602cc8004200220063602c88004200241c0006a200241c880046a10a301410121292002280244210720022802404101470d1520074108762101200241c0006a41086a2903002208422088a72122200241d0006a28020021042008a721250c9c010b200241d4006a280200212a200241d0006a2802002101200241cc006a2802002107200241c8006a280200212b2002280244212c41002120410021044100212d03402004411f4b0d0e20072001460d1c2001417f460d5d2007200141016a222e490d5e202c20016a2d0000220341ff00712004411f7174202d72212d200441076a2104202e21012003418001710d000b20044120490d2920036741686a41ff017141044f0d29410d2101410021070ca3010b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021054100210420022802e48004210120022802d8800421184100210303402004411f4b0d0e20052001460d1c2001417f460d5e2005200141016a2207490d5f201820016a2d0000221941ff00712004411f71742003722103200441076a2104200721012019418001710d000b200241e480046a200736020020044120490d2920196741686a41ff017141044f0d2941002104410d21180c0e0b200241e880046a200241d4006a280200360200200241e080046a222f200241c0006a410c6a290200370300200220022902443703d8800441002130410021014100212003402001411f4b0d0f202f2802002211200241d880046a410c6a22052802002204460d1c200441016a21032004417f460d5f20112003490d6020022802d88004221f20046a2d0000210420052003360200200441ff00712001411f71742020722120200141076a21012004418001710d000b20014120490d2920046741686a41ff017141044f0d29410d210f410021310c9d010b200241d4006a2802002132200241d0006a2802002101200241cc006a2802002118200241c8006a280200213320022802442134410021044100213503402004411f4b0d0f20182001460d1c2001417f460d602018200141016a2219490d61203420016a2d0000220341ff00712004411f71742035722135200441076a2104201921012003418001710d000b20044120490d2920036741686a41ff017141034b0d29410d21120c0f0b200241d4006a2802002106200241d0006a2802002101200241cc006a2802002103200241c8006a280200212220022802442118410021044100210503402004411f4b0d1020032001460d1d2001417f460d612003200141016a2219490d62201820016a2d0000220741ff00712004411f71742005722105200441076a2104201921012007418001710d000b024020044120490d00410d210120076741686a41ff01714104490d1e0b2006201946210102402022450d00201810230b2001450d2b410921040c95010b410f21170b41002136410021370ca9010b200241e480046a200136020041002104410f21070b41002118410021220ca5010b410f211d0b41002138410021390ca1010b410f2101410021070c9e010b410f2101410021040c9b010b410f2101410021070c98010b410f2101410021070c95010b200241e480046a200136020041002104410f21180b41002122410021060c91010b410f210f410021310c8e010b410f21120b0c0c0b410f21010c0d0b2007450d18200241c0006a41004180081093041a200241d080046a222d280200210420022802cc8004211520022802c8800421354101212941002125410021034100211b0340201520046b2007201b6b22014180082001418008491b2201490d1a200420016a22192004490d5520152019490d56200241c0006a203520046a20011094041a202d20193602000240024002400240202520036b20014f0d00200320016a22222003490d7220254101742204202220222004491b22044100480d722025450d01202920252004102722290d020c5b0b200120036a21220c020b200410262229450d590b200421250b202920036a200241c0006a20011094041a201921042022210320072001201b6a221b4b0d000b200241c0006a2029202210a50120022802404101470d27410821072025450d2a202910230c86010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7213620022802e08004210b2008a7213741052117410021090c99010b200241e480046a2003360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72118200228023021012008a7212241052107410021040c96010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a721382002280230210e2008a721394105211d4100210c0c93010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a7211f200228023021032008a72107410521010c90010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72104410521010c8d010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72128200228023021032008a72107410521010c8a010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72107410521010c87010b200241e480046a2005360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72122200228023021032008a7210641052118410021040c84010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72130200228023021112008a721314105210f0c81010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004211320022903d880042108410521120b2008422088a7213a2008a7213b0c7d0b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201410521010b2000200136020420004101360200200041086a20022902d88004370200200041106a200241d880046a41086a2802003602002022450d8f0120181023200241f080046a24000f0b200241013a00c88004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c880046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022802302104200229032821084105210702402018450d00200610230b0c790b2015450d0c4100213c4104213d4101213e411f213f410c2140200241286a410c6a214141082142200241286a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421054100211441002116410021200c540b2019450d0c41042105200241d880046a410c6a21294108211b4100210641002125024020032007460d000340200741016a21012007417f460d4a20032001490d4b201820076a2c000021042029200136020020044100480d1d41072107200441c00071450d1e200441807f7222044170470d20200241c0006a200241d880046a10a60120022f004520022d004741107472210420022d0044210720022802404101460d1f200241c0006a410c6a2802002103200241c0006a41086a280200211802400240024020252006470d0020064101742201200641016a222220222001491b2222ad420c7e2208422088a70d622008a722014100480d622006450d0120052006410c6c2001102722050d020c530b200621220c010b200110262205450d510b2005201b6a220120033602002001417b6a200441ffffff077122044110763a0000200141796a20043b00002001417c6a2018360200200141786a20073a0000202541016a220120194f0d21201b410c6a211b20022802d8800421182022210620012125200241d880046a41086a280200220320292802002207470d000b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a2802002101200228022c211820022802282122410521070c1e0b201b450d0c4100215f4104216041012161411f2162410c2163200241d880046a410c6a216441082165200241d880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421054100211a4100211c410121200c530b2006450d0c41042178410021794101217a410c217b200241c0006a410c6a217c4108217d200241c0006a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211e4104210541002196014100219701410221200c530b410421052025450d0c41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321200c530b2029450d0c410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042105410021b901410021ba01410421200c530b202d450d0c410021bb01410020076b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042105410021d301410021d401410521200c530b2003450d0c200241c0006a410c6a2129200241c0006a41086a21154100212541002119410021014100211b410421050340200241c0006a200241d880046a10a60120022f004520022d0047411074722104202928020021222015280200210620022d0044211820022802404101460d14200141016a210702402001201b470d002025200720072025491b221bad420c7e2208422088a70d592008a7222d4100480d5902402001450d0020052019202d102722050d010c440b202d10262205450d430b200520196a220120183a0000200141036a20044110763a0000200141016a20043b0000200141086a2022360200200141046a2006360200202541026a21252019410c6a21192007210120072003490d000c0e0b0b2020450d0d200241d880046a410c6a215c200241c0006a41086a215b4100215941002158410021544100212f41042153410421d60141042105024020112003460d000340200341016a21042003417f460d4520112004490d46201f20036a2c00002101205c200436020020014100480d1c4106210f200141c00071450d1d200141807f72225d41ff017141fc01490d1e20112004460d1f200341026a21032004417f460d4720112003490d48201f20046a2d00002101410c210f200241d880046a410c6a20033602004100210302402001450d0020014101470d2241800221030b200241c0006a200241d880046a10a701200241c0006a410c6a2802002130205b28020021312002280244210f20022802404101460d22205441016a210402402054202f470d002059200420042059491b222fad420486225e422088a70d59205ea722014100480d59024002402054450d00205320582001102722530d010c4d0b200110262253450d4c0b205321d601205321050b200520586a2201200f3602002001410c6a205a4180807c71205d417f7341ff017172200372225a360200200141086a2030360200200141046a2031360200200420204f0d23205941026a2159205841106a215820022802d88004211f20042154200241d880046a41086a2802002211205c2802002203470d000b0b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010c1e0b2035450d0d200241c9006a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241286a41106a21e501410c21e601200241286a410c6a21e701422021e801410221e901410821ea01200241c0006a41086a21eb01410621ec01411421ed01200241c0006a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410721f501420121f601419cf6c40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042105410021fc01410021fd01410621200c510b4100210741002122410021250c0f0b200241013a00c78004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c780046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022903282208422088a72122200228023021042008a72103410521074100210102402025450d00202910230b200321250c6c0b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201200241cb006a200241e080046a280200360000200220022903d88004370043200041053a000420004101360200200020022900403700052000410c6a200241c7006a290000370000200241f080046a24000f0b410021144104210541002116410021010c500b4100212241042105410021040c130b4100211a410421054100211c410121010c4e0b410021960141042105410021010c640b410021a701410021a8010c620b410021b90141042105410021010c600b410021d30141042105410021590c5e0b41042105410021074100211b0b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d022007ad422086201bad84210a410621040c600b41042105410021044100212f0c460b410021fc0141042105410021fd01410221010c460b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a200228023021034105210141002104201b450d66200510230c660b202941087621070b2005200241d080046a2802002203490d37200520036b2204417f4c0d38024002402004450d00200410262201450d3b2001200620036a20041094041a0c010b410121010b2022ad42208621082025ad210a2004ad220d422086211002402018450d00200610230b2008200a84210a2010200d8421082007410874202941ff0171722105410121040c5b0b200241d0006a2802002103201b450d62200510230c620b0c5b0b411821070b0c010b20044180feff07714108762103200241d0006a2802002101200241cc006a2802002118200241c0006a41086a28020021220b2003410874200441ff01717221042006450d69200510230c690b202541016a21040b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad4220862022ad84210a410521040c540b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a2002280230210141052104410021032022450d68200510230c680b4118210f0b0c030b205d21010c020b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010b20022802302111200228022c2130200228022821314105210f0b200141ff0171410874200f72210f2054450d3f0c330b200241d0006a280200211120540d320c3e0b205441016a21040c320b417f20051048000b20052003108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2003108c01000b417f20031048000b20032005108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2007108c01000b417f200141016a1048000b200141016a2005108c01000b417f20031048000b20032011108c01000b417f200141016a1048000b200141016a2018108c01000b417f200141016a1048000b200141016a2003108c01000b200520221048000b2022201b108c01000b20224101102a000b200420191048000b20192015108c01000b20044101102a000b202d4104102a000b417f20011048000b20012003108c01000b417f20041048000b20042011108c01000b417f20031048000b20032011108c01000b20014104102a000b20014104102a000b200320051048000b101d000b20044101102a000b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b200520586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2120410321010c010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad422086202fad84210a410721040c190b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201422021910220022903282110200228023021112004450d124104219202200520044104746a21930241102194024109219502410821960241ffffffff032197024170219802200521990241082120410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241346a28020020022802384621010240200228022c450d00200228022810230b2001450d032016ad4220862014ad84210a410c21040cdf010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d01201cad422086201aad84210a410a21040cde010b2019203246210102402033450d00203410230b2001450d0220fd01ad42208620fc01ad84210a410b21040cdd010b20024103410220011b3a00c880044114219a02200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2014220219b022002290328210d2002280230210e201c450d03411c219c022005201c411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200521a502410921200cb9010b20024103410220011b3a00c88004411421a602200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a201422021a70220022903d88004210a20022802e08004210b2016450d04411c21a80220052016411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200521b102410a21200cba010b20024103410220011b3a0028411421b202200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201422021b30220022903d88004210820022802e08004211320fd01450d05411821b402200520fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200521bd02410b21200cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e0f000102030405060b0d1416181c202c2c0b20162253203e6a2116410021014100211f0340410021092001203f4b0d0c2043280200225420412802002204460d0e2004203e6a210320042044460d7420542003490d75200228022820046a2d000021042041200336020020042045712001203f7174201f72211f200120466a210120042047710d000b024020012049490d0020046720486a204a71203d490d530b200241c0006a200241286a10a7012002280240203e460d53200241c0006a20406a2802002155200241c0006a20426a280200215620022802442157410021044100215803402004203f4b0d1d2043280200225420412802002203460d1f2003203e6a210120032044460d840120542001490d85012002280228225920036a2d000021032041200136020020032045712004203f71742058722158200420466a210420032047710d000b024020042049490d0020036720486a204a71203d490d5e0b4100215a200241c0006a4100204b1093041a024002402058450d004100215a4101215b410021034100215c0340205420016b2058205c6b2204204b2004204b491b2204490d3d200120046a225d2001490d9b012054205d490d9c01200241c0006a205920016a20041094041a2041205d3602000240024002400240205a20036b20044f0d00200320046a225d2003490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a20011027225b0d020ca1010b200420036a215d0c020b20011026225b450d9f010b2001215a0b205b20036a200241c0006a20041094041a20582004205c6a225c4d0d02204128020021012043280200215420022802282159205d21030c000b0b4101215b4100215d0b024020142053470d002014203e7422012014203e6a220420042001491b2204ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402014450d0020052014204e6c2001102722050d010c9e010b200110262205450d9d010b200421140b20052053204e6c6a2201201f20427622043b00012001205b360210200120573602042001201f3a0000200120506a2004204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020162015490dae010cbd010b201c225820616a211c410021014100211f03404100210c200120624b0d072066280200225420642802002204460d09200420616a210320042067460d7120542003490d7220022802d8800420046a2d00002104206420033602002004206871200120627174201f72211f200120696a21012004206a710d000b02402001206c490d00200467206b6a206d712060490d4b0b200241c0006a200241d880046a10a70120022802402061460d4b200241c0006a20636a2201280200215c200241c0006a20656a2204280200215d2002280244215a200241c0006a200241d880046a10a80120022802402061460d4c2004280200215b2002280244215902400240024020012802002201450d00200120757422032075752253ad207686225e206f88a70dd801205ea72201205f480dd801200110262254450d9e01200320776a21552054210120592104034020012004280200360200200120606a2101200420606a2104200320776a22030d000b205520757620616a2104205b450d020c010b410021534104215441002104205b450d010b205910230b0240201a2058470d00201a2061742201201a20616a220320032001491b2203ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201a450d002005201a20706c2001102722050d010c9f010b200110262205450d9e010b2003211a0b2005205820706c6a2201201f20657622033b0001200120543602102001205a3602042001201f3a0000200120726a20032071763a0000200120736a2004360200200120746a2053360200200120636a205c360200200120656a205d360200201c201b490dae010cbd010b200241c0006a200241d880046a10a901207c280200211f207e280200215d2002280244215b2002280240207a460d23200241c0006a200241d880046a10a901207c2802002157207e2802002153200228024421552002280240207a460d24200241d880046a207d6a2802002203200241d880046a207b6a22592802002220460d252020207a6a21012020207f460d850120032001490d860120022802d88004225c20206a2d00002104205920013602004100215a20042080014b0d2602400240024002400240024020040e0400030102000b4100215a4100210441002120034020042081014b0d1d20032001460d1e2001207f460d7f20032001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120042081017174202072212020042083016a2104205821012054208401710d000b4100215a02402004208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d424102215a209601209701460d020c030b20032001460d4320202091016a21582001207f460d9f0120032058490da001205c20016a2c000021042059205836020020042079480d44200420920171450d38200420930172220420870171209501490d3820032058460d4820202080016a21012058207f460da10120032001490da2012004207f732154205c20586a2d00002104410c2120200241d880046a410c6a20013602004103215a4100210302402004450d002004207a470d4b410121030b209601209701460d010c020b20032001460d4120202091016a21042001207f460d900120032004490d9101205c20016a2c00002101205920043602002001207f4c0d44200120920171450d382001209301722201209401470d38200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d484101215a209601209701470d010b209601207a742201209601207a6a220420042001491b2204ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002005209601208a016c2001102722050d010c93010b200110262205450d92010b20042196010b2005209701208a016c6a2201205536020c2001201f3602082001205d3602042001205b36020020012086016a205e3702002001208b016a20203602002001208c016a20033a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201e208a016a211e209701207a6a220121970120012006490dae010cea010b20a701221f209a016a21a70120262101410021044100210303402004209b014b0d0420222001460d062001209c01460d6d20222001209a016a2226490d6e202420016a2d00002220209d01712004209b01717420037221032004209e016a2104202621012020209f01710d000b0240200420a101490d0020206720a0016a20a2017120a3014d0d480b024020a801201f470d00201f209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd4010240201f450d002005201f20a601742001102722050d010ca1010b200110262205450da0010b2005201f20a601746a200336020020a7012025490dae010ce8010b200241c0006a200241d880046a10a901200228024020ab01460d2b200241c0006a20ad016a280200215a2002280244215d200241d880046a20ad016a2802002204200241d880046a20ac016a22202802002203460d2c200320ab016a2101200320ae01460d8f0120042001490d9001200241c0006a20ac016a280200215320022802d88004221f20036a2d0000215c20202001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021030340205420284b0d1e20042001460d24200120ae01460d86012004200120ab016a2259490d8701201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021030340205420284b0d1220042001460d21200120ae01460d89012004200120ab016a2259490d8a01201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021030340205420284b0d1120042001460d21200120ae01460d7e2004200120ab016a2259490d7f201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021030340205420284b0d1020042001460d1e200120ae01460d7b2004200120ab016a2259490d7c201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241c880046a20ad016a20033602002002205c3602cc8004200220533602c8800420022902cc8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220420042001491b2204ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200520b90120b8016c2001102722050d010c94010b200110262205450d93010b200421b9010b200520ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b2007202e460d34202e20be016a2101202e20bf01460d910120072001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a211f4100215841002104410021200340201f212e200420c2014b0d0c20072001460d0d200120bf01460d732007200120be016a2203490d74202c20016a2d0000225420c30171200420c20171742020722120202e20be016a211f200420c4016a210420032101205420c501710d000b0240200420c701490d0020546720c6016a20c8017120bd01490d510b41002104024002402020450d0020bc0120036a2153202c20036a215b4101215a41002154410021014100215d0340205320016a450d30202e450da2012007202e490da301205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a211f02402001205d470d002054201f201f2054491b225d20bb01480dd50102402001450d00205a2001205d1027225a0d010ca3010b205d1026225a450da2010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e201f2101201f2020490d000b2003201f6a21030c010b4101215a4100211f4100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200420c2014b0d2820072003460d2a200320bf01460d87012007200320be016a222e490d8801202c20036a2d0000222020c30171200420c20171742001722101200420c4016a2104202e2103202020c501710d000b0240200420c701490d0020206720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210420d30120d401460d010c020b2007202e460d65202e20bf01460da9012007202e20be016a2201490daa01202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321042001212e20d30120d401470d010b20d30120be0174220120d30120be016a220320032001491b2203ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200520d30120bd01742001102722050d010ca4010b200110262205450da3010b200321d3010b200520d40120bd01746a220120d50120ce0171200420c8017120ca01747220c0017222d50136020c2001201f3602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021030340200120db014b0d0920182019460d0a201920dc01460d702018201920da016a2204490d71203420196a2d0000221f20dd0171200120db0171742003722103200120de016a210120042119201f20df01710d000b0240200120e101490d00201f6720e0016a20e2017120d901490d4f0b41002158200241c0006a410020e3011093041a024002402003450d004100215c4101215a41002154410021590340201820046b200320596b220120e301200120e301491b2201490d21200420016a22192004490d7e20182019490d7f200241c0006a203420046a20011094041a0240024002400240205c20546b20014f0d00205420016a221f2054490dd701205c20da01742204201f201f2004491b220420d801480dd701205c450d01205a205c20041027225a0d020c8e010b200120546a211f0c020b20041026225a450d8c010b2004215c0b205a20546a200241c0006a20011094041a20192104201f21542003200120596a22594b0d000c020b0b4101215a200421194100215c4100211f0b20e501201f36020020e70141003602002002205a3602282002201fad20e80186205cad8437022c41002101410021590340200120db014b0d24201f2058460d25205820dc01460d8901201f205820da016a2203490d8a01205a20586a2d0000210420e7012003360200200420dd0171200120db0171742059722159200120de016a210120032158200420df01710d000b0240200120e101490d0020046720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100211f02400240024002400340200120db014b0d01200241286a20ea016a280200225420e7012802002204460d02200420da016a2103200420dc01460d7b20542003490d7c2002280228225820046a2d0000211220e7012003360200201220dd0171200120db017174201f72211f200120de016a2101201220df01710d000b02400240200120e101490d0020126720e0016a20e2017120f0014d0d010b0240024020542003470d00200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a20ea016a28020021fe0120022802dc800421ff0120022802d880042180024105211f0c010b200420e9016a2101200320dc01460daa0120542001490dab01205820036a2c0000210420e701200136020002400240200420d801480d00200420f801710d014106211f0c020b4118211f0c010b0240200420f90172220120e2017120fa014d0d00201f20fb01712103201f20ea01762104200120dc01732101410021540c060b4106211f200121040b20800220ea0176218102410121544100210320ff0121820220fe0121830220800221010c040b203b2101203a218202410d211f0c020b410f211f203b2101203a2182020c010b200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e20e80188a7218202200241d880046a20ea016a2802002113205ea721014105211f0b200120ea017621810241012154410021042013218302410021032001213b208202213a0b2003200420e2017120ea017472201f20e2017172211220540d3b0240205c2053470d00205c20da01742204205c20da016a220320032004491b2204ad20f40186225e20e80188a70dd401205ea7220320d801480dd40102400240205c450d002055205c20f001742003102722550d010ca9010b200310262255450da8010b2004215c0b2055205320f001746a220420013a000420042012360200205a2059490d000c020b0b410421554100215c4100215a0b4101211f4108215641002101410021034100218402034020012104200241c0006a200241286a10aa01200228024020da01460d3a200241d880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01d88004200241c0006a20e6016a2802002159200241c0006a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00201f20dc016a211f0c010b205420f3016a20e9014b0d00201f20da016a2257201f4f2185022057211f208502450d540b200241c0006a20e9016a225720012d00003a0000200220022f01d880043b014002402003208402470d00200320da016a22012003490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402003450d00205620042001102722560d010ca7010b200110262256450da6010b205620046a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01403b0000205b20e9016a215b200420e4016a2101200320da016a2103201f0d000b20e70128020020e5012802004621010240200228022c450d00200228022810230b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220420042001491b2204ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200520fc0120f2016c2001102722050d010ca8010b200110262205450da7010b200421fc010b2005205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2003360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211d20580d480c490b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004210320022802dc8004212020022802d8800421044105210120a801450df2010cdf010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a2012002290328225e422088a72138200241306a280200210e205ea721394105211d0c440b02402090022088026a2802002204450d0020900228020421012004208b027421040340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a28020010230b2001208c026a21012004208f026a22040d000b0b02402090022089026a280200450d00209002208b026a28020010230b2090022086026a21010240209002208a026a280200450d0020900228021010230b20012190022001208702470daa010c460b410f211720530d540c550b02402099022802082204450d00209902280200210120042092027421040340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a28020010230b20012094026a210120042098026a22040d000b0b2099022094026a210102402099022092026a280200450d0020990228020010230b20012199022001209302470da9010cda010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea721374105211720530d520c530b410f2112205d0d5e0c5f0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7213a200241e080046a2802002113205ea7213b41052112205d0d5d0c5e0b410f215c0cc8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a20120022903d880042208422088a72120200241e080046a28020021012008a721074105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002204450d0020a5022802042101200420a0027421040340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a28020010230b200120a1026a2101200420a4026a22040d000b0b024020a502209f026a280200450d0020a50220a0026a28020010230b20a502209c026a2101024020a502209a026a280200450d0020a50228021010230b200121a5022001209d02470da3010b200d209b02882108410521014100210c201a450deb01200510230ceb010b024020b10220aa026a2802002204450d0020b1022802042101200420ac027421040340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a28020010230b200120ad026a2101200420b0026a22040d000b0b024020b10220ab026a280200450d0020b10220ac026a28020010230b20b10220a8026a2101024020b10220a6026a280200450d0020b10228021010230b200121b102200120a902470da2010b200a20a70288210841052101410021092014450ded01200510230ced010b024020bd0220b6026a280200450d0020bd0228020010230b024020bd0220b2026a2802002204450d0020bd0228020c2101200420b6027421040340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a28020010230b200120b7026a2101200420bc026a22040d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a28020010230b200121bd02200120b502470da1010b200820b30288210a410521124100210120fc01450dd901200510230cd9010b410f21200cc6010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a0cc6010b024020052802082204450d0020052802002101200420c0027421040340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a28020010230b200120bf026a2101200420c4026a22040d000b0b200520bf026a21010240200520c0026a280200450d00200528020010230b2001210520be022001470d9e010cc3010b410f211720550d410c420b410f21010cbc010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea72137410521170c1c0b024020cf0220c7026a2802002204450d0020cf022802042101200420ca027421040340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a28020010230b200120cb026a2101200420ce026a22040d000b0b024020cf0220c8026a280200450d0020cf0220ca026a28020010230b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf0228021010230b200121cf02200120c602470d9b010c410b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c100b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0f0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0e0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a201200229022c210820022802282107410521010cb6010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a20120022903c88004225e422088a7213a200241d080046a2802002113205ea7213b41052112205c450d46205a1023205d0d480c490b200241d0006a2802002103205d2107205b21012097010dbf010cc0010b200241d0006a2802002103205321072057211f20552101205d0dbc010cbd010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a410021030cba010b41092120410021030cb9010b410f2112200228022c0d3a0c3b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7218202200241e080046a280200218302205ea7213b410521120c300b024020da0220d2026a280200450d0020da0228020010230b024020da0220d3026a2802002204450d0020da0228020c2101200420d2027421040340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a28020010230b200120d4026a2101200420d9026a22040d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a28020010230b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d450daf010cae010b2002200241cc006a2902003703c88004200241c8006a28020021072002280244210120022802c88004212820022802cc8004210320ba010dab010cac010b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010b200229022c210820022802282107410521014100215c0ca8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e080046a280200210120022802dc8004212020022802d8800421074105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a10230ca2010b41062120410021030caa010b410721030c0c0b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c0ca4010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a201200241d080046a280200210b20022802cc8004213620022802c88004213741052117205a0d010b2055450d230c220b205b102320550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241d0006a280200218302200241cc006a280200218202200241c8006a280200213b200228024421122003450d1a0c190b200241c0006a41086a200241d0006a2802003602002020418080807871215a20204180807c712103202041087621040c97010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a28020021042002290328215e410521030c040b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a20141052120200229022c210820022802282107410021030c9f010b41182120410021030c9e010b411821030b0b200141ff017141087420037221200c90010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c21082002280228210741052120410021030c9a010b200241d0006a28020021040c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211d20580d040c050b2002280244221d410876210c200241d0006a280200210e200241cc006a2802002138200241c0006a41086a280200213920580d030c040b2002280244211d200241c0006a41106a280200210e200241cc006a2802002138200241c0006a41086a28020021390240205c450d00205c4104742104205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b201d410876210c205d0d010b2058450d020c010b205a10232058450d010b411c21860220052058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022005219002410721200c760b201a450dad01200510230cad010b410d211720530d0d0c0e0b200228024422174108762109200241d0006a280200210b200241cc006a2802002136200241c0006a41086a280200213720530d0c0c0d0b410d2112205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21200c88010b024020544109470d00205841ffffffff0371450d00205910230b411521820241a4c5c200213b410421122003450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b0240208402450d00205610230b205c0d010b200228022c450d090c080b20551023200228022c0d070c080b410d21172055450d010b20554104742104205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b4100210902402056450d00205710230b2053450d010b411c21c50220052053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200521cf02410d21200c700b2014450da101200510230ca1010b410d21010c770b410d2112200228022c450d010b200228022810230b208202213a20830221130c050b410d215c205d0d760c770b4104215c41eb93c300210741242120205d0d750c760b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00c88004200241d4006a410136020020024107360224200241c0006a41106a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a41086a280200211320022802dc8004213a20022802d88004213b02402003450d00200441106a21034100210103400240205620016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010230b2003200141106a2201470d000b0b0240208402450d00205610230b41052112205c0d010b205d450d020c010b20551023205d450d010b411821d0022005205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200521da02410e21200c650b20fc01450d8201200510230c82010b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032054108c01000b417f20031048000b20032054108c01000b417f201941016a1048000b201941016a2018108c01000b417f200141016a1048000b200141016a2007108c01000b417f20031048000b20032054108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200141016a1048000b200141016a2004108c01000b200420191048000b20192018108c01000b417f20011048000b20012054108c01000b417f200141016a1048000b200141016a2004108c01000b417f20011048000b20012003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200341016a1048000b200341016a2007108c01000b20044101102a000b417f205841016a1048000b205841016a201f108c01000b417f20041048000b20042003108c01000b20014104102a000b417f20011048000b20012004108c01000b20014104102a000b417f20011048000b20012007108c01000b2001205d1048000b205d2054108c01000b20014101102a000b20014104102a000b20014104102a000b20014104102a000b417f20581048000b20582003108c01000b417f20011048000b20012003108c01000b20014104102a000b205d4101102a000b417f202e1048000b202e2007108c01000b20014104102a000b417f20011048000b20012054108c01000b20034104102a000b20014108102a000b20014104102a000b417f202e41016a1048000b202e41016a2007108c01000b410021200c110b410121200c110b410221200c110b410321200c110b410421200c110b410521200c110b410621200c110b410721200c120b410821200c120b410921200c130b410a21200c140b410b21200c150b410c21200c150b410d21200c160b410e21200c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b101e000b200241c0006a41086a20043602002020418080807871215a20204180807c712103202041087621040b2002205e37034020022902442108205ea721070c090b20014110762104200141087621030c040b205c4108742001722101200220083703c880042008a721280240205a450d00205d10230b20022802cc8004210320ba01450d010b2005210403400240200441046a280200450d00200428020010230b200441146a21042027416c6a22270d000b0b20b901450d1c200510230c1c0b205410230b200341ff0171410874200141ff017172210320044110742104205841ff01714108742119024020d401450d002005210103400240200141046a280200450d00200128020010230b200141106a210120d20141706a22d2010d000b0b200320047221032019205c72210120d301450d18200510230c180b202f450d1320d60110230c130b0b41002103410021040b202041ff0171200441ff0171410874722003418080fc077172205a7221012008422088a721032008a7211f02402053450d00205510230b205d450d010b205b10230b209701450d010b2005210403400240200441046a280200450d00200428020010230b0240200441106a280200450d002004410c6a28020010230b200441286a2104201e41586a221e0d000b0b209601450d16200510230c160b20102091028821084105210f41002101202f450d0c200510230c0c0b200510230c120b202e202a4621010240202b450d00202c10230b02402001450d002059ad42208620d301ad84210a410221040c040b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d88004210820022802e08004210302402059450d00205941047421042005210103400240200141046a280200450d00200128020010230b200141106a2101200441706a22040d000b0b2008422088210a410521014100210420d301450d0e200510230c0e0b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b02402004450d002001ad42208620b901ad84210a410821040c030b20024103410220041b3a00c88004200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141146c21042005210103400240200141046a280200450d00200128020010230b200141146a21012004416c6a22040d000b0b2008422088210a410521014100210420b901450d0f200510230c0f0b2026202146210102402023450d00202410230b02402001450d0020a701ad42208620a801ad84210a410421040c020b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088210a20022802e080042103410521014100210420a801450d10200510230c100b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b2004450d012001ad422086209601ad84210a410321040b200020043a000420004100360200200041056a20022f001d3b0000200041186a2008370200200041146a20013602002000410c6a200a370200200041086a2005360200200041206a200229020c370200200041076a2002411f6a2d00003a0000200041286a2002410c6a41086a290200370200200241f080046a24000f0b20024103410220041b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141286c21042005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200441586a22040d000b0b2008422088210a4105210141002104209601450d0f200510230c0f0b2022ad4220862025ad8421082018450d00200610230b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff017172360204200241f080046a24000f0b20124108762101203aad220a422086203bad8421082033450d00203410230b20004101360200200041106a2013360200200041086a200a422086200842ffffffff0f838437020020002001410874201241ff017172360204200241f080046a24000f0b200f41087621012030ad22084220862031ad84211020022802dc8004450d0020022802d8800410230b20004101360200200041106a2011360200200041086a2008422086201042ffffffff0f838437020020002001410874200f41ff017172360204200241f080046a24000f0b200441ffffff07712204410874201841ff01717221012022ad220a4220862006ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042020ad220a4220862007ad842108202b450d00202c10230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042028ad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b2020ad220a4220862004ad842108410021042023450d00202410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b20014108762104201fad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200c410874201d41ff01717221012038ad22084220862039ad84210d20022802dc8004450d0020022802d8800410230b20004101360200200041106a200e360200200041086a2008422086200d42ffffffff0f83843702002000200c410874200141ff017172360204200241f080046a24000f0b200441ffffff07712203410874200741ff01717221042018ad220a4220862022ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241f080046a24000f0b2009410874201741ff01717221012036ad22084220862037ad84210a200228022c450d00200228022810230b20004101360200200041106a200b360200200041086a2008422086200a42ffffffff0f838437020020002009410874200141ff017172360204200241f080046a24000f0b200241f080046a24000b6b000240024020002d000022004101460d0020004102470d0120012802184190f6c400410b2001411c6a28020028020c1102000f0b20012802184183f6c400410d2001411c6a28020028020c1102000f0b200128021841f7f5c400410c2001411c6a28020028020c1102000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006102622050d0120064101102a000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41c482c500200241186a10e2030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10fb03000b41b482c500410041001029000b101d000b960301087f230041c0006b2202240041002103200141086a2104200141046a210541002106024002400240024002400340200341204f0d012005280200220720042802002208460d02200841016a21092008417f460d0420072009490d05200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b20034120490d0220086741686a41ff017141034b0d02200041013602002000410d3a0004200241c0006a24000f0b200041013602002000410f3a0004200241c0006a24000f0b200241013a000f200241346a41013602002002410736023c200242013702242002419cf6c40036022020022002410f6a3602382002200241386a360230200241106a200241206a10a2012002412b6a200241186a28020036000020022002290310370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241c0006a24000f0b2000410036020020002006360204200241c0006a24000f0b417f20091048000b20092007108c01000ba005010c7f230041c080016b22022400200241086a200110a30141012103024020022802084101470d002000200229020c370204200041013602002000410c6a200241086a410c6a290200370200200241c080016a24000f0b200228020c2104200241086a4100418080011093041a41002105410021060240024002400240024002402004450d00200141086a2107200141046a21084100210941002105410121034100210a03402008280200220b200728020022066b2004200a6b220c41808001200c41808001491b220c490d022006200c6a220d2006490d03200b200d490d04200241086a200128020020066a200c1094041a2007200d3602000240024002400240200520096b200c4f0d002009200c6a22062009490d092005410174220d20062006200d491b220d4100480d092005450d0120032005200d102722030d020c0a0b200c20096a21060c020b200d10262203450d080b200d21050b200320096a200241086a200c1094041a200621092004200c200a6a220a4b0d000b0b2000200336020420004100360200200041146a2006360200200041106a41003602002000410c6a2006360200200041086a2005360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241073602bc8001200242013702a480012002419cf6c4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a10a201200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a29000037000002402005450d00200310230b200241c080016a24000f0b2006200d1048000b200d200b108c01000b101e000b200d4101102a000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d000022064118744118752207417f4c0d002005410371450d01200441016a22042002490d0f0c100b42808080801021082006419684c5006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000be607010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241073602242002420137022c2002419cf6c40036022820022002410f6a3602202002200241206a360238200241106a200241286a10a201200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f20041048000b20042003108c01000b417f20061048000b20062003108c01000b417f200441016a1048000b200441016a2003108c01000bd503020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110aa0120022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b102722090d010c050b200b10262209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010230b200741106a2107200641706a22060d000b0b02402008450d00200910230b200241306a24000f0b101e000b200b4108102a000bbf07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b41027420081027220c0d010c110b20081026220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241073602142002420137022c2002419cf6c40036022820022002410f6a3602102002200241106a360238200241186a200241286a10a201410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241073602142002420137022c2002419cf6c400360228200220023602102002200241106a360238200241186a200241286a10a20120022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f20091048000b20092007108c01000b417f20091048000b20092005108c01000b101e000b20084104102a000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c1023200241c0006a24000f0b200241c0006a24000bcf07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a41004180081093041a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a20031094041a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e20091027220d0d020c100b200320086a21050c020b20091026220d450d0e0b2009210e0b200d20086a200241086a20031094041a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d200510a50120022802084101470d050240200e450d00200d10230b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410736028c082002420137020c2002419cf6c400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a10a201410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410736028c08200242013702ac082002419cf6c4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a10a201200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d1023200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f20091048000b20092007108c01000b200920051048000b20052007108c01000b101e000b20094101102a000b200241c0086a24000bcbbe0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2012002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a200110a80141042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de802200410262209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241186a200241c8006a10a201200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2014105210b0c9a020b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f20051048000b20052003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b101e000b200520011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20091048000b20092003108c01000b200520011048000b20012003108c01000b20044104102a000b417f20011048000b20012003108c01000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200310230b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a28020010230b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205102722090d0120054104102a000b4100210d02402007450d00200910230b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d0620091023200241e0006a24000f0b417f20041048000b20042006108c01000b418080c000104f000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000bbd07050c7f017e027f017e027f23004190026b2202240020024100360230200241306a20012802002203200128020422044104200441044922051b22061094041a2001200420066b22043602042001200320066a2206360200024020050d002002280230210720024200370214200241f098c400360210200241106a41086a21080240024002402007450d00200141046a2109200241c4006a210a200241c0006a210b200241306a410c6a210c4100210d034020024200370330200241306a200620044108200441084922051b22031094041a2009200420036b3602002001200620036a36020020050d022002290330210e200241086a200110452002280208450d020240024002400240200228020c2206417f4c0d00024002402006450d00200610ac01220f450d03200f200128020020092802002204200620042006491b22041094041a200928020022032004490d042009200320046b3602002001200128020020046a36020020042006470d010c050b4101210f41002006460d040b2006450d06200f10230c060b101d000b20064101102a000b200420031048000b200f450d022002200e370320024002402002280210220441f098c400460d00200228021421100c010b41e40110262204450d0441002110200441003b010620044100360200200441086a200241306a41dc011094041a20024100360214200220043602100b200d41016a210d2006ad22114220862011842111024002400340200441086a210520042f010622124103742103417f210602400240024003402003450d01200641016a2106417f4101200241206a2005410810960422134100481b410020131b2213450d05200341786a2103200541086a210520134101460d000b20100d010c020b201221062010450d010b2010417f6a2110200420064102746a41e4016a28020021040c010b0b200a200e370200200b2008360200200c2006360200200241306a41086a200241106a3602002002200436023420024100360230200220113702242002200f360220200241306a200241206a10ad01200d2007490d010c030b20042006410c6c6a220441e4006a2206280200210320062011370200200441e0006a220628020021042006200f36020002402004450d002003450d00200410230b200d20074f0d020b20092802002104200128020021060c000b0b20002002290310370200200041086a200828020036020020024190026a24000f0b2000410036020020022802102002280214200241186a28020010ae0120024190026a24000f0b41e4014104102a000b2000410036020020024190026a24000b0700200010fa030bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b4103741095041a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c1095041a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e4011026220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc011094042107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a22014103741094042107200a41e0006a200041b4016a2001410c6c109404210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b4103741095041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c1095041a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b4103741095041a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c1095041a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d0241940210262207450d03200741003b010620074100360200200741086a200241d0006a418c021094042103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a22004103741094042116200741e0006a200941b4016a2000410c6c1094042117200741e4016a20094180026a2001417a6a220e4102741094042118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b22134103741095041a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c1095041a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b4102741095041a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b4103741095041a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c1095041a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b4102741095041a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b41940210262200450d03200041003b010620004100360200200041086a200241d0006a418c0210940421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b22074103741095041a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c1095041a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b4102741095041a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b4194024104102a000b41e4014104102a000b4194024104102a000b200241e0026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d00200410230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0bc10703097f047e017f230041e0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a41086a220720052003410c6c6a220a41f0026a280200360200200a41e8026a290200210b2001410c6a200341016a360200200141086a2004360200200141046a20053602002002200b370320200241306a41186a2006290300220b370300200241306a41106a2008290300220c370300200241306a41086a2009290300220d370300200241d8006a2007280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000f0b20004100360200200241e0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210b0c010b2004ad210b410021030b20051023200ba7210402400240200b422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210b0c010b2004ad210b410021050b20031023200ba7210420052103200b422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41086a220f20052006410c6c6a220341f0026a2802003602002002200341e8026a290200370320200520064102746a41f0036a2802002103024020074101460d00410120076b2105034020032802ec032103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241306a41186a2008290300220b370300200241306a41106a2009290300220c370300200241306a41086a200a290300220d370300200241d8006a200f280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000b970603087f017e017f23004180026b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e0001094041a2001410c6a200341016a360200200141086a2004360200200141046a200536020020024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000f0b2000420237032020024180026a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b20051023200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b20031023200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e0001094041a200520064102746a418c0b6a2802002103024020074101460d00410120076b2105034020032802880b2103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a200336020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000bc60401067f230041106b220224002002410036020820024201370300200120021041200141046a20021041200141086a20021041200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d0320022802002004200510272203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d0420022802002004200510272203450d050c060b200228020021030c080b200228020021030c050b2005102622030d050b20054101102a000b2005102622030d010b20054101102a000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002104102400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d0120022802002005200710272204450d020c040b200228020021040c040b2007102622040d020b20074101102a000b101e000b2002200736020420022004360200200721050b200420036a200620011094041a200041202004200320016a100402402005450d00200410230b200241106a24000b1600200120002802002200280200200028020810b3010b8408010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022074f0d01410021064100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20076a2103410020002d0030220920094103461b2209410371450d0220094102460d0341002108200321060c040b2000280218200120022000411c6a28020028020c1102000f0b2000280218200120022000411c6a28020028020c1102000f0b200321080c010b20034101762106200341016a41017621080b417f2103200041046a2109200041186a210a2000411c6a210702400340200341016a220320064f0d01200a28020020092802002007280200280210110300450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1102000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110300450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11020021030b20030bdb1801187f230041c00f6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e0001094041a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b4105741095041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903203700002003200441e0006c6a220041c8036a200041e8026a2200200341066a22032f010020046b41e0006c1095041a2000200241a0026a41e0001094042100200320032f010041016a3b0100200241c00f6a240020000f0b02400240024041880b1026220a450d00200a41003b0106200a4100360200200a41086a20024190046a41800b10940421012002200341ca016a2d00003a00aa03200220032f00c8013b01a803200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e20024190046a200341a8076a41e0001094041a2001200341e8016a200341066a22062f010041796a22004105741094042101200a41e8026a20034188086a200041e0006c1094042107200641063b0100200a20003b0106200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241b0036a20024190046a41e0001094041a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220f41e0006a200f20002f010020046b41e0006c1095041a200f200241a0026a41e0001094041a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a290300370000200120022903203700002007200441e0006c6a220041c07b6a200041e07a6a220f200a41066a22002f010020066b41e0006c1095041a200f200241a0026a41e0001094041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e0001094041a2002411c6a41026a221020042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e0001094041a02400240024020032802002207450d0020032f0104211103402002419c026a41026a221620102d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e0001094041a201141ffff0371210620072f01062203410a4d0d0241b80b10262201450d03200141003b010620014100360200200141086a20024190046a41b00b10940421002002200741ca016a2d00003a00aa03200220072f00c8013b01a803200220072900db01370398032002200741e0016a29000037009d03200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a280000211320024190046a200741a8076a41e0001094041a2000200741e8016a200741066a22092f0100220441796a22034105741094042117200141e8026a20074188086a200341e0006c1094042118200141880b6a200741a40b6a2004417a6a22084102741094042119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024190046a41e0001094041a200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241ac036a41026a220820022d0096033a0000200220022f0194033b01ac0320022002290380033703800120022002290085033700850120024190046a200241b0036a41e0001094041a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b22194105741095041a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200741e8026a200641e0006c6a220341e0006a2003201941e0006c1095041a2003200241a0026a41e0001094041a2009201141016a22033b0100200741880b6a2211200641027422196a41086a201120044102746a2211200341ffff037120046b4102741095041a2011200a360200200020092f010022044f0d01200720196a418c0b6a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b4105741095041a200041186a200229008d023700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f019c023b000020002002290388023700132018200641e0006c6a220041c07b6a200041e07a6a220020092f010020036b41e0006c1095041a2000200241a0026a41e0001094041a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b4102741095041a2009200a360200200420064b0d00200120116a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b20024184026a41026a220320082d00003a0000200220022f01ac033b01840220022002290380013703f00120022002290085013700f50120024190016a20024190046a41e0001094041a201020032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e0001094041a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b80b10262203450d03200341003b010620034100360200200341086a20024190046a41b00b10940421012003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f011c3b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290308370013200041026a2002411c6a41026a2d00003a0000200041186a200229000d3700002003200441e0006c6a41e8026a200241206a41e0001094041a200341880b6a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b22014105741095041a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002007200641e0006c6a220041c8036a200041e8026a2200200141e0006c1095041a2000200241a0026a41e0001094041a200741066a2200200341016a22033b0100200741880b6a220120064102746a41086a200120044102746a2201200341ffff037120046b4102741095041a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b80b4108102a000b41880b4108102a000b41b80b4108102a000b200241c00f6a2400200f0bbe0101047f230041306b220124002001200010af01024020012802004101470d00200141286a2102200141246a21030340024020032802002204450d002002280200450d00200410230b2001200010af0120012802004101460d000b0b02402000280204220441f098c400460d0020042802002103200410232003450d0020032802002100200310232000450d00024020002802002204450d000340200010232004210020042802002203210420030d000b0b200010230b200141306a24000ba11f01407f23004190066b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a2900003703002004200229000037036002400240024002402001280200220541f098c400460d00200128020421060c010b41ec0310262205450d0141002106200541003b010620054100360200200541086a200441f8016a41e4031094041a20014100360204200120053602000b0c010b41ec034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200541086a2107200541066a210820052f01062209410574210a417f2102024002400240024002400340200a450d01200241016a2102417f4101200441e0006a20074120109604220b4100481b4100200b1b220b450d04200a41606a210a200741206a2107200b4101460d000b20060d010c020b200921022006450d010b2006417f6a2106200520024102746a41ec036a2802002105410021020c0a0b200441086a41186a220b200441e0006a41186a220a290300370300200441086a41106a220c200441e0006a41106a2207290300370300200441086a41086a2209200441e0006a41086a220d290300370300200420042903603703082001200128020841016a360208200a200b2903003703002007200c290300370300200d200929030037030020042004290308370360200441e8016a41086a220c200341086a280200360200200420032902003703e80120082f01002209410b4f0d01200520024105746a220b41286a200b41086a220e200920026b4105741095041a200b41206a200a290300370000200b41186a2007290300370000200b41106a200d290300370000200e200429036037000020052002410c6c6a220a41f4026a200a41e8026a220d200541066a22072f010020026b410c6c1095041a200a41f0026a200c280200360200200d20042903e801370200200720072f010041016a3b01000c0a0b200441f8016a41086a220a20052002410c6c6a220241f0026a22072802003602002004200241e8026a22022902003703f8012007200341086a28020036020020022003290200370200200441e0006a41086a2202200a280200360200200420042903f801370360200041013602002000410c6a20022802003602002000200429036037020420044190066a24000f0b41ec031026220f450d04200f41003b0106200f4100360200200f41086a200441f8016a41e4031094042107200441f8016a41086a220d200541b8036a280200360200200420052902b0033703f8012004200541e0016a2900003700c501200420052900db013703c0012004200541ca016a2d00003a00d201200420052f00c8013b01d001200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a200541066a220b2f010041796a220a4105741094042107200f41e8026a200541bc036a200a410c6c109404210c200b41063b0100200f200a3b0106200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200441286a41086a200d280200360200200420042903f80137032802400240200241064b0d00200541086a20024105746a220a41206a200a20082f010020026b4105741095041a200a41186a200441e0006a41186a290300370000200a41106a200441e0006a41106a290300370000200a41086a200441e0006a41086a290300370000200a2004290360370000200541e8026a2002410c6c6a220a410c6a200a20082f010020026b410c6c1095041a200a41086a200441e8016a41086a280200360200200a20042903e8013702000c010b200720024105746a41c07e6a2007200241796a220d4105746a2207200a41ffff0371200d6b4105741095041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a29030037000020072004290360370000200c2002410c6c6a220241b87f6a200241ac7f6a220a200f41066a22082f0100200d6b410c6c1095041a200241b47f6a200441e8016a41086a280200360200200a20042903e8013702000b4101210d200820082f010041016a3b01004102211420044198016a41026a220220042d00be013a000041082115200441d8016a41086a2216200441286a41086a280200360200200420042f01bc013b019801200420042903a801370350200420042900ad01370055200420042903283703d801200441c0006a41086a221720162802003602002004413c6a41026a221820022d00003a0000200420042903d801370340200420042903503703282004200429005537002d200420042f0198013b013c2005280200220e450d0120052f0104211941ffff03211a410a211b419c04211c4100211d419404211e41ca01211f41db01212041e001212141cb01212241cf01212341d301212441d701212541b803212641b003212741e8012128410621294179212a4105212b41bc03212c41e802212d410c212e418804212f41ec032130417a21314118213241f00321334104210c41ac7f213441b87f213541b47f2136416c213741d40321380c060b20044194016a20146a223d20182d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a20156a223e201728020036020020042004290340370398012019201a712109200e2f01062202201b4d0d01201c1026220b450d02200b201d3b0106200b201d360200200b20156a200441f8016a201e109404210a2004200e201f6a2d00003a00d2012004200e2f00c8013b01d0012004200e20206a2900003703c0012004200e20216a2900003700c501200e20226a2800002139200e20236a280000213c200e20246a280000213b200e20256a280000213a200441f8016a20156a223f200e20266a2802003602002004200e20276a2902003703f801200a200e20286a200e20296a22402f01002207202a6a2202202b741094042141200b202d6a200e202c6a2002202e6c1094042142200b20306a200e202f6a200720316a22082014741094042143204020293b0100200b20023b010602402008450d00410021022043210a0340200a280200220720023b01042007200b360200200a200c6a210a20082002200d6a2202470d000b0b200441e8016a20156a2202203f280200360200200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200420042903f8013703e801200441d4016a20146a220820042d00be013a0000200420042f01bc013b01d401200420042903a8013703f801200420042900ad013700fd0120162002280200360200200420042903e8013703d801024002402019201a71220a20294b0d00200e20156a22022009200d6a2219202b746a20022009202b746a220220402f010020096b202b741095041a200220326a20042900653700002002201336000f2002201236000b2002201136000720022010360003200220146a203d2d00003a0000200220042f0194013b000020022004290360370013200e202d6a2009202e6c6a2202202e6a200220402f0100220720096b202e6c1095041a200220156a203e280200360200200220042903980137020020402007200d6a22023b0100200e20306a2207200920147422116a20156a200720192014746a22402002201a71220720196b2014741095041a2040200f360200200a20074f0d01200e20116a20336a210203402002280200220a2009200d6a22093b0104200a200e3602002002200c6a210220072009470d000c020b0b2041200920316a2207202b746a20412009202a6a2202202b746a220a200b20296a22192f010020026b202b741095041a200a20326a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a20146a203d2d00003a0000200a20042f0194013b0000200a200429036037001320422009202e6c6a220a20356a200a20346a224020192f0100221120026b202e6c1095041a200a20366a203e280200360200204020042903980137020020192011200d6a220a3b01002043200920147422406a20376a204320072014746a2219200a201a71220920076b2014741095041a2019200f360200200720094b0d00200b20406a20386a210a0340200a28020022072002200d6a22023b01042007200b360200200a200c6a210a20092002470d000b0b20044190016a20146a220220082d00003a000020044180016a20156a220a2016280200360200200420042f01d4013b019001200420042903f801370350200420042900fd01370055200420042903d801370380012017200a280200360200201820022d00003a00002004200429038001370340200420042903503703282004200429005537002d200420042f0190013b013c0240200e2802002202450d00200e2f0104211920392110203a2113203b2112203c21112002210e200b210f410121020c070b20392110203a2113203b2112203c2111200b210f0b419c0410262202450d03200241003b010620024100360200200241086a200441f8016a419404109404210d20022001280200220a3602ec03200120023602002001200128020441016a360204200a41003b0104200a2002360200200d20022f010622074105746a220a2004290328370013200a20042f013c3b0000200a201336000f200a201236000b200a2011360007200a2010360003200a41186a200429002d370000200a41026a2004413c6a41026a2d00003a000020022007410c6c6a220a41f0026a200441c0006a41086a280200360200200a41e8026a2004290340370200200241ec036a200741016a220a4102746a200f3602002002200a3b0106200f200a3b0104200f20023602000c060b200e41086a220a200941016a22074105746a200a20094105746a220a200220096b4105741095041a200a41186a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a41026a20044194016a41026a2d00003a0000200a20042f0194013b0000200a2004290360370013200e2009410c6c6a220241f4026a200241e8026a220a200e41066a220d2f0100220b20096b410c6c1095041a200241f0026a20044198016a41086a280200360200200a200429039801370200200d200b41016a22023b0100200e41ec036a220a20094102746a41086a200a20074102746a220a200241ffff0371220d20076b4102741095041a200a200f360200201941ffff0371200d4f0d05200e2007417f6a22024102746a41f0036a210a0340200a2802002207200241016a22023b01042007200e360200200a41046a210a200d2002470d000c060b0b419c044104102a000b41ec034104102a000b419c044104102a000b410121020c000b0b2000410036020020044190066a24000b9f3401087f23004190016b220824000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010052209417f460d00410c1026220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041026220b450d03200b200a360200200a280208210c41031026220d450d04200d41026a41002d00cce2443a0000200d41002f00cae2443b000041061026220e450d05200e41046a41002f00cfbf443b0000200e41002800cbbf44360000412010262209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001006200a200a280204417f6a220d360204200d0d00200a10230b41031026220d450d07200d41026a41002d00cce2443a0000200d41002f00cae2443b000041031026220e450d08200e41026a41002d00cfe2443a0000200e41002f00cde2443b00002009412041c00010272209450d092009410836023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031026220d450d0a200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0b200e41076a41002900a6ce44370000200e410029009fce44370000200941c00041800110272209450d0c2009410936025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031026220d450d0d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0e200e41076a41002900b5ce44370000200e41002900aece443700002009410a36027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031026220d450d0f200d41026a41002d00cce2443a0000200d41002f00cae2443b000041081026220e450d10200e42e5f0d1fbb5ac98b6ec00370000200941800141800210272209450d112009410b36029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031026220d450d12200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d13200e41086a41002f00cdce443b0000200e41002900c5ce443700002009410c3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031026220d450d14200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d15200e41086a41002f00d7ce443b0000200e41002900cfce443700002009410d3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031026220d450d16200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d17200e41086a41002f00e1ce443b0000200e41002900d9ce443700002009410e3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031026220d450d18200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d19200e41076a41002800eace44360000200e41002900e3ce44370000200941800241800410272209450d1a2009410f36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031026220d450d1b200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410d1026220e450d1c200e41056a41002900f3ce44370000200e41002900eece44370000200941103602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031026220d450d1d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410c1026220e450d1e200e41086a4100280083cf44360000200e41002900fbce44370000200941113602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031026220d450d1f200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d20200e41076a410028008ecf44360000200e4100290087cf44370000200941123602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031026220e450d21200e41026a41002d00cce2443a0000200e41002f00cae2443b000041151026220d450d22200d410d6a410029009fcf44370000200d41086a410029009acf44370000200d4100290092cf443700002009411336029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031026220d450d23200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d24200e41086a41002f00afcf443b0000200e41002900a7cf44370000200941143602bc03200941003602b8032009428a808080a0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031026220d450d25200d41026a41002d00cce2443a0000200d41002f00cae2443b000041071026220e450d26200e41036a41002800b4cf44360000200e41002800b1cf44360000200941153602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031026220e450d27200e41026a41002d00cce2443a0000200e41002f00cae2443b000041111026220d450d28200d41106a41002d00c8cf443a0000200d41086a41002900c0cf44370000200d41002900b8cf44370000200941163602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031026220d450d29200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410e1026220e450d2a200e41066a41002900cfcf44370000200e41002900c9cf4437000020094180044180081027220c450d2b200c411736029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d36028004410310262209450d2c200941026a41002d00cce2443a0000200941002f00cae2443b0000410e1026220d450d2d200d41066a41002900ddcf44370000200d41002900d7cf44370000200c41183602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a004410310262209450d2e200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d2f200d41086a41002900edcf44370000200d41002900e5cf44370000200c41193602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c004410310262209450d30200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d31200d41086a41002900fdcf44370000200d41002900f5cf44370000200c411a3602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e00441031026220d450d32200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411110262209450d33200941106a41002d0095d0443a0000200941086a410029008dd04437000020094100290085d044370000200c411b36029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d3602800541031026220d450d34200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411610262209450d352009410e6a41002900a4d044370000200941086a410029009ed04437000020094100290096d044370000200c411c3602bc05200c41003602b805200c4296808080e0023702b005200c20093602ac05200c4283808080303702a405200c200d3602a00541031026220d450d36200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411210262209450d37200941106a41002f00bcd0443b0000200941086a41002900b4d044370000200941002900acd044370000200c411d3602dc05200c41003602d805200c4292808080a0023702d005200c20093602cc05200c4283808080303702c405200c200d3602c005410310262209450d38200941026a41002d00cce2443a0000200941002f00cae2443b0000410b1026220d450d39200d41076a41002800c5d044360000200d41002900bed044370000200c411e3602fc05200c41003602f805200c428b808080b0013702f005200c200d3602ec05200c4283808080303702e405200c20093602e005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f2008410036025020084201370348200841183602880120084188016a200841c8006a10414100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a28020022093602880120084188016a200841c8006a10410240024002400240200828024c2206200841c8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828024820062003102722060d020c060b200828024821060c020b200310262206450d040b2008200336024c200820063602480b200e200a20096a3602002006200a6a200120091094041a200d410c6a28020021052008200d41146a28020022013602880120084188016a200841c8006a10410240024002400240200828024c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280248200a2006102722090d020c070b200828024821090c020b200610262209450d050b2008200636024c200820093602482006210a0b200e200320016a2206360200200920036a200520011094041a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001102722090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001102722090d060c140b200a21010c030b200a21010c050b200110262209450d100b2008200136024c200820093602480b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003102722090d040c100b200110262209450d0e0b2008200136024c200820093602480b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003102722090d040c0e0b200310262209450d0c0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d040c030b200310262209450d0a0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d010b0b200828024c210902400240411f2007200f20082802482206200841d0006a280200200841086a1007220d417d460d00200d417f470d014100210a2009450d470c460b4102210a20090d450c460b41041026220e450d41200b280200220a28020041016a22014102490d07200a2001360200200e200a36020002402009450d00200610230b20022802042106200228020021012008410036025020084201370348200841003602880120084188016a200841c8006a104120082802502103200828024c21042008280248210a410a10ac012209450d4241012105024002400240200d20012006200a20032009410a200841086a10082206417d460d0020060d462008410936028c012008200941016a36028801024020092d00002206450d00024020064101470d00200841c8006a20084188016a10d0012008280248417e714104470d010b200910232004450d02200a10230c020b410021050b2009102302402004450d00200a10230b410321092005450d010b410221090b200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200910d101200d1009200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081006200e28020022092009280204417f6a360204200e28020022092802040d00200910230b200e102341012106410021010c460b101e000b20034101102a000b20064101102a000b20014101102a000b20014101102a000b20034101102a000b20034101102a000b00000b10d201000b410c4104102a000b41044104102a000b41034101102a000b41064101102a000b41204104102a000b41034101102a000b41034101102a000b41c0004104102a000b41034101102a000b410f4101102a000b4180014104102a000b41034101102a000b410f4101102a000b41034101102a000b41084101102a000b4180024104102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410b4101102a000b4180044104102a000b41034101102a000b410d4101102a000b41034101102a000b410c4101102a000b41034101102a000b410b4101102a000b41034101102a000b41154101102a000b41034101102a000b410a4101102a000b41034101102a000b41074101102a000b41034101102a000b41114101102a000b41034101102a000b410e4101102a000b4180084104102a000b41034101102a000b410e4101102a000b41034101102a000b41104101102a000b41034101102a000b41104101102a000b41034101102a000b41114101102a000b41034101102a000b41164101102a000b41034101102a000b41124101102a000b41034101102a000b410b4101102a000b41044104102a000b410a4101102a000b41e49cc300104f000b200610230b0240200a450d00200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200a10d10141002106410121010c010b20004187abc10036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d00200910230b0240200841246a280200450d00200841206a28020010230b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810062009280200220a200a280204417f6a360204200928020022092802040d00200910230b0240200841386a2802002209450d002008413c6a280200450d00200910230b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102320084190016a24000f0b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102341002109024020014100472006720d00200d100902400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081006200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a1023200941046a22094104470d000b0b200e10230b20084190016a24000b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41c9b9c10041f4031021000bbb0e03047f037e047f230041900d6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042103200241146a2802002105200241246a2802002106200241346a2802002107200441106a2001280224290338420042204200109804200441386a4200370300200441306a4200370300200441286a4200370300200128022c2202420020022903082208427f200429031020042903184200521b7d220920092008562009507222021b370308200442003703200240024020020d0020012802282802082003200441206a4120100e2202417e460d0020020d06024002400240024002402005450d002004200141246a28020029033842002007ad220a42001098042001412c6a2802002202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d052007450d0120074100480d0e20071026220b450d0f41012102200b2103024020074102490d00200b41002007417f6a220210930420026a2103200721020b200341003a00000c020b4100210b0c020b410021024101210b4200210a0b200141286a2802002802082006200b2002100e2203417e460d0120030d0a200b450d02200a2002ad4220868421090b20012802002102200441c0006a41186a2201200441206a41186a290300370300200441c0006a41106a2207200441206a41106a290300370300200441c0006a41086a2205200441206a41086a2903003703002004200429032037034020022802182103200441e0006a41186a2001290300370300200441e0006a41106a2007290300370300200441e0006a41086a200529030037030020042004290340370360200328020c0d082003410c6a417f360200200441d80c6a41186a200341e4006a290000370300200441d80c6a41106a200341dc006a290000370300200441d80c6a41086a200341d4006a2900003703002004200329004c3703d80c02400240200341106a220c280200220141f098c400460d00200341146a280200210d0c010b41880b10262201450d0d4100210d200141003b010620014100360200200141086a200441d8016a41800b1094041a200341146a4100360200200341106a20013602000b0240024002400240034020012f0106220e410574210641002102417f2107024002400240034020062002460d01200741016a2107417f4101200441d80c6a200120026a41086a412010960422054100481b410020051b2205450d05200241206a210220054101460d000b200d0d010c020b200e2107200d450d010b200d417f6a210d200120074102746a41880b6a28020021010c010b0b20044180016a41186a200441d80c6a41186a29030037030020044180016a41106a200441d80c6a41106a29030037030020044180016a41086a200441d80c6a41086a290300370300200420042903d80c37038001200341186a21024100210d41000d010c020b200341186a21024101450d010b200441f0016a4200370300200441ec016a41f098c400360200200441003602f801200441003602e801200442003703e001200441f098c4003602dc01200441003602d8012001200741e0006c6a41e8026a2102200441d8016a10b5010c010b200441f40c6a20044180016a41086a290300370200200441fc0c6a20044180016a41106a290300370200200441840d6a20044180016a41186a290300370200200420023602e80c200420073602e40c2004200c3602e00c200420013602dc0c2004200d3602d80c20042004290380013702ec0c2004418c026a4200370200200441f8016a20042903c80137030020044180026a200441c8016a41086a29030037030020044195026a20042900a0013700002004419d026a200441a0016a41086a290000370000200441a5026a200441a0016a41106a290000370000200441ad026a200441a0016a41186a290000370000200441b4026a200441bf016a280000360000200442003703f001200442003703d801200441f098c40036028802200441003a009402200441d80c6a200441d8016a10b40121020b200441d8016a41186a200441e0006a41186a290300370300200441d8016a41106a200441e0006a41106a290300370300200441d8016a41086a200441e0006a41086a290300370300200420042903603703d801200420093702a4012004200b3602a001200441d80c6a200241306a200441d8016a200441a0016a10b601024020042802d80c450d0020042802dc0c2202450d00200441e00c6a280200450d00200210230b2003410c6a2202200228020041016a360200410421020c020b200a500d00200b10230b410521020b20002002360200200441900d6a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b10e601000b41d8f6c400104f000b101e000b20074101102a000b41880b4108102a000b940302017f027e230041d0006b22042400024002402003450d0020022802000d002002280204210320042001280224290338420042204200109804200441286a4200370300200441206a4200370300200441186a4200370300200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b3703082004420037031002400240024020020d0020012802282802082003200441106a4120100e2202417e460d0020020d04200441306a20012802002802182202410c6a200241cc006a2002410020022802001b200441106a10e5012004280230450d01200441c0006a41086a2203200441306a41086a28020036020020042004290330370340200141186a210202402001411c6a280200450d00200228020010230b20022004290340370200200241086a2003280200360200410021010c020b20004105360200200441d0006a24000f0b200141206a4100360200410121010b2000410036020020002001360204200441d0006a24000f0b41c9b9c10041f4031021000b41d8f6c400104f000bab0d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a20044180016a200320051094041a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310230b200441106a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d10200310230c100b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b1094041a2003410f4d0d0020044188016a290300210f200429038001211002402008450d00200210230b2004200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d10200210230c100b4100210a41012102410021030b024002400240024002402001280228280208200920022003100e2205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210820012802182107200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d01410121032008450d0220071023200a0d030c040b200a450d12200210230c120b200541086a220e200b200c7d3703002005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b370360200128020041186a280200210520044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a801200420083602a401200420073602a001200441f0006a200520044180016a2010200f200441d0006a20022003200441a0016a10e701200441f0006a41086a290300210c2004280274210520042802702108200e2004290358200e2903007c3703004101210320084101460d002005450d0002402001411c6a2203280200450d00200141186a28020010230b2003200c370200200141186a2005360200410021030b200a450d010b200210230b2000410036020020002003360204200441b0016a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b20004105360200200441b0016a24000b8f1006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a200441f8006a200320051094041a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310230b200441186a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d15200310230c150b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b1094041a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d00200210230b200441086a200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d15200210230c150b4100210a41012102410021030b024002402001280228280208200920022003100e2205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b200541086a2208200b200c7d3703002005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a200128020041186a2802002010200f20044198016a200441386a2002200310e2014101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200a0d130c140b200a450d14200210230c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a2205200441c9016a290000370300200441f8006a41086a220e200441c1016a290000370300200420042900b901370378200441d8006a41086a2207200e290300370300200441d8006a41106a220e2005290300370300200441d8006a41186a22052003290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200441b8016a41186a2005290300370300200441b8016a41106a200e290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a2802002005200310272205450d020c110b200141186a28020021050c110b2003102622050d0f0b20034101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b200210230b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b10272203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b102622030d060b200b4101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41bdbdc10041fd001021000b41ccabc400104f000b101e000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a1093041a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b02402001280228280208200520032002100e2208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d00200510230b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d00200310230b20004105360200200441106a24000f0b41d8f6c400104f000b900101027f200128020021040240412010262205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b960101027f200128020028021821040240412010262205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b7703017f027e017f200128022c220441186a2903002105200429031021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000b6202017e027f200128022c29030821040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000bc103020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a28020028021c110400200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a360200411010262206450d01200620103700002006200f37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441106a24000f0b10e401000b41104101102a000b7703017f027e017f2001280200220441086a2903002105200429030021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000bf80303047f027e017f230041306b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d01410521050240200241146a2802002203200128022422062802584b0d00200228020421072004200629033842002003ad4200109804200128022c2202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d00024002402003450d0020034100480d06200310262202450d07410121062002210a024020034102490d00200241002003417f6a220610930420066a210a200321060b200a41003a00000c010b4100210341012102410021060b02402001280228280208200720022006100e2207417e460d0020070d042002450d01200441106a2002200610e301412010262205450d0720052004290310370000200541186a200441106a41186a290300370000200541106a200441106a41106a290300370000200541086a200441106a41086a29030037000002402001411c6a2206280200450d00200141186a28020010230b200642a08080808004370200200141186a2005360200410421050b2003450d00200210230b20002005360200200441306a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20034101102a000b41204101102a000b6202017e027f200128020029031021040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000be70a04027f027e027f047e230041b0036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d05200210262203450d062003210841002109024020024102490d00200341002002417f6a220910930420096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b024002402001280228280208200520032009100e2205417e460d0020050d042003450d0c200420093602ac01200420033602a801200441a0026a200441a8016a104420042802a0022205410e470d010b2002450d0b200310230c0b0b200441b0016a200441a0026a41047241ec001094041a20042005360238200441386a410472200441b0016a41ec001094041a02402002450d00200310230b200441003602a802200442013703a002200441386a200441a0026a103920042802a8022103024020042802a402450d0020042802a00210230b42002107200441a0026a41086a22024200370300200442003703a002418bcec200411b200441a0026a1000200441b0016a41086a22052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012209417f460d072009410f4d0d07200441a8026a290300210620042903a002210a0c010b4200210a420021060b20024200370300200442003703a00241a6cec200411b200441a0026a100020052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012202417f460d082002410f4d0d08200441a8026a290300210b20042903a00221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad4200109804200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10970420024200200229030822062004290308427f200441086a41086a290300501b7d220720072006562007507222031b37030802402003450d00200441386a10240c0b0b20012802002102200441b0016a200441386a41f0001094041a200441b8026a2002280218220241e4006a290000370300200441b0026a200241dc006a290000370300200441a0026a41086a200241d4006a2900003703002004200229004c3703a002200441c0026a200441b0016a41f0001094041a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4290017e2207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014190016c200910272201450d010c0a0b2009102622010d090b20094108102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41c8adc400104f000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014190016c6a200441a0026a4190011094041a2003200328020041016a360200410421020c010b410521020b20002002360200200441b0036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000be50f04047f027e0d7f017e230041a0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a2802002106024002400240200241146a2802002207450d0020022802042103200441c0006a200128022429033842002007ad4200109804200128022c2202420020022903082208427f200429034020042903484200521b7d220920092008562009507222021b3703084105210a20020d1920074100480d1220071026220b450d07200b210c41002102024020074102490d00200b41002007417f6a220210930420026a210c0b200c41003a000020012802282802082003200b200241016a220c100e2202417e460d0f20020d08200b450d192004200c3602542004200b360250200441386a200441d0006a10452004280238450d0f200428023c220dad2209421b88a70d092009420586a72202417f4c0d092002450d0120021026220e450d0a200d450d020c0b0b4101210e4100210c410021130c100b4101210e200d0d090b4100210c41002113200e450d0b0c090b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b20074101102a000b41d8f6c400104f000b101d000b20024101102a000b2004280250210f20042802542103410021104100211141002112200d21130340200441d8006a2003412020034120491b22026a41004100412020026b2002411f4b1b1093041a200441d8006a200f20021094041a2004200f20026a220f360250200320026b21142003411f4d0d02201241016a210c20044180016a41186a2203200441d8006a41186a29000037030020044180016a41106a2215200441d8006a41106a29000037030020044180016a41086a2216200441d8006a41086a2900003703002004200429005837038001024020122013470d002010200c200c2010491b2213ad4205862209422088a70d082009a722024100480d0802402012450d00200e201120021027220e0d010c070b20021026220e450d060b200e20116a2202200429038001370000200241186a2003290300370000200241106a2015290300370000200241086a2016290300370000201041026a2110201141206a211120142103200c2112200c200d490d000b20042014360254200e450d020b02402007450d00200b10230b200c200141246a28020028024c4d0d040c0a0b200420143602542013450d00200e10230b2007450d0a0b200b10230c090b20024101102a000b200e200c41004120200c676b108e010240200c4102490d00200e2102200c210303402002200241206a22074120109604450d07200721022003417f6a220341014b0d000b0b200441286a200128022429033842002006ad22174200109804200128022c2202420020022903082208427f200429032820042903304200521b7d220920092008562009507222021b37030820020d05024002402006450d0020064100480d02200610262202450d044101210720022103024020064102490d00200241002006417f6a220310930420036a2103200621070b200341003a00000c010b4100210641012102410021070b024002402001280228280208200520022007100e2203417e460d0020030d032002450d07200441086a200141246a28020022122903284200200cad4200109804200441186a20122903204200201742001098042001412c6a2802002103427f2109024020042903204200520d0020042903104200520d002004290318220820042903087c22172008540d00427f201720122903307c220920092017541b21090b200342002003290308220820097d220920092008562009507222121b3703082012450d010b2006450d06200210234105210a20130d070c080b20044180016a41186a22112001280200280218220341e4006a29000037030020044180016a41106a220a200341dc006a29000037030020044180016a41086a220f200341d4006a2900003703002004200329004c37038001200341306a221228020022012003412c6a280200470d04200141016a22102001490d002001410174220b20102010200b491b2210ad42e8007e2209422088a70d002009a7220b4100480d00024002402001450d00200341286a280200200141e8006c200b10272201450d010c050b200b102622010d040b200b4108102a000b101e000b41d8f6c400104f000b20064101102a000b2003412c6a2010360200200341286a2001360200200341306a28020021010b200341286a280200200141e8006c6a2203200429038001370001200341053a0000200341096a200f290300370000200341116a200a290300370000200341196a2011290300370000200341216a20042f00503b0000200341236a200441d2006a2d00003a00002003412c6a2007360000200341286a2006360000200341246a2002360000200341d0006a200441f8006a290300370300200341c8006a200441d8006a41186a290300370300200341c0006a200441d8006a41106a290300370300200341386a200441d8006a41086a290300370300200341306a2004290358370300200341e0006a200c360200200341dc006a20133602002003200e3602582012201228020041016a3602004104210a0c020b4105210a2013450d010b200e10230b2000200a360200200441a0016a24000bb80a03027f027e057f230041a00c6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b3703084105210820030d09024002402002450d0020024100480d05200210262203450d06410121092003210a024020024102490d00200341002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012103410021090b0240024002402001280228280208200520032009100e2205417e460d0020050d052003450d0c200442003703a801200442003703a001200441a0016a20032009411020094110491b1094041a2009410f4d0d00200441a8016a290300210720042903a001210602402002450d00200310230b2001280200280218220328020c0d082003410c6a417f36020020044180016a200341e4006a290000370300200441e8006a41106a200341dc006a290000370300200441f0006a200341d4006a2900003703002004200329004c370368200341106a220b280200220141f098c400460d01200341146a280200210a0c020b2002450d0b200310230c0b0b41880b10262201450d074100210a200141003b010620014100360200200141086a200441a0016a41800b1094041a200341146a4100360200200341106a20013602000b02400240034020012f0106220c410574210541002102417f2108024002400240034020052002460d01200841016a2108417f4101200441e8006a200120026a41086a412010960422094100481b410020091b2209450d05200241206a210220094101460d000b200a0d010c020b200c2108200a450d010b200a417f6a210a200120084102746a41880b6a28020021010c010b0b200441106a41186a200441e8006a41186a290300370300200441106a41106a200441e8006a41106a290300370300200441106a41086a200441e8006a41086a29030037030020042004290368370310200341186a21024100210a41000d010c090b200341186a21024101450d080b200441b8016a4200370300200441b4016a41f098c400360200200441003602c001200441003602b001200442003703a801200441f098c4003602a401200441003602a0012001200841e0006c6a41e8026a2102200441a0016a10b5010c080b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b10e601000b41880b4108102a000b20044184016a200441106a41086a2903003702002004418c016a200441106a41106a29030037020020044194016a200441106a41186a29030037020020042002360278200420083602742004200b3602702004200136026c2004200a3602682004200429031037027c200441d4016a4200370200200441c0016a2004290358370300200441c8016a200441d8006a41086a290300370300200441dd016a2004290035370000200441e5016a200441356a41086a290000370000200441ed016a200441356a41106a290000370000200441f5016a200441356a41186a290000370000200441fc016a200441d4006a280000360000200442003703b801200442003703a001200441f098c4003602d001200441003a00dc01200441e8006a200441a0016a10b40121020b200241286a2007370300200241206a2006370300200242013703182003410c6a2202200228020041016a360200410421080b20002008360200200441a00c6a24000bda03020b7f027e230041206b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d00200641186a280200220d450d00200641286a290300210f200641206a29030021100c010b200441086a2005411c6a2802002007200541206a280200280214110400200441186a290300210f200528020c2108200429031021102004280208210d0b2005410c6a2008417f6a360200411010262206450d0120062010427f200d1b3700002006200f427f200d1b37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441206a24000f0b10e401000b41104101102a000bff0203027f027e037f230041206b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222081b37030841052103024020080d00024002402002450d0020024100480d06200210262208450d07410121092008210a024020024102490d00200841002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012108410021090b02402001280228280208200520082009100e2201417e460d0020010d042008450d01200441106a2008200910a501024020042802100d002004280214200441186a280200100f0b410421030b2002450d00200810230b20002003360200200441206a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b870603027f017e087f230041c0006b220424002004200136020c2004200041a886c50020011b3602082004200441086a104502400240024002400240024002402004280200450d000240024002400240024020042802042205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d00200110262207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b101d000b20014108102a000b200441206a4104722108410021094100210a410021002005210b0340200441206a200441086a10d001200441306a41086a220c200841086a280200360200200420082902003703302004280220220d4104460d02200041016a2101200441106a41086a220e200c2802003602002004200429033037031002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c102722070d010c070b200c10262207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290310370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200441206a20022007200120031105002004410036023820044201370330200428022021004101102621010240024020004105470d002001450d06200141013a0000200442818080801037023420042001360230420121060c010b2001450d06200141003a000020044281808080103702342004200136023020014101410210272101024020004104470d002001450d08200141003a0001200442828080802037023420042001360230420221060c010b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a10d302200441386a3502002106200428023021010b2001ad42208620068421060240200b450d00200710230b200441c0006a240020060f0b200b450d00200710230b41f19bc30041f0001021000b101e000b200c4108102a000b41014101102a000b41014101102a000b41024101102a000b41024101102a000bcb0401057f230041106b22022400200241003a0008200241086a200128020022032001280204220441004722051094041a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b200520041048000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a41c8b3c10036020002402003450d002004450d00200310230b200128020c2200450d010b200141106a280200450d00200010230b02402001411c6a280200450d00200128021810230b200128022822012001280200417f6a22003602000240024020000d002001280208100620012001280204417f6a22003602042000450d010b0f0b200110230f0b41d8b3c100104f000b0a004198abc100104f000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0b9203010e7f230041b0016b22012400200141086a200010b001024020012903284202510d00200141e0006a2102200141dc006a2103200141d8006a2104200141a4016a2105200141a0016a21062001419c016a210720014198016a210820014190016a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e2802ec03210e200d417f6a220d0d000b0340200b200b2f01064102746a41ec036a280200210b200c417f6a220c0d000c020b0b200b210e0b20014188016a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36028c01200141003602880120014188016a10b501200141086a200010b001200141086a41206a2903004202520d000b0b02402000280204220b41f098c400460d00200b280200210c200b1023200c450d00200c280200210e200c1023200e450d000240200e280200220b450d000340200e1023200b210e200b280200220c210b200c0d000b0b200e10230b200141b0016a24000b9a0304027f017e027f017e230041c0006b2203240002400240411410262204450d00200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b64137000020044114413410272204450d01200420022900003700142004412c6a200241186a290000370000200441246a200241106a2900003700002004411c6a200241086a29000037000042002105200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020044134200341206a1002200341186a2002290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012202417f460d022002410f4d0d02200341286a2903002108200329032021050c010b420021080b200410232000200837030820002005370300200341c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bfb0101057f230041c0006b22052400024002402003450d002003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1002200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a100a210420052802202203417f460d012000200336020420002004360200200041086a2003360200200541c0006a24000f0b20004100360200200541c0006a24000f0b20004100360200200541c0006a24000b8b0201057f23004190016b22032400200341086a200210d801024020032d000822024102470d00200041003a000020034190016a24000f0b200341f0006a200341c8006a290300370300200341f8006a2204200341d0006a29030037030020034180016a2205200341d8006a29030037030020034188016a2206200341e0006a2903003703002003200341c0006a29030037036802402002450d00200041003a000020034190016a24000f0b2003413c6a2802002102200341386a280200210720002003290370370001200041013a0000200041196a2006290300370000200041116a2005290300370000200041096a200429030037000002402002450d00200710230b20034190016a24000bce0e06087f047e017f037e017f027e23004180016b220224000240024002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241386a41186a22014200370300200241386a41106a22044200370300200241386a41086a220542003703002002420037033820034137200241386a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033837030802400240024002400240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a360228200241003a0038200241086a4120200241386a410141001001210120022002280230200141016a41014b22016a22043602302001450d0720022d003822014101460d0120010d072002200241286a104a2002280200450d0720022802042201417f4c0d0a2001450d02200110ac012206450d0b200241306a22072001410020022802282204200228022c2205200620012007280200100122082008417f461b2208200820014b1b220920072802006a220836020020092001460d030c060b200041023a00000c040b4200210a200241d0006a4200370300200241c8006a4200370300200241386a41086a42003703002002420037033841002105200241286a41086a22064100200241086a4120200241386a41202004100122012001417f461b2201412020014120491b20062802006a360200024002402001411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210b200229003f210c200229004f210d2002310057210a2002200228007b36007320022002280278360270410121050c010b0b2002200228007336003b200220022802703602382005450d052002200228003b36006b200220022802383602682002200228006b360063200220022802683602602002200228006336003b200220022802603602382002200241dc006a28000036007b20022002280059360278410121010c020b4101210620022802282204200228022c220541014100200241306a280200220810011a41002001470d030b20024100360238200241286a41086a2207410020042005200241386a41042008100122082008417f461b2208410420084104491b20072802006a2209360200200841034d0d0220022802382108200241d0006a4200370300200241c8006a4200370300200241386a41086a4200370300200242003703382007410020042005200241386a412020091001220e200e417f461b220e4120200e4120491b20096a220936020002400240200e411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210f200229003f2110200229004f211120022d005721072002200228007b360073200220022802783602704101210e0c010b4100210e0b2002200228007336003b20022002280270360238200e450d022002200228003b36006b200220022802383602682002420037034020024200370338200241286a41086a2212410020042005200241386a411020091001220e200e417f461b220e4110200e4110491b20096a2209360200200e410f4d0d02200241386a41086a290300210b2002290338210c200242003703382012410020042005200241386a410820091001220e200e417f461b220e4108200e4108491b20096a2209360200200e41074d0d022002290338210d200241003a0038200241306a200920042005200241386a41012009100141016a41014b220e6a2209360200200e450d020240024020022d0038220e450d00200e4101470d0420024200370338200241286a41086a410020042005200241386a41082009100122042004417f461b2204410820044108491b20096a360200200441074d0d04200229033821134201210a0c010b4200210a0b2001ad221442208620148421142002200228006b360063200220022802683602602002200228006336007b200220022802603602782002200241dc006a28000036003b20022002280059360238410021010b2002200228003b36007320022002280238360270200220022802783602682002200228007b36006b200041106a200b370000200041086a200c370000200041cf006a200f370000200041c7006a2010370000200020013a00002000413c6a2008360000200041346a2014370000200041306a2006360000200041286a2013370000200041206a200a370000200041186a200d370000200041df006a20073a0000200041d7006a201137000020002002280270360001200041046a2002280073360000200041c0006a2002280268360000200041c3006a200228006b3600000b2003102320024180016a24000f0b2001450d00200610230b41d4aac10041331021000b41174101102a000b41374101102a000b101d000b20014101102a000baf0201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041a886c500410041001001210120031023200241c0006a24002001417f470f0b41174101102a000b41374101102a000b840102017f037e230041e0006b220324002003200210d8010240024020032d000022024102470d00420021040c010b2002410173ad2104200341106a2903002105200341086a290300210620020d00200341346a280200450d00200341306a28020010230b2000200637030820002004370300200041106a2005370300200341e0006a24000bdb2710067f017e177f017e017f017e047f027e017f047e027f017e027f037e037f017e230041c0046b22022400200241106a4200370300200242003703082002420037030020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b200241086a2107200241186a411c6a20042f0106360200200241186a41186a4100360200200241186a41146a20043602002002200336023820024100360228200242003703202002200136021c2002410036021820024180016a200241186a10b0010240024002400240024020022903a00122084202520d00200241186a10d4010c010b20024180016a41c0006a210920024180016a41386a210a20024180016a410472210b200241dd016a210c20024180016a41086a2103200241e0026a41386a210d20024180016a41306a210e20024180016a41286a210f200241c8016a2110200241d0016a211120024180016a41d8006a2112200241dc016a211320024180016a411c6a211420024180016a41146a211520024180016a41346a2116200241b8036a41206a2217410f41edccc2006b41f5ccc2006a200241b8036a6b6a2118200241e0026a412c6a2119200241a4016a211a200241bc016a211b0340200241e0006a41186a220420024180016a41186a2221290300370300200241e0006a41106a220120024180016a41106a2223290300370300200241e0006a41086a22052003290300370300200241c0006a41086a2206200c41086a290000370300200241c0006a41106a2231200c41106a290000370300200241c0006a41186a2232200c41186a29000037030020022002290380013703602002200c290000370340200e290300212c200f290300212d2010290300213320092903002134200a2903002130201129030021352012280200213620132d0000213720024180026a41186a2229200429030037030020024180026a41106a2238200129030037030020024180026a41086a220120052903003703002002200229036037038002200241a0026a41186a22042032290300370300200241a0026a41106a22322031290300370300200241a0026a41086a22312006290300370300200220022903403703a00202400240024002400240024020084201520d0020024180016a20024180026a202d202c10dc01202329030021392003290300212d20212d00002105200229038001212a200241106a22062903002108200241086a222e290300212c02400240024002400240024020022903004201520d00202a4200510d01427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b0c040b202a4200510d01202c202d56200820395620082039511b450d02200820397d202c202d54ad7d212a202c202d7d212b420021080c040b203920087d202d202c54ad7d200820397d202c202d54ad7d202d202c562039200856203920085122261b22251b212a202d202c7d202c202d7d20251b212b202d202c58203920085820261bad21080c030b427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b420021080c020b203920087d202d202c54ad7d212a202d202c7d212b0b420121080b2006202a370300202e202b37030020022008370300200541ff01710d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020360d0020304201510d00203741ff01714101460d002035a721042035422088a72201450d01410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c030b0b20024180016a20024180026a10d80120022d00800122054103714102460d0220054101470d0320050d132016280200450d13200e28020010232035a721042035422088a722010d140c150b200421010b20024180016a41206a4100360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010c150b024020050d002016280200450d00200e28020010230b42022108203741ff01710d010c100b200241c0026a41086a2205200941086a290300370300200241c0026a41106a2206200941106a290300370300200241c0026a41186a222e200941186a290300370300200220092903003703c0022023290300212820032903002127201b280200211c200a280200211d2016280200211e200e280200211f200f29030021202021290300212220024180016a41206a29030022084202520d01203741ff0171450d0f0b200241a0046a41186a22262004290300370300200241a0046a41106a22252032290300370300200241a0046a41086a22242031290300370300200220022903a0023703a004200241b8036a41086a22064200370300200242003703b80341d0c5c200411a200241b8036a100020032006290300370300200220022903b8033703800120024180016a411041a886c500410041001001417f460d01200241003602b80320024180016a4110200241b8036a41044100100141016a41044d0d0820022802b80321050c020b201d417f4c0d0b02400240201d0d00410121010c010b201d10262201450d0d2001201f201d1094041a0b200d20022903c002370300200241e0026a41346a201c360200200241e0026a41306a201d3602002019201d360200200241e0026a41286a2001360200200241e0026a41206a2020370300200241e0026a41106a2022370300200241e0026a41186a2008420151ad222d370300200d41086a2005290300370300200d41106a2006290300370300200d41186a202e290300370300200220273703e002200220283703e802201d212f201d21292022212c2027212a2028212b201c210520304201510d020c030b410021050b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380010240024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80342017c212c0c010b4201212c0b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380012002202c3703b80320024180016a4110200241b8036a4108100441201026222e450d06202e200229038002370000202e41186a2029290300370000202e41106a2038290300370000202e41086a2001290300370000202e412041c00010272229450d072029202c37002020214200370300202342003703002003420037030020024200370380012029412820024180016a1002200241b8036a41186a2021290300370300200241b8036a41106a20232903003703002006200329030037030020022002290380013703b803413710262201450d08200142bac6a1cbc68dd9aff300370000200142f4dec98bf6ac999de400370008200141e5cc85ab07360010200141ece8013b00142001413a3a0016200120022903b803370017200120022903c00337001f200120022802c803360027200120022f01cc033b002b200120022d00ce033a002d200120022d00cf033a002e200120022d00d0033a002f200120022d00d1033a0030200120022d00d2033a0031200120022d00d3033a0032200120022d00d4033a0033200120022d00d5033a0034200120022d00d6033a0035200120022d00d7033a0036202910234200212d20064200370300200242003703b80341af98c300410d200241b8036a100020032006290300370300200220022903b803370380014200212c024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b803212c0b200241e0026a41346a2005360200200241e0026a41306a20183602004137212f20194137360200200241e0026a41286a2001360200200d20022903a004370000200241e0026a41186a4200370300200241e0026a41106a202c370300200d41086a2024290300370000200d41106a2025290300370000200d41186a2026290300370000427f212a2002427f3703e8022002427f3703e00220182129427f212b20304201520d010b200220343703e002200220333703e8022034212a2033212b0b0240203741ff0171450d00200d20022903a002370000200d41186a2004290300370000200d41106a2032290300370000200d41086a20312903003700000b02402036450d0042002139200241b8036a41086a22044200370300200242003703b80341af98c300410d200241b8036a100020032004290300370300200220022903b80337038001024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80321390b4201212d200241e0026a41186a4201370300200241e0026a41206a20393703000b2035a72104024002402035422088a72206450d00410020066b2231213220042106034020062802ec032106203241016a22320d000b0340200420042f01064102746a41ec036a2802002104203141016a22310d000c020b0b200421060b20042f0106213120172036360200200241b8036a411c6a2031360200200241b8036a41186a22264100360200200241b8036a41146a2004360200200241b8036a41106a22254100360200200241b8036a41086a22244200370300200220063602bc03200241003602b80320024180016a200241b8036a10af0102402002280280014101470d000340200241e0036a41186a2231200b41186a290200370300200241e0036a41106a2232200b41106a290200370300200241e0036a41086a2236200b41086a2902003703002002200b2902003703e003201a2802002104200f280200213820024180016a412c6a280200210620024180046a41186a203129030037030020024180046a41106a203229030037030020024180046a41086a2036290300370300200220022903e00337038004202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a1002200241a0046a41186a22322021290300370300200241a0046a41106a22362023290300370300200241a0046a41086a2237200329030037030020022002290380013703a004200241003602800120012029200241a0046a412020024180016a100a212e02402002280280012231417f460d00200520316b21052031450d00202e10230b024002402004450d00202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a412020042006100b200520066a21052038450d01200410230c010b202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a4120100c0b20024180016a200241b8036a10af012002280280014101460d000b200241e0026a41346a20053602000b200241b8036a10b5012026200241c0026a41186a2903003703002025200241c0026a41106a2903003703002024200241c0026a41086a290300370300200220022903c0023703b803024020084202510d002016201c360200200e201d36020020024180016a412c6a201e360200200f201f36020020024180016a41206a20203703002021200837030020232022370300200a20022903b803370300200a41086a2024290300370300200a41106a2025290300370300200a41186a20262903003703002002202737038001200220283703880141012104024002400240201d2029470d0002400240201f2001460d00201f2001201d1096040d02201c2005470d020c010b201c2005470d010b200a200d41201096040d002027202a852028202b85844200520d002022202c520d002008a72205202da7470d0020054101462020200241e0026a41206a29030052712104201e0d010c020b201e450d010b201f10230b20044102460d0020040d00202f450d0e200110230c0e0b2003200241e0026a41d8001094041a200241003a00800120024180026a20024180016a10dd010c0d0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41c0004101102a000b41374101102a000b101d000b201d4101102a000b2035a721042035422088a72201450d010b410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c020b0b200421010b20024180016a41206a2036360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010b20024180016a200241186a10b00120024180016a41206a29030022084202520d000b20022903002135200241186a10d401203550450d010b200241086a290300200241106a2903008450450d0220022903004200510d010b200220073602800120024180016a10de01200241c0046a24000f0b200220073602800120024180016a107b200241c0046a24000f0b41b4b8c100104f000b970a03057f037e017f23004190016b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a20082903003703002004200429032037030002400240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a20052903003703002004200429032037030002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d022005410f4d0d02200a2009844200520d002004290320200258200441286a290300220b200358200b2003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a200529030037030020042004290320370300024002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d062005410f4d0d062004290320200258200441286a290300220b200358200b2003511b0d0020012002200310df01410121050c010b411410262205450d06200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d07200520012900003700142005412c6a200141186a220c290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703002004412041a886c50041004100100121062005102302402006417f470d00200110e001200441d8006a2003370300200441d0006a2002370300200441206a41086a41003a0000200441296a2001290000370000200441316a200141086a290000370000200441396a200141106a290000370000200441c1006a200c290000370000200441023a002041a886c5004100200441206a102c0b20012002200310df01410021050b2000200a20027d2002200a7d200a200256200920035620092003511b22011b370308200020053a001820002001ad370300200041106a200920037d200a200254ad7d200320097d2002200a54ad7d20011b37030020044190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000bd00201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10b30220031023024020012d00000d00200141346a280200450d00200141306a28020010230b200241c0006a24000f0b41174101102a000b41374101102a000bcd0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a1000200320022903003703002001200129031037030020014200200520077d2006200854ad7d2207200620087d2208200656200720055620072005511b22021b37031820014200200820021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000ba01f05017f017e017f017e067f230041f0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a1000200341d0016a41086a2005290300370300200320032903203703d0010240024002400240200341d0016a411041a886c500410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441142107411410262205450d010c030b42002106411421074114102622050d020b20074101102a000b41d4aac10041331021000b200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b641370000024002400240024002400240024002400240024002400240024020052007413410272205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200320013703d001200320023703d801200341206a4120200341d0016a41101004200510232004200158200620025820062002511b0d0b411410262205450d02200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e101200341086a41106a2903002102200329031021012003280208210a20051023410e10262205450d04200541066a41002900b0b741370000200541002900aab7413700002005410e412e10272205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102302402001200284500d00200a450d0020032001370320200320023703282003200341206a3602d001200341d0016a10de010b410e10262205450d06200541066a4100290094c7403700002005410029008ec7403700002005410e412e10272205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a200929030037030020032003290390013703d00102400240200341d0016a412041a886c500410041001001417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341d0016a4120200341206a4120410010012207417f460d032007411f4d0d03200341b0016a41186a2207200341206a41186a290300370300200341b0016a41106a2208200341206a41106a290300370300200341b0016a41086a2209200341206a41086a290300370300200320032903203703b001200341d0016a4120100320051023200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a2009290300370300200320032903b0013703d001410e10262205450d0a200541066a41002900c6c740370000200541002900c0c7403700002005410e412e10272205450d0b200520032903d00137000e200541266a200341d0016a41186a2903003700002005411e6a200341d0016a41106a290300370000200541166a200341d0016a41086a29030037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023410d2107410d10262205450d010c0c0b20051023410d2107410d102622050d0b0b20074101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b200541056a41002900ee9c41370000200541002900e99c41370000024002400240024002400240024002400240024020052007412d10272205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412d20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d01200541106a41002f00a6f5403b0000200541086a410029009ef54037000020054100290096f54037000020054112413210272205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102320001085012000108601200341206a200010d801024002400240024020032d00202205410371450d0020054102470d0120050d02200341d4006a280200450d02200341d0006a2802001023411721074117102622050d030c070b200341d4006a2802002105200341d0006a2802002207200341d8006a280200100d2005450d0120071023411721074117102622050d020c060b20050d00200341d4006a280200450d00200341d0006a28020010230b41172107411710262205450d040b2005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020052007413710272205450d04200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413720034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d05200541106a41002f00c4ad443b0000200541086a41002900bcad44370000200541002900b4ad4437000020054112413210272205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411810262205450d07200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032002400240200341206a412041a886c500410041001001417f460d00200342003703d801200342003703d001200341206a4120200341d0016a4110410010012207417f460d012007410f4d0d01200341d8016a290300210220032903d001210141002107200510232001200284504101710d0d0c0b0b41012107200510234100410171450d0a0c0c0b41d4aac10041331021000b412d4101102a000b41124101102a000b41324101102a000b20074101102a000b41374101102a000b41124101102a000b41324101102a000b41184101102a000b41384101102a000b20070d010b200341f0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41186a220a420037030020034190016a41106a220b420037030020034190016a41086a220c420037030020034200370390012005413320034190016a1002200341206a41186a200a290300370300200341206a41106a200b290300370300200341206a41086a220a200c2903003703002003200329039001370320200341206a4120100320051023200a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a002041a886c5004100200341206a102c200341f0016a24000f0b41134101102a000b41334101102a000b950803037f017e077f23004190016b22012400200141206a41086a220242003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2002290300370300200120012903203703104100210202400240024002400240200141106a411041a886c500410041001001417f460d0020014100360220200141106a4110200141206a41044100100141016a41044d0d01200128022021020b412010262203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d0001210520031023200141106a20054108742004a7220341c0017172410676220510870102400240024002402003413f71220320012802184f0d002001200128021020034105746a220310342001290300200141086a290300844200510d010b02402001280214450d00200128021010230b200141206a2002108701024020012802282203413f4d0d00200141286a21050340200241016a210202402001280224450d00200128022010230b200141206a20021087012005280200220341c0004f0d000b0b2001280220210620012802242107200141206a41186a2208200041186a290000370300200141206a41106a2209200041106a290000370300200141206a41086a220a200041086a29000037030020012000290000370320200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b10272206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141206a41086a200141106a41086a280200360200200120012903103703202005200141206a10b50320014190016a24000f0b200b102622060d040b200b4101102a000b41d4aac10041331021000b41204101102a000b101e000b200320024106746a210b200620034105746a22032001290320370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141206a41086a220342003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2003290300370300200120012903203703102001200241016a360220200141106a4110200141206a410410040b2001200536022820012007360224200120063602202002200141206a10b503200141206a41086a2000290000370300200141206a41106a200041086a290000370300200141206a41186a200041106a290000370300200141c0006a200041186a2900003703002001200b360224200141013a002041a886c5004100200141206a102c20014190016a24000b980204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1002200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012201417f460d022001410f4d0d02200341286a290300210820032903202109200341201003420121040c010b0b2000200437030020002009370308200041106a2008370300200341c0006a24000f0b41d4aac10041331021000b972403027f027e0a7f230041b00d6b2208240002402001280224200128024022092802b001470d00200041013a0000200041086a4124360200200041046a41ebbcc400360200200841b00d6a24000f0b200442002004290308220a200941a8016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a418fbdc400360200200841b00d6a24000f0b200841b0026a41186a22094200370300200841b0026a41106a220c4200370300200841b0026a41086a220d4200370300200842003703b00220062007200841b0026a1002200841c0016a41186a2009290300370300200841c0016a41106a200c290300370300200841c0016a41086a200d290300370300200820082903b0023703c0010240024002400240024002400240024002400240024002400240412010262209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010272209450d01200920082903c001370020200941386a200841c0016a41186a290300370000200941306a200841c0016a41106a290300370000200941286a200841c0016a41086a290300370000200941c00041800110272209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841b0026a41186a220c4200370300200841b0026a41106a220d4200370300200841b0026a41086a220f4200370300200842003703b002200941e000200841b0026a1002200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903b00237030820091023200841cc006a41bcbbc400360200200841386a41086a420037030020082001410c6a2210360248200841f098c40036023c20084100360238200841a0016a41186a200541186a290000370300200841a0016a41106a200541106a290000370300200841a0016a41086a200541086a29000037030020084101360238200820052900003703a0012010200841086a10ea01210920082008280238417f6a220c360238024002400240024002402009450d00200841386a410c6a2802002109200841386a41086a2802002105200828023c2101200041086a412a360200200041046a419eb3c100360200200041013a00002005450d012005210420012100034020002802880b21002004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012005417f6a22050d000c030b0b200c0d082008417f360238200841c0016a41186a200841086a41186a290300370300200841c0016a41106a200841086a41106a290300370300200841c0016a41086a200841086a41086a290300370300200820082903083703c001200828023c220c41f098c400460d02200841386a41086a28020021110c030b200121000b200841cc026a20012f0106360200200841c8026a4100360200200841c4026a2001360200200820093602d002200841003602c002200842003703b802200820003602b402200841003602b002200841b0026a10d401200841b00d6a24000f0b41880b1026220c450d0641002111200c41003b0106200c4100360200200c41086a200841b0026a41800b1094041a200841386a41086a41003602002008200c36023c0b200841386a4104722112024002400340200c2f01062213410574211441002109417f210d024002400240034020142009460d01200d41016a210d417f4101200841c0016a200c20096a41086a4120109604220f4100481b4100200f1b220f450d05200941206a2109200f4101460d000b20110d010c020b2013210d2011450d010b2011417f6a2111200c200d4102746a41880b6a280200210c0c010b0b200841d0006a41186a2209200841c0016a41186a290300370300200841d0006a41106a220f200841c0016a41106a290300370300200841d0006a41086a2214200841c0016a41086a290300370300200820082903c001370350200841dc016a2014290300370200200841e4016a200f290300370200200841ec016a20092903003702002008200841c4006a3602d0012008200d3602cc01200820123602c8012008200c3602c401200841003602c001200820082903503702d401200841e4026a4200370200200841003a00ec02200842003703b002200841f098c4003602e002200842003703c802200841c0016a200841b0026a10b40121090c010b200c200d41e0006c6a41e8026a21090b200941013a003c200941286a427f370300200941206a427f3703002009413d6a20082903a001370000200941d5006a200841a0016a41186a290300370000200941cd006a200841a0016a41106a220c290300370000200941c5006a200841a0016a41086a220d290300370000200942013703182008200828023841016a360238200c200841386a41106a290300370300200d200841386a41086a290300370300200820082903383703a001200841d0006a41186a2214200841086a41186a290300370300200841d0006a41106a2211200841086a41106a290300370300200841d0006a41086a2213200841086a41086a29030037030020082008290308370350200841c0016a200841d0006a10d8014100210f0240024020082d00c00122124102470d000c010b200841f8016a280200210920120d002009417f4c0d07200841f4016a2802002115200841f0016a2802002112024002402009450d0020091026220f450d0b200f201220091094041a20150d010c020b4101210f2015450d010b201210230b200841b0026a41086a200936020020084184036a20132903003702002008418c036a201129030037020020084194036a2014290300370200200841c4026a200d290300370200200841cc026a200c290300370200200820093602b4022008200f3602b002200820082903503702fc02200820082903a0013702bc02200141246a2802002109200141c0006a290200210b2001280248210c200841e8026a4200370300200841e0026a428080808080013703002008200c3602f8022008200b3703f002200842083703d8022008200941016a3602d402200820044101200e200841086a20022003200841b0026a10bc03024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802b00222010d0c0c0d0b200841c0016a2005200141c8006a28020028020010c402024020082802c0014101470d00200041046a20082902c401370200200041013a00000c0b0b200841a0016a41186a2205200841c0016a410472220941186a280200360200200841a0016a41106a220c200941106a290200370300200841a0016a41086a220d200941086a290200370300200820092902003703a001200841d0006a41106a200d290300370300200841d0006a41186a200c290300370300200841f0006a200528020036020020084106360254200841e5c4c400360250200820082903a001370358200141c4006a28020021092005200141e4006a290000370300200c200141dc006a290000370300200d200141d4006a2900003703002008200129004c3703a0014200210b20084188016a41086a220e4200370300200842003703880141a298c300410d20084188016a1000200841a0026a41086a200e29030037030020082008290388013703a0020240200841a0026a411041a886c500410041001001417f460d002008420037038801200841a0026a411020084188016a41084100100141016a41084d0d04200829038801210b0b200841e4016a200d290300370200200841ec016a200c290300370200200841f4016a2005290300370200200820023703c0012008200b3703d001200820033703c801200820082903a0013702dc012008200841b0026a3602d801200841003602a801200842013703a001200841f8006a2009200841d0006a200841c0016a20062007200841a0016a200410b70102400240200828027822054101460d0020054102470d01200041046a200829027c370200200041013a0000200841e8006a280200450d0c200841e4006a280200102320082802b00222010d0d0c0e0b20084180016a280200450d00200828027c10230b200841c0016a41186a200141cc006a220541186a290000370300200841c0016a41106a200541106a290000370300200841c0016a41086a200541086a290000370300200841a0016a41086a200841086a41086a290300370300200841a0016a41106a200841086a41106a290300370300200841a0016a41186a200841086a41186a290300370300200820052900003703c001200820082903083703a0010240024002400240200841e0026a2802002205200841dc026a280200470d00200541016a22042005490d0b20054101742209200420042009491b2209ad42e8007e220b422088a70d0b200ba7220c4100480d0b2005450d01200841d8026a280200200541e8006c200c102722040d020c0d0b200841d8026a28020021040c020b200c10262204450d0b0b200841dc026a2009360200200841d8026a2004360200200841e0026a28020021050b2004200541e8006c6a220520082903c001370001200541013a0000200541096a200841c0016a41086a2204290300370000200541116a200841c0016a41106a290300370000200541196a200841c0016a41186a290300370000200541216a20082903a001370000200541296a200841a0016a41086a290300370000200541316a200841a0016a41106a290300370000200541396a200841a0016a41186a290300370000200541c1006a200829008801370000200541c9006a20084188016a41086a290000370000200541d0006a20084197016a290000370000200541e0006a410036020020054201370358200841e0026a2205200528020041016a22093602002004200841bc026a220541086a290200370300200841286a41086a200841cc016a280200360200200820052902003703c001200820082902c401370328200841ec026a280200210c200841e8026a2802002106200841e4026a2802002105200841dc026a2802002107200841d8026a28020021040240200841d0006a41186a280200450d00200841e4006a28020010230b024020082802b002220d450d0020082802b402450d00200d10230b200841c0016a41086a220d200841286a41086a280200360200200820082903283703c001200841b0026a41086a200d280200360200200820082903c0013703b0022010200841b0026a10ec0120082004200941e8006c6a3602bc02200820043602b802200820073602b402200820043602b002200141286a200841b0026a10a20220082005200c4190016c6a3602bc02200820053602b802200820063602b402200820053602b002200141346a200841b0026a10a102200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841b00d6a24000f0b41204101102a000b41c0004101102a000b4180014101102a000b41d4aac10041331021000b10e601000b41880b4108102a000b101d000b101e000b20094101102a000b200c4108102a000b20082802b0022201450d010b20082802b402450d00200110230b200841b0026a41186a2802002109200841c0026a280200210102400240200841b0026a41146a2802002200450d002000210420012105034020052802880b21052004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012000417f6a22000d000c020b0b200121050b200841dc016a20012f0106360200200841c0016a41186a4100360200200841c0016a41146a2001360200200820093602e001200841003602d001200842003703c801200820053602c401200841003602c001200841c0016a10d4010240200841e0026a2802002205450d00200841b0026a41286a2802002101200541e8006c210503400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200541987f6a22050d000b0b0240200841dc026a280200450d00200841d8026a28020010230b0240200841ec026a2802002201450d0020014190016c2105200841e4026a28020041206a210103402001102420014190016a2101200541f07e6a22050d000b0b0240200841e8026a280200450d00200841e4026a28020010230b200841b00d6a24000bc718012e7f230041b00d6b220324002003200236020420032001360200200341086a10d40202400240024002400240024002400240200328020c2204450d0020032802102105200341086a410c6a2802002202450d0120032c00082101200341086a410041e00c1093041a200441206a2106200420024105746a2107200341900d6a41086a2108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128200421294100212a41d100212b02400340202a212c024002400240024002402001450d0020072004460d012001417f7321022029210102400340024020012007460d002001212d200141206a22292101200241016a22020d010c020b20062129200621012004212d200241016a22020d000b0b202d0d040c060b20292007460d012029212d202941206a21290c030b20292007460d042001417f7321010340200141016a2201450d022007202941206a2229470d000c050b0b20072004460d03200621292004222d0d010c030b2029212d202941206a2129202d450d020b2003280204212e2003280200212f20084100360200200342013703900d410110262201450d072001202c3a000020034281808080103702940d200320013602900d2003202e36028c0d2003418c0d6a200341900d6a1041024002400240024020032802940d22022008280200222a6b202e4f0d00202a202e6a2201202a490d0a20024101742230200120012030491b22304100480d0a2002450d0120032802900d20022030102722010d020c0c0b20032802900d21010c020b203010262201450d0a0b200320303602940d200320013602900d203021020b2008202a202e6a22303602002001202a6a202f202e1094041a0240024002400240200220306b411f4b0d00203041206a222e2030490d0a2002410174222a202e202e202a491b222e4100480d0a2002450d0120012002202e102722010d020c0d0b2002212e0c020b202e10262201450d0b0b2003202e3602940d200320013602900d0b200120306a2202202d290000370000200241186a202d41186a290000370000200241106a202d41106a290000370000200241086a202d41086a290000370000200341900d6a41186a22024200370300200341900d6a41106a222d420037030020084200370300200342003703900d2001203041206a200341900d6a1002200341e80c6a41186a22302002290300370300200341e80c6a41106a2202202d290300370300200341e80c6a41086a222d2008290300370300200320032903900d3703e80c0240202e450d00200110230b202b417f6a212b202c41016a212a200341086a202c4103704105746a220120032903e80c370000200141186a2030290300370000200141106a2002290300370000200141086a202d290300370000410021024100212e02400340202c202c41036e222d417d6c6a4102470d01200341086a20026a220141df006a2d000022092001411f6a2d0000220a712009200a722001413f6a2d000071722126200141de006a2d000022092001411e6a2d0000220a712009200a722001413e6a2d000071722125200141dd006a2d000022092001411d6a2d0000220a712009200a722001413d6a2d000071722124200141dc006a2d000022092001411c6a2d0000220a712009200a722001413c6a2d000071722123200141db006a2d000022092001411b6a2d0000220a712009200a722001413b6a2d000071722122200141da006a2d000022092001411a6a2d0000220a712009200a722001413a6a2d000071722121200141d9006a2d00002209200141196a2d0000220a712009200a72200141396a2d000071722120200141d8006a2d00002209200141186a2d0000220a712009200a72200141386a2d00007172211f200141d7006a2d00002209200141176a2d0000220a712009200a72200141376a2d00007172211e200141d6006a2d00002209200141166a2d0000220a712009200a72200141366a2d00007172211d200141d5006a2d00002209200141156a2d0000220a712009200a72200141356a2d00007172211c200141d4006a2d00002209200141146a2d0000220a712009200a72200141346a2d00007172211b200141d3006a2d00002209200141136a2d0000220a712009200a72200141336a2d00007172211a200141d2006a2d00002209200141126a2d0000220a712009200a72200141326a2d000071722119200141d1006a2d00002209200141116a2d0000220a712009200a72200141316a2d000071722118200141d0006a2d00002209200141106a2d0000220a712009200a72200141306a2d000071722117200141cf006a2d000022092001410f6a2d0000220a712009200a722001412f6a2d000071722116200141ce006a2d000022092001410e6a2d0000220a712009200a722001412e6a2d000071722115200141cd006a2d000022092001410d6a2d0000220a712009200a722001412d6a2d000071722114200141cc006a2d000022092001410c6a2d0000220a712009200a722001412c6a2d000071722113200141cb006a2d000022092001410b6a2d0000220a712009200a722001412b6a2d000071722112200141ca006a2d000022092001410a6a2d0000220a712009200a722001412a6a2d000071722111200141c9006a2d00002209200141096a2d0000220a712009200a72200141296a2d000071722110200141c8006a2d00002209200141086a2d0000220a712009200a72200141286a2d00007172210f200141c7006a2d00002209200141076a2d0000220a712009200a72200141276a2d00007172210e200141c6006a2d00002209200141066a2d0000220a712009200a72200141266a2d00007172210d200141c5006a2d00002209200141056a2d0000220a712009200a72200141256a2d00007172210c200141c4006a2d00002209200141046a2d0000220a712009200a72200141246a2d00007172210b200141c3006a2d00002209200141036a2d0000220a712009200a72200141236a2d00007172210a200141c2006a2d00002209200141026a2d00002227712009202772200141226a2d000071722109200141c1006a2d00002227200141016a2d00002228712027202872200141216a2d000071722127200141c0006a2d0000222820012d00002230712028203072200141206a2d000071722128200241800c460d01200341086a2002202d410574202c41096e41e0006c6b6a6a220141ff006a20263a0000200141fe006a20253a0000200141fd006a20243a0000200141fc006a20233a0000200141fb006a20223a0000200141fa006a20213a0000200141f9006a20203a0000200141f8006a201f3a0000200141f7006a201e3a0000200141f6006a201d3a0000200141f5006a201c3a0000200141f4006a201b3a0000200141f3006a201a3a0000200141f2006a20193a0000200141f1006a20183a0000200141f0006a20173a0000200141ef006a20163a0000200141ee006a20153a0000200141ed006a20143a0000200141ec006a20133a0000200141eb006a20123a0000200141ea006a20113a0000200141e9006a20103a0000200141e8006a200f3a0000200141e7006a200e3a0000200141e6006a200d3a0000200141e5006a200c3a0000200141e4006a200b3a0000200141e3006a200a3a0000200141e2006a20093a0000200141e1006a20273a0000200141e0006a20283a0000200241e0006a2102202d212c202e41016a222e4111490d000b0b41002101202b0d000b0b200020263a001f200020253a001e200020243a001d200020233a001c200020223a001b200020213a001a200020203a00192000201f3a00182000201e3a00172000201d3a00162000201c3a00152000201b3a00142000201a3a0013200020193a0012200020183a0011200020173a0010200020163a000f200020153a000e200020143a000d200020133a000c200020123a000b200020113a000a200020103a00092000200f3a00082000200e3a00072000200d3a00062000200c3a00052000200b3a00042000200a3a0003200020093a0002200020273a0001200020283a000020050d020c030b41012104410021050b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002005450d010b200410230b200341b00d6a24000f0b101e000b41014101102a000b20304101102a000b202e4101102a000b7601017f230041c0006b220024002000411836020c200041c8b7c100360208200041346a4120360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000bfd0401137f02400240200128020022054100480d00200541ffffffff07460d002001200541016a360200200141046a2106200141086a28020021070c010b10e401000b410021050340024002400240024002400240024002400240024020050e020001010b2006280200220841086a210920082f0106220a410574210b417f21050240024002400340200b450d01200541016a2105417f4101200220094120109604220c4100481b4100200c1b220c450d03200b41606a210b200941206a2109200c4101460d000b20070d010c040b200a21052007450d030b2007417f6a2107200820054102746a41880b6a2106410021050c0a0b200841e8026a200541e0006c6a2205450d01200541306a210d200541346a280200210e4108210f41052110417f21114102211241ec032113412021144100211541012116416021170c080b200d2802002208200f6a210920082f0106220d201074210b417f21050240024002400340200b450d01200520166a210520112016200420092014109604220c2015481b2015200c1b220c450d03200b20176a210b200920146a2109200c2016460d000b200e0d010c030b200d2105200e450d020b200e20116a210e200820052012746a20136a210d410121050c090b200841e8026a220b2005410c6c6a2216450d0020162802002209450d01200b2005410c6c6a2802082205417f4c0d052005450d02200510262216450d062016200920051094041a0c030b20002001280210200220032004200141146a28020028020c1106000c030b410021160c010b410121160b2000200536020420002016360200200041086a20053602000b20012001280200417f6a3602000f0b101d000b20054101102a000b410121050c000b0b7601017f230041c0006b220024002000411036020c200041b8b7c100360208200041346a4121360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000be41d03027f027e097f230041b0036b2209240002400240024020012802242001280240220a2802b001470d00200041eebac40036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a41a0016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d0020004197bbc40036020420004101360200200041086a41233602000c010b20024200410110d1021a200941d8016a41186a220d200241186a290000370300200941d8016a41106a220e200241106a290000370300200941d8016a41086a220f200241086a290000370300200920022900003703d801200941c0026a200941d8016a10d8014100211002400240024020092d00c00222114102460d00200941f8026a280200210a02402011450d00410021100c010b200a417f4c0d01200941f4026a2802002112200941f0026a280200211102400240200a450d00200a10262210450d0420102011200a1094041a20120d010c020b410121102012450d010b201110230b200941d8006a4200370300200941d0006a42808080808001370300200941c0006a41bcbbc4003602002009413c6a2001410c6a2212360200200941346a4200370200200941206a41106a41f098c400360200200941206a41086a200a360200200941f4006a200f290300370200200941fc006a200e29030037020020094184016a200d290300370200200942083703482009410036022c2009200a36022420092010360220200920092903d80137026c200920012802483602682009200141c0006a2902003703602009200141246a28020041016a3602440240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941206a10bc032009280208220a450d00200928020c21012000200a36020420004101360200200041086a2001360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d012002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c030b0b201228020022134100480d0a201341ffffffff07460d0a2001410c6a201341016a360200200141106a210a200141146a28020021110240024002400340200a280200220e41086a210d200e2f010622144105742110417f210a02400240024003402010450d01200a41016a210a417f41012002200d4120109604220f4100481b4100200f1b220f450d03201041606a2110200d41206a210d200f4101460d000b20110d010c040b2014210a2011450d030b2011417f6a2111200e200a4102746a41880b6a210a0c010b0b200e200a41e0006c6a41e8026a220a450d00200941c8026a2210200a41c5006a290000370300200941d0026a220d200a41cd006a290000370300200941d8026a220e200a41d5006a2900003703002009200a413d6a2900003703c002200a2d003c4101470d0020094199016a2010290300370000200941a1016a200d290300370000200941a9016a200e290300370000200920092903c00237009101200941013a009001201220133602000c010b20094190016a2001411c6a2802002002200141206a28020028021011040020092d00900121022001200128020c417f6a36020c2002450d010b200941b8016a41186a200941a9016a290000370300200941b8016a41106a200941a1016a290000370300200941b8016a41086a20094199016a29000037030020092009290091013703b801200941c0026a200941b8016a200141c8006a28020028020010c402024020092802c0024101470d00200020092902c40237020420004101360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d042002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c060b0b20094190026a41186a220a200941c0026a410472220241186a28020036020020094190026a41106a2210200241106a29020037030020094190026a41086a220d200241086a2902003703002009200229020037039002200941d8016a41106a200d290300370300200941d8016a41186a2010290300370300200941f8016a200a280200360200200941043602dc01200941a7c4c4003602d80120092009290390023703e001200141c4006a2802002102200a200141e4006a2900003703002010200141dc006a290000370300200d200141d4006a2900003703002009200129004c370390024200210c200941a0036a41086a220a4200370300200942003703a00341a298c300410d200941a0036a1000200941b0026a41086a200a290300370300200920092903a0033703b002410021100240200941b0026a411041a886c500410041001001417f460d00200942003703a003200941b0026a4110200941a0036a41084100100141016a41084d0d0b20092903a003210c0b200941e4026a20094190026a41086a220a290300370200200941ec026a200941a0026a290300370200200941f4026a200941a8026a290300370200200920033703c0022009200c3703d002200920043703c80220092009290390023702dc022009200941206a3602d802200a200841086a280200360200200920082902003703900220094180026a2002200941d8016a200941c0026a2006200720094190026a200510b7014101210d20092802800222024101460d054100210620024102470d062000200929028402370204200041013602000240200941f0016a280200450d00200941ec016a28020010230b024020092802202201450d002009280224450d00200110230b200941206a41186a2802002108200941306a2802002101200941206a41146a2802002202450d082002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c0a0b0b4101210d4100211041002106410121070c060b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d0b200941d4006a2802001023200841046a2802000d0c0c0d0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d09200941d4006a2802001023200841046a2802000d0a0c0b0b2009418c026a280200211020094180026a41086a2802002106200928028402210d0b0240200941f0016a280200450d00200941ec016a28020010230b410021070b200941c0026a41086a220a200941346a290200370300200941106a41086a220e200941c0026a410c6a2802003602002009200929022c3703c002200920092902c402370310200941dc006a280200210f200941d8006a2802002111200941206a41346a2802002102200941d0006a2802002113200941cc006a2802002114200941206a41286a2802002105024020092802202215450d002009280224450d00201510230b200a200e280200360200200920092903103703c002200941206a41086a200a280200360200200920092903c0023703202012200941206a10ec0120092005201341e8006c6a36022c200920053602282009201436022420092005360220200141286a200941206a10a20220092002200f4190016c6a36022c200920023602282009201136022420092002360220200141346a200941206a10a1022000410c6a2010360200200041086a20063602002000200d360204200041003602002007450d08200841046a280200450d0820082802001023200941b0036a24000f0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a2001360200200920083602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d06200941d4006a2802001023200941b0036a24000f0b41d4aac10041331021000b10e401000b101d000b200a4101102a000b200841046a280200450d010b200828020010230b200941b0036a24000bde0202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a28020028021c110400200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b10e401000ba90301097f230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b2007200441e0006c6a41e8026a2204450d00200341086a220a200441c5006a290000370300200341106a2208200441cd006a290000370300200341186a2207200441d5006a29000037030020032004413d6a29000037030020042d003c4101470d0020002003290300370001200041013a0000200041096a200a290300370000200041116a2008290300370000200041196a20072903003700000c010b200020012802102002200141146a280200280210110400200128020021050b20012005417f6a360200200341206a24000f0b10e401000ba40201087f0240200028020022024100480d00200241ffffffff07460d002000200241016a2203360200200041046a2102200041086a2802002104024003402002280200220541086a210620052f010622074105742108417f210202400240024003402008450d01200241016a2102417f410120012006412010960422094100481b410020091b2209450d03200841606a2108200641206a210620094101460d000b20040d010c040b200721022004450d030b2004417f6a2104200520024102746a41880b6a21020c010b0b2005200241e0006c6a41e8026a2202450d002002413c6a2d0000210220002003417f6a36020020024101460f0b20002802102001200041146a280200280218110300210220002000280200417f6a36020020020f0b10e401000bf80202097f037e230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d00200441186a290300220ca7450d00200441286a290300210d200441206a290300210e0c010b200341086a20012802102002200141146a280200280214110400200341186a290300210d200128020021052003290310210e2003290308210c0b20012005417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b10e401000bff1207057f017e1a7f047e017f017e097f230041b00d6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241b0026a200210b0010240024020022903d00222074202510d002000410c6a2108200041046a210920024190016a41146a210a20024190016a41206a2105200241b0026a41047221042002418d036a210b200241b0026a413d6a210c200241ad036a210d200241f8026a210e200241f0026a210f200241b0026a41306a2110200241b0026a41286a21112002418c036a2112200241e8026a211320024180036a211420024184036a211520024188036a2116200241b0026a413c6a2117200241e4026a2118200241c8016a411c6a21190340200241c8006a41086a2203200241b0026a41086a221a290300370300200241c8006a41106a221b200241b0026a41106a221c290300370300200241c8006a41186a221d200241b0026a41186a221e290300370300200241286a41086a221f200b41086a290000370300200241286a41106a2220200b41106a290000370300200241286a41186a2221200b41186a290000370300200220022903b0023703482002200b290000370328200e2903002122200f2903002123201029030021242011290300212520122d0000212620132903002127201428020021012015280200210620162802002128200241246a41026a2229200d41026a2d00003a00002002200d2f00003b0124200241f0006a41186a222a2021290300370300200241f0006a41106a222b2020290300370300200241f0006a41086a222c201f290300370300200241ec006a41026a222d20292d00003a000020022002290328370370200220022f01243b016c20024190016a41186a2220201d29030037030020024190016a41106a221d201b29030037030020024190016a41086a221f20032903003703002002200229034837039001024002402009280200221b41f098c400460d00200041086a280200212e0c010b41880b1026221b450d034100212e201b41003b0106201b4100360200201b41086a200241b0026a41800b1094041a200041086a41003602002009201b3602000b024002400340201b2f0106222f4105742130417f212141002103024002400240034020302003460d01202141016a2121417f410120024190016a201b20036a41086a412010960422294100481b410020291b2229450d05200341206a210320294101460d000b202e0d010c020b202f2121202e450d010b202e417f6a212e201b20214102746a41880b6a280200211b0c010b0b200241c8016a41186a22032020290300370300200241c8016a41106a2220201d290300370300200241c8016a41086a2229201f29030037030020022002290390013703c801201d200836020020024190016a410c6a2021360200201f2009360200200a20022903c801370200200a41086a2029290300370200200a41106a2020290300370200200a41186a20032903003702002002201b36029401200241003602900120112022370300200241b0026a41206a2023370300201c2024370300201a2025370300201720263a0000201320283602002018200636020020102001360200201e2027370300200c2002290370370000200c41086a202c290300370000200c41106a202b290300370000200c41186a202a290300370000200b20022f016c3b0000200b41026a202d2d00003a0000200220073703b00220024190016a200241b0026a10b4011a0c010b201b41e8026a202141e0006c6a22212021290308202520075022031b37030820212021290300200720031b370300202141106a221b201b290300202420031b3703002020202a290300370300201d202b290300370300201f202c290300370300200220022903703703900120212d003c211b201e202141d5006a290000370300201c202141cd006a290000370300201a202141c5006a29000037030020022021413d6a22032900003703b00202400240202641ff01714101470d00200241c8016a41186a2020290300370300200241c8016a41106a201d290300370300200241c8016a41086a201f29030037030020022002290390013703c8014101211b0c010b200241c8016a41186a201e290300370300200241c8016a41106a201c290300370300200241c8016a41086a201a290300370300200220022903b0023703c8010b2021413c6a201b3a0000200341186a200241c8016a41186a2229290300370000200341106a200241c8016a41106a2230290300370000200341086a200241c8016a41086a222e290300370000200320022903c801370000202141286a2203202220032903002027a722031b37030020212023202129032020031b37032020212027202129031820031b370318024002402006450d002006211b20012103034020032802ec032103201b417f6a221b0d000b0340200120012f01064102746a41ec036a28020021012006417f6a22060d000c020b0b200121030b20012f01062106200241c8016a41206a20283602002019200636020020294100360200200241c8016a41146a200136020020304100360200202e4200370300200220033602cc01200241003602c801200241b0026a200241c8016a10af01024020022802b0024101470d00202141306a211b034020024190016a41286a200441286a2802003602002005200441206a2902003703002020200441186a2201290200370300201d200441106a2206290200370300201f200441086a2203290200370300200220042902003703900120024180026a41186a200129000037030020024180026a41106a200629000037030020024180026a41086a20032900003703002002200429000037038002200241a0026a41086a200541086a280200360200200220052902003703a002200241f0016a201b20024180026a200241a0026a10b601024020022802f001450d0020022802f4012201450d00200241f0016a41086a280200450d00200110230b200241b0026a200241c8016a10af0120022802b0024101460d000b0b200241c8016a10b5010b200241b0026a200210b001200241b0026a41206a29030022074202520d000b0b200210d4012000200028020041016a360200200241b00d6a24000f0b41880b4108102a000b10e601000bd30102027f027e200028022021020240024002400240410410262203450d00200320023600002000280224210220034104410810272203450d0120032002360004200041086a29030021042000290300210520034108411810272203450d0220032005370008200341106a2004370000200041186a29030021042000290310210520034118413010272200450d0320002005370018200041206a200437000020012802002001280204200041281004200010230f0b41044101102a000b41084101102a000b41184101102a000b41304101102a000b13002000410a360204200041bcbec1003602000ba70301047f230041c0006b2202240002400240411610262203450d002003410e6a41002900e1b641370000200341086a41002900dbb641370000200341002900d3b64137000020034116413610272203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002002410036022020024120200241206a41044100100141016a4105490d02200228022021012002410036022020024120200241206a41044104100141016a4105490d02200041086a200228022036020020002001360204200041013602000c010b200041003602000b20031023200241c0006a24000f0b41d4aac10041331021000b41164101102a000b41364101102a000b130020004107360204200041e5e4c1003602000b130020004117360204200041ece4c1003602000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241003600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241183600000f0b41044101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242053700000f0b41084101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242e8073700000f0b41084101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241013600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241023600000f0b41044101102a000b3901017f0240411010262202450d002002420037000820024201370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024200370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024209370000200042908080808002370204200020023602000f0b41104101102a000b130020004102360204200041b88ec2003602000bbe0904027f017e037f077e230041f0006b2202240002400240024002400240411010262203450d00200341086a41002900dd9d42370000200341002900d59d4237000020034110413010272203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220742003703002002420037035020034130200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a200729030037030020022002290350370330024002400240024002400240200241306a412041a886c500410041001001417f460d002002420037035820024200370350200241306a4120200241d0006a4110410010012205417f460d052005410f4d0d05200241d8006a2903002108200229035021092002420037035820024200370350200241306a4120200241d0006a4110411010012205417f460d052005410f4d0d05200241d0006a41086a290300210a2002290350210b20031023411410262203450d09200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220142003703002002420037035020034134200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a2205200129030037030020022002290350370330200241306a412041a886c500410041001001417f460d012002420037035820024200370350200241306a4120200241d0006a4110410010012206417f460d082006410f4d0d08200241d8006a290300210c2002290350210d0c020b200310234200210c0c020b4200210d4200210c0b20031023200142003703002002420037035041af98c300410d200241d0006a100020052001290300370300200220022903503703300240200241306a411041a886c500410041001001417f460d0020024200370350200241306a4110200241d0006a41084100100141016a41084d0d02200229035021040b4200210e200242004200200b4200109804200241106a200a420020044200109804200241206a20044200200b42001098044200210402404200420052200a42005271200229030842005272200229031842005272200241286a290300220b200229030020022903107c7c220a200b54720d002008200a2002290320220e200954200a200854200a2008511b22011b200a7d2009200e20011b220a200e54ad7d2104200a200e7d210e0b2004200c200d200e56200c200456200c2004511b22011b210c200e200d20011b21040b200020043703002000200c370308200241f0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41104101102a000b41304101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b130020004108360204200041e59dc2003602000baf0c05017f017e017f017e067f230041b0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a100020034190016a41086a20052903003703002003200329032037039001024002400240024020034190016a411041a886c500410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441182107411810262205450d010c030b42002106411821074118102622050d020b20074101102a000b41d4aac10041331021000b200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000002400240024002400240024002400240024020052007413810272205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054138200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001200320013703202003200237032820034190016a4120200341206a41101004200510232004200158200620025820062002511b0d07411810262205450d02200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e101200341086a41106a290300210220032802082107200329031021012005102302402001200284500d002007450d0020032001370320200320023703282003200341206a3602900120034190016a10de010b411410262205450d04200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054134200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001024020034190016a412041a886c500410041001001417f460d00200342003703282003420037032020034190016a4120200341206a4110410010012207417f460d022007410f4d0d02200341286a29030021022003290320210141002107200510232001200284504101710d090c070b41012107200510234100410171450d060c080b41384101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b41144101102a000b41344101102a000b20070d010b200341b0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100220034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100320051023200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a002041a886c5004100200341206a102c200341b0016a24000f0b41134101102a000b41334101102a000b13002000410a360204200041f09dc2003602000bc60807057f017e087f047e017f017e017f230041f0006b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1002200241086a41186a2001290300370300200241086a41106a2003290300370300200241086a41086a2005290300370300200220022903383703080240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a3602282002200241286a104a2002280200450d0b20022802042206ad42287e2207422088a70d032007a72201417f4c0d032001450d01200110262208450d062006450d020c070b20004100360208200042083702000c080b4108210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b412e4101102a000b20014108102a000b200241286a41086a22032802002109200228022c21052002280228210a200241ec006a210b420021074100210c4100210d410021012006210e03402002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382110200242003703402002420037033820034100200a2005200241386a411020091001220f200f417f461b220f4110200f4110491b20096a2209360200200f410f4d0d03200241386a41086a2903002111200229033821122002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382113200241003a003820032009200a2005200241386a41012009100141016a41014b220f6a2209360200200f450d03200141016a210f20022d003821142002200b280000360063200220022800693602602002200228006336005b2002200228026036025802402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002008200d2016102722080d010c080b201610262208450d070b2008200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a200228005b360000200141216a200228025836000020074280808080107c2107200c41026a210c200d41286a210d200f2101200f2006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241f0006a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20164108102a000b850701087f230041900c6b22042400024002400240024020002802000d002000417f360200200441d8006a41186a200141186a290000370300200441d8006a41106a200141106a290000370300200441d8006a41086a200141086a29000037030020042001290000370358024002402000280204220541f098c400460d00200041086a28020021060c010b41880b10262205450d0241002106200541003b010620054100360200200541086a20044190016a41800b1094041a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f01062209410574210a41002101417f21080240024002400340200a2001460d01200841016a2108417f4101200441d8006a200520016a41086a4120109604220b4100481b4100200b1b220b450d05200141206a2101200b4101460d000b20060d010c020b200921082006450d010b2006417f6a2106200520084102746a41880b6a28020021050c010b0b200441186a200441d8006a41186a290300370300200441106a200441d8006a41106a290300370300200441086a200441d8006a41086a290300370300200420042903583703002000410c6a21014100210641000d010c040b2000410c6a21014101450d030b200441a8016a4200370300200441a4016a41f098c400360200200441003602b001200441003602a0012004420037039801200441f098c4003602940120044100360290012005200841e0006c6a41e8026a210120044190016a10b5010c030b10e601000b41880b4108102a000b200441f4006a200441086a290300370200200441fc006a200441106a29030037020020044184016a200441186a2903003702002004200136026820042008360264200420073602602004200536025c200420063602582004200429030037026c200441c4016a4200370200200441b0016a2004290348370300200441b8016a200441c8006a41086a290300370300200441cd016a2004290025370000200441d5016a200441256a41086a290000370000200441dd016a200441256a41106a290000370000200441e5016a200441256a41186a290000370000200441ec016a200441c4006a280000360000200442003703a8012004420037039001200441f098c4003602c001200441003a00cc01200441d8006a20044190016a10b40121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900c6a24000b840402057f027e230041c0006b2204240002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a2001200a20027c2202200920037c2002200a54ad7c10dc01200441106a200441206a41106a290300220a370300200420042903282202370308200420042903202203370300024020034200510d002004200441086a360220200441206a10de01420021024200210a0b200020023703002000200a370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bff0304027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110fc012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110fc012005290300200358200541086a290300220720045820072004511b0d010b41bcb4c1002101412621060c010b200541206a20011080020240024002400240024020052802282201450d0042002107200541c0006a41086a220642003703002005420037034041af98c300410d200541c0006a1000200541306a41086a2006290300370300200520052903403703300240200541306a411041a886c500410041001001417f460d0020054200370340200541306a4110200541c0006a41084100100141016a41084d0d03200529034021070b200141286c210620052802242108200528022022092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d030b200141286a2101200641586a22060d000b410021012008450d040c030b02402005280224450d00200528022010230b410021010c040b41e2b4c100210120080d010c020b41d4aac10041331021000b200910230b413121060b2000200636020420002001360200200541d0006a24000bd30704027f017e037f057e230041c0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054134200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a2004290320210b0c010b4200210b4200210a0b200510232001200b2002200b200b200256200a200356200a2003511b22051b220c7d200a2003200a20051b220d7d200b200c54ad7d10df0102400240024002402002200c7d220b2003200d7d2002200c54ad7d220e84500d00411810262205450d08200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703002004412041a886c500410041001001417f460d01200442003703282004420037032020044120200441206a4110410010012207417f460d072007410f4d0d07200441286a2903002103200429032021020c020b4200210e0c020b420021030b2005102320012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b22067d2002200a54ad7d10fe01200e20067d200b200a54ad7d210e2006200d7c200a200c7c2202200a54ad7c2103200b200a7d21060b2000200637031020002002370300200041186a200e37030020002003370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b8b0604027f017e037f027e230041d0006b220524000240024002400240411410262206450d00200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541306a41186a22084200370300200541306a41106a22094200370300200541306a41086a220a42003703002005420037033020064134200541306a1002200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a29030037030020052005290330370310024002400240200541106a412041a886c500410041001001417f460d002005420037033820054200370330200541106a4120200541306a4110410010012208417f460d022008410f4d0d02200541386a290300210b200529033021070c010b4200210b0b20061023024002400240200720027d220c200756200b20037d2007200254ad7d2207200b562007200b511b450d00200041b5b5c100360204200041086a411d3602000c010b200541306a41086a22064200370300200542003703304182b6c100411b200541306a1000200541106a41086a2006290300370300200520052903303703100240200541106a411041a886c500410041001001417f460d002005420037033820054200370330200541106a4110200541306a4110410010012206417f460d062006410f4d0d06200c20052903305a2007200541306a41086a290300220b5a2007200b511b0d00200041d2b5c100360204200041086a411a3602000c010b200541086a20012004200c200710830220052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200c200710df01200041106a2003370300200041086a2002370300410021060c040b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b20002006360200200541d0006a24000bfc0304017f017e037f037e230041c0006b2202240042002103200241186a41086a2204420037030020024200370318419db6c100411b200241186a1000200241306a41086a22052004290300370300200220022903183703300240024002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841b8b6c100411b200241186a1000200520042903003703002002200229031837033002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b200241086a200320092001ad4200109804200241186a20002002290308220320087c2208200241106a29030020077c2008200354ad7c4101108502024020022802184101470d00200228021c2104200241c0006a240020040f0b200229032021032002200241286a290300370320200220033703182002200241186a360230200241306a10de01200241c0006a240041000f0b41d4aac10041331021000b41d4aac10041331021000ba10802097f027e230041d0006b2202240002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1002200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002400240024002402000450d00200041286c210720052802002108200228022c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802282000200a102722030d020c080b200841086a2109200228022821030c020b200a10262203450d060b2002200a36022c20022003360228200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a102722030d020c090b200941106a21080c020b200a10262203450d070b2002200a36022c20022003360228200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009102722030d010c090b200910262203450d080b2002200936022c200220033602280b2005200841086a360200200320086a200b3700000240024002400240200228022c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228022820032000102722090d020c0b0b200228022821090c020b200010262209450d090b2002200036022c200220093602280b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228022c2100200228022821090b200241086a412020092008100402402000450d00200910230b200410230240200141046a280200450d00200128020010230b200241d0006a24000f0b101e000b200a4101102a000b200a4101102a000b20094101102a000b20004101102a000b410e4101102a000b412e4101102a000b898b010d027f027e067f017e0c7f017e017f037e0f7f027e347f027e347f230041a0026b2201240020014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037022034200510d044200210420002003824200520d130c010b42002104200042e807824200520d120b20014180026a41086a22022004370300200120043703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d1120014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0120012802702202450d114108210520014180026a41086a2206420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200629030037030020012001290380023703e0014100210602400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10890220012802702205450d07200141f8006a2802002106200128027421070c010b410021070b4200210320014180026a41086a22084200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a2209200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d002001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122082008417f461b2208410820084108491b220936028802200841074d0d05200129037021032001410036027020014188026a4100200141e0016a4110200141f0006a41042009100122082008417f461b22084104200841044922081b20096a36020020080d0520012802702108200141f0006a20014180026a10282001280270220a450d0520082001290274220b422088a76b20066a21090240200ba7450d00200a10230b20092002490d080c070b20084200370300200142003703800241af98c300410d20014180026a10002009200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d04200129037021030b41002108200620024f0d060c070b41d4aac10041331021000b41d4aac10041331021000b4198b3c200104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014180026a41086a22024200370300200142003703800241d8b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037020037c21030c010b420520037c21030b20014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d022001290370220b4200520d0141fcb3c200104f000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d00200510230b20032000520d0c4108210c20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210d02400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220c450d07200141f8006a280200210d2001280274210e0c010b4100210e0b20014180026a41086a22024200370300200142003703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210f0240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d032001280270210f0b4200210320014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037021030b02400240200d41286c2202450d00200c41206a2903002003580d010b4101211041002111410021120c090b200141e0016a41186a2206200c41186a290300370300200141e0016a41106a2208200c41106a290300370300200141e0016a41086a2205200c41086a2903003703002001200c2903003703e001412010262210450d07201020012903e001370000201041186a2006290300370000201041106a2008290300370000201041086a200529030037000002400240200c20026a200c41286a2202460d00200d41286c41586a21054120210841012106410121110340200241206a2903002003560d02200141e0016a41186a2207200241186a290300370300200141e0016a41106a2209200241106a290300370300200141e0016a41086a220a200241086a290300370300200120022903003703e00102400240024020112006470d00200641016a22132006490d2020064101742212201320132012491b2212ad420586220b422088a70d20200ba722134100480d202006450d01201020064105742013102722100d020c0a0b200621120c010b201310262210450d080b200241286a2102201020086a220620012903e001370000200641186a2007290300370000200641106a2009290300370000200641086a200a290300370000200841206a2108201141016a211120122106200541586a22050d000c0b0b0b4101211141012112200f200d41016b22064b0d0a0c0b0b20062112200f200d20116b22064b0d090c0a0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20134101102a000b41d4aac10041331021000b41ecb3c200200820061029000b41204101102a000b200f200d20116b22064d0d010b20014180026a41086a2202420037030020014200370380024194b4c200411c20014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d072001290370210b0c010b42e807210b0b20014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0012001410036027820014201370370410810262202450d09200142888080808001370274200120023602702002200b20037c37000020024108411010272202450d0a20014290808080c0013702742002200f20066b221436000820012002360270200120113602800220014180026a200141f0006a1041024002402011450d00201141057421094100200141f0006a41086a28020022066b21052001280270210a200128027421072010210203400240200720056a411f4b0d00200641206a22082006490d1420074101742213200820082013491b22084100480d14024002402007450d00200a200720081027220a0d010c090b20081026220a450d080b200821070b200a20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200941606a22090d000b200141f8006a2006360200200120073602742001200a3602700c010b200141f8006a2802002106200128027421072001280270210a0b200141e0016a4110200a2006100402402007450d00200a10230b02402012450d00201010230b20014180026a41086a22024200370300200142003703800241b0b4c200411220014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0a200128027021060c010b410221060b20014198026a420037030020014190026a420037030020014188026a42003703002001420037038002200620146a2213ad42307e2203422088a70d0f2003a72202417f4c0d0f024002402002450d00200210262210450d0d201021020c010b41082110410821020b200141f0006a41186a220920014180026a41186a290300370300200141f0006a41106a220a20014180026a41106a290300370300200141f0006a41086a20014180026a41086a290300370300200120012903800237037002400240024020134102490d002011200f6a20066a417f6a200d6b21060340200141e0016a41186a22082009290300370300200141e0016a41106a2205200a290300370300200141e0016a41086a2207200141f0006a41086a290300370300200120012903703703e0012002420037030820024200370300200241286a2008290300370300200241206a2005290300370300200241186a2007290300370300200241106a20012903e001370300200241306a21022006417f6a22060d000b2013417f6a21060c010b410021062013450d010b200242003703082002420037030020022001290370370310200241186a200141f8006a290300370300200241206a20014180016a290300370300200241286a200141f0006a41186a290300370300200641016a21060b20012006360278200120133602742001201036027020014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108a0202402013450d00201010230b200141f0006a41086a2014360200200141023a0074200141063a007041a886c5004100200141f0006a102c200e0d010c020b02402012450d00201010230b200e450d010b200c10230b20014180026a41086a22022004370300200120043703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0f2001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b22063602880202400240024002400240200241074d0d00200129037021042001410036027020014188026a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d00200141f0006a20014180026a102820012802702215450d002001280274211620042000520d1320014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240200141e0016a411041a886c500410041001001417f460d002001200141e0016a360240200141103602442001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b2206360248200241074d0d062001290370210420014100360270200141c8006a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d0620012802702102200141f0006a200141c0006a102820012802702217450d0620012002360288022001200437038002200129027421182001280288022119200141e0016a41101003410821144200211a20014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a108b0220012802702214450d0c2001290274211a200141e0016a411010030b20014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0014200211b0240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211b0b20024200370300200142003703800241d8b3c200411420014180026a10002006200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0120014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211c0c020b02402016450d00201510230b41c9b5c200410f100f41d8b5c2004135100f200141a0026a24000f0b4205211c0b4200210420014180026a41086a22024200370300200142003703800241a1b5c200411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d002001420037037820014200370370200141e0016a4110200141f0006a4110410010012202417f460d082002410f4d0d08200141f8006a2903002104200129037021000c010b420921000b2014201a422088a7221d41306c6a21020240024002402019450d002019417f6a211341002108024020142002460d002014201d41306c6a220641506a2202290300200641586a29030084500d0220014198026a200641786a29000037030020014190026a200641706a29000037030020014188026a200641686a2900003703002001200641606a29000037038002410121080b410021110c020b4100211141002113410021080c010b410121110b200141f9006a20014180026a41086a29030037000020014181016a20014180026a41106a29030037000020014189016a20014180026a41186a290300370000200120083a007020012001290380023700714101210d200141f0006a410172210602402008450d00200620002004102b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e00141201026220e450d0a200e20012903e001370000200e41186a200141e0016a41186a2208290300370000200e41106a200141e0016a41106a2205290300370000200e41086a200141e0016a41086a2207290300370000200141f0006a41017221064102210a412021094101211e4101211f0240410020136b220c41016a4101460d000340201141ff01710d0120142002460d01200241506a2213290300200241586a29030084500d012008200241786a2900003703002005200241706a2900003703002007200241686a2900003703002001200241606a2900003703e001200620012903e001370000200641086a22022007290300370000200641106a22112005290300370000200641186a22102008290300370000200141013a0070200620002004102b20014180026a41186a2212201029000037030020014180026a41106a2210201129000037030020014180026a41086a22112002290000370300200120062900003703800220082012290300370300200520102903003703002007201129030037030020012001290380023703e0010240201e201f470d00201e41016a2202201e490d16200a20022002200a491b221fad4205862203422088a70d162003a722024100480d160240201e450d00200e200920021027220e0d010c090b20021026220e450d080b200e20096a220220012903e001370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200a41026a210a200941206a21094100211120132102200c201e41016a221e6a4101470d000b0b200e20096a210d201e450d0f41082120200141f0006a41086a2121412021224101212341212124411f21254105212641072127417f2128411821294110212a4102212b4201212c4200212d4111212e4190b5c200212f4100213041a886c50021312001419c016a213241132133410f213441332135412b213641232137411b213841042139415f213a200e213b4100213c0c100b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e0014100211f4101210e4100211e410021020c100b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20024101102a000b20084101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41d4aac10041331021000b41084101102a000b41104101102a000b20024108102a000b410021020c010b410121020b034002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b4108210f20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100213d024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220f450d02200141f8006a280200213e2001280274213d0c010b4100213e0b200141013602700240024002400240024002402018422088a72207450d004100213f4100214002402007200f203e41286c6a2205200f6b41286e2202200220074b1b2202450d00200241057422064100480d1e200610262208450d0920012008360270200221400b200f2102200721082001280270224121060340200520026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000203f41046a213f20064180016a2106200241a0016a21022008417c6a22080d000c060b0b41002140200128027021414100213f0c040b20052002460d03200f203e41286c6a2109410121050240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082005223c460d01203c41016a2105200641206a21062009200241286a2202470d000b0b203f203c6a213f0c030b203f410172213f0c020b203f410272213f0c010b203f410372213f0b201c201b7c210b200f203e41286c6a210c02400240024002400240024002402007450d00200c200f460d012007417f732106203e41286c2108200f21020340200141e0016a41186a200241186a290300370300200141e0016a41106a200241106a290300370300200141e0016a41086a200241086a290300370300200120022903003703e001200641016a2206450d05200241286a2102200841586a22080d000b200c2106200e200d470d030c020b200c200f460d00200141f0006a41186a200f41186a290300370300200141f0006a41106a200f41106a290300370300200141f0006a41086a200f41086a2903003703002001200f290300370370200f41286a2106200f29032021040c040b200f2106200e200d470d010b41002142410821430240203d450d00200f10230b4100213e0c180b200141e0016a41186a200e41186a2202290000370300200141e0016a41106a200e41106a2208290000370300200141e0016a41086a200e41086a22052900003703002001200e2900003703e0012005290000210420082900002100200e290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200e41206a210841022105200b21040c020b200241206a2903002104200141f0006a41186a200141e0016a41186a290300370300200141f0006a41106a200141e0016a41106a290300370300200141f0006a41086a200141e0016a41086a290300370300200120012903e001370370200241286a21060b20014180026a41186a200141f0006a41186a29030037030020014180026a41106a200141f0006a41106a29030037030020014180026a41086a200141f0006a41086a290300370300200120012903703703800241002105200e21080b417f417f200c20066b41286d2202200d20086b4105766a220720072002491b220241016a220720072002491b2242ad42287e2200422088a70d162000a72202417f4c0d16024002402002450d00200210262243450d03204321440c010b41082143410821440b2043200129038002370300204341186a20014180026a41186a290300370300204341106a20014180026a41106a290300370300204341086a20014180026a41086a2903003703002044200437032002400240024002400240024002402005450d002008200d460d03200841086a2900002104200841106a29000021002008290000210320014180026a41186a200841186a29000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080c010b02402006200c460d00200141f0006a41186a200641186a2202290300370300200141f0006a41106a200641106a2205290300370300200141f0006a41086a200641086a22072903003703002001200629030037037020014180026a41086a200729030037030020014180026a41106a200529030037030020014180026a41186a20022903003703002001200629030037038002200641286a210220062903202104410021110c020b2008200d460d02200141e0016a41186a200841186a2202290000370300200141e0016a41106a200841106a2205290000370300200141e0016a41086a200841086a2207290000370300200120082900003703e00120072900002104200529000021002008290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080b41022111200b2104200621020b4102210741022106412821050340200141f0006a41186a223c20014180026a41186a2213290300370300200141f0006a41106a220920014180026a41106a2210290300370300200141f0006a41086a220a20014180026a41086a2212290300370300200120012903800237037002402006223e417f6a22062042470d002006417f417f200c20026b41286d2244200d20086b4105766a224220422044491b224441016a224220422044491b6a22442006490d1d2007204420442007491b2242ad42287e2200422088a70d1d2000a722064100480d1d02400240203e4101470d002006102622430d010c070b20432005200610272243450d060b204321440b204420056a22062001290370370300200641186a203c290300370300200641106a2009290300370300200641086a200a290300370300200641206a2004370300024002400240024002400240201141ff017122064101460d0020064102470d012008200d460d05200841086a2900002104200841106a2900002100200829000021032013200841186a29000037030020102000370300201220043703002001200337038002200841206a210842012100410221110c020b200c2002460d042013200241186a2903003703002010200241106a2903003703002012200241086a2903003703002001200229030037038002200229032021044201210041012111200241286a21020c030b200c2002470d014102211102402008200d460d00200141e0016a41186a200841186a2206290000370300200141e0016a41106a200841106a223c290000370300200141e0016a41086a200841086a2209290000370300200120082900003703e00120092900002104203c2900002100200829000021032013200629000037030020102000370300201220043703002001200337038002200841206a2108420121000c010b420021000c020b200b21040c010b203c200241186a22062903003703002009200241106a223c290300370300200a200241086a22092903003703002001200229030037037020092903002104203c2903002100200229030021032013200629030037030020102000370300201220043703002001200337038002200229032021044201210041002111200241286a21020b200741026a2107203e41016a2106200541286a210520004200520d010b0b203d450d020c010b4101213e203d450d010b200f10230b0240203e41144b0d0041022145203e4102490d16417f2146203e417f6a2147412821482044203e41286c6a21494120214a4118214b4110214c4108214d4103214e41f000214f41582150417821514170215241682153416021544101215541c80021564101213c0c070b203e4101762257ad42287e2204422088a70d172004a72202417f4c0d1741082158024002402002450d00200210262259450d062059215a0c010b410821594108215a0b4158215b204441586a215c204441a87f6a215d4100215e4104215f417f21604101216142032162422021634103216441022165417d21664128216741782168412021694118216a4110216b417e216c4174216d4164216e4150216f410521704109217141f000217241c800217341c00021744138217541302176410a217741042178410021794100217a203e217b4102213c0c080b20064108102a000b41d4aac10041331021000b20024108102a000b20064101102a000b20024108102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240203c0e050001020304040b2001203b10ef01024020012802002023470d00200120206a2802002108200141206a108c022001280220213d0240200141206a20206a2802002202450d00200220246c2106203d20236a2102200820207621112023200820257174210c20082026762027712213202873210f03400240024002400240200220286a2d00002023470d00200141f0006a20296a200220296a2205290000370300200141f0006a202a6a2002202a6a22072900003703002021200220206a220929000037030020022900002104200141f0006a20226a20113602002001200437037020014180026a200141f0006a108d020240201320014180026a20206a220a28020022084f0d002008200f6a221020084f0d0d20012802800222122010202b746a280200200c7121080240200128028402450d00201210230b2008450d01200141f0006a2002108e022001290370202c520d02200a202d3703002001202d37038002202f202e20014180026a1000200141e0016a20206a2210200a29030037030020012001290380023703e001200141e0016a202a20312030203010012028460d032001203036028002200141e0016a202a20014180026a20392030100120236a20394d0d0e203220012802800220236a3602002033102622080d040c120b200128028402450d0020012802800210230b200220246a21022006203a6a22060d030c040b203310262208450d0d200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d370300200141e0016a20206a2209202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2009290300370300200120012903e001370340200141c0006a2022100320081023200220246a21022006203a6a22060d020c030b20324101360200203310262208450d0e0b200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d3703002010202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2010290300370300200120012903e00137034020012022360284022001200141c0006a36028002202120014180026a10ed0120081023200220246a21022006203a6a22060d000b0b2001280224450d00203d10230b200d203b20226a223b470d130c180b203e2047220220466a2247490d0d0240203e20476b22062045490d002044200220486c6a2202204a6a22052903002044204720486c6a2208204a6a220729030022045a0d00200141e0016a204b6a223c2008204b6a2209290300370300200141e0016a204c6a220a2008204c6a2211290300370300200141e0016a204d6a22132008204d6a2210290300370300200120082903003703e0012008200229030037030020102002204d6a29030037030020112002204c6a29030037030020092002204b6a2903003703002007200529030037030002402006204e490d002008204f6a29030020045a0d00410221082049210503402005220220506a2002290300370300200220516a2002204a6a290300370300200220526a2002204b6a290300370300200220536a2002204c6a290300370300200220546a2002204d6a290300370300200820556a220820064f0d01200220486a2105200220566a2903002004540d000b0b200220012903e001370300200220043703202002204b6a203c2903003703002002204c6a200a2903003703002002204d6a20132903003703000b204920506a214920470d130c280b207b217c4100217b4101217d207c20606a2209450d1f0240024002400240024002402044200920676c6a20696a2903002044207c20676c22026a206f6a29030022045a0d00205d207c20706c20647422056a2102034020092061460d02200920606a21092004200229030022005421062002205b6a21022000210420060d000c030b0b207c206c6a2105205d20026a21064100217b41002102034020052002460d05200220616a21022004200629030022005a21082006205b6a21062000210420080d000b200220616a217d207c20026b20606a2209450d030c020b410021090b207c2009490d11207c203e4b0d130240207c20096b227d2061762208450d00205c20056a21022044200920676c6a21060340200141f0006a20696a2205200620696a2207290300370300200141f0006a206a6a223c2006206a6a220a290300370300200141f0006a206b6a22112006206b6a2213290300370300200141f0006a20586a2210200620586a221229030037030020012006290300370370200220586a220c29030021042002206b6a220f29030021002002206a6a223d29030021032002290300210b2007200220696a228101290300370300200a200337030020132000370300201220043703002006200b3703002081012005290300370300203d203c290300370300200f2011290300370300200c2010290300370300200220012903703703002002205b6a2102200620676a2106200820606a22080d000b0b2009450d010b207d20714b0d00207c203e4b0d112044200920676c6a217e4100217f0c260b2009217b2079207a460d230c240b207c217d2079207a460d200c210b2087012014460d01208701208a016a2102208701208b016a228701290300200229030084500d012019209601460d1420960120196b210203402014208701460d02208701208a016a2106208701208b016a228701290300200629030084500d0220022096016a22020d000c140b0b2087012014460d0002400340208701208a016a2903002104208701208b016a22022903002100208e01208701208c016a290300370300209101208701208f016a2903003703002094012087012092016a29030037030020012087012095016a290300370380022000200484500d01200141f0006a208d016a2206208e01290300370300200141f0006a2090016a2208209101290300370300200141f0006a2093016a22052094012903003703002001200129038002370370200141e0006a200141f0006a10ef01200141c0006a208d016a2207208e01290300370300200141c0006a2090016a223c209101290300370300200141c0006a2093016a2209209401290300370300200120012903800237034002402001280260209601460d00200221870120142002470d010c030b0b200141e0016a2093016a220a2009290300370300200141e0016a2090016a2209203c290300370300200141e0016a208d016a223c2007290300370300200120012903403703e001200141e0006a2093016a2802002102200141206a208d016a2207203c290300370300200141206a2090016a223c2009290300370300200141206a2093016a2209200a290300370300200120012903e0013703202001208d016a220a200729030037030020012090016a2207203c29030037030020012093016a223c2009290300370300200120012903203703002006200a290300370300200820072903003703002005203c29030037030020012001290300370370024020860120024d0d00208701208b016a2187012085012002209701746a220220012903703700002002208d016a200629030037000020022090016a200829030037000020022093016a20052903003700002089012096016a2189014100211941000d134104213c0c1b0b41d8b4c20020022086011029000b200141206a41186a200141e0016a41186a290300370300200141206a41106a200141e0016a41106a290300370300200141206a41086a200141e0016a41086a290300370300200120012903e0013703200b0240208801450d00201410230b024020860120840141ffffff3f71220220022086014b1b2207450d0020830121022085012106410021050340024020022006460d00200220064120109604450d00411610262208450d0a2008410e6a41002900e1b641370000200841086a41002900dbb641370000200841002900d3b64137000020084116413610272208450d0b200820022900003700162008412e6a200241186a290000370000200841266a200241106a2900003700002008411e6a200241086a290000370000200141e0016a41186a223e4200370300200141e0016a41106a223c4200370300200141e0016a41086a22094200370300200142003703e00120084136200141e0016a1002200141c0006a41186a203e290300370300200141c0006a41106a203c290300370300200141c0006a41086a2009290300370300200120012903e001370340200141c0006a41201003200810230b200241206a2102200641206a2106200541016a22052007490d000b0b2085012086014105746a2102208601213e02400240024002400240024002402086014104490d00200141f0006a41206a213c200141b0016a2109200141d0016a210a200141f0016a21870120014188016a210820014180016a2105200141f8006a210720022106208601213e0340200842003703002005420037030020074200370300200142003703700240203c2006460d00200641606a200141f0006a41201096040d030b20084200370300200542003703002007420037030020014200370370024020092006460d00200641406a200141f0006a41201096040d040b200842003703002005420037030020074200370300200142003703700240200a2006460d00200641a07f6a200141f0006a41201096040d050b20084200370300200542003703002007420037030020014200370370200641807f6a210202402087012006460d002002200141f0006a41201096040d060b203e417c6a213e2002210620022085016b41ff004b0d000b0b2002208501460d05203e417f6a2106200141f0006a41206a210820014188016a210520014180016a2107200141f8006a213e03402005420037030020074200370300203e420037030020014200370370024020082002460d00200241606a200141f0006a41201096040d060b2006417f6a2106208501200241606a2202470d000c060b0b203e417f6a21060c030b203e417e6a21060c020b203e417d6a21060c010b203e417c6a21060b200641016a220220860120860120024b1b2186010b2001418c016a203f360200200141f0006a41186a204036020020014184016a2041360200200141f0006a41106a201e360200200141fc006a201f360200200141f0006a41086a2202200e360200200141033a0074200141063a007041a886c5004100200141f0006a102c20014180026a41086a22064200370300200142003703800241e8b4c200411220014180026a1000200141e0016a41086a200629030037030020012001290380023703e001200141003602782001420137037020012086013602800220014180026a200141f0006a104102400240208601450d00208601410574213e4100200228020022066b21052001280270213c20012802742107208501210203400240200720056a411f4b0d00200641206a22082006490d2b20074101742209200820082009491b22084100480d2b024002402007450d00203c200720081027223c0d010c080b20081026223c450d070b200821070b203c20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102203e41606a223e0d000b200141f8006a2006360200200120073602742001203c3602700c010b20022802002106200128027421072001280270213c0b200141e0016a4110203c2006100402402007450d00203c10230b0240208401450d0020850110230b20014180026a41086a22024200370300200142003703800241fab4c200411620014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0012001208901360270200141e0016a4110200141f0006a410410042002420037030020014200370380024190b5c200411120014180026a10002006200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0c200128027041016a21020c010b410121020b20014180026a41086a2206420037030020014200370380024190b5c200411120014180026a1000200141e0016a41086a200629030037030020012001290380023703e00120012002360270200141e0016a4110200141f0006a410410040240208201450d0020830110230b2018a7450d28201710230c280b41ecb3c200201020081029000b41d4aac10041331021000b20084101102a000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b41164101102a000b41364101102a000b2047203e1048000b41d4aac10041331021000b2009207c1048000b207c2009417f6a227b490d160b207c203e108c01000b4100213c0c050b4101213c0c060b4103213c0c080b4104213c0c080b4104213c0c080b410021020c110b410121020c100b410121020c0f0b410121020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2079207a470d12410121020c160b207920616a22022079490d1a20792061742206200220022006491b2202ad2062862204206388a70d1a2004a72206205e480d1a024002402079450d00207820792064742006102722780d010c030b200610262278450d020b20022179410221020c150b2078207a2064746a2202207d3602042002207b360200207a20616a228001217a2080012065490d024101217f0c130b20064104102a000b02400240207f0e020001010b207c200920606a227b490d140240207c207b6b227d2065490d002044200920676c6a220220696a22082903002044207b20676c6a220620696a220529030022045a0d00200141e0016a206a6a22072006206a6a223c290300370300200141e0016a206b6a220a2006206b6a2211290300370300200141e0016a20586a2213200620586a2210290300370300200120062903003703e001200620022903003703002010200220586a29030037030020112002206b6a290300370300203c2002206a6a290300370300200520082903003703000240207d2064490d00200620726a29030020045a0d0041022106207e2108024003402008220220696a200220736a2903003703002002206a6a200220746a2903003703002002206b6a200220756a290300370300200220586a200220766a2903003703002002200220676a2208290300370300200620616a2206207d4f0d01200220726a2903002004540d000b0b200220676a21020b200220012903e001370300200220043703202002206a6a20072903003703002002206b6a200a290300370300200220586a20132903003703000b207b450d0e207e205b6a217e207b2109207d2077490d0c410021020c130b02400240024002402078208001221320606a2280012064746a2202280200450d00207820132064746a2207206d6a2802002205200228020422064d0d004102217a201341024d0d042078201320666a22022064746a2802042208200620056a4d0d014103217a201341034d0d042007206e6a280200200820056a4d0d010c050b20132064490d01200228020421062078201320666a22022064746a28020421080b20082006490d010b2013206c6a21020b2013200220616a227a4d0d03201320024d0d04207820022064746a2212280204223d20122802006a22022078207a2064746a220c280200220f490d052002203e4b0d062012205f6a2181012044200f20676c6a2211200c280204221020676c22066a2107200220676c2108024002400240024002402002200f6b223c20106b220220104f0d0020592007200220676c22061094041a205a20066a210520102061480d0120022061480d01205c20086a210820072102034020082002205b6a223c2005205b6a220a200520686a290300200220686a2903005422071b2206290300370300200820696a200620696a2903003703002008206a6a2006206a6a2903003703002008206b6a2006206b6a290300370300200820586a200620586a2903003703002005200a20071b21052011203c200220071b22024f0d042008205b6a2108205a2106205a2005490d000c050b0b2059201120061094041a205a20066a210520102061480d01203c20104c0d01204420086a210a205a2106201121020340200220072006200720696a290300200620696a29030054223c1b2208290300370300200220696a200820696a2903003703002002206a6a2008206a6a2903003703002002206b6a2008206b6a290300370300200220586a200820586a2903003703002006200620676a203c1b2106200220676a2102200720676a2007203c1b2207200a4f0d04200520064b0d000c040b0b200721020c010b201121020b205a21060b20022006200520066b220820082067706b1094041a208101203d20106a3602002012200f360200200c200c20586a207a20607320136a2064741095041a208001217a20800120614b0d0c0b207b0d060c010b2013217a207b0d060b02402079450d00207810230b2057450d11205910230c110b41b0a8c100207a20131029000b41b0a8c100200220131029000b200f20021048000b2002203e108c01000b4102213c0c010b4102213c0c010b410121020c0b0b410121020c0a0b4100217f0c030b4101217f0c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b207b207c1048000b2001203e360278200120423602742001204336027020014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108f0202402042450d00204310230b2041203f10900220024200370300200142003703800241e8b4c200411220014180026a10002006200229030037030020012001290380023703e001410021820102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10282001280270228301450d02200141f8006a28020021840120012802742182010c010b410121830141002184010b200141d8006a4200370300200141d0006a4200370300200141c8006a420037030020014200370340208401ad2204421b88a70d042004420586a72202417f4c0d04024002402002450d00200210262285010d0120024101102a000b41012185010b200141f0006a41186a2208200141c0006a41186a290300370300200141f0006a41106a2205200141c0006a41106a290300370300200141f0006a41086a2207200141c0006a41086a290300370300200120012903403703700240024002402084014102490d00208401417f6a21062085012102034020022001290370370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200241206a21022006417f6a22060d000b208401417f6a2186010c010b41002186012085012102208401450d010b20022001290370370000200241186a200141f0006a41186a290300370000200241106a200141f0006a41106a290300370000200241086a200141f0006a41086a29030037000020860141016a2186010b2014201d41306c6a218701201aa721880141002189014158218a014150218b014178218c014118218d0120014180026a41186a218e014170218f01411021900120014180026a41106a2191014168219201410821930120014180026a41086a2194014160219501410121960141052197012019450d014103213c0c020b41d4aac10041331021000b4104213c410121020c010b410121020c000b0b101d000b101e000b2016450d00201510230b200141a0026a24000bf90504027f017e0f7f017e230041f0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241d0006a41086a220e420037030020024200370350200141086a2205410020012802002009280200200241d0006a412020052802001001220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241306a41186a22112007290300370300200241306a41106a22122008290300370300200241306a41086a2213200e29030037030020022002290350370330200242003703502005410020012802002009280200200241d0006a410820101001220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f20022903502104200241106a41186a220e2011290300370300200241106a41106a22102012290300370300200241106a41086a22112013290300370300200220022903303703100240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005102722060d010c060b200510262206450d050b2006200b6a22052002290310370300200541186a200e290300370300200541106a2010290300370300200541086a2011290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d00200610230b200241f0006a24000f0b2000200d36020420002006360200200041086a200f360200200241f0006a24000f0b101e000b20054108102a000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a102722060d020c070b200541106a21090c020b200a10262206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a102722060d020c080b200941206a21050c020b200a10262206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510042000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100420030d030c040b101e000b200a4101102a000b200a4101102a000b200610230b200241106a24000bce0506027f017e0b7f017e027f017e230041d0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b101d000b20054108102a000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001001220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1001220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f102722060d010c060b200f10262206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d00200610230b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b101e000b200f4108102a000b8603020c7f017e230041206b2201240020014100109102200141106a410110910202400240024020012802182202450d00410221032001280204210420012802082105200141186a210603402001280214210b2001280210210a024002400240200420056b200241216c220241216d220c4f0d002005200c6a220c2005490d0520044101742208200c200c2008491b2209ad42217e220d422088a70d05200da722074100480d050240024020040d00200710262208450d080c010b2001280200200441216c200710272208450d070b20012008360200200921042008200541216c6a200a20021094041a200b0d010c020b2005200c6a210c2001280200200541216c6a200a20021094041a200b450d010b200a10230b200141106a2003109102200341016a2103200c2105200628020022020d000b200141086a200c360200200120043602040b02402001280214450d00200128021010230b20002001290300370200200041086a200141086a280200360200200141206a24000f0b101e000b20074101102a000bad0301047f230041d0006b220224000240024002400240411310262203450d002003410f6a410028009cb642360000200341086a4100290095b6423700002003410029008db64237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200128022021042003413341e60010272201450d0220012004360033200241306a41186a22034200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020014137200241306a1002200241186a2003290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a10920220022802302203450d0520002002290234370204200020033602000c010b20004100360208200042043702000b20011023200241d0006a24000f0b41134101102a000b41334101102a000b41e6004101102a000b41d4aac10041331021000bf50402057f037e230041c0006b2202240002400240411310262203450d002003410f6a41002800c5b542360000200341086a41002900beb542370000200341002900b6b54237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034133200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d0020024100360220410020024120200241206a41044100100122012001417f461b220141034d0d022002280220210420024100360220410020024120200241206a41042001410420014104491b2205100122012001417f461b220141034d0d0220022802202106200242003703282002420037032020024120200241206a41102001410420014104491b20056a220110012205417f460d022005410f4d0d02200241286a290300210720022903202108200242003703282002420037032020024120200241206a4110200141107210012201417f460d022001410f4d0d0220022903202109200041206a200241286a290300370300200041186a2009370300200041106a2007370300200020083703082000412c6a2006360200200041286a2004360200200042013703000c010b200042003703000b20031023200241c0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009102722080d020c070b200041206a2107200228020021080c020b200910262208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009102722080d020c080b200741086a21000c020b200910262208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20094101102a000b20094101102a000b200810230b200241106a24000b840e05027f017e0d7f067e047f230022022103200241e0016b416071220224000240024002402001ad2204421b88a70d002004420586a72205417f4c0d000240024002402005450d00200510262206450d0441002107410021084100210520010d010c020b410121064100210741002108410021052001450d010b20014105742109416020006b210a2006210520002108034020052008290000370000200541186a200841186a290000370000200541106a200841106a290000370000200541086a200841086a290000370000200541206a2105200841206a2108200941606a22090d000b200020014105746a200a6a41057641016a2105200121080b20022005360218200220083602142002200636021020062005200241d8016a200741202005676b108901200241a0016a41086a22054200370300200242003703a0014188a8c4004118200241a0016a100020024180016a41086a2005290300370300200220022903a00137038001024002400240024002400240024020024180016a411041a886c500200720071001417f460d0020024210370244200220024180016a360240200241a0016a200241c0006a102820022802a001220b450d0920022802a401210c4105210d200241a8016a28020041057422000d010c020b4101210b4100210c4105210d41004105742200450d010b200241a0016a411472210e200241a0016a410872210f200b21050340200241206a41186a220a200541186a290000370300200241206a41106a2210200541106a290000370300200241206a41086a2211200541086a29000037030020022005290000370320200241c0006a200241206a10b603200241003602a80120022903582112200220022903b801221337035820022903502114200220022903b001221537035020022903402116200220022903a00137034020022903482104200220022903a80122173703482015422088a721062017422088a721012013a721072017a7210902402004a72208450d00200220163703a001200220043703a801200220143703b001200220123703b8012002418c016a221820082014a7200d746a36020020024180016a41086a2219200836020020024180016a41106a221a200241106a36020020022004422088a7360284012002200836028001200241f0006a20024180016a10ab02200f41086a200241f0006a41086a221b280200360200200f200229037037020020182014422088a722082012422088a7200d746a36020020192008360200201a200241106a36020020022012a7360284012002200836028001200241f0006a20024180016a10ab02200e41086a201b280200360200200e200229037037020020022903b801211720022903b001211220022903a801210420022903a001211402402009450d0002402001450d00200910230b2007450d00200610230b20022014370340200220043703482004422088a72101200220123703502012422088a72106200220173703582004a721092017a721070b41151026210802402009450d002008450d032008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d04200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a220a4200370300200241a0016a41106a22104200370300200241a0016a41086a22114200370300200242003703a00120084135200241a0016a100220024180016a41186a200a29030037030020024180016a41106a201029030037030020024180016a41086a2011290300370300200220022903a00137038001200241203602a401200220024180016a3602a001200241c0006a200241a0016a10ad032008102302402001450d00200910230b02402007450d00200610230b200541206a2105200041606a22000d010c020b2008450d042008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d05200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a22094200370300200241a0016a41106a22014200370300200241a0016a41086a22074200370300200242003703a00120084135200241a0016a100220024180016a41186a200929030037030020024180016a41106a200129030037030020024180016a41086a2007290300370300200220022903a0013703800120024180016a4120100320081023200541206a2105200041606a22000d000b0b0240200c450d00200b10230b02402002280214450d00200228021010230b200324000f0b41154101102a000b41354101102a000b41154101102a000b41354101102a000b101d000b20054101102a000b41d4aac10041331021000b9a0805057f017e0b7f017e017f230041a0016b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272204450d012004200136000e200241c0006a41186a22034200370300200241c0006a41106a22014200370300200241c0006a41086a220542003703002002420037034020044112200241c0006a1002200241106a41186a2003290300370300200241106a41106a2001290300370300200241106a41086a2005290300370300200220022903403703100240024002400240200241106a412041a886c500410041001001417f460d00200242203702342002200241106a360230200241086a200241306a104a2002280208450d0b200228020c2206ad42217e2207422088a70d032007a72203417f4c0d032003450d01200310262208450d062006450d020c070b20004100360208200042013702000c080b4101210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b411c4101102a000b20034101102a000b200241306a41086a220928020021012002280234210a2002280230210b420021074100210c4100210d410021032006210e0340200241003a004020092001200b200a200241c0006a41012001100141016a41014b22056a22013602002005450d034100210f024020022d00402205450d0020054101470d04200241c0006a41186a220f4200370300200241c0006a41106a22104200370300200241c0006a41086a221142003703002002420037034020094100200b200a200241c0006a41202001100122052005417f461b2205412020054120491b20016a22013602002005411f4d0d0420024180016a41186a200f29030037030020024180016a41106a201029030037030020024180016a41086a201129030037030020022002290340370380014101210f0b200341016a2105200241e0006a41186a221020024180016a41186a290300370300200241e0006a41106a221120024180016a41106a290300370300200241e0006a41086a221220024180016a41086a290300370300200220022903800137036002402003200e470d00200c20052005200c491b220ead42217e2213422088a70d062013a722144100480d0602402003450d002008200d2014102722080d010c080b201410262208450d070b2008200d6a2203200f3a0000200341196a2010290300370000200341116a2011290300370000200341096a2012290300370000200341016a200229036037000020074280808080107c2107200c41026a210c200d41216a210d2005210320052006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241a0016a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20144101102a000bc50303027f017e097f230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b101d000b20054104102a000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100122052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d102722060d010c060b200d10262206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200d4104102a000bce0304027f017e037f017e230041c0006b2204240002400240411810262205450d00200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a200429032021060c010b4200210a0b2005102320012006200220062006200256200a200356200a2003511b22051b22027d200a2003200a20051b22037d2006200254ad7d10fe012000200337030820002002370300200441c0006a24000f0b41d4aac10041331021000b41184101102a000b41384101102a000bf01004047f017e087f037e230041d0046b22022400200241186a200110450240024002400240024002400240024002402002280218450d00200241003a00a002200241a0026a200128020022032001280204220441004722051094041a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d00a002220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b200241a8046a200110950202400240024020022d00a8044102460d0020024180046a41206a200241a8046a41206a28020036020020024180046a41186a200241a8046a41186a29030037030020024180046a41106a200241a8046a41106a29030037030020024180046a41086a200241a8046a41086a290300370300200220022903a80437038004200241a0026a41386a22074200370300200241a0026a41306a22084200370300200241a0026a41286a22094200370300200241a0026a41206a220a4200370300200241a0026a41186a220b4200370300200241a0026a41106a220c4200370300200241a0026a41086a220d4200370300200242003703a002200241a0026a20012802002203200141046a220e280200220441c000200441c000491b22051094041a200e200420056b3602002001200320056a3602002004413f4d0d0020024190036a41386a200729030037030020024190036a41306a200829030037030020024190036a41286a200929030037030020024190036a41206a200a29030037030020024190036a41186a200b29030037030020024190036a41106a200c29030037030020024190036a41086a200d290300370300200220022903a00237039003200241086a200110462002280208450d002002290310210f200141046a220e2802002104200241003a00a002200241a0026a20012802002207200441004722051094041a20042005490d04200e200420056b22033602002001200720056a22053602002004450d0020023100a0022210500d01200241003a00a002200241a0026a2005200341004722041094041a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d004201210620023100a0024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024188016a41206a20024180046a41206a28020036020020024188016a41186a20024180046a41186a29030037030020024188016a41106a20024180046a41106a29030037030020024188016a41086a20024180046a41086a290300370300200241b0016a41086a20024190036a41086a290300370300200241b0016a41106a20024190036a41106a290300370300200241b0016a41186a20024190036a41186a290300370300200241b0016a41206a20024190036a41206a290300370300200241b0016a41286a20024190036a41286a290300370300200241b0016a41306a20024190036a41306a290300370300200241b0016a41386a20024190036a41386a29030037030020022002290380043703880120022002290390033703b0010c030b200520041048000b200520041048000b200420031048000b20024190036a41206a220420024188016a41206a28020036020020024190036a41186a220520024188016a41186a29030037030020024190036a41106a220320024188016a41106a29030037030020024190036a41086a220e20024188016a41086a290300370300200241a0026a41086a2207200241b0016a41086a290300370300200241a0026a41106a2208200241b0016a41106a290300370300200241a0026a41186a2209200241b0016a41186a290300370300200241a0026a41206a220a200241b0016a41206a290300370300200241a0026a41286a220b200241b0016a41286a290300370300200241a0026a41306a220c200241b0016a41306a290300370300200241a0026a41386a220d200241b0016a41386a290300370300200220022903880137039003200220022903b0013703a002024020064202520d0020004203370370200241d0046a24000f0b200241e0006a41206a2004280200360200200241e0006a41186a2005290300370300200241e0006a41106a2003290300370300200241e0006a41086a200e290300370300200241206a41086a2007290300370300200241206a41106a2008290300370300200241206a41186a2009290300370300200241206a41206a200a290300370300200241206a41286a200b290300370300200241206a41306a200c290300370300200241206a41386a200d2903003703002002200229039003370360200220022903a0023703200b200241a0026a2001104420022802a002210120024190036a200241a0026a41047241ec001094041a02402001410e470d0020004203370370200241d0046a24000f0b200241b0016a20024190036a41ec001094041a2000200f37030020002002290360370308200041106a200241e0006a41086a290300370300200041186a200241e0006a41106a290300370300200041206a200241e0006a41186a290300370300200041286a200241e0006a41206a2802003602002000200229032037022c200041346a200241206a41086a2903003702002000413c6a200241206a41106a290300370200200041c4006a200241206a41186a290300370200200041cc006a200241206a41206a290300370200200041d4006a200241206a41286a290300370200200041dc006a200241d0006a290300370200200041e4006a200241d8006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241b0016a41ec001094041a200241d0046a24000b8c0701067f230041f0006b22022400200241003a0050200241d0006a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002402004450d0020022d0050220441ef014d0d02200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b22041094041a200141046a200620046b3602002001200520046a360200200641014d0d0320022f0150220441f0014f0d050c030b20024100360250200241d0006a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d024101210120022802502204418080044f0d050c020b200141046a20062006410420064104491b22046b3602002001200520046a3602000c010b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241d0006a200520041094041a200141046a200620046b3602002001200520046a360200024002402006411f4d0d00200241c8006a41026a200241d0006a41026a2d00003a0000200241306a200241df006a290000370300200241386a200241e7006a290000370300200241c0006a200241d0006a411f6a2d00003a0000200220022f00503b01482002200229005737032820022800532104410121030c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2205200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502003450d00200241246a41026a20012d00003a0000200241086a41086a2005290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c030b200041023a0000200241f0006a24000f0b200520041048000b410121010b200020022f01243b0001200020013a0000200041046a2004360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000b9d1707017f027e037f017e017f017e047f230041e0046b2202240002400240200129037022034202520d00200241086a20014188016a41f0001094041a420021030c010b200241b6016a2001410b6a2d00003a000020024198016a41086a2001411c6a29020037030020024198016a410d6a200141216a290000370000200220012f00093b01b40120022001290214370398012001410c6a280200210520012d0008210620012802102107200241f0016a200141e4006a290000370300200241e8016a200141dc006a290000370300200241e0016a200141d4006a290000370300200241d8016a200141cc006a290000370300200241d0016a200141c4006a290000370300200241b8016a41106a2001413c6a290000370300200241b8016a41086a200141346a2900003703002002200129002c3703b80120012903002108200241f8016a41106a200141f0006a220941106a290300370300200241f8016a41086a200941086a290300370300200220092903003703f8014200210a200241d8026a41086a220b4200370300200242003703d80241af98c300410d200241d8026a1000200241c0046a41086a200b290300370300200220022903d8023703c00442002104024002400240024002400240024002400240024002400240200241c0046a411041a886c500410041001001417f460d00200242003703d802200241c0046a4110200241d8026a41084100100141016a41084d0d0120022903d8022104200929030021030b024020034201520d002001290378220a500d02200420014180016a290300220320032004541b2204200420037d200a827d210a0b200241d8026a200a109702200241ac026a41026a20022d00da023a0000200241c0046a41086a2209200241eb026a290000370300200241c0046a410d6a220b200241f0026a290000370000200220022f01d8023b01ac02200220022900e3023703c00420022800db02210c20022800df02210d20024190026a410d6a200b29000037000020024190026a41086a2009290300370300200220022903c004370390022002418c046a41026a2209200241b4016a41026a2d00003a0000200241d8026a41086a220b20024198016a41086a290300370300200241d8026a410d6a220e20024198016a410d6a290000370000200220022f01b4013b018c0420022002290398013703d8020240024002400240024002400240200641ff01714101470d0020024190046a200541067610870120022802900421092002280298042005413f7122054d0d0120024188046a41026a200920054105746a220541026a2d00003a0000200241a8046a200541136a290000370300200241ad046a200541186a290000370000200220052f00003b0188042002200529000b3703a0042005280007210720052800032105410121062002280294040d020c030b20024188046a41026a20092d00003a0000200241a0046a41086a200b290300370300200241a0046a410d6a200e290000370000200220022f018c043b018804200220022903d8023703a0040c030b41002106200228029404450d010b200910230b2006450d010b20024190046a41026a20024188046a41026a2d00003a0000200241d8026a41086a200241a0046a41086a290300370300200241d8026a410d6a200241a0046a410d6a290000370000200220022f0188043b019004200220022903a0043703d802410021090c010b410121094115210741d9cac40021050b200241d4026a41026a220620024190046a41026a2d00003a0000200241c0046a41086a220b200241d8026a41086a220e290300370300200241c0046a41106a200241d8026a41106a290300370300200220022f0190043b01d402200220022903d8023703c00402402009450d002000200536020420004101360200200041086a200736020020014188016a1024200241e0046a24000f0b200241c3026a200b290300370000200241c8026a200241c0046a410d6a290000370000200220022f01d4023b01b002200220073600b702200220053600b302200220022903c0043700bb02200220062d00003a00b202200220083703d802200e20014188016a41f000109404210b200241ef036a200d360000200241eb036a200c360000200241d8026a4188016a200241f8016a41106a290300370300200241d8036a2201200241f8016a41086a290300370300200241ea036a200241ac026a41026a2d00003a0000200241f3036a200229039002370000200241fb036a20024190026a41086a29030037000020024180046a20024190026a410d6a290000370000200220022903f8013703d003200220022f01ac023b01e803200241003602c804200242013703c004200241d8026a200241c0046a109802200b200241c0046a103902400240024002400240024020022903d0034201520d0020012903002203420c882204420120044201561b22044200510d08200241e0036a290300200480210420022802c4042205200241c8046a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d0420022802c0042005200110272205450d050c0b0b024020022802c404200241c8046a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d0220022802c0042001200910272205450d030c090b20022802c00421050c090b20022802c00421050c0a0b2009102622050d060b20094101102a000b2001102622050d060b20014101102a000b41d4aac10041331021000b41e0fec400104f000b41b099c300104f000b200220093602c404200220053602c004200241c8046a28020021010b200241c8046a200141016a360200200520016a41003a00000c020b200220013602c404200220053602c004200241c8046a28020021010b200241c8046a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b02400240024020022802c4042206200241c8046a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d0120022802c0042006200910272205450d020c040b20022802c00421050c040b2009102622050d020b20094101102a000b101e000b200220093602c404200220053602c004200241c8046a2802002101200921060b200520016a2209200241e8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241c0046a41186a22094200370300200241c0046a41106a22074200370300200241c0046a41086a220c4200370300200242003703c00420052001200241c0046a1002200241a0046a41186a2009290300370300200241a0046a41106a2007290300370300200241a0046a41086a200c290300370300200220022903c0043703a004200241a0046a4120200241b8016a200241b0026a1011450d01200241a0046a4120200241b8016a200241b0026a101245210120060d020c030b20052001200241b8016a200241b0026a1011450d0020052001200241b8016a200241b0026a101245210120060d010c020b410121012006450d010b200510230b02402001450d00200241f8006a41186a200241b0026a41186a290300370300200241f8006a41106a200241b0026a41106a290300370300200241f8006a41086a200241b0026a41086a290300370300200220022903b00237037820022903d8022104200241086a200b41f0001094041a420121030c010b200041eecac40036020420004101360200200041086a411a360200200b1024200241e0046a24000f0b200041106a2002290378370300200041086a2003370300200041306a2004370300200041186a200241f8006a41086a290300370300200041206a200241f8006a41106a290300370300200041286a200241f8006a41186a290300370300200041386a200241086a41f0001094041a20004100360200200241e0046a24000ba40301057f230041c0006b2202240002400240411010262203450d00200341086a410029009299433700002003410029008a994337000020034110412010272203450d0120032001370010200241206a41186a22044200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034118200241206a1002200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002004420037030020054200370300200241286a42003703002002420037032020024120200241206a4120410010012204417f460d022004411f4d0d0220002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031023200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000bc00903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0520012802002000200510272204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d0820012802002004200010272204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000102722040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004102722070d0a0c110b2005102622040d130b20054101102a000b200128020021040c050b200128020021070c070b2000102622040d0d0b20004101102a000b200010262204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b200410262207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008102722050d020c060b200128020021050c020b200810262205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b101e000b20084101102a000b41d498c400104f000b2002200241086a360240200241f098c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4122360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002412236022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a418099c4001061000b20004101102a000b20044101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000bc92c06057f027e027f017e0d7f097e230041b0026b2203240041012104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022054101460d0020054102470d1520034190016a41026a200141076a2d00003a0000200341286a41086a2204200141186a290200370300200341286a410d6a22062001411d6a290000370000200320012f00053b0190012003200141106a2902003703284128210720022d000120022d000072450d0141b394c30021050c200b200141306a2903002108200141286a2903002109200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021062001410c6a280200210a20012d0004210b2002411a6a290100210c200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002110200241146a2d00002111200241126a2f01002112200241116a2d00002113200241106a2d000021142002410e6a2f010021152002410d6a2d00002116200241046a2d00002117200241026a2f01002118412a21074100210141db94c300210520022d0000450d01410021190c020b200141c0006a2903002108200141386a290300210c200141306a2903002109200141286a290300211a2001410c6a2802002107200141086a280200210520012d000421012003418c016a41026a220220034190016a41026a2d00003a0000200341c0016a41086a2004290300370300200341c0016a410d6a2006290000370000200320032f0190013b018c01200320032903283703c001200141ff01714101470d02200341086a20054106761087012003280208210220032802102005413f7122014d0d0920034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b370370200128000721072001280003210541012101200328020c0d0a0c0b0b41012104410021014100211920022d00014101470d002002410c6a2d000021012002410a6a2f01002119200241096a2d00002107200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021040b201941ffff0371410874200141187472200741ff017172210720040d1c2003200c3703402003200d3a003f2003200e3a003e2003200f3b013c200320103a003b200320113a003a200320123b0138200320133a0037200320143a0036200320153b0134200320163a00332003200736002f2003200536002b200320173a002a200320183b01282003418c016a41026a2201200341246a41026a2d00003a0000200341c0016a41086a2202200341086a41086a290300370300200341c0016a410d6a2205200341086a410d6a290000370000200320032f01243b018c01200320032903083703c0010240200b41ff01714101470d0020034190016a200641067610870120032802900121022003280298012006413f7122014d0d0220034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b3703702001280007210a20012800032106410121012003280294010d030c040b20034188016a41026a20012d00003a0000200341f0006a41086a2002290300370300200341f0006a410d6a2005290000370000200320032f018c013b018801200320032903c0013703700c040b20034188016a41026a20022d00003a0000200341f0006a41086a200341c0016a41086a290300370300200341f0006a410d6a200341c0016a410d6a290000370000200320032f018c013b018801200320032903c0013703700c090b41002101200328029401450d010b200210230b2001450d010b20034190016a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b019001200320032903703703c001410021010c010b410121014115210a41d9cac40021060b200341cc006a41026a220220034190016a41026a2d00003a0000200341a0016a41086a2205200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f0190013b014c200320032903c0013703a00102402001450d00200a2107200621050c160b200341e3006a2005290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200a36005720032006360053200320032903a00137005b200320022d00003a0052411410262201450d0c200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0d200120032903283700142001412c6a200341286a41186a290300370000200141246a200341286a41106a2903003700002001411c6a200341286a41086a2903003700004200210c200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d06200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d0b2002410f4d0d0b200341c8016a290300211a20032903c001210c2001102341142102411410262201450d070c140b41002101200328020c450d010b200210230b2001450d010b200341086a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b0108200320032903703703c001410021010c010b410121014115210741d9cac40021050b200341cc006a41026a2202200341086a41026a2d00003a0000200341a0016a41086a2204200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f01083b014c200320032903c0013703a00120010d0f200341e3006a2004290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200736005720032005360053200320032903a00137005b200320022d00003a0052411410262201450d0a200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0b200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200211d200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d082002410f4d0d08200341c8016a290300211b20032903c001211d0c030b4200211a20011023411421024114102622010d0d0b20024101102a000b4200211b0b2001102302400240201d201a5a201b20095a201b20095122011b0d002003201a201d7d3703c00120032009201b7d201a201d54ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b201d201a58201b20095820011b0d002003201d201a7d3703c0012003201b20097d201d201a54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a201a200910df01411810262201450d08200141106a410029008db741370000200141086a4100290085b741370000200141002900fdb64137000020014118413810272201450d0920012003290350370018200141306a200341d0006a41186a290300370000200141286a200341d0006a41106a290300370000200141206a200341d0006a41086a29030037000042002109200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014138200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a00102400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d072002410f4d0d07200341c8016a290300211a20032903c00121090c010b4200211a0b20011023024002402009200c5a201a20085a201a20085122011b0d002003200c20097d3703c00120032008201a7d200c200954ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b2009200c58201a20085820011b0d0020032009200c7d3703c0012003201a20087d2009200c54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a200c200810fe01410021050c0b0b200341d4016a4101360200200341013602a4012003418898c4003602a001200342013702c401200341d497c4003602c0012003200341a0016a3602d001200341c0016a41e0b7c1001061000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41184101102a000b41384101102a000b200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b6413700000240024002400240024020012002413410272201450d00200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001024002400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d022002410f4d0d02200341c8016a290300211b20032903c001211c0c010b4200211c4200211b0b20011023200341c0016a41086a22014200370300200342003703c0010240024002400240201c201b84221e4200510d0041d8b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0c010b41c4b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d01200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0b20032903c00121200c010b420021204200211f0b0240200920207c222120095422012008201f7c2001ad7c221d200854201d2008511b450d004128210741ecb9c20021050c070b0240200c20217d2222200c56201a201d7d200c202154ad7d220c201a56200c201a511b450d00411d21074182bcc40021050c070b201e4200520d05200341c0016a41086a22014200370300200342003703c0014182b6c100411b200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d05200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d042001410f4d0d0420032903c001200956200341c8016a290300221a200856201a2008511b450d05411f2107419fbcc40021050c060b41d4aac10041331021000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b2003200341286a41022022200c108302024020032802002205450d00200328020421070c010b0240201c20097c221d201c542201201b20087c2001ad7c221a201b54201a201b511b450d00412d210741bebcc40021050c010b024002400240200341286a200341d0006a4120109604450d00200341286a2022200c10df01411410262201450d01200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d02200120032903503700142001412c6a200341d0006a41186a2202290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22054200370300200341c0016a41106a22074200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2005290300370300200341a0016a41106a2007290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c50041004100100121052001102302402005417f470d00200341d0006a10e001200341f8016a201a370300200341f0016a201d370300200341c0016a41086a41003a0000200341c9016a2003290350370000200341d1016a200341d0006a41086a290300370000200341d9016a200341e0006a290300370000200341e1016a2002290300370000200341023a00c00141a886c5004100200341c0016a102c0b200341d0006a201d201a10df012003201f3703c801200320203703c0012003200341c0016a3602a001200341a0016a10de01200341c0016a41086a41023a0000200341c9016a2003290328370000200341d1016a200341286a41086a290300370000200341d9016a200341286a41106a290300370000200341e1016a200341286a41186a290300370000200341e9016a2003290350370000200341f1016a200341d0006a41086a290300370000200341f9016a200341d0006a41106a29030037000020034181026a2002290300370000200341023a00c001200341a8026a201f370300200341a0026a202037030020034198026a200837030020034190026a200937030041a886c5004100200341c0016a102c0b410021050c020b41144101102a000b41344101102a000b2000200736020420002005360200200341b0026a24000bb2be0117197f027e107f017e107f017e037f027e107f017e0f7f027e017f027e0a7f027e117f0a7e2e7f017e087f017e197f230041d0036b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b200141086a28020021052001280204210620022d00000d0a4101210720022d00014101470d0a200241196a2d00002104200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f010021182001410c6a2802002119200141146a280200211a200141106a280200211b20032002411a6a29010037038002200320043a00ff01200320083a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320173a00ea01200320183b01e801200320132012410874201141187472723600ef01200320162015410874722014411874723600eb01200320193602b003200320053602ac03200320063602a803200341086a200341e8016a200341a8036a201b201a109b02200328020c21022003280208210441002108200128020022054101470d510c500b200128020421092002411a6a290100211c200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541db94c3002104412a210520022d0000450d0b4101210741002108410021060c0c0b20022d000120022d0000720d07200141086a290300211c200341a8036a41086a22024200370300200342003703a80341d8b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c4c0b200141216a290000211d200141206a2d0000211e2001411d6a2f0000211f2001411c6a2d00002120200141196a2f00002121200141186a2d00002122200141156a2f00002123200141146a2d00002124200141106a28020021252001410c6a2802002126200141086a2d00002127200141306a28020021282001412c6a280200210620012d001f212920012d001b212a20012d0017212b20012d000b212c20012f0009212d200128020421082002411a6a290100212e200241196a2d0000212f200241186a2d00002130200241166a2f01002131200241156a2d00002132200241146a2d00002133200241126a2f01002134200241116a2d00002135200241106a2d000021362002410e6a2f010021372002410d6a2d00002138200241046a2d00002139200241026a2f0100213a412a211141db94c300210420022d0000450d0b4101213b4100213c4100213d0c0c0b200128020421152002411a6a290100211c200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211441db94c3002104412a210520022d0000450d0c4101210741002108410021060c0d0b20022d000120022d0000720d04200141086a280200210420012d00044101470d11200341e8016a200441067610870120032802e801213e20032802f0012004413f7122024d0d14203e20024105746a2202290018213f20022d0017210720022d0016210a20022f0014210b20022d0013210c20022d0012211220022f0010211420022d000f211520022d000e211620022f000c211a20022d000b2140200228000721412002280003210420022d0002213c20022f000021424101210520032802ec01450d3d0c3c0b200141086a28020021052001280204210620022d00000d0520022d00014101470d052001410c6a2802002118200141146a2802002119200141106a280200211a200241196a2d00002104200241186a2d00002107200241166a2f01002108200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210e2002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002111200241096a2d00002112200241086a2d00002113200241066a2f01002114200241056a2d00002115200241046a2d00002116200241026a2f0100211720032002411a6a2901003703c003200320043a00bf03200320073a00be03200320083b01bc03200320093a00bb032003200a3a00ba032003200b3b01b8032003200c3a00b7032003200d3a00b6032003200e3b01b4032003200f3a00b303200320163a00aa03200320173b01a803200320122011410874201041187472723600af03200320152014410874722013411874723600ab03200341e8016a200341a8036a104220032d00e8014101470d14200341f4016a2d00002102200341f5016a290000211c200341fd016a280000210420032f00e901210720032d00eb01210820032902ec012143200320034181026a29000037038002200320043602fc012003201c3702f401200320023a00f301200320433700eb01200320083a00ea01200320073b01e801200320183602b003200320053602ac03200320063602a803200341106a200341e8016a200341a8036a201a2019109b0220032802142102200328021021044101210841002107200128020022054101470d4b0c4a0b200141386a290300211c200141306a29030021432001411d6a29000021442001411c6a2d00002145200141196a2f00002146200141186a2d00002147200141156a2f00002148200141146a2d00002149200141116a2f0000214a200141106a2d0000214b2001410c6a280200214c200141086a280200214d200141286a280200214e20012d001b214f20012d0017215020012d0013215120012d0007215220012f0005215320012d000421542002411a6a2901002155200241196a2d00002156200241186a2d00002157200241166a2f01002158200241156a2d00002159200241146a2d0000215a200241126a2f0100215b200241116a2d0000215c200241106a2d0000215d2002410e6a2f0100215e2002410d6a2d0000215f200241046a2d00002160200241026a2f0100216141db94c3002104412a211820022d0000450d0b4101216241002163410021640c0c0b20022d000120022d0000720d0120012802042102200341a8036a41086a22044200370300200342003703a80341b0b3c2004114200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200320023602e801200341d8016a4110200341e8016a410410040c460b20022d000120022d000072450d0b0b41b394c3002104412821020c480b41db94c3002104412a210241002108410121072005450d4020061023200128020022054101470d460c450b41db94c3002104412a210241012108410021072005450d3f0c340b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d3c2003201c370398032003200a3a0097032003200b3a0096032003200c3b0194032003200d3a0093032003200e3a0092032003200f3b019003200320103a008f03200320113a008e03200320123b018c03200320133a008b0320032002360087032003200436008303200320143a008203200320153b018003411610262202450d192002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272204450d1a20042003290380033700162004412e6a20034180036a41186a290300370000200441266a20034180036a41106a290300370000411e21022004411e6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044136200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001210520041023419ebdc20021042005417f470d3c200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210b0240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d1920032802e801210b0b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210c200341d8016a411041a886c500410041001001417f460d12200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220d450d1e200341f0016a280200210520032802ec01210c200b2009460d130c140b4101213b4100213c4100213d20022d00014101470d002002410c6a2d0000213c2002410a6a2f0100213d200241096a2d00002111200241066a2f0100410874200241056a2d000072200241086a2d00004118747221044100213b0b203d41ffff0371410874203c41187472201141ff0171722102203b0d3a2003202e3703a8012003202f3a00a701200320303a00a601200320313b01a401200320323a00a301200320333a00a201200320343b01a001200320353a009f01200320363a009e01200320373b019c01200320383a009b0120032002360097012003200436009301200320393a0092012003203a3b019001202741ff01714101470d2f200341e8016a202641067610870120032802e801210420032802f0012026413f7122024d0d08200420024105746a2202290018211d20022d0017211e20022d0016212920022f0014211f20022d0013212020022d0012212a20022f0010212120022d000f212220022d000e212b20022f000c212320022d000b21242002280007213b2002280003213c20022d0002212c20022f0000212d4101211120032802ec01450d2e0c2d0b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d382003201c37039803200320093a0097032003200a3a0096032003200b3b0194032003200c3a0093032003200d3a0092032003200e3b0190032003200f3a008f03200320103a008e03200320113b018c03200320123a008b0320032002360087032003200436008303200320133a008203200320143b018003200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d0341e8bcc2002104411e21020c380b41012162410021634100216420022d00014101470d002002410c6a2d000021642002410a6a2f01002163200241096a2d00002118200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021620b206341ffff0371410874201841ff017172206441187472210220620d36200320553703f002200320563a00ef02200320573a00ee02200320583b01ec02200320593a00eb022003205a3a00ea022003205b3b01e8022003205c3a00e7022003205d3a00e6022003205e3b01e4022003205f3a00e302200320023600df02200320043600db02200320603a00da02200320613b01d8022043201c844200510d03205441ff01714101470d28200341e8016a204d41067610870120032802e801210420032802f001204d413f7122024d0d0a200420024105746a2202290018214420022d0017214520022d0016214f20022f0014214620022d0013214720022d0012215020022f0010214820022d000f214920022d000e215120022f000c214a20022d000b214b200228000721622002280003216320022d0002215220022f000021534101211820032802ec01450d270c260b200141086a290300211c200341a8036a41086a22024200370300200342003703a8034194b4c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c390b411310262202450d132002410f6a41002800c5b542360000200241086a41002900beb542370000200241002900b6b54237000020024113413310272204450d142004200329038003370013411821022004412b6a20034180036a41186a290300370000200441236a20034180036a41106a2903003700002004411b6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044133200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c5004100410010012105200410232005417f460d09200341a8036a2015410676109102410021052015413f71220420032802b0034f0d0520032802a803200441216c6a22042d00004101470d0520042f00012107200441196a290000211c200441186a2d00002108200441176a2d00002106200441156a2f00002109200441146a2d0000210a200441136a2d0000210b200441116a2f0000210c200441106a2d0000210d2004410f6a2d0000210e2004410d6a2f0000210f2004410c6a2d00002110200441086a2800002111200441046a2800002112200441036a2d000021044101210520032802ac030d060c070b2001410c6a2802002102200141106a2d00002140200141116a2f0000211a200141146a2d00002115200141156a2f00002114200141186a2d0000210c200141196a2f0000210b2001411c6a2d000021072001411d6a290000213f20012f0005214220012d0007213c20012d0013211620012d0017211220012d001b210a0c2c0b41f0bdc200210441d00021020c320b4100211120032802ec010d240c250b4100210520032802ec010d270c280b4194bac2002104410b2102410121084100210720050d250c300b20032802ac03450d010b20032802a80310230b2005450d052003201c37038002200320083a00ff01200320063a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320113600ef01200320123600eb01200320043a00ea01200320073b01e801200341e8016a20034180036a4120109604450d0641b7bcc2002104411921020c2c0b4100211820032802ec010d1b0c1c0b4186bdc20021040c2a0b4101210d41002105200b2009470d010b20052009460d0c0b41bcbdc200210441162102200520094d0d0c20034180026a4200370300200341f8016a4200370300200341f0016a4200370300200342003703e801200d20094105746a2207200341e8016a460d0b2007200341e8016a41201096040d0c0c0b0b41d0bcc20021040c260b20034180036a2015109c024200211c200341a8036a41086a22024200370300200342003703a80341a5bcc2004112200341a8036a1000200341d8016a41086a22042002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703b003200342003703a803200341d8016a4110200341a8036a4110410010012205417f460d0a2005410f4d0d0a200341b0036a290300214320032903a80321550c010b42002155420021430b20034180036a20552043102b200342e3ded5f3b6ac9ab6f3003703900120024200370300200342003703a80341af98c300410d200341a8036a100020042002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00200342003703a803200341d8016a4110200341a8036a41084100100141016a41084d0d0720032903a803211c0b2003201c3703b801200341a8036a20034180036a10800220032802ac03210420032802a803210220032802b0032105200341bc036a20034190016a36020020032002200541286c6a3602b403200320023602b003200320043602ac03200320023602a8032003200341b8016a3602b803200341d8026a200341a8036a109d02200341a8036a41086a200341d8026a41086a280200360200200320032903d8023703a80320034180036a200341a8036a1087020c290b200341fc016a4101360200200341013602ac032003418898c4003602a803200342013702ec01200341d497c4003602e8012003200341a8036a3602f801200341e8016a41b4b9c2001061000b41d4aac10041331021000b41164101102a000b41364101102a000b41134101102a000b41334101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b4200211c200341a8036a41086a22024200370300200342003703a80341a1b5c2004115200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d042002410f4d0d04200341f0016a290300211c20032903e80121430c010b420921430b200341386a20034180036a2043201c105b2003280238450d0141d2bdc2002104411e21020b200c450d1a200d10230c1a0b200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021070240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121070b411610262202450d022002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272202450d0320022003290380033700162002412e6a20034180036a41186a290300370000200241266a20034180036a41106a2903003700002002411e6a20034180036a41086a290300370000200341e8016a41186a22044200370300200341e8016a41106a22084200370300200341e8016a41086a22064200370300200342003703e80120024136200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2008290300370300200341a8036a41086a2006290300370300200320032903e8013703a803410410262204450d042004200736000020044104410810272204450d0520042009360004200341a8036a4120200441081004200410232002102302400240024020052009470d00200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220520034180036a41106a290300370300200341e8016a41086a220720034180036a41086a29030037030020032003290380033703e801200c2009470d0a200941016a22022009490d1720094101742208200220022008491b220cad420586221c422088a70d17201ca722024100480d172009450d01200d200941057420021027220d450d020c0a0b200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220720034180036a41106a290300370300200341e8016a41086a220820034180036a41086a29030037030020032003290380033703e801200520094d0d08200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2007290300370000200241086a20082903003700000c0a0b20021026220d0d080b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41164101102a000b41364101102a000b41044101102a000b41084101102a000b41d8b4c200200920051029000b200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2005290300370000200241086a2007290300370000200941016a21050b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341003602f001200342013703e801200320053602a803200341a8036a200341e8016a10410240024002402005450d00200541057421064100200341e8016a41086a28020022046b210720032802e801210920032802ec012108200d210203400240200820076a411f4b0d00200441206a22052004490d102008410174220a20052005200a491b22054100480d10024002402008450d00200920082005102722090d010c060b200510262209450d050b200521080b200920046a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a290000370000200741606a2107200441206a2104200241206a2102200641606a22060d000b200341f0016a2004360200200320083602ec01200320093602e8010c010b200341e8016a41086a280200210420032802ec01210820032802e80121090b200341d8016a411020092004100402402008450d00200910230b0240200c450d00200d10230b200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410121072003200b41016a3602e801200341d8016a4110200341e8016a41041004410021040c160b20054101102a000b200410230b206341d9cac40020181b21042062411520181b21022018450d0e2004214d2002214c0b2003204437039803200320453a0097032003204f3a009603200320463b019403200320473a009303200320503a009203200320483b019003200320493a008f03200320513a008e032003204a3b018c032003204b3a008b032003204c360087032003204d36008303200320523a008203200320533b018003200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80141002102024002400240024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0120032802e80121020b02400240024002402002204e470d00200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d012003200341d8016a3602a803200341103602ac03200342003703e80120034100200341d8016a4110200341e8016a41084100100122022002417f461b22024108200241084922041b22023602b00320040d06200341003602e801200341b0036a4100200341d8016a4110200341e8016a41042002100122042004417f461b22044104200441044922041b20026a36020020040d06200341e8016a200341a8036a102820032802e8012262450d0620032902ec01214442002155200341a8036a41086a22024200370300200342003703a8034190c1c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d072002410f4d0d07200341f0016a290300215520032903e80121650c030b41edbec2002104411121020c1b0b41c0bec2002104412d21020c1a0b420121650b200341a8036a41086a22024200370300200342003703a80341acc1c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021020240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121020b20034180016a206520552002ad4200109804411410262202450d0520034180016a41086a29030021552003290380012165200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b64137000020024114413410272202450d06200220032903d8023700142002412c6a200341d8026a41186a290300370000200241246a200341d8026a41106a2903003700002002411c6a200341d8026a41086a29030037000042002168200341e8016a41186a22044200370300200341e8016a41106a22184200370300200341e8016a41086a22634200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2018290300370300200341a8036a41086a2063290300370300200320032903e8013703a80302400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300216920032903e80121680c010b420021690b2002102302402068206554206920555420692055511b450d0041afbfc2002104412e21022044a70d180c190b200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a108b0220032802e8012218450d0e200341e8016a41086a2802002263450d0f20032802ec0121644180c0c2002104412321022018290300204354201841086a2903002269201c542069201c511b450d0341082158200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d80141002159200341d8016a411041a886c500410041001001417f460d01200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012258450d10200341f0016a280200215a20032802ec0121590c020b41febec2002104413121022044a70d1d0c1e0b4100215a0b2058205a41286c6a2157205821044100214d024002400240024002400340205720046b419f014d0d01200420034180036a460d02204d200420034180036a412010960422564100476a214d2056450d02200441286a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441d0006a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441f8006a225620034180036a460d02200441a0016a2104204d205620034180036a412010960422564100476a214d20560d000c020b0b20572004460d012058205a41286c6a2157034020034180036a2004460d01204d200420034180036a412010960422564100476a214d2056450d012057200441286a2204470d000c020b0b204d2044422088a74f0d010b02402059450d00205810230b20034190016a108c02200341e8016a20034180036a10ef0120032802e8014101470d01200328029001214d2003280298012204450d0520032802ec01216a4121216b204d200441216c6a216c4108216d200341f0016a2802002204410876216e4101216f41012004411f71742170417f217120044105764107712272417f732173420021744201217520034190026a217641202177200341e8016a41206a217841182179200341e8016a41186a217a4110217b20034194026a217c4111217d4190b5c200217e4100217f41a886c500218001411221810141d9c0c200218201419701218301410221840141042185014200216842002169204d2186014101213c0c100b41a3c0c2002104413621022059450d012058102320640d020c030b0240200328029401450d0020032802900110230b41ddbfc20021040b2064450d010b201810230b2044a7450d190c180b4200216842002169410021040c120b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41ecb3c200410041001029000b41d4aac10041331021000b410121040c070b200410230b203c41d9cac40020111b2104203b411520111b21022011450d0b20042126200221250b2003201d3703d0012003201e3a00cf01200320293a00ce012003201f3b01cc01200320203a00cb012003202a3a00ca01200320213b01c801200320223a00c7012003202b3a00c601200320233b01c401200320243a00c301200320253600bf01200320263600bb012003202c3a00ba012003202d3b01b801200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00419fbac2002104412621020c0b0b200341e8016a20034190016a108e02024002400240024002400240024020032903e8014201520d00200341e8016a200341b8016a108e0220032903e8014201520d0120034190026a2802002124200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021110240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80121110b41f3bac20021044116210220112028470d11200341a8036a41086a22044200370300200342003703a80341d4bbc200411b200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80120246a20284f0d030c060b41c5bac2002104411821020c100b41a8bbc2002104412c21020c0f0b410120246a2028490d030b4189bbc2002104411f21020c0d0b41d4aac10041331021000b41d4aac10041331021000b200341e8016a2008410676109102410021110240024002402008413f71220420032802f0014f0d0020032802e801200441216c6a22042d00004101470d0020042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d010c020b20032802ec01450d010b20032802e80110230b02400240024002402011450d002003201d3703f0022003203c3a00ef022003203d3a00ee02200320263b01ec022003201e3a00eb022003201f3a00ea02200320203b01e802200320213a00e702200320223a00e602200320233b01e402200320293a00e3022003202a3600df022003202b3600db02200320043a00da022003203b3b01d802200341e8016a2006410676109102410021112006413f71220420032802f0014f0d0120032802e801200441216c6a22042d00004101470d0120042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d020c030b41ddbac20021040c0d0b20032802ec01450d010b20032802e80110230b024002402011450d002003201d370398032003203c3a0097032003203d3a009603200320263b0194032003201e3a0093032003201f3a009203200320203b019003200320213a008f03200320223a008e03200320233b018c03200320293a008b032003202a360087032003202b36008303200320043a0082032003203b3b018003200341d8026a20034190016a4120109604450d014183bcc2002104411221020c0c0b41efbbc2002104411421020c0b0b024020034180036a200341b8016a4120109604450d004195bcc2002104411021020c0b0b4118212f200341e8016a41186a22a501200341b8016a41186a22a60129030037030041102127200341e8016a41106a22a701200341b8016a41106a22a8012903003703004108212c200341e8016a41086a22a901200341b8016a41086a22aa01290300370300410021042003410036028802200320032903b8013703e801200341a8036a200341e8016a108d020240024020032802b0032223450d0041012111410021ab01417f211e4102212a4120213b200341e8016a41206a21ac0141042129411f2126411e211f411d2120411c2121411b21ad01411a21ae01411921af01411721b001411621b101411521b201411421b301411321b401411221b50141112128410f213a410e2139410d2138410c2137410b2136410a21354109213441ff0121334107213241062131410521304103213d417c21224100212b4100212d41012125410021b6010c010b410121254100212d0c070b4103213c410121040c040b20061023200128020022054101470d100c0f0b203e10230b200441d9cac40020051b21042041411520051b21022005450d070b2003203f3703d001200320073a00cf012003200a3a00ce012003200b3b01cc012003200c3a00cb01200320123a00ca01200320143b01c801200320153a00c701200320163a00c6012003201a3b01c401200320403a00c301200320023600bf01200320043600bb012003203c3a00ba01200320423b01b80141082105200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d8014100210b024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012205450d0620032802ec01210b41282107200341f0016a280200221241286c220c0d010c020b4100211241282107410041286c220c450d010b4100210a0340200341e8016a41206a2005200a6a220441206a290300370300200341e8016a41186a200441186a290300370300200341e8016a41106a200441106a290300370300200341e8016a41086a200441086a290300370300200320042903003703e801200341e8016a200341b8016a41201096040d02200c200a20076a220a470d000b0b4108210741002112200b450d01200510234100210a0c0f0b200341a8036a41206a2207200341e8016a41206a290300370300200341a8036a41186a220c200341e8016a41186a290300370300200341a8036a41106a2214200341e8016a41106a290300370300200341a8036a41086a2215200341e8016a41086a290300370300200320032903e8013703a80320034180036a41206a2216200729030037030020034180036a41186a2207200c29030037030020034180036a41106a220c201429030037030020034180036a41086a22142015290300370300200320032903a80337038003200341d8026a41206a22152016290300370300200341d8026a41186a22162007290300370300200341d8026a41106a221a200c290300370300200341d8026a41086a220c201429030037030020032003290380033703d802412810262207450d03200720032903d802370300200741206a2015290300370300200741186a2016290300370300200741106a201a290300370300200741086a200c290300370300201241286c41586a200a460d01200441286a21424128211a2005201241286c6a224041586a21414101213e4120210c411821164110211541082114422821664220213f41002167410121124101210a4100213c0c040b4100210a0c0d0b410121124101210a0c0b0b41d4aac10041331021000b41284108102a000b410121040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e020001010b2018206341306c6a2157201821040240024002400340205720046b41bf014d0d0141012156200441106a223c20034180036a460d02203c20034180036a4120109604450d02200441c0006a223c20034180036a460d02203c20034180036a4120109604450d02200441f0006a223c20034180036a460d02203c20034180036a4120109604450d02200441a0016a223c20034180036a460d02200441c0016a2104203c20034180036a41201096040d000c020b0b024020042057460d00034041012156200441106a220420034180036a460d02200420034180036a4120109604450d02200441206a22042057470d000b0b4100215620682043852069201c85844200520d0020034180036a41086a290300211d20034180036a41106a290300212e20034180036a41186a290300219001200329038003218b012018201c37030820182043370300200341e8016a41186a209001370300200341e8016a41106a202e370300200341e8016a41086a201d3703002018208b01370310201841186a201d370300201841206a202e370300201841286a2090013703002003208b013703e801206341144b0d01410221910120634102490d1d417f2192012063417f6a21930141302194012018206341306c6a21950141082196014128219701411821980141202199014110219a014103219b0141e800219c014150219d014178219e014170219f01416821a001416021a101415821a201413821a301410121a4014102213c0c0f0b200341c0006a200341d8026a206520551084022003290340211c2003200341c8006a2903003703f0012003201c3703e80141ebc0c2004181c1c20020561b21044116410f20561b21022003200341e8016a3602a803200341a8036a10de0141012105200328029401450d220c210b206341017622be01ad42307e22bf01422088a70d0120bf01a72204417f4c0d01410821090240024002402004450d002004102622c001450d0220c00121c1010c010b410821c001410821c1010b41502113201841506a21c20141302117201841306a21c301201841f07e6a21c401410021c501410421c601417f21c70141012119420321c801422021bf01410321c901410221ca01417d21cb01415821cc01412821104120210f4118210d4110210e417e21cd01417421ce01416421cf0141a87f21d00141a07f21d101410921d20141e80021d301417821d401417021d501416821d601416021d701413821d801410a21d901410421da01410021db01410021dc01206321dd014104213c0c100b20044108102a000b024002400240024002400240024002400240203c0e050001020304040b2042210402400340200341e8016a200c6a223c2004200c6a290300370300200341e8016a20166a2256200420166a290300370300200341e8016a20156a2257200420156a290300370300200341e8016a20146a2258200420146a290300370300200320042903003703e801200341e8016a200341b8016a200c1096040d0120402004201a6a2204470d000c2e0b0b200341a8036a200c6a2242203c290300370300200341a8036a20166a22592056290300370300200341a8036a20156a225a2057290300370300200341a8036a20146a225b2058290300370300200320032903e8013703a80320034180036a200c6a225c204229030037030020034180036a20166a2242205929030037030020034180036a20156a2259205a29030037030020034180036a20146a225a205b290300370300200320032903a80337038003203c205c29030037030020562042290300370300205720592903003703002058205a29030037030020032003290380033703e8010240200a2012470d002012203e6a220a2012490d262012203e742242200a200a2042491b220aad20667e221d203f88a70d26201da722422067480d2602402012450d0020072012201a6c2042102722070d010c060b204210262207450d050b2004201a6a214220072012201a6c6a225920032903e8013703002059200c6a203c290300370300205920166a2056290300370300205920156a2057290300370300205920146a20582903003703002012203e6a211220412004470d0e0c2c0b02402086012d0000206f470d00200341e8016a208601206f6a2257108e0220032903e8012075520d002076280200206a490d002078290300218701207a290300218801200341e8016a207b6a290300218901200341e8016a206d6a290300218a01207c2802002104200341a8036a206d6a22582074370300200320743703a803207e207d200341a8036a1000200341d8016a206d6a22592058290300370300200320032903a8033703d80102400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0720032802a80321560c010b410021560b20582074370300200320743703a803208201208101200341a8036a100020592058290300370300200320032903a8033703d8010240024002400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0a20032802a8032159205620046b2204208301490d020c010b41182159205620046b2204208301490d010b200341e0006a2088012087012059ad2074109804200341e0006a206d6a290300218b012003290360218c010c010b02402004450d002059ad221d20757c228d01201d54ad218e014200218c01208801211d208701212e4200218b010340200341f0006a201d202e208d01208e011097042074202e200341f0006a206d6a2903007d201d2003290370228f0154ad7d229001201d208f017d228f01201d56209001202e56209001202e511b22561b222e208b017c2074208f0120561b221d208c017c228c01201d54ad7c218b01200420716a22040d000c020b0b4200218c014200218b010b200341a8036a20796a205720796a290000370300200341a8036a207b6a2057207b6a29000037030020582057206d6a2900003703002057290000211d200341a8036a20776a206e3602002003201d3703a803200341b8016a200341a8036a108d024200211d4200212e02402072200341b8016a206d6a28020022044f0d00200420736a225620044f0d082087012089017c208801208a017c221d20880154ad7c208b017c201d208c017c229001201d54ad7c207420032802b8012056208401746a28020020707122041b212e209001207420041b211d0b024020032802bc01450d0020032802b80110230b202e20697c201d20687c2268201d54ad7c21690b208601206b6a228601206c470d0e0c100b206320930122042092016a229301490d08024020632093016b2256209101490d00201820042094016c6a220429030020182093012094016c6a223c2903002290015a20042096016a2257290300222e203c2096016a2258290300221d5a202e201d511b0d00200341e8016a2098016a225a203c2097016a2259290300370300200341e8016a209a016a225b203c2099016a225c290300370300200341e8016a2096016a225d203c2098016a225e2903003703002003203c2903103703e801203c200429030037030020582057290300370300203c209a016a2004209a016a290300370300205e20042098016a290300370300205c20042099016a290300370300205920042097016a2903003703004101215702402056209b01490d00203c2903602090015a203c209c016a290300222e201d5a202e201d511b0d004103215720950121580240034020582204209d016a20042903003703002004209e016a20042097016a2903003703002004209f016a20042099016a290300370300200420a0016a20042098016a290300370300200420a1016a2004209a016a290300370300200420a2016a20042096016a2903003703002057225920564f0d01205920a4016a215720042094016a22582903002090015a200420a3016a290300222e201d5a202e201d511b450d000b0b20592092016a21570b20042090013703002004201d370308203c20572094016c6a22042097016a205a29030037030020042099016a205b29030037030020042098016a205d290300370300200420032903e8013703100b209501209d016a2195012093010d0e0c200b2023201e4c0d0520032802ac0321b90120032802a80321ba012023102622b801450d0602402023202a742204450d0020ba0120046a21bb01410021b70120ba0121bc01410021bd010c1c0b410021b7010c200b20dd0121de01410021dd01410121df0120de0120c7016a221b450d1302400240024002400240024002402018201b20176c6a2204290300201820de0120176c22576a223c20d1016a290300222e54200420096a290300229001203c20d0016a290300221d54209001201d511b450d0020c40120576a21040340201b2019460d02202e2004290300228b0154213c201d200420096a2903002290015121df01201d209001542156200420136a2104201b20c7016a211b208b01212e209001211d203c205620df011b0d000c030b0b20de0120cd016a215820c40120576a2104410021dd014100213c03402058203c460d05202e2004290300228b015a21df01201d200420096a290300229001512156201d2090015a2157200420136a2104203c20196a213c208b01212e209001211d20df01205720561b0d000b203c20196a21df0120de01203c6b20c7016a221b0d030c020b4100211b0b20de01201b490d0b20de0120634b0d0d024020de01201b6b22df012019762256450d0020c20120576a21042018201b20176c6a213c0340200341e8016a20106a2257203c20106a2258290300370300200341e8016a200f6a2259203c200f6a225a290300370300200341e8016a200d6a225b203c200d6a225c290300370300200341e8016a200e6a225d203c200e6a225e290300370300200341e8016a20096a225f203c20096a22602903003703002003203c2903003703e801200420096a2261290300211d2004200e6a2245290300212e2004200d6a22462903002190012004200f6a2247290300218b012004290300218c012058200420106a2248290300370300205a208b01370300205c209001370300205e202e3703002060201d370300203c208c0137030020482057290300370300204720592903003703002046205b2903003703002045205d2903003703002061205f290300370300200420032903e801370300203c20176a213c200420136a2104205620c7016a22560d000b0b201b0d010b201b21dd0120db0120dc01460d1b0c1c0b20df0120d2014b0d0120de0120634b0d0a20c301201b20176c6a21e001410121bd010c1d0b20de0121df0120db0120dc01460d150c160b201b21dd0120db0120dc01470d170c160b20424108102a000b41d4aac10041331021000b41d4aac10041331021000b41ecb3c200205620041029000b101d000b20234101102a000b20930120631048000b201b20de011048000b20de01201b417f6a22dd01490d140b20de012063108c01000b4100213c0c030b4101213c0c030b4102213c0c040b410021040c120b410121040c110b410121040c100b410121040c0f0b410121040c0e0b410121040c0d0b410021040c080b410121040c070b410221040c060b410121040c050b410221040c040b410121040c030b410221040c020b410321040c010b410321040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20db0120dc01470d15410121040c1a0b20db0120196a220420db01490d1e20db01201974223c20042004203c491b2204ad20c80186221d20bf0188a70d1e201da7223c20c501480d1e0240024020db01450d0020da0120db0120c90174203c102722da010d010c030b203c102622da01450d020b200421db01410221040c190b20da0120dc0120c901746a220420df01360204200420dd0136020020dc0120196a22e10121dc0120e10120ca01490d02410221bd010c170b203c4104102a000b02400240024020bd010e03000102020b20bc01280200213c203b10262204450d0520bc0120296a21bc012004203c2026763a001f2004203c2011713a00002004203c201f762011713a001e2004203c2020762011713a001d2004203c2021762011713a001c2004203c20ad01762011713a001b2004203c20ae01762011713a001a2004203c20af01762011713a00192004203c202f762011713a00182004203c20b001762011713a00172004203c20b101762011713a00162004203c20b201762011713a00152004203c20b301762011713a00142004203c20b401762011713a00132004203c20b501762011713a00122004203c2028762011713a00112004203c2027762011713a00102004203c203a762011713a000f2004203c2039762011713a000e2004203c2038762011713a000d2004203c2037762011713a000c2004203c2036762011713a000b2004203c2035762011713a000a2004203c2034762011713a00092004203c202c762011713a00082004203c203371223c2032763a00072004203c2031762011713a00062004203c2030762011713a00052004203c2029762011713a00042004203c203d762011713a00032004203c202a762011713a00022004203c2011762011713a00014100215602400240024002400240024002400340200420566a223c203b6a20046b203d4d0d01203c20266a2d00000d02203c201f6a2d00000d03203c20206a2d00000d04205620226a2156203c20216a2d0000450d000b2056203b6a20116a22560d050c060b2056203b6a213c0340203c450d062004203c6a2156203c201e6a2257213c2056201e6a2d0000450d000c040b0b205620266a20116a22560d030c040b2056201f6a20116a22560d020c030b205620206a21570b205720116a2256450d010b0240202320b7016b2056203b2056203b491b223c4f0d0020b701203c6a223c20b701490d1f20232011742257203c203c2057491b223c20ab01480d1f024002402023450d0020b8012023203c102722b8010d010c0a0b203c102622b801450d090b203c21230b20b80120b7016a21574100213c02400340203c203b460d012057203c6a2004203c6a2d00002011713a00002056203c20116a223c470d000b0b20b701203c6a21b7010b2004102320bc0120bb01470d0f0c1b0b20de01201b20c7016a22dd01490d18024020de0120dd016b22df0120ca01490d002018201b20176c6a2204290300201820dd0120176c6a223c2903002290015a200420096a2256290300222e203c20096a2257290300221d5a202e201d511b0d00200341e8016a200d6a2259203c20106a2258290300370300200341e8016a200e6a225a203c200f6a225b290300370300200341e8016a20096a225c203c200d6a225d2903003703002003203c2903103703e801203c200429030037030020572056290300370300203c200e6a2004200e6a290300370300205d2004200d6a290300370300205b2004200f6a2903003703002058200420106a29030037030041012156024020df0120c901490d00203c2903602090015a203c20d3016a290300222e201d5a202e201d511b0d004103215620e0012157024003402057220420136a2004290300370300200420d4016a200420106a290300370300200420d5016a2004200f6a290300370300200420d6016a2004200d6a290300370300200420d7016a2004200e6a290300370300200420cc016a200420096a2903003703002056225820df014f0d01205820196a2156200420176a22572903002090015a200420d8016a290300222e201d5a202e201d511b450d000b0b205820c7016a21560b20042090013703002004201d370308203c205620176c6a220420106a20592903003703002004200f6a205a2903003703002004200d6a205c290300370300200420032903e8013703100b20dd01450d1120e00120136a21e00120dd01211b20df0120d901490d0f410021040c170b024002400240024020da0120e101225b20c7016a22e10120c901746a2204280200450d0020da01205b20c901746a225820ce016a28020022572004280204223c4d0d00410221dc01205b41024d0d0420da01205b20cb016a220420c901746a2802042256203c20576a4d0d01410321dc01205b41034d0d04205820cf016a280200205620576a4d0d010c050b205b20c901490d012004280204213c20da01205b20cb016a220420c901746a28020421560b2056203c490d010b205b20cd016a21040b205b200420196a22604d0d05205b20044d0d0620da01200420c901746a225d2802042261205d2802006a220420da01206020c901746a225e280200225f490d07200420634b0d08205d20c6016a21452018205f20176c6a225a205e280204225c20176c223c6a2156200420176c21dc01024002400240024002402004205f6b2258205c6b2204205c4f0d0020c0012056200420176c223c1094041a20c101203c6a2157205c2019480d0120042019480d0120c20120dc016a21dc0120562104034020dc01200420136a2256205720136a22582058290300205629030054205720cc016a290300221d200420cc016a290300222e54201d202e511b22591b223c29030037030020dc0120106a203c20106a29030037030020dc01200f6a203c200f6a29030037030020dc01200d6a203c200d6a29030037030020dc01200e6a203c200e6a29030037030020dc0120096a203c20096a2903003703002057205820591b2157205a2056200420591b22044f0d0420dc0120136a21dc0120c101213c20c1012057490d000c050b0b20c001205a203c1094041a20c101203c6a2157205c2019480d012058205c4c0d01201820dc016a215920c101213c205a2104034020042056203c2056290300203c29030054205620096a290300221d203c20096a290300222e54201d202e511b22581b22dc01290300370300200420106a20dc0120106a2903003703002004200f6a20dc01200f6a2903003703002004200d6a20dc01200d6a2903003703002004200e6a20dc01200e6a290300370300200420096a20dc0120096a290300370300203c203c20176a20581b213c200420176a2104205620176a205620581b225620594f0d042057203c4b0d000c040b0b205621040c010b205a21040b20c101213c0b2004203c2057203c6b22dc0120dc012017706b1094041a20452061205c6a360200205d205f360200205e205e20096a206020c70173205b6a20c901741095041a20e10121dc0120e10120194b0d0f0b20dd010d080c010b205b21dc0120dd010d080b024020db01450d0020da0110230b20be01450d1520c00110230c150b41204101102a000b203c4101102a000b41b0a8c1002060205b1029000b41b0a8c1002004205b1029000b205f20041048000b20042063108c01000b4104213c0c010b4104213c0c010b410121040c0e0b410121040c0d0b410021bd010c040b410121bd010c040b410221bd010c040b410021040c050b410221040c040b410321040c030b410321040c020b410321040c010b410321040c000b0b20dd0120de011048000b200320633602f001200320643602ec01200320183602e801200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108a0202402064450d00201810230b41002105410021042003280294010d040c050b024020b901450d0020ba0110230b02400240024002400240202d202b6b20b7014f0d00202b20b7016a2204202b490d06202d201174223c20042004203c491b223c20ab01480d0602400240202d0d00203c10262225450d050c010b2025202d203c10272225450d040b203c212d2025202b6a20b80120b7011094041a20230d010c020b202b20b7016a21042025202b6a20b80120b7011094041a2023450d010b20b80110230b20ac0120b60120116a22b60136020020a50120a60129030037030020a70120a80129030037030020a90120aa01290300370300200320032903b8013703e801200341a8036a200341e8016a108d022004212b200341a8036a202c6a28020022230d010c040b203c4101102a000b4103213c410121040c000b0b101e000b024020032802ac03450d0020032802a80310230b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210202400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220c450d02200341f0016a280200210220032802ec01210d0c010b4101210c4100210d0b02400240200241ffffff3f7122022004200420024b1b2205450d004100210420034180026a2107200341f8016a2109200341f0016a210a200c210203400240202520046a2d0000450d002007420037030020094200370300200a4200370300200342003703e801200341e8016a2002460d002002200341e8016a4120109604450d00200341e8016a200210ef014101210b20032802e8014101470d0020032802ec0120244d0d030b200241206a2102200441016a22042005490d000b0b4100210b0b0240200d450d00200c10230b0240202d450d00202510230b20034190016a200341b8016a200b1b220520082006200b1b109c02200342e3ded5f3b6ac9ab6f3003703b0014200211c200341a8036a41086a22024200370300200342003703a80341af98c300410d200341a8036a1000200341d8016a41086a22072002290300370300200320032903a8033703d80142002143024002400240200341d8016a411041a886c500410041001001417f460d00200342003703e801200341d8016a4110200341e8016a41084100100141016a41084d0d0120032903e80121430b200320433703d801200341e8016a200510800220032802ec01210820032802e801210420032802f0012106200341fc016a200341b0016a36020020032004200641286c6a3602f401200320043602f001200320083602ec01200320043602e8012003200341d8016a3602f801200341a8036a200341e8016a109d02200341e8016a41086a2002280200360200200320032903a8033703e8012005200341e8016a10870220024200370300200342003703a80341a5bcc2004112200341a8036a100020072002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d032002410f4d0d03200341f0016a290300214320032903e801211c200b450d010c090b42002143200b0d080b200341286a20034190016a10340240024002402003290328200341306a290300844200510d00411810262202450d07200241106a410029008db741370000200241086a4100290085b741370000200241002900fdb64137000020024118413810272202450d08200220032903b801370018200241306a200341b8016a41186a290300370000200241286a200341b8016a41106a290300370000200241206a200341b8016a41086a29030037000042002155200341e8016a41186a22044200370300200341e8016a41106a22054200370300200341e8016a41086a22074200370300200342003703e80120024138200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2005290300370300200341a8036a41086a2007290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001417f460d01200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300214420032903e80121552002102341142104411410262202450d020c090b4193b5c1002104412221020c0d0b4200214420021023411421044114102622020d070b20044101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41184101102a000b41384101102a000b200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b641370000024020022004413410272202450d0020022003290390013700142002412c6a20034190016a41186a2204290300370000200241246a20034190016a41106a2903003700002002411c6a20034190016a41086a29030037000042002165200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803024002400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012205417f460d022005410f4d0d02200341f0016a290300217420032903e80121650c010b420021740b2002102320034190016a2065201c20552055201c56204420435620442043511b22021b221c7c223f20742043204420021b22437c203f206554ad7c10df01200341b8016a2055201c7d204420437d2055201c54ad7d10fe01200341f5016a200341b8016a41086a290300370000200341fd016a200341b8016a41106a29030037000020034185026a200341b8016a41186a2903003700002003418d026a20032903900137000020034195026a20034190016a41086a2903003700002003419d026a20034190016a41106a290300370000200341a5026a2004290300370000200341003a00ec01200341063a00e801200320032903b8013700ed0141a886c5004100200341e8016a102c0c0a0b41d4aac10041331021000b41344101102a000b200341186a20034190016a201c20431093022003290318211c2003200341186a41086a2903003703f0012003201c3703e8012003200341e8016a3602a803200341a8036a10de01200341f5016a20034190016a41086a290300370000200341fd016a200341a0016a29030037000020034185026a200341a8016a290300370000200341013a00ec01200341063a00e80120032003290390013700ed0141a886c5004100200341e8016a102c0c070b204d10230b02402005450d0002402064450d00201810230b2044a70d010c020b2044a7450d010b206210230b41012107410121080b200128020022054101460d040c050b200b450d00200510230b200320123602f0012003200a3602ec01200320073602e801200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108f020240200a450d00200710230b200341e8016a41186a200341b8016a41186a290300370300200341e8016a41106a200341b8016a41106a290300370300200341e8016a41086a200341b8016a41086a290300370300200320032903b8013703e80141012107200341e8016a41011090024100210441012108200128020022054101470d030c020b41002104410121070b41012108200128020022054101470d010b2008450d01200141086a280200450d01200128020410230c010b20054102470d002007450d00200141086a280200450d00200128020410230b2000200236020420002004360200200341d0036a24000bcc310b067f057e017f017e017f017e017f017e017f047e087f23004180026b22052400200541e8006a41086a220642003703002005420037036841e8b4c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024002400240024002400240024020054190016a411041a886c500410041001001417f460d00200542103702e401200520054190016a3602e001200541386a200541e0016a102820052802382208450d02200541c0006a2802002107200528023c21090c010b41012108410021090b200541e8006a41086a220642003703002005420037036841c4b3c2004114200541e8006a100020054190016a41086a220a20062903003703002005200529036837039001024020054190016a411041a886c500410041001001417f460d0041bec1c2002106412e210720090d030c040b20064200370300200542003703684190b5c2004111200541e8006a1000200a2006290300370300200520052903683703900102400240024020054190016a411041a886c500410041001001417f460d002005410036023820054190016a4110200541386a41044100100141016a41044d0d0220052802382003470d010c040b41002003460d030b41ecc1c20021064114210720090d030c040b41d4aac10041331021000b41d4aac10041331021000b0240024002402007450d002007200241086a280200220a4f0d0141c1c2c2002106413c210720090d030c040b4180c2c200210641c10021070c010b200541286a20011034200541286a41086a290300210b2005290328210c200541386a2001108e02024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052903384201520d00200541d8006a290300210d200541d0006a290300210e200541c8006a290300210f200541e4006a280200211020052903402111200541c0016a2004410676109102410021122004413f71220620052802c8014f0d0120052802c001200641216c6a22062d00004101470d01200541aa016a200641036a2d00003a000020054190016a41086a200641146a2900003703002005419d016a200641196a290000370000200520062f00013b01a80120052006410c6a29000037039001200641086a2800002107200641046a28000021064101211220052802c4010d020c030b411410262206450d1d200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d1e200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002113200541e0016a41186a22074200370300200541e0016a41106a22124200370300200541e0016a41086a22144200370300200542003703e00120064134200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2012290300370300200541c0016a41086a2014290300370300200520052903e0013703c001200541c0016a412041a886c500410041001001417f460d03200542003703e801200542003703e001200541c0016a4120200541e0016a4110410010012207417f460d1b2007410f4d0d1b200541e8016a290300210e20052903e00121150c040b20052802c401450d010b20052802c00110230b024002402012450d0020054188016a41026a200541a8016a41026a2d00003a0000200541c0016a41086a20054190016a41086a290300370300200541c0016a410d6a20054190016a410d6a290000370000200520052f01a8013b01880120052005290390013703c001410021040c010b410121044113210741fdc2c20021060b20054184016a41026a221220054188016a41026a2d00003a0000200541e8006a41086a2214200541c0016a41086a290300370300200541e8006a41106a200541c0016a41106a290300370300200520052f0188013b018401200520052903c00137036820040d2a200541f3016a2014290300370000200541f8016a200541f5006a290000370000200520052f0184013b01e001200520073600e701200520063600e301200520052903683700eb01200520122d00003a00e201200541e0016a2001460d02200541e0016a20014120109604450d024190c3c20021064111210720090d2b0c2c0b420021154200210e0b20061023200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d192006410f4d0d19200541e8016a290300210d20052903e00121130c010b4200210d0b02402015201358200e200d58200e200d511b0d00200541e0016a2004410676221210910241002106024020052802e8012004413f7122074d0d004101410220052802e001200741216c6a2d00001b21060b024020052802e401450d0020052802e00110230b200641024f0d02200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1d20052802e00121070b200541a8016a200710910220052802b0012206450d06200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200541c0016a2104200641c000470d0b0c0c0b41a1c3c20021064134210720090d290c2a0b200541e8006a41086a220642003703002005420037036841d9c0c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d01200541003602c00120054190016a4110200541c0016a41044100100141016a41044d0d1920052802c0012107200320106b22064197014f0d020c030b200541e8006a2012109102200541e0016a41186a2204200141186a290000370300200541e0016a41106a2214200141106a290000370300200541e0016a41086a2210200141086a290000370300200520012900003703e0012005280270220620074d0d1f20052802682216200741216c6a220620052903e001370001200641013a0000200641096a2010290300370000200641116a2014290300370000200641196a2004290300370000410e10262206450d20200641066a41002900a6b642370000200641002900a0b6423700002006410e411c10272206450d212006201236000e200541e0016a41186a22074200370300200541e0016a41106a22044200370300200541e0016a41086a22124200370300200542003703e00120064112200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2004290300370300200541c0016a41086a2012290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541e8006a200541e0016a109e0220061023200528026c450d0a201610230c0a0b41182107200320106b2206419701490d010b2005200e200d2007ad4200109804200541086a2903002117200529030021150c030b2006450d012007ad221342017c2218201354ad2119200541186a210442002115420021170340200541106a200e200d201820191097044200200d20042903007d200e2005290310221a54ad7d2213200e201a7d221a200e562013200d562013200d511b22071b220d20177c4200201a20071b220e20157c2215200e54ad7c21172006417f6a22060d000c030b0b4200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a2004290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d02200542003703c801200542003703c00120054190016a4110200541c0016a4110410010012204417f460d1e2004410f4d0d1e200541c8016a290300210d20052903c001210e0c030b42002115420021170b2017200f7c201520117c220e201554ad7c210d0c050b4200210d0b200541e0016a2001200e200d4108108502024020052802e0014101470d0020052802e801210720052802e401210620052802ac01450d1f20052802a801102320090d200c210b20052903e801210e2005200541e0016a41106a2903003703e8012005200e3703e0012005200541e0016a3602c001200541c0016a10de014200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a200429030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012204417f460d1e2004410f4d0d1e200541e8016a290300210d20052903e001210e0c010b4200210d0b200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200b200d7d200c200e54ad7d210b200c200e7d210c200541c0016a21040b200541e0016a41186a200441186a290000370300200541e0016a41106a200441106a290000370300200541e0016a41086a200441086a290000370300200520042900003703e001024002400240024020052802ac012006470d00200641016a22042006490d0720064101742212200420042012491b2214ad42217e220e422088a70d07200ea722124100480d072006450d0120052802a801200641216c2012102722040d020c200b20052802a80121040c020b201210262204450d1e0b200520143602ac01200520043602a8010b200541a8016a41086a200641016a3602002004200641216c6a220420052903e001370001200441013a0000200441096a200541e0016a41086a290300370000200441116a200541e0016a41106a290300370000200441196a200541f8016a2903003700002006413f470d00200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a200629030037030020052005290368370390012005200741016a3602e00120054190016a4110200541e0016a410410040b200541e0016a41086a200541a8016a41086a280200360200200520052903a8013703e0012007200541e0016a109f020b4200210e200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d112006410f4d0d11200541e8016a290300210d20052903e001210e0c010b4200210d0b200541206a2001200e200d105b024020052802202206450d002005280224210720090d1d0c1e0b200541e8006a41086a220642003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1220052802e00141016a21060c010b410121060b4200210e200541e8006a41086a220742003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a20072903003703002005200529036837039001200520063602e00120054190016a4110200541e0016a410410044200210d0b200542e3ded5f3b6ac9ab6f3003703b801200541b8016a2001200c200b427f410f1062200541d0006a200b3703002005200c3703482005200d3703402005200e3703382005200336025c20052003360258411310262206450d102006410f6a41002800c5b542360000200641086a41002900beb542370000200641002900b6b54237000020064113413310272206450d11200620012900003700132006412b6a200141186a290000370000200641236a200141106a2900003700002006411b6a200141086a290000370000200541e0016a41186a22074200370300200541e0016a41106a22034200370300200541e0016a41086a22044200370300200542003703e00120064133200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2003290300370300200541c0016a41086a2004290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541386a200541e0016a10ed01200610232002280204211420022802002103024002400240024002400240200a410576221b450d00201b41027422061026221c450d18201c211d200a0d010c020b4104211c4104211d200a450d010b0240201b0d0041041026221c450d1c4101211b201c211d0b201d4100360200200a417f6a210441012116410021024100210602400340201620024d0d08201d20024102746a22072007280200200320066a2d00002006411f71746a360200200620044f0d0102400240200641016a2206411f71450d00200a20064b0d020c010b0240201b2016470d00201b41016a2207201b490d08201b4101742212200720072012491b2207ad420286220e422088a70d08200ea722124100480d0802400240201b450d00201c201b41027420121027221c0d010c110b20121026221c450d100b201c211d2007211b0b201d20164102746a4100360200200241016a2102201641016a2116200a20064b0d010b0b41ecb3c2002006200a1029000b02402014450d00200310230b4100211e0340200541386a41186a2203200141186a290000370300200541386a41106a220a200141106a290000370300200541386a41086a2204200141086a290000370300200520012900003703382016410820164108491b221f410274212002400240201f450d00202010262221450d0d2021201d20201094042102201f21074113102622060d010c0a0b410421214104210241002107411310262206450d090b2006410f6a410028009cb642360000200641086a4100290095b6423700002006410029008db64237000020064113413310272206450d09200620052903383700132006412b6a2003290300370000200641236a200a2903003700002006411b6a20042903003700002006413341e60010272222450d0a2022201e360033200541e0016a41186a22064200370300200541e0016a41106a22034200370300200541e0016a41086a22104200370300200542003703e00120224137200541e0016a1002200541c0016a41186a2006290300370300200541c0016a41106a2003290300370300200541c0016a41086a2010290300370300200520052903e0013703c00120104100360200200542013703e00120052007360268200541e8006a200541e0016a104102400240024020070d0020052802e4012106200541c0016a412020052802e001220a2010280200100420060d010c020b200741027421044100201028020022066b210720052802e40121030340200228020021140240024002400240200320076a41044f0d00200641046a220a2006490d0c20034101742212200a200a2012491b22124100480d0c2003450d0120052802e001200320121027220a0d020c0d0b20052802e001210a0c020b20121026220a450d0b0b200520123602e4012005200a3602e001201221030b200241046a21022010200641046a2212360200200a20066a20143600002007417c6a2107201221062004417c6a22040d000b200541c0016a4120200a201210042003450d010b200a10230b2016201f6b2116202210230240201f450d00202110230b201d20206a211d201e41016a211e20160d000b201b450d01201c10234100210620090d020c030b2014450d00200310230b410021062009450d010b200810230b0c1d0b101e000b20124101102a000b41d8b4c200200220161029000b41134101102a000b41334101102a000b41e6004101102a000b20204104102a000b20124104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41134101102a000b41334101102a000b20064104102a000b41d8b4c200200720061029000b410e4101102a000b411c4101102a000b41d4aac10041331021000b41044104102a000b41d4aac10041331021000b20124101102a000b2009450d010b200810230b200241046a280200450d00200228020010230b200020073602042000200636020020054180026a24000bf909010c7f23004190016b22022400200241086a20014106762203109102024002400240200228021022042001413f7122014d0d002002280208200141216c6a22012002290028370001200141003a0000200141096a200241286a41086a2204290000370000200141116a200241286a41106a290000370000200141196a200241c0006a2900003700002004200241086a41086a280200360200200220022903083703282003200241286a109f02200442003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a200429030037030020022002290328370370417f210102400240200241f0006a411041a886c500410041001001417f460d0020024100360228200241f0006a4110200241286a41044100100141016a41044d0d012002280228417f6a21010b200241286a41086a220342003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a220520032903003703002002200229032837037020022001360228200241f0006a4110200241286a41041004200241286a41186a2206200041186a2207290000370300200241286a41106a2208200041106a22092900003703002003200041086a220a2900003703002002410036024820022000290000370328200241186a200241286a108d0202400240024002402002280220450d00410021040340200241d0006a41186a220b2007290000370300200241d0006a41106a220c2009290000370300200241d0006a41086a220d200a29000037030020022000290000370350411310262201450d042001410f6a410028009cb642360000200141086a4100290095b6423700002001410029008db64237000020014113413310272201450d02200120022903503700132001412b6a200b290300370000200141236a200c2903003700002001411b6a200d2903003700002001413341e60010272201450d03200120043600332006420037030020084200370300200342003703002002420037032820014137200241286a1002200241f0006a41186a2006290300370300200241f0006a41106a20082903003703002005200329030037030020022002290328370370200241f0006a4120100320011023200441016a21040240200228021c450d00200228021810230b200241286a41206a200436020020062007290000370300200820092900003703002003200a29000037030020022000290000370328200241186a200241286a108d02200241186a41086a2802000d000b0b0240200228021c450d00200228021810230b411310262201450d052001410f6a41002800c5b542360000200141086a41002900beb542370000200141002900b6b54237000020014113413310272201450d06200120002900003700132001412b6a200041186a290000370000200141236a200041106a2900003700002001411b6a200041086a290000370000200241286a41186a22044200370300200241286a41106a22034200370300200241286a41086a220642003703002002420037032820014133200241286a1002200241f0006a41186a2004290300370300200241f0006a41106a2003290300370300200241f0006a41086a200629030037030020022002290328370370200241f0006a412010032001102320024190016a24000f0b41334101102a000b41e6004101102a000b41134101102a000b41d4aac10041331021000b41d8b4c200200120041029000b41134101102a000b41334101102a000bdb0a03087f047e0b7f230041a0016b2202240002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f8006a41186a2107200141146a2108034020032004220941286a2204360200200941086a290300210a200941106a290300210b200941186a290300210c2009290300210d200241f8006a41206a200941206a2903003703002007200c370300200241f8006a41106a220e200b370300200241f8006a41086a200a3703002002200d3703780240200e2903002006290300580d002008280200220e2007460d002007290000200e290000520d030b20052004470d000b200521040b2000410036020820004208370200024020042005460d00200141086a2004200541586a20046b41286e41286c6a41286a3602000b02402001280204450d00200128020010230b200241a0016a24000f0b200241d0006a41206a2204200241f8006a41206a290300370300200241d0006a41186a2207200241f8006a41186a290300370300200241d0006a41106a2203200241f8006a41106a290300370300200241d0006a41086a2208200241f8006a41086a29030037030020022002290378370350200241286a41206a220f2004290300370300200241286a41186a22042007290300370300200241286a41106a22072003290300370300200241286a41086a2203200829030037030020022002290350370328200241206a2208200f290300370300200241186a22102004290300370300200241106a22042007290300370300200241086a22072003290300370300200220022903283703000240024002400240024041281026220f450d00200f2002290300370300200f41206a2008290300370300200f41186a2010290300370300200f41106a2004290300370300200f41086a2007290300370300200128020421112001280200211241012101024002400240200541586a2009460d00200e200241f8006a41186a2204460d02200941286a2113200541586a2114410121014101211003402013210902400340200241f8006a41206a2207200941206a2903003703002004200941186a290300370300200241f8006a41106a2203200941106a290300220a370300200241f8006a41086a2208200941086a290300370300200220092903003703780240200a2006290300580d002004290000200e290000520d020b2005200941286a2209470d000c040b0b200241d0006a41206a22132007290300370300200241d0006a41186a22152004290300370300200241d0006a41106a22162003290300370300200241d0006a41086a2217200829030037030020022002290378370350200241286a41206a22182013290300370300200241286a41186a22132015290300370300200241286a41106a22152016290300370300200241286a41086a22162017290300370300200220022903503703282007201829030037030020042013290300370300200320152903003703002008201629030037030020022002290328370378024020102001470d00200141016a22102001490d0720014101742213201020102013491b2210ad42287e220a422088a70d07200aa722134100480d0702402001450d00200f200141286c20131027220f0d010c070b20131026220f450d060b200941286a2113200f200141286c6a22152002290378370300201541206a2007290300370300201541186a2004290300370300201541106a2003290300370300201541086a2008290300370300200141016a210120142009470d000c020b0b410121100b2011450d050c040b4101211020110d030c040b41284108102a000b20134108102a000b101e000b201210230b20002001360208200020103602042000200f360200200241a0016a24000bc60501087f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002104102400240024002400240024002402000450d00200041216c2104200241086a21050240034002400240024002400240024002400240024002400240024020032d00004101470d002002280204220020052802002206470d01200641016a22002006490d0f20064101742207200020002007491b22004100480d0f2006450d03200228020020062000102722070d040c100b2002280204220020052802002206470d01200641016a22002006490d0e20064101742207200020002007491b22004100480d0e2006450d05200228020020062000102722070d060c100b200228020021070c030b200228020021070c050b200010262207450d0c0b20022000360204200220073602000b2005200641016a2208360200200720066a41013a00000240200020086b41204f0d00200841206a22092008490d0a20004101742206200920092006491b22064100480d0a2000450d04200720002006102722070d050c0d0b200641216a21090c050b200010262207450d0a0b20022000360204200220073602000b2005200641016a2209360200200720066a41003a0000200341216a21032004415f6a22040d030c040b200610262207450d080b2002200636020420022007360200200621000b20052009360200200720086a220641086a200341016a220841086a290000370000200641106a200841106a290000370000200641186a200841186a29000037000020062008290000370000200341216a21032004415f6a22040d000b0b200128020020012802042007200910042000450d060c050b200228020421002001280200200128020420022802002207200241086a280200100420000d040c050b101e000b20004101102a000b20004101102a000b20064101102a000b200710230b200241106a24000b840201047f230041c0006b2202240002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272203450d012003200036000e200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034112200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a109e02200310230240200141046a280200450d00200128020010230b200241c0006a24000f0b410e4101102a000b411c4101102a000ba20d010e7f230041e0006b220224000240024020012802042203200128020022046b418001490d00200141046a210503402001200441206a360200200141086a220628020022032802282107200341306a2802002108200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a220b2003290300370300200241106a220c2009290300370300200241086a220d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d0020062802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20052802002203200128020022046b41ff004b0d000b0b024020042003460d00200141046a210c03402001200441206a360200200141086a220b28020022032802282106200341306a2802002107200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a2003290300370300200241106a2009290300370300200241086a200a29030037030020022002290340370300200241003602402006200720024120200241c0006a100a2108024020022802402207417f460d00200b2802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20012802002204200c280200470d000b0b20004100360200200241e0006a24000f0b20002008360204200020043602002000410c6a2007360200200041086a2007360200200241e0006a24000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b22064190016d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4290017e2209422088a70d032009a722084100480d032002450d01200028020020024190016c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b200220034190016c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641e8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42e8007e2209422088a70d032009a722084100480d032002450d012000280200200241e8006c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b2002200341e8006c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0bcd0201077f230041106b220224002002410036020c2002410c6a20012802002203200128020422044104200441044922051b22061094041a2001200420066b3602042001200320066a3602000240024002400240024002400240024020050d00200228020c21052002200110452002280200450d0320022802042204417f4c0d042004450d01200410ac012203450d0520032001280200200141046a22072802002206200420062004491b22061094041a200728020022082006490d062007200820066b3602002001200128020020066a36020020062004470d020c070b20004100360204200241106a24000f0b4101210341002004460d050b2004450d00200310230b20004100360204200241106a24000f0b101d000b20044101102a000b200620081048000b2000200436020820002003360204200020053602002000410c6a2004360200200241106a24000bdb0201057f230041106b220224002002410036020c20014100200128020020012802042002410c6a41042001280208100122032003417f461b22034104200341044922031b20012802086a360208024002400240024002400240024020030d00200228020c210420022001104a2002280200450d0320022802042203417f4c0d042003450d01200310ac012205450d05200141086a2206200341002001280200200141046a280200200520032006280200100122012001417f461b2201200120034b1b220120062802006a36020020012003470d020c060b20004100360204200241106a24000f0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d040b2003450d00200510230b20004100360204200241106a24000f0b101d000b20034101102a000b2000200336020820002005360204200020043602002000410c6a2003360200200241106a24000b8203010a7f230041106b220224002002200110450240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d01200310262204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b1094041a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008102722040d010c090b200810262204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d00200410230b200241106a24000f0b200b20091048000b101e000b20084101102a000b101d000b20034101102a000bf502010a7f230041106b2202240020022001104a024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d01200310262204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001001210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009102722040d010c080b200910262204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d00200410230b200241106a24000f0b101e000b20094101102a000b101d000b20034101102a000bed0504027f017e0f7f017e230041f0006b22022400200241086a200110450240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b410021114100210e0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200241d0006a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370350200241d0006a2001280200220f200a28020022054120200541204922101b22111094041a200a200520116b22053602002001200f20116a221136020020100d01200241306a41186a22102007290300370300200241306a41106a22122008290300370300200241306a41086a221320092903003703002002200229035037033020024200370350200241d0006a20112005410820054108491b220f1094041a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903502104200241106a41186a220f2010290300370300200241106a41106a22102012290300370300200241106a41086a22122013290300370300200220022903303703100240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005102722060d010c060b200510262206450d050b2006200c6a22052002290310370300200541186a200f290300370300200541106a2010290300370300200541086a2012290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d00200610230b200241f0006a24000f0b2000200e36020420002006360200200041086a2011360200200241f0006a24000f0b101e000b20054108102a000be60403027f017e0b7f230041106b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d01200510262206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210e4100210c0c020b20054104102a000b200141086a2107200141046a2108410021094100210a4100210b2003210c034020022001104a0240024002402002280200450d0020022802042205417f4c0d07024002402005450d00200510ac01220d450d0320072005410020012802002008280200200d200520072802001001220e200e417f461b220e200e20054b1b220e20072802006a360200200e2005470d010c040b4101210d2001280200200828020041014100200728020010011a41002005460d030b2005450d00200d10230b200041003602000240200b450d002006210503400240200541046a280200450d00200528020010230b2005410c6a2105200a41746a220a0d000b0b0240200c450d00200610230b200241106a24000f0b20054101102a000b200b41016a210e0240200b200c470d002009200e200e2009491b220cad420c7e2204422088a70d032004a7220f4100480d030240200b450d002006200a200f102722060d010c050b200f10262206450d040b2006200a6a220b200d360200200b41046a2005ad2204422086200484370200200941026a2109200a410c6a210a200e210b200e2003490d000b0b2000200c36020420002006360200200041086a200e360200200241106a24000f0b101e000b200f4104102a000b101d000bb00d03027f017e167f230041f0006b22022400200241106a2001104a02400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b41002111410021100c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200141086a210a200241d0006a41186a210b200241d0006a41106a210c200241e3006a220d41056a210e4100210f20032110410021110340200241003a00502001280200200141046a2212280200200241d0006a4101200a28020010012105200a200a280200200541016a41014b22056a2213360200024002400240024002400240024002400240024002402005450d004105211420022d0050220541064b0d08024020050e07000b030b020405000b200241086a2001104a2002280208450d08200228020c2215417f4c0d102015450d05201510ac012205450d07200a201541002001280200201228020020052015200a280200100122122012417f461b2212201220154b1b2212200a2802006a36020020122015470d060c090b410521140c070b200241d0006a200110a40220022802542215450d0620022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410221140c080b200b4200370300200c4200370300200241d0006a41086a420037030020024200370350200a410020012802002012280200200241d0006a41202013100122052005417f461b2205412020054120491b200a2802006a3602002005411f4d0d05200241c0006a41086a200941086a280000360200200220092900003703402002200d2900003703302002200e29000037003520022f0150210520022d0052211420022800532117200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201741087621162005201441107472211a41002114200228024021150c070b200241d0006a200110a40220022802542215450d0420022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410321140c060b200241d0006a200110a40220022802542215450d0320022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410121140c050b410121052001280200201228020041014100200a28020010011a41002015460d030b2015450d01200510230c010b20154101102a000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022015ad22044220862004843703402005410876211641042114200521170b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020144105460d0220022802442112200241186a41106a2213200c280200360200200241186a41086a2218200241d0006a41086a29020037030020022002290250370318024020112010470d00201041016a22052010490d0420104101742219200520052019491b2205ad42247e2204422088a70d042004a722194100480d04024002402010450d002006201041246c2019102722060d010c070b201910262206450d060b200521100b2006200f6a220520143a00002005410c6a2012360200200541086a2015360200200541046a2016410874201741ff017172360200200541036a201a4110763a0000200541016a201a3b0000200541206a2013280200360200200541186a2018290300370200200541106a2002290318370200200f41246a210f201141016a22112003490d000b0b2000201036020420002006360200200041086a2011360200200241f0006a24000f0b2000410036020002402011450d002006210503400240024020052d0000220a41034b0d00024002400240200a0e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200f415c6a220f0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200f415c6a220f0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200f415c6a220f0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200f415c6a220f0d000b0b02402010450d00200610230b200241f0006a24000f0b101e000b20194104102a000b101d000bb30405027f017e077f017e017f230041e0056b2202240020022001104502400240024002400240024002400240024002402002280200450d0020022802042203ad42f8017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241e0056a24000f0b4108210620030d030b4100210b4100210a0c030b101d000b20054108102a000b200241f8016a41f8006a21074100210841002105410021092003210a0340200241f8016a2001109402200241f0046a200241f8016a41f0001094041a200241f8016a41f0006a2903002104200241f0036a20074180011094041a20044203510d02200941016a210b20024188016a200241f0046a41f0001094041a200241086a200241f0036a4180011094041a02402009200a470d002008200b200b2008491b220aad42f8017e220c422088a70d04200ca7220d4100480d0402402009450d0020062005200d102722060d010c060b200d10262206450d050b200620056a20024188016a41f000109404220941f0006a2004370300200941f8006a200241086a4180011094041a200841026a2108200541f8016a2105200b2109200b2003490d000b0b2000200a36020420002006360200200041086a200b360200200241e0056a24000f0b2000410036020002402009450d0020064188016a210b0340200b1024200b41f8016a210b200541887e6a22050d000b0b0240200a450d00200610230b200241e0056a24000f0b101e000b200d4108102a000be30a04177f027e087f017e23004180016b220224000240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014621094100210a0340024002400240024002400240024002400240200a0e020001010b2003200441206a220b360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a290000370300200220042900003703604100210a0240024020090d002008450d014100210a2008210c0340200c410176220d200a6a220e200a2007200e4105746a200241e0006a41201096044101481b210a200c200d6b220c41014b0d000b0b2007200a4105746a200241e0006a41201096040d00200b2104200b2005470d07200521040c0a0b200241206a41186a220a200241e0006a41186a290300370300200241206a41106a220f200241e0006a41106a290300370300200241206a41086a220c200241e0006a41086a29030037030020022002290360370320200241186a220d200a290300370300200241106a220a200f290300370300200241086a220f200c29030037030020022002290320370300200241c0006a41186a220c200d290300370300200241c0006a41106a220d200a290300370300200241c0006a41086a220a200f29030037030020022002290300370340412010262210450d0420102002290340370000201041186a200c290300370000201041106a200d290300370000201041086a200a2903003700002001280204211120012802002112200b2005460d014101210f41082113200641086a211441182115411021164120211741052118420521194220211a4100211b4101211c4101211d4101210a0c080b2014280200211e2006280200211f02400340200241e0006a20156a2220200b20156a290000370300200241e0006a20166a2221200b20166a290000370300200241e0006a20136a2222200b20136a2900003703002002200b290000370360200b20176a210b4100210a0240201e200f460d00201e450d024100210a201e210c0340200c200f76220d200a6a220e200a201f200e2018746a200241e0006a2017109604200f481b210a200c200d6b220c200f4b0d000b0b201f200a2018746a200241e0006a20171096040d01200b2005470d000c030b0b200241206a20156a220a2020290300370300200241206a20166a220c2021290300370300200241206a20136a220d202229030037030020022002290360370320200241c0006a20156a220e200a290300370300200241c0006a20166a220a200c290300370300200241c0006a20136a220c200d29030037030020022002290320370340200220156a220d200e290300370300200220166a220e200a290300370300200220136a221f200c290300370300200220022903403703000240201d201c470d00201c200f6a220a201c490d03201c200f74220c200a200a200c491b221dad2019862223201a88a70d032023a7220a201b480d030240201c450d002010201c201874200a102722100d010c060b200a10262210450d050b2010201c2018746a220a2002290300370000200a20156a200d290300370000200a20166a200e290300370000200a20136a201f290300370000201c200f6a211c200b2005470d060c010b4101211c4101211d0b02402011450d00201210230b2000201c3602082000201d3602042000201036020020024180016a24000f0b101e000b41204101102a000b200a4101102a000b4100210a0c010b4101210a0c000b0b2000410036020820004201370200024020042005460d00200141086a2004200520046b41606a4160716a41206a3602000b02402001280204450d00200128020010230b20024180016a24000b0c002000280200200110ad020bce7601027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341aa014b0d00024020030eab010002030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b200128021841d3eac40041032001411c6a28020028020c11020021010cb1010b200128021841c8eac400410b2001411c6a28020028020c11020021010cb0010b2002200128021841d6eac40041052001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caf010b2002200128021841eceac40041042001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cae010b2002200128021841f0eac40041022001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cad010b200128021841f2eac40041042001411c6a28020028020c11020021010cac010b200128021841f6eac40041032001411c6a28020028020c11020021010cab010b2002200128021841f9eac40041022001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450daa01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caa010b20022001280218418cebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca9010b200220012802184190ebc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a4198ebc40010de03210120022000410c6a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450da801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca8010b200128021841a8ebc40041062001411c6a28020028020c11020021010ca7010b2002200128021841aeebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca6010b2002200128021841b2ebc400410c2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c4101210120022002410c6a41fceac40010de0321032002200041016a36020c20032002410c6a41c0ebc40010de031a20022d0008210020022802042203450da2010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca5010b200128021841d0ebc40041042001411c6a28020028020c11020021010ca4010b200128021841d4ebc40041062001411c6a28020028020c11020021010ca3010b2002200128021841daebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca2010b2002200128021841e2ebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca1010b2002200128021841eaebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca0010b2002200128021841f2ebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9f010b2002200128021841fbebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9e010b200220012802184184ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9d010b20022001280218418becc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9c010b200220012802184192ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9b010b200220012802184199ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9a010b2002200128021841a0ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c99010b2002200128021841a9ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c98010b2002200128021841b2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c97010b2002200128021841bcecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c96010b2002200128021841c6ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9501200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c95010b2002200128021841cfecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c94010b2002200128021841d8ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c93010b2002200128021841e2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c92010b2002200128021841ececc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c91010b2002200128021841f6ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c90010b200220012802184180edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8f010b200220012802184188edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8e010b200220012802184190edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8d010b200220012802184198edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8c010b2002200128021841a0edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8b010b2002200128021841a9edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8a010b2002200128021841b3edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c89010b2002200128021841bcedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c88010b2002200128021841c6edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c87010b2002200128021841d0edc400410d2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c86010b2002200128021841ddedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c85010b2002200128021841e7edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f0edc40010de031a20022d0008210120022802042203450d8401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c84010b200220012802184180eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4188eec40010de031a20022d0008210120022802042203450d8301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c83010b200220012802184198eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d8201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c82010b2002200128021841a0eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41a8eec40010de031a20022d0008210120022802042203450d8101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c81010b200128021841b8eec40041062001411c6a28020028020c11020021010c80010b200128021841beeec40041052001411c6a28020028020c11020021010c7f0b200128021841c3eec40041052001411c6a28020028020c11020021010c7e0b200128021841c8eec40041062001411c6a28020028020c11020021010c7d0b200128021841ceeec40041062001411c6a28020028020c11020021010c7c0b200128021841d4eec40041062001411c6a28020028020c11020021010c7b0b200128021841daeec40041062001411c6a28020028020c11020021010c7a0b200128021841e0eec40041062001411c6a28020028020c11020021010c790b200128021841e6eec40041062001411c6a28020028020c11020021010c780b200128021841eceec40041062001411c6a28020028020c11020021010c770b200128021841f2eec40041062001411c6a28020028020c11020021010c760b200128021841f8eec40041062001411c6a28020028020c11020021010c750b200128021841feeec40041052001411c6a28020028020c11020021010c740b20012802184183efc40041052001411c6a28020028020c11020021010c730b20012802184188efc40041062001411c6a28020028020c11020021010c720b2001280218418eefc40041062001411c6a28020028020c11020021010c710b20012802184194efc40041062001411c6a28020028020c11020021010c700b2001280218419aefc40041062001411c6a28020028020c11020021010c6f0b200128021841a0efc40041062001411c6a28020028020c11020021010c6e0b200128021841a6efc40041062001411c6a28020028020c11020021010c6d0b200128021841acefc40041062001411c6a28020028020c11020021010c6c0b200128021841b2efc40041062001411c6a28020028020c11020021010c6b0b200128021841b8efc40041052001411c6a28020028020c11020021010c6a0b200128021841bdefc40041052001411c6a28020028020c11020021010c690b200128021841c2efc40041052001411c6a28020028020c11020021010c680b200128021841c7efc40041052001411c6a28020028020c11020021010c670b200128021841ccefc40041052001411c6a28020028020c11020021010c660b200128021841d1efc40041052001411c6a28020028020c11020021010c650b200128021841d6efc40041052001411c6a28020028020c11020021010c640b200128021841dbefc40041052001411c6a28020028020c11020021010c630b200128021841e0efc40041052001411c6a28020028020c11020021010c620b200128021841e5efc40041052001411c6a28020028020c11020021010c610b200128021841eaefc40041052001411c6a28020028020c11020021010c600b200128021841efefc40041052001411c6a28020028020c11020021010c5f0b200128021841f4efc40041062001411c6a28020028020c11020021010c5e0b200128021841faefc40041062001411c6a28020028020c11020021010c5d0b20012802184180f0c40041092001411c6a28020028020c11020021010c5c0b20012802184189f0c40041062001411c6a28020028020c11020021010c5b0b2001280218418ff0c40041062001411c6a28020028020c11020021010c5a0b20012802184195f0c40041062001411c6a28020028020c11020021010c590b2001280218419bf0c40041072001411c6a28020028020c11020021010c580b200128021841a2f0c40041072001411c6a28020028020c11020021010c570b200128021841a9f0c40041072001411c6a28020028020c11020021010c560b200128021841b0f0c40041072001411c6a28020028020c11020021010c550b200128021841b7f0c40041062001411c6a28020028020c11020021010c540b200128021841bdf0c40041052001411c6a28020028020c11020021010c530b200128021841c2f0c40041062001411c6a28020028020c11020021010c520b200128021841c8f0c40041062001411c6a28020028020c11020021010c510b200128021841cef0c40041072001411c6a28020028020c11020021010c500b200128021841d5f0c40041072001411c6a28020028020c11020021010c4f0b200128021841dcf0c40041072001411c6a28020028020c11020021010c4e0b200128021841e3f0c40041072001411c6a28020028020c11020021010c4d0b200128021841eaf0c40041062001411c6a28020028020c11020021010c4c0b200128021841f0f0c40041062001411c6a28020028020c11020021010c4b0b200128021841f6f0c40041092001411c6a28020028020c11020021010c4a0b200128021841fff0c40041062001411c6a28020028020c11020021010c490b20012802184185f1c40041062001411c6a28020028020c11020021010c480b2001280218418bf1c40041062001411c6a28020028020c11020021010c470b20012802184191f1c40041072001411c6a28020028020c11020021010c460b20012802184198f1c40041072001411c6a28020028020c11020021010c450b2001280218419ff1c40041072001411c6a28020028020c11020021010c440b200128021841a6f1c40041072001411c6a28020028020c11020021010c430b200128021841adf1c40041062001411c6a28020028020c11020021010c420b200128021841b3f1c40041052001411c6a28020028020c11020021010c410b200128021841b8f1c40041062001411c6a28020028020c11020021010c400b200128021841bef1c40041062001411c6a28020028020c11020021010c3f0b200128021841c4f1c40041072001411c6a28020028020c11020021010c3e0b200128021841cbf1c40041072001411c6a28020028020c11020021010c3d0b200128021841d2f1c40041072001411c6a28020028020c11020021010c3c0b200128021841d9f1c40041072001411c6a28020028020c11020021010c3b0b200128021841e0f1c40041062001411c6a28020028020c11020021010c3a0b200128021841e6f1c40041062001411c6a28020028020c11020021010c390b200128021841ecf1c40041072001411c6a28020028020c11020021010c380b200128021841f3f1c40041082001411c6a28020028020c11020021010c370b200128021841fbf1c40041082001411c6a28020028020c11020021010c360b20012802184183f2c400410a2001411c6a28020028020c11020021010c350b2001280218418df2c40041072001411c6a28020028020c11020021010c340b20012802184194f2c40041062001411c6a28020028020c11020021010c330b2001280218419af2c40041062001411c6a28020028020c11020021010c320b200128021841a0f2c40041062001411c6a28020028020c11020021010c310b200128021841a6f2c40041062001411c6a28020028020c11020021010c300b200128021841acf2c40041062001411c6a28020028020c11020021010c2f0b200128021841b2f2c40041062001411c6a28020028020c11020021010c2e0b200128021841b8f2c400410b2001411c6a28020028020c11020021010c2d0b200128021841c3f2c40041062001411c6a28020028020c11020021010c2c0b200128021841c9f2c40041062001411c6a28020028020c11020021010c2b0b200128021841cff2c40041072001411c6a28020028020c11020021010c2a0b200128021841d6f2c40041082001411c6a28020028020c11020021010c290b200128021841def2c40041082001411c6a28020028020c11020021010c280b200128021841e6f2c400410a2001411c6a28020028020c11020021010c270b200128021841f0f2c40041072001411c6a28020028020c11020021010c260b200128021841f7f2c40041062001411c6a28020028020c11020021010c250b200128021841fdf2c40041062001411c6a28020028020c11020021010c240b20012802184183f3c40041062001411c6a28020028020c11020021010c230b20012802184189f3c40041062001411c6a28020028020c11020021010c220b2001280218418ff3c40041062001411c6a28020028020c11020021010c210b20012802184195f3c40041062001411c6a28020028020c11020021010c200b2001280218419bf3c400410b2001411c6a28020028020c11020021010c1f0b200128021841a6f3c400410a2001411c6a28020028020c11020021010c1e0b200128021841b0f3c400410c2001411c6a28020028020c11020021010c1d0b200128021841bcf3c400410c2001411c6a28020028020c11020021010c1c0b200128021841c8f3c400410c2001411c6a28020028020c11020021010c1b0b200128021841d4f3c400410c2001411c6a28020028020c11020021010c1a0b200128021841e0f3c400410d2001411c6a28020028020c11020021010c190b200128021841edf3c400410d2001411c6a28020028020c11020021010c180b200128021841faf3c400410c2001411c6a28020028020c11020021010c170b20012802184186f4c400410c2001411c6a28020028020c11020021010c160b20012802184192f4c400410c2001411c6a28020028020c11020021010c150b2001280218419ef4c400410c2001411c6a28020028020c11020021010c140b200128021841aaf4c400410e2001411c6a28020028020c11020021010c130b200128021841b8f4c400410e2001411c6a28020028020c11020021010c120b200128021841c6f4c400410e2001411c6a28020028020c11020021010c110b200128021841d4f4c400410e2001411c6a28020028020c11020021010c100b200128021841e2f4c400410c2001411c6a28020028020c11020021010c0f0b200128021841eef4c400410e2001411c6a28020028020c11020021010c0e0b200128021841fcf4c400410e2001411c6a28020028020c11020021010c0d0b2001280218418af5c400410e2001411c6a28020028020c11020021010c0c0b20012802184198f5c400410e2001411c6a28020028020c11020021010c0b0b200128021841a6f5c400410d2001411c6a28020028020c11020021010c0a0b200128021841b3f5c40041112001411c6a28020028020c11020021010c090b200128021841c4f5c40041112001411c6a28020028020c11020021010c080b200128021841d5f5c40041112001411c6a28020028020c11020021010c070b200128021841e6f5c40041112001411c6a28020028020c11020021010c060b200021010c050b200021010c040b200021010c030b200021010c020b200021010c010b200021010b200241106a2400200141ff01714100470bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bc60301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a102722090d020c070b200728020021090c020b200a10262209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a2106200441046a210703402002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d072008410174220a20092009200a491b220a4100480d072008450d0120072802002008200a102722090d020c080b200728020021090c020b200a10262209450d060b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200241046a22022003470d000b0b2000411a3a00000f0b101e000b200a4101102a000b200a4101102a000bd40301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107200241046a2108034002402005417f470d00200341ff01710d020b0240024002400240200728020020062802002209470d00200941016a22032009490d0620094101742204200320032004491b22044100480d062009450d01200828020020092004102722030d020c070b200828020021030c020b200410262203450d050b2007200436020020082003360200200628020021090b2006200941016a360200200320096a200141807f723a0000200541c000712103200541ff007121042005210120054107752209210520090d002009210520030d000b0b024002400240200241086a2802002002410c6a2802002205470d00200541016a22092005490d0320054101742206200920092006491b22064100480d032005450d01200241046a2802002005200610272209450d020c050b200241046a28020021090c050b2006102622090d030b20064101102a000b101e000b20044101102a000b200241086a2006360200200241046a20093602002002410c6a28020021050b2002410c6a200541016a360200200920056a20043a00002000411a3a00000bd40301077f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107200241046a2108034002402001427f520d00200441ff01710d020b0240024002400240200728020020062802002204470d00200441016a22052004490d0620044101742209200520052009491b22094100480d062004450d01200828020020042009102722050d020c070b200828020021050c020b200910262205450d050b2007200936020020082005360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a2802002004200610272203450d020c050b200241046a28020021030c050b2006102622030d030b20064101102a000b101e000b20094101102a000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bf61402047f017e2000280248210202400240024002400240024002400240200141046a2802002203200141086a28020022046b41044f0d00200441046a22052004490d0520034101742204200520052004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240024002400240200141046a2802002203200528020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028024c210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280250210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280254210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240024002400240200141046a28020020022802002204470d00200441016a22032004490d0520044101742202200320032002491b22024100480d052004450d0120012802002004200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a200041dc006a2d00003a000020002802582103024002400240200141046a2802002204200228020022006b41044f0d00200041046a22022000490d0320044101742200200220022000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000bc00201037f230041106b22022400200241003602082002420137030020002d0000210341011026210402400240024002400240024020034101470d002004450d03200441013a000020024281808080103702042002200436020020044101412110272204450d0420042000290001370001200441096a200041096a290000370000200441116a200041116a290000370000200441196a200041196a290000370000200242a1808080900437020420022004360200200128020020012802042004412110044100450d010c020b2004450d04200441003a0000200242818080801037020420022004360200200041086a200210b402200228020421002001280200200128020420022802002204200241086a28020010042000450d010b200410230b200241106a24000f0b41014101102a000b41214101102a000b41014101102a000b8a0c02067f027e230041106b22022400200028022821032002200041306a280200220436020c2002410c6a2001104102400240024002400240024002400240200141046a2802002205200141086a28020022066b20044f0d00200620046a22072006490d0520054101742206200720072006491b22064100480d052005450d0120012802002005200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a200320041094041a2000280234210502400240024002400240200141046a2802002206200728020022046b41044f0d00200441046a22032004490d0520064101742204200320032004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a200536000002400240024002400240200141046a2802002206200328020022046b41204f0d00200441206a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441206a360200200620046a220441186a200041d0006a290000370000200441106a200041c8006a290000370000200441086a200041c0006a29000037000020042000290038370000200041086a29030021082000290300210902400240024002400240200141046a2802002206200528020022046b41104f0d00200441106a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000290310210802400240024002400240200141046a2802002206200528020022046b41084f0d00200441086a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441086a360200200620046a20083700000240024002400240024002400240024002400240024020002903184201520d00200141046a28020020052802002204470d01200441016a22062004490d0b20044101742205200620062005491b22054100480d0b2004450d0320012802002004200510272206450d040c090b200141046a28020020052802002200470d01200041016a22042000490d0a20004101742206200420042006491b22064100480d0a2000450d0420012802002000200610272204450d050c060b200128020021060c080b200128020021040c050b2005102622060d050b20054101102a000b2006102622040d010b20064101102a000b20012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a0000200241106a24000f0b20012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a0000200041206a2903002108024002400240200141046a2802002204200528020022006b41084f0d00200041086a22062000490d0320044101742200200620062000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200420006a2008370000200241106a24000b13002000410636020420004198cfc2003602000b130020004108360204200041a0c9c2003602000b13002000411636020420004188e7c2003602000b7801047f230041106b2202240020024100360208200242013703000240410110262203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b41014101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242003700000f0b41084101102a000bab0101017f230041f0006b22022400200241003a005c20024280808480800237035020024201370340200242013703382002420137033020024201370328200242013703202002420137031820024201370310200242013703082002420137030020024280808080c0003703482002412036025820024100360268200242013703602002200241e0006a10b202200041086a200228026836020020002002290360370200200241f0006a24000b3501017f0240410810262202450d002000428880808080013702042000200236020020024280ade2043700000f0b41084101102a000b3301017f0240410410262202450d0020004284808080c00037020420002002360200200241e4003600000f0b41044101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242af013700000f0b41084101102a000b3301017f0240410810262202450d002000428880808080013702042000200236020020024287013700000f0b41084101102a000b3901017f0240411010262202450d002002420037000820024215370000200042908080808002370204200020023602000f0b41104101102a000bc32b05087f037e037f017e047f23004190056b22022400200241003a00c80220012802002001280204200241c8026a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00c802220341054b0d06024020030e06000503040206000b200241c8026a200110c102200241b0046a200241c8026a41dc001094041a20024190046a41026a2201200241a7036a2d00003a0000200220022f00a5033b01900420022d00a40322034102470d09200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d05200241e8016a41186a22042005290300370300200241e8016a41106a22052006290300370300200241e8016a41086a22062007290300370300200220022903b0043703e801200241c8026a41186a22072004290300370300200241c8026a41106a22042005290300370300200241c8026a41086a22052006290300370300200220022903e8013703c802200241f0036a41186a2007290300370300200241f0036a41106a2004290300370300200241f0036a41086a2005290300370300200220022903c8023703f003200241003a00c80220012802002008280200200241c8026a410120091001210420032003280200200441016a41014b22046a22053602002004450d0920022d00c8022203450d1520034101470d09200241b0046a41186a22044200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a280200200241b0046a41202005100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d09200241e8016a41186a22012004290300370300200241e8016a41106a22032006290300370300200241e8016a41086a22042007290300370300200220022903b0043703e801200241c8026a41186a22052001290300370300200241c8026a41106a22012003290300370300200241c8026a41086a22032004290300370300200220022903e8013703c80220024190046a41186a200529030037030020024190046a41106a200129030037030020024190046a41086a2003290300370300200220022903c80237039004410121010c160b20024180016a200110c202200241c8026a41086a220320024189016a290000370300200241c8026a41106a220420024191016a290000370300200241c8026a41186a220520024199016a290000370300200241c8026a411f6a2206200241a0016a28000036000020022002290081013703c80220022d00800122074102470d05200041073a000020024190056a24000f0b200241e0006a2001104c2002290360a7450d08200241f0006a290300210a2002290368210b200241d0006a2001104b2002290350a7450d0b2002290358210c200241b0046a41186a22064200370300200241b0046a41106a22074200370300200241b0046a41086a22084200370300200242003703b00441002105200141086a220341002001280200200141046a280200200241b0046a41202003280200100122042004417f461b2204412020044120491b20032802006a36020002402004411f4d0d00200241e8016a41186a22032006290300370300200241e8016a41106a22042007290300370300200241e8016a41086a22052008290300370300200220022903b0043703e80120024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903e80137038001410121050b200241c8026a41186a220320024180016a41186a290300370300200241c8026a41106a220420024180016a41106a290300370300200241c8026a41086a220620024180016a41086a29030037030020022002290380013703c8022005450d0c20024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903c80237039004200241c8006a2001104a2002280248450d1a200228024c2203417f4c0d1e2003450d18200310ac012204450d22200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d190c260b200241086a2001104b2002290308a7450d082002290310210a20022001104a2002280200450d0f20022802042203417f4c0d1d2003450d0d200310ac012204450d20200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d0e0c240b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d04200241e8016a41186a22042005290300370300200241e8016a41106a220d2006290300370300200241e8016a41086a220e2007290300370300200220022903b0043703e801200241c8026a41186a220f2004290300370300200241c8026a41106a2204200d290300370300200241c8026a41086a220d200e290300370300200220022903e8013703c802200241f0036a41186a200f290300370300200241f0036a41106a2004290300370300200241f0036a41086a200d290300370300200220022903c8023703f003200542003703002006420037030020074200370300200242003703b0042003410020012802002008280200200241b0046a41202009100122042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d08200241e8016a41186a2203200241b0046a41186a290300370300200241e8016a41106a2204200241b0046a41106a290300370300200241e8016a41086a2206200241b0046a41086a290300370300200220022903b0043703e80120024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903e8013703900420024200370388012002420037038001200141086a220441002001280200200141046a28020020024180016a41102005100122032003417f461b2203411020034110491b20042802006a3602002003410f4d0d0f20024180016a41086a290300210c2002290380012110200241f8006a2001104a2002280278450d1b200228027c2211ad220a421b88a70d1c200a420586a72203417f4c0d1c2003450d1920031026220d0d1a20034101102a000b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a411f6a2006280000360000200241b0046a41186a2005290300370300200241b0046a41106a2004290300370300200241b0046a41086a2003290300370300200220022903c8023703b004200241306a2001104c2002290330a7450d08200241306a41106a290300210a2002290338210b200241206a2001104b2002290320a7450d0d2002290328210c200241186a2001104a2002280218450d12200228021c2203417f4c0d192003450d10200310ac012204450d1e200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d110c1f0b200241e8016a200241b0046a41dc001094041a200241f0036a41026a220420012d00003a0000200220022f0190043b01f00320024187016a200241e8016a41dc001094041a200041013a0000200041016a20024180016a41e3001094041a200041e4006a20033a0000200041e5006a20022f01f0033b0000200041e7006a20042d00003a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d160b2003450d00200410230b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410021010b200241b0036a41186a220320024190046a41186a290300370300200241b0036a41106a220420024190046a41106a290300370300200241b0036a41086a220520024190046a41086a29030037030020022002290390043703b003200241d0036a41186a2206200241f0036a41186a290300370300200241d0036a41106a2207200241f0036a41106a290300370300200241d0036a41086a2208200241f0036a41086a290300370300200220022903f0033703d003200041053a0000200041216a20013a0000200020022903d003370001200041096a2008290300370000200041116a2007290300370000200041196a2006290300370000200041226a20022903b0033700002000412a6a2005290300370000200041326a20042903003700002000413a6a2003290300370000200041e0006a2002419e016a290100370100200041da006a20024180016a41186a290100370100200041d2006a20024180016a41106a290100370100200041ca006a20024180016a41086a290100370100200041c2006a20022901800137010020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0e0b2003450d00200410230b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0d0b2003450d00200410230b200041073a000020024190056a24000f0b4101210d0b0240024002402011450d0020024180016a41186a210820024180016a41106a2109200141046a21124200210a410021074100210541002104201121130340200842003703002009420037030020024180016a41086a220e42003703002002420037038001200141086a220341002001280200201228020020024180016a41202003280200100122062006417f461b2206412020064120491b20032802006a3602002006411f4d0d03200441016a2103200241c8026a41186a22062008290300370300200241c8026a41106a220f2009290300370300200241c8026a41086a2214200e29030037030020022002290380013703c802024020042013470d002007200320032007491b2213ad420586220b422088a70d07200ba7220e4100480d0702402004450d00200d2005200e1027220d0d010c090b200e1026220d450d080b200d20056a220420022903c802370000200441186a2006290300370000200441106a200f290300370000200441086a2014290300370000200a4280808080107c210a200741026a2107200541206a21052003210420032011490d000c020b0b410021134200210a0b200d450d01200241d0036a41186a2201200241f0036a41186a290300370300200241d0036a41106a2203200241f0036a41106a290300370300200241d0036a41086a2204200241f0036a41086a290300370300200241b0036a41086a220520024190046a41086a290300370300200241b0036a41106a220620024190046a41106a290300370300200241b0036a41186a220720024190046a41186a290300370300200220022903f0033703d00320022002290390043703b003200041063a0000200020022903d003370001200041096a2004290300370000200041116a2003290300370000200041196a2001290300370000200041216a20022903b003370000200041296a2005290300370000200041316a2006290300370000200041396a2007290300370000200041c1006a20022f00ad033b0000200041c3006a200241af036a2d00003a0000200041d8006a200c370300200041d0006a2010370300200041c8006a200a2013ad84370000200041c4006a200d36000020024190056a24000f0b2013450d00200d10230b200041073a000020024190056a24000f0b101d000b101e000b200e4101102a000b20034101102a000b20034101102a000b20034101102a000b200241e8016a411f6a2201200241b0046a411f6a280000360000200241e8016a41186a2205200241b0046a41186a290300370300200241e8016a41106a2206200241b0046a41106a290300370300200241e8016a41086a2208200241b0046a41086a290300370300200220022903b0043703e801200041c0006a200a370300200041386a200b370300200041033a0000200041046a20073a0000200041c8006a200c3703002000412c6a2003ad220a422086200a84370200200041286a2004360200200020022f00f0033b0001200041036a200241f2036a2d00003a0000200041056a20022903e8013700002000410d6a2008290300370000200041156a20062903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024190046a41106a290300370300200041d8006a20024190046a41086a290300370300200041d0006a20022903900437030020024190056a24000f0b200020022f00c8023b0001200041023a0000200041106a200a370300200041046a2004360000200041036a200241c8026a41026a2d00003a0000200041086a2003ad220a422086200a84370000200041186a20024180016a41d0001094041a20024190056a24000f0b200241f0036a41186a220120024190046a41186a290300370300200241f0036a41106a220520024190046a41106a290300370300200241f0036a41086a220620024190046a41086a29030037030020022002290390043703f003200041386a200a370300200041306a200b370300200041043a0000200041c0006a200c370300200041286a2003ad220a422086200a84370000200041246a2004360000200020022903f003370001200041096a2006290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00b0033b0000200041236a200241b2036a2d00003a0000200041c8006a20022903d003370300200041d0006a200241d0036a41086a290300370300200041d8006a200241d0036a41106a290300370300200041e0006a200241d0036a41186a29030037030020024190056a24000be10c05057f017e017f087e037f230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100122032003417f461b2203410420034104491b20012802086a2204360208024002400240024002400240024002400240024002400240024002400240200341034d0d002002280208210520024200370308200141086a220641002001280200200141046a280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d012002290308210720024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d022002290308210920024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d032002290308210a20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d042002290308210b20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d052002290308210c20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d062002290308210d20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d072002290308210e20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d082002290308210f20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d0920022903082110200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0a200228020821112008280200210320024100360208200141086a2206410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0b20022802082112200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0c20022802082113200241003a000820012802002008280200200241086a4101200410012104200141086a22032003280200200441016a41014b22046a22063602002004450d0d20022d00082108200141046a2802002104200241003602082003410020012802002004200241086a41042006100122012001417f461b2201410420014104491b20032802006a360200200141034d0d0e20022802082101200020083a005c2000200136025820002013360254200020123602502000201136024c20002005360248200020103703402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a3703102000200937030820002007370300200020022f00053b005d200041df006a200241076a2d00003a0000200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000be10701067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002402003450d0020022d0050220341ef014d0d01200341847e6a220341034b0d00024002400240024020030e0400010203000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100122012001417f461b2201410220014102491b20052802006a360200200141014d0d0320022f0150220341f0014f0d040c030b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d024101210120022802502203418080044f0d040c020b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a3602000c010b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100122012001417f461b2201412020014120491b20032802006a360200024002402001411f4d0d00200241ca006a20022d00523a0000200241286a41086a200241df006a290000370300200241286a41106a200241e7006a290000370300200241286a41186a200241d0006a411f6a2d00003a0000200220022f01503b01482002200229005737032820022800532103410121050c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2204200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502005450d00200241246a41026a20012d00003a0000200241086a41086a2004290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c020b200041023a0000200241f0006a24000f0b410121010b200020022f01243b0001200020013a0000200041046a2003360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000bca3303077f097e097f230041d0036b22022400200241003a00a803200241a8036a200128020022032001280204220441004722051094041a02400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00a803220441054b0d06024020040e06000503040206000b200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012108200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012109200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210a200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210b200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210c200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210d200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210e200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210f200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d072002290388012110200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012111200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012112200241003602880120024188016a20052004410420044104491b22031094041a2007200420036b22063602002001200520036a2205360200200441034d0d072002280288012107200241003602880120024188016a20052006410420064104491b22031094041a200141046a200620036b22043602002001200520036a2205360200200641034d0d072002280288012113200241003a00880120024188016a2005200441004722061094041a20042006490d2e200141046a2214200420066b22033602002001200520066a22053602002004450d0720022d0088012106200241003602880120024188016a20052003410420034104491b22041094041a2014200320046b3602002001200520046a360200200341034d0d072002280288012101200241d8016a41026a220420024180026a41026a2d00003a0000200220022f0080023b01d801200041013a0000200041e4006a20063a0000200041e0006a2001360000200041dc006a2013360000200041d8006a2007360000200041d4006a2012360000200041d0006a2008360000200041c8006a2011370000200041c0006a2010370000200041386a200f370000200041306a200e370000200041286a200d370000200041206a200c370000200041186a200b370000200041106a200a370000200041086a2009370000200020022800a803360001200041046a200241a8036a41036a280000360000200041e7006a20042d00003a0000200041e5006a20022f01d8013b0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d06200241d8016a41186a220520024180026a41186a290000370300200241d8016a41106a220620024180026a41106a290000370300200241d8016a41086a220720024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22082005290300370300200241a8036a41106a22052006290300370300200241a8036a41086a22062007290300370300200220022903d8013703a803200241e8026a41186a2008290300370300200241e8026a41106a2005290300370300200241e8026a41086a2006290300370300200220022903a8033703e802200241003a00a803200241a8036a2004200341004722051094041a20032005490d24200141046a200320056b22063602002001200420056a22043602002003450d0b20022d00a8032205450d1620054101470d0b20024180026a2006412020064120491b22056a41004100412020056b2005411f4b1b1093041a20024180026a200420051094041a200141046a200620056b3602002001200420056a3602002006411f4d0d0b200241d8016a41186a220120024180026a41186a290000370300200241d8016a41106a220420024180026a41106a290000370300200241d8016a41086a220520024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22062001290300370300200241a8036a41106a22012004290300370300200241a8036a41086a22042005290300370300200220022903d8013703a80320024188036a41186a200629030037030020024188036a41106a200129030037030020024188036a41086a2004290300370300200220022903a80337038803410121010c170b20024188016a2001109502200241a8036a41086a220420024191016a290000370300200241a8036a41106a220520024199016a290000370300200241a8036a41186a2206200241a1016a290000370300200241a8036a411f6a2203200241a8016a28000036000020022002290089013703a80320022d00880122074102470d06200041073a0000200241d0036a24000f0b200241e8006a200110472002290368a7450d07200241f8006a29030021092002290370210a200241d8006a200110462002290358a7450d0b2002290360210b20024180026a41186a2207420037030020024180026a41106a2208420037030020024180026a41086a22124200370300200242003703800220024180026a20012802002206200141046a22032802002204412020044120491b22051094041a2003200420056b3602002001200620056a3602002004411f4d0d0c200241d8016a41186a22042007290300370300200241d8016a41106a22052008290300370300200241d8016a41086a2206201229030037030020022002290380023703d80120024188016a41186a200429030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903d80137038801410121040c0d0b200241106a200110462002290310a7450d0720022903182109200241086a200110452002280208450d10200228020c2204417f4c0d1f2004450d0e200410ac012206450d2320062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d242003200720056b3602002001200128020020056a36020020052004470d0f0c2c0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a2214200620046b22033602002001200520046a22053602002006411f4d0d04200241d8016a41186a220620024180026a41186a2215290000370300200241d8016a41106a220720024180026a41106a2216290000370300200241d8016a41086a220820024180026a41086a221729000037030020022002290080023703d801200241a8036a41186a22042006290300370300200241a8036a41106a22122007290300370300200241a8036a41086a22132008290300370300200220022903d8013703a803200241e8026a41186a2004290300370300200241e8026a41106a2012290300370300200241e8026a41086a2013290300370300200220022903a8033703e80220024180026a2003412020034120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a2014200320046b22123602002001200520046a22043602002003411f4d0d0820062015290000370300200720162900003703002008201729000037030020022002290080023703d80120024188036a41186a200629030037030020024188036a41106a200729030037030020024188036a41086a2008290300370300200220022903d801370388032002420037039001200242003703880120024188016a20042012411020124110491b22051094041a200141046a201220056b3602002001200420056a3602002012410f4d0d1020024190016a290300210b200229038801210c20024180016a20011045200228028001450d1c2002280284012218ad2209421b88a70d1e2009420586a72204417f4c0d1e2004450d1a2004102622160d1b20044101102a000b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a411f6a200328000036000020024180026a41186a200629030037030020024180026a41106a200529030037030020024180026a41086a2004290300370300200220022903a80337038002200241386a200110472002290338a7450d08200241386a41106a29030021092002290340210a200241286a200110462002290328a7450d0d2002290330210b200241206a200110452002280220450d1220022802242204417f4c0d1a2004450d10200410ac012206450d2020062001280200200141046a22032802002205200420052004491b22051094041a200328020022082005490d212003200820056b3602002001200128020020056a36020020052004470d110c260b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021040b200241a8036a41186a220520024188016a41186a290300370300200241a8036a41106a220620024188016a41106a290300370300200241a8036a41086a220320024188016a41086a29030037030020022002290388013703a80302402004450d0020024188036a41186a200529030037030020024188036a41106a200629030037030020024188036a41086a2003290300370300200220022903a80337038803200241d0006a200110452002280250450d0e20022802542204417f4c0d132004450d0c200410ac012206450d1b20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d1c2003200720056b3602002001200128020020056a36020020052004470d0d0c1e0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b4101210641002004460d1d0b2004450d00200610230b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021010b200241a8026a41186a220420024188036a41186a290300370300200241a8026a41106a220520024188036a41106a290300370300200241a8026a41086a220620024188036a41086a29030037030020022002290388033703a802200241c8026a41186a2203200241e8026a41186a290300370300200241c8026a41106a2207200241e8026a41106a290300370300200241c8026a41086a2208200241e8026a41086a290300370300200220022903e8023703c802200041053a0000200041216a20013a0000200020022903c802370001200041096a2008290300370000200041116a2007290300370000200041196a2003290300370000200041226a20022903a8023700002000412a6a2006290300370000200041326a20052903003700002000413a6a2004290300370000200041e0006a200241a6016a290100370100200041da006a20024188016a41186a290100370100200041d2006a20024188016a41106a290100370100200041ca006a20024188016a41086a290100370100200041c2006a200229018801370100200241d0036a24000f0b4101210641002004460d150b2004450d00200610230b200041073a0000200241d0036a24000f0b4101210641002004460d110b2004450d00200610230b200041073a0000200241d0036a24000f0b410121160b0240024002402018450d0020024188016a41186a211220024188016a41106a211420024188016a41086a2113200141046a210842002109410021074100210641002105201821190340201242003703002014420037030020134200370300200242003703880120024188016a2001280200221520082802002204412020044120491b22031094041a2008200420036b3602002001201520036a3602002004411f4d0d03200541016a2104200241a8036a41186a22032012290300370300200241a8036a41106a22152014290300370300200241a8036a41086a2217201329030037030020022002290388013703a803024020052019470d002007200420042007491b2219ad420586220a422088a70d08200aa7221a4100480d0802402005450d0020162006201a102722160d010c0b0b201a10262216450d0a0b201620066a220520022903a803370000200541186a2003290300370000200541106a2015290300370000200541086a201729030037000020094280808080107c2109200741026a2107200641206a21062004210520042018490d000c020b0b41002119420021090b2016450d01200241c8026a41186a2201200241e8026a41186a290300370300200241c8026a41106a2204200241e8026a41106a290300370300200241c8026a41086a2205200241e8026a41086a290300370300200241a8026a41086a220620024188036a41086a290300370300200241a8026a41106a220320024188036a41106a290300370300200241a8026a41186a220720024188036a41186a290300370300200220022903e8023703c80220022002290388033703a802200041063a0000200020022903c802370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a20022903a802370000200041296a2006290300370000200041316a2003290300370000200041396a2007290300370000200041c1006a20022f00a5023b0000200041c3006a200241a7026a2d00003a0000200041d8006a200b370300200041d0006a200c370300200041c8006a20092019ad84370000200041c4006a2016360000200241d0036a24000f0b2019450d00201610230b200041073a0000200241d0036a24000f0b200520041048000b101d000b101e000b200520031048000b201a4101102a000b20044101102a000b200520071048000b20044101102a000b200520081048000b20044101102a000b200520071048000b200620041048000b200241e8026a41186a220120024188036a41186a290300370300200241e8026a41106a220520024188036a41106a290300370300200241e8026a41086a220320024188036a41086a29030037030020022002290388033703e802200041386a2009370300200041306a200a370300200041043a0000200041c0006a200b370300200041286a2004ad2209422086200984370000200041246a2006360000200020022903e802370001200041096a2003290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00a8023b0000200041236a200241aa026a2d00003a0000200041c8006a20022903c802370300200041d0006a200241c8026a41086a290300370300200041d8006a200241c8026a41106a290300370300200041e0006a200241c8026a41186a290300370300200241d0036a24000f0b200241d8016a411f6a220120024180026a411f6a280000360000200241d8016a41186a220520024180026a41186a290300370300200241d8016a41106a220320024180026a41106a290300370300200241d8016a41086a220820024180026a41086a29030037030020022002290380023703d801200041c0006a2009370300200041386a200a370300200041033a0000200041046a20073a0000200041c8006a200b3703002000412c6a2004ad2209422086200984370200200041286a2006360200200020022f00e8023b0001200041036a200241ea026a2d00003a0000200041056a20022903d8013700002000410d6a2008290300370000200041156a20032903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024188036a41106a290300370300200041d8006a20024188036a41086a290300370300200041d0006a200229038803370300200241d0036a24000f0b200020022f00a8033b0001200041023a0000200041106a2009370300200041046a2006360000200041036a200241a8036a41026a2d00003a0000200041086a2004ad2209422086200984370000200041186a20024188016a41d0001094041a200241d0036a24000b8812010d7f230041a0016b22032400024002400240024002400240024002400240024002400240024002400240411410262204450d00200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f8006a41186a22054200370300200341f8006a41106a22064200370300200341f8006a41086a220742003703002003420037037820044134200341f8006a1002200341d8006a41186a2005290300370300200341d8006a41106a2006290300370300200341d8006a41086a2007290300370300200320032903783703580240024002400240200341d8006a412041a886c500410041001001417f460d002003422037027c2003200341d8006a360278200341286a200341f8006a104a2003280228450d03200328022c2106200341206a200341f8006a104a2003280220450d0320032802242107200341186a200341f8006a104a2003280218450d03200328021c210841002109200341003a009f0120034180016a2205200528020022052003280278200328027c2003419f016a41012005100141016a41014b22056a3602002005450d03024020032d009f012205450d004101210920054101470d040b200341106a200341f8006a104a2003280210450d0320032802142205417f4c0d092005450d01200510ac01220a450d0620034180016a220b200b280200220b200541002003280278200328027c200a2005200b1001220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b200410234101210441d689c300210641112107410221090c070b4101210a2003280278200328027c4101410020034180016a28020010011a41002005460d050b2005450d00200a10230b41d4aac10041331021000b41144101102a000b41344101102a000b20054101102a000b200341d4006a41026a220b200341386a41026a2d00003a0000200320032f00383b0154200341f8006a41026a220c200b2d00003a0000200320032f01543b017820041023200341d8006a41026a200c2d00003a0000200320032f01783b0158410021040b200341346a41026a220b200341d8006a41026a2d00003a0000200320032f01583b013402402004450d002000200636020420004101360200200041086a2007360200200341a0016a24000f0b200341306a41026a200b2d00003a0000200320032f01343b01300240024002400240200228024820064d0d00411510262204450d05410021062004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f8006a41186a22074200370300200341f8006a41106a22094200370300200341f8006a41086a220b42003703002003420037037820044135200341f8006a1002200341d8006a41186a2007290300370300200341d8006a41106a2009290300370300200341d8006a41086a200b29030037030020032003290378370358200341d8006a412041a886c500410041001001417f460d012003422037027c2003200341d8006a360278200341086a200341f8006a104a2003280208450d08200328020c2207417f4c0d042007450d02200710ac012206450d0920034180016a220920092802002209200741002003280278200328027c200620072009100122092009417f461b2209200920074b1b22096a36020020092007460d030c070b200521042005210b200a21020c0c0b0c010b410121062003280278200328027c4101410020034180016a28020010011a41002007470d040b200410232007411a20061b210d200641fc89c30020061b210c024002400240024002402006450d00200341f8006a200c2007200210c502200341f8006a41086a2802002107200328027c210620032802784101470d042000200636020420004101360200200041086a2007360200200d450d01200c102320050d020c030b2000200c36020420004101360200200041086a200d3602000b2005450d010b200a10230b200341a0016a24000f0b200341d8006a41026a220e20034197016a2d00003a0000200320032f0095013b015820034194016a2d0000210920034190016a28020021042003418c016a280200210b20034188016a280200210220034184016a280200210802402005450d00200a10230b200341306a41026a200e2d00003a0000200320032f01583b01302004417f4c0d004101210a02402004450d0020041026220a450d09200a200220041094041a0b200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a0050411410262205450d06200541106a41002800d28943360000200541086a41002900ca8943370000200541002900c2894337000020054114413410272205450d07200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f8006a41186a22014200370300200341f8006a41106a220e4200370300200341f8006a41086a220f42003703002003420037037820054134200341f8006a1002200341d8006a41186a2001290300370300200341d8006a41106a200e290300370300200341d8006a41086a200f29030037030020032003290378370358200341d8006a200341386a10b1012005102302402004450d00200a10230b200d450d09200c10230c090b101d000b41154101102a000b41354101102a000b2007450d00200610230b41d4aac10041331021000b20074101102a000b41144101102a000b41344101102a000b20044101102a000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200b360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200341326a2d00003a0000200341a0016a24000bc0dc0123227f037e017f017e107f017e067f017e027f017e037f017e017f017e087f017e017f017e027f017e047f017e177f017e017f017e6a7f017e1d7f017e147f017e067f027e0f7f230041e0056b22042400410021052004410036028802200420023602840220042001360280020240024002400240024002400240200241034b0d00200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c0221062004280298022107410521080c010b20044188026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c022106200428029802210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240200241074d0d0020044180026a41086a41083602000240024002400240200128000422074101470d00200441d0046a20044180026a10a00120042802d0044101470d014104210a4100210b4100210c20042d00d4040d020c050b410221080c0f0b200441d0046a410572210f4104210a200441d0046a412c6a2110200441f4046a2111200441f0046a2112200441ec046a2113200441e8046a2114200441e4046a2115200441e0046a2116200441dc046a2117200441d8046a211841002107412821054100210b4100210c410021090340200441a8036a41026a2219200f41026a2d00003a00002004200f2f00003b01a8032010280200211a200441f8046a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00d4042223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d00200610230b0240201f450d00201e450d00201f10230b201b450d0d201c1023200b0d0e0c0f0b024002400240024002400240024002400240024002400240024002400240024020230e0e1b0405011b1b1b08031c070002061b0b2021450d1a4118218a012006202141186c6a218b014104218c014114218d014110218e01410c218f014109219001410821910141ffffffff03219201417021930120062194014100215d0c0a0b2021450d19202141286c21022006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000c1a0b0b2021450d18411c21950120062021411c6c6a219601410c219701410821980141142199014104219a014110219b014109219c0141ffffffff03219d014170219e012006219f014101215d0c090b2021450d17202141146c21022006210103400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000c180b0b02402022450d00200610230b201f450d1720201023200b0d180c190b2021450d15202141047421022006210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000c160b0b200641ff017122014102460d0320014101460d022021450d1520221023200b0d160c170b2021450d13411c21a00120062021411c6c6a21a101410c21a201410821a301411421a401410421a501411021a601410921a70141ffffffff0321a801417021a901200621aa014102215d0c050b2021450d12410421ab01200620214104746a21ac01411021ad01410921ae01410821af0141ffffffff0321b001417021b101200621b2014103215d0c050b201f450d10201f410c6c2102202121010340024020012802002205450d00200141046a280200450d00200510230b2001410c6a2101200241746a22020d000c110b0b201f450d0f410421b3012021201f4104746a21b401411021b501410c21b601410821b701417421b801202121b9014106215d0c040b410821010c0b0b410821010c0a0b410821010c090b410821010c080b410821010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b20044198026a41026a222420192d00003a0000200420042f01a8033b0198020240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a20011027220a0d010c040b20011026220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f0198023b0000200741026a21072005412c6a2105200b41016a210b200441d0046a20044180026a10a00120042802d0044101470d000b20042d00d404450d030b20042902d4042227a722084110762105200841087621092027422088a72107200441d0046a41106a2802002102200441dc046a2802002106200b0d090c0a0b20014104102a000b41082002108c01000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441b0016a200d10be03200e20042802b401460d010c0a0b200e4100470d090b024002400240024002400240024002400240024002400240024020044180026a41086a2802002002470d004280c2cdeb062128200441d4036a200b360200200441d0036a2201200c360200200441cc036a200a36020041002129200441003602c00320044280c2cdeb06428080808010843702c403200a2001290300222a422088a7220e412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441a8016a200741586a10be034104212b20042802a8012102024020042802ac012223450d00202341047422014100480d0f20011026222b450d0b0b410021294100212402402023450d002023410474210741002124202b21010340200241086a2802002205417f4c0d052002410c6a2d0000210d2002280200212c024002402005450d0020051026220f0d010c080b4101210f0b200f202c2005109404212c2001410d6a2002410d6a2d00003a00002001410c6a200d3a0000200141086a2005360200200141046a20053602002001202c360200200141106a2101202441016a2124200241106a2102200741706a22070d000b0b202b450d01202321290c020b200441003a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a201200441db046a20044198026a41086a28020036000020042004290398023700d304200441cc036a200441d7046a290000370000200441053a00c403200441013602c003200420042900d0043700c5030240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b200441c0036a41047221010240200c450d00200a10230b4100450d190c1a0b4104212b410021240b200a200e412c6c6a2107200a210102400240024003404100210541a886c500210d20072001460d0120012d000021022001412c6a222c210120024103470d000b200441a0016a202c41586a10be034100210120042802a0012202450d012002210d4104211020042802a40122010d020c0b0b410021010b410421102001450d090b200141286c211e200d411c6a21014104211d410021054100211441042111410021074100211f410121124100210f410021194104211a41002102410021234100211c4100212c4101210d0340024002400240024002400240024002400240024002400240024002400240024002402001417c6a2d0000221b4101460d000240201b4102460d00201b4103470d022001417e6a22132d000021152001417d6a22162d000021172019200f470d04200f41016a221b200f490d1e200f4101742225201b201b2025491b221b201b6a2218201b490d1e20184100480d1e200f450d0b201220252018102722120d0c0c170b200441d0046a41086a221b200141086a280200360200200420012902003703d00420052014470d06200541016a22132005490d1d20054101742214201320132014491b2214ad420c7e2226422088a70d1d2026a722134100480d1d2005450d0520112005410c6c2013102722110d060c140b200441d0046a41086a221b200141086a280200360200200420012902003703d004201f2007470d01200741016a22132007490d1c20074101742215201320132015491b2215ad420c7e2226422088a70d1c2026a722134100480d1c2007450d06201d2007410c6c20131027221d0d070c140b2001280200211b20232002470d02200241016a22132002490d1b20024101742215201320132015491b2215ad4202862226422088a70d1b2026a722134100480d1b2002450d0a201a200241027420131027221a0d0b0c150b201f21130c060b200f211b2019210f0c070b202321130c090b201310262211450d0e0b20112005410c6c6a221320042903d004370200201341086a201b280200360200200541016a2105200141286a2101201e41586a221e0d0a0c140b20131026221d450d0d0b20072113201521070b201d2013410c6c6a221320042903d004370200201341086a201b280200360200201f41016a211f200141286a2101201e41586a221e0d070c110b201810262212450d0b0b2012200f4101746a220f20154101713a0001200f20173a000020132d0000210f20162d00002113202c201c470d04201c41016a222c201c490d11201c4101742216202c202c2016491b222c202c6a2215202c490d1120154100480d11201c450d03200d201620151027220d0d040c0c0b20131026221a450d0a0b20022113201521020b201a20134102746a201b360200202341016a2123200141286a2101201e41586a221e0d020c0c0b20151026220d450d080b201941016a2119200d201c4101746a2215200f4101713a0001201520133a0000201c41016a211c201b210f200141286a2101201e41586a221e0d000c0a0b0b101d000b20054101102a000b20134104102a000b20134104102a000b20184101102a000b20134104102a000b20154101102a000b20014104102a000b410121124104211d4100211441042111410021074100211f4100210f410021194104211a41002102410021234100211c4100212c4101210d0b200a200e412c6c6a211e200a21010240024002400240024002400240024002400240024002400340201e2001460d0120012d0000211b2001412c6a22132101201b2010470d000b20044198016a201341586a10be03200428029c01221b450d002004280298012101201b410274211b03402001280200211e024002400240024020232002470d00200241016a22102002490d1220024101742213201020102013491b2213ad4202862226422088a70d122026a722104100480d122002450d01201a200241027420101027221a0d020c070b20022113202321100c020b20101026221a450d050b20022110201321020b200141046a2101201a20104102746a201e360200202341016a2123201b417c6a221b0d000c020b0b200221130b200a200e412c6c6a211b200a2101024002400240024002400340201b2001460d0120012d000021022001412c6a221e210120024105470d000b20044190016a201e41586a10be03200428029401410c6c221b450d002004280290012101200441e4046a2115200441e0046a21160340200141086a21020240200141046a2802004101470d0020042002280200221e3602a80320012802002210201e4d0d0020044198026a410c6a41023602002015410236020020044198026a41086a20044180026a3602002004410236029c022004201036028002201620044198026a360200200442023702d4042004418cd6c4003602d0042004200441a8036a36029802200441c0036a200441d0046a10a20120042802c003222d0d040b20012902002126200441d0046a41086a221e2002280200360200200420263703d0040240024002400240201f2007470d00200741016a22022007490d1520074101742210200220022010491b2210ad420c7e2226422088a70d152026a722024100480d152007450d01201d2007410c6c20021027221d0d020c0b0b20072110201f21020c020b20021026221d450d090b20072102201021070b2001410c6a2101201d2002410c6c6a220220042903d004370200200241086a201e280200360200201f41016a211f201b41746a221b0d000c020b0b200721100b200a200e412c6c6a2107200a2101024002400240034020072001460d0120012d000021022001412c6a221b210120024106470d000b20044188016a201b41586a10be03200428028c012202450d0020042802880121012002410c6c211b200541017421072005410c6c21020340200441d0046a200110c00320042802d004222d0d0220012902002126200441d0046a41086a221e200141086a280200360200200420263703d004024020052014470d00200541016a22142005490d132007201420142007491b2214ad420c7e2226422088a70d132026a722154100480d1302402005450d00201120022015102722110d010c0b0b201510262211450d0a0b2001410c6a2101201120026a221520042903d004370200201541086a201e280200360200200741026a21072002410c6a2102200541016a2105201b41746a221b0d000b0b200a200e412c6c6a2107200a210102400240034020072001460d0120012d000021022001412c6a221b210120024107470d000b20044180016a201b41586a10be032004280284012202450d00200428028001220120024104746a2116200441d0046a41086a2117200441e4046a21180340200441d0046a2001200d201c10c10302400240024020042d00d0044101470d002017290300212720042802d404222d450d010c070b200420042d00d10422073a00a80320072001410c6a2d00002202460d0120044198026a410c6a41233602002018410236020020044198026a41086a200441a8036a3602002004412336029c02200420023a008002200441d0046a41106a20044198026a360200200442023702d404200441a0d7c4003602d004200420044180026a36029802200441c0036a200441d0046a10a20120042902c403212720042802c003222d0d060b2001410c6a2d000021070b2001410d6a2d0000211b0240024002402019200f470d00200f41016a2202200f490d16200f4101742215200220022015491b220220026a221e2002490d16201e4100480d16200f450d0120122015201e102722120d020c0e0b200f21022019210f0c010b201e10262212450d0c0b2012200f4101746a220f201b4101713a0001200f20073a0000201941016a21192002210f200141106a22012016470d000c020b0b200f21020b200441f8036a2023360200200441f4036a2013360200200441c0036a412c6a2024360200200441e8036a2029360200200441e0036a2019360200200441dc036a2002360200200441d4036a201f360200200441d0036a20103602002004201a3602f0032004202b3602e403200420123602d8032004201d3602cc03200420053602c803200420143602c403200420113602c003200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441f8006a200741586a10be03200428027c210f0c010b4100210f0b2004200f3602cc01200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220721012002410b470d000b2004200741606a28020022013602d001200f2001460d010c100b200441003602d001200f4100470d0f0b200f450d09200a200e412c6c6a2105200a2101034020052001460d0420012d000021022001412c6a2207210120024104470d000b200a200e412c6c6a210f200a21010340200f2001460d0520012d000021022001412c6a220521012002410b470d000b200441f0006a200741586a10be0320042802742201450d0a4102212e2004280270222f20014102746a2130200541606a2131200541586a213220044189056a21334100213441142135200441d0046a41146a2136410121374102213841102139200441d0046a41106a213a4201213b41908bc300213c4104213d4118213e412c213f200441c0036a412c6a2140200441e4036a214142ff01214241202143410821444228214520044188056a214620044184056a21474180800121484281808080102149200441f8046a214a4280808080808010214b410c214c200441d0046a410c6a214d4170214e20044180056a214f200441ec046a21504124215141032152412521534203215441a8cbc40021554220215641782157412621584202215941988bc300215a4198dac400215b4100215c4104215d0c0b0b20042902d404212720102107202c450d0c0c0b0b20102107202c0d0a0c0b0b20042902c4032127202c0d090c0a0b41a88ac300411e1021000b41c68ac30041c8001021000b20104104102a000b20024104102a000b20154104102a000b201e4101102a000b410021010c050b410021010c040b410821010c030b200d10230b02402014450d00201110230b02402007450d00201d10230b0240200f450d00201210230b02402024450d0020244104742102202b210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b02402029450d00202b10230b024002402013450d00201a1023202d0d050c010b410421010c020b410521010c010b200441a4026a4102360200200441e4046a41023602002004410236029c02200442023702d404200441988ac3003602d0042004200441d0016a3602a0022004200441cc016a36029802200420044198026a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d024020042802c4030d00410321010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0900010304050708090c0c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024109470d000b2004200741586a28020022013602b801200441f8036a28020020014d0d012004200441f0036a28020020014102746a280200220136028002200441ec036a28020020014d0d03200441e4036a28020020014104746a22013502084200520d07200131000d4220864280808080f000834280808080c000520d070b200a200e412c6c6a2105200a2101034020052001460d5620012d000021022001412c6a2207210120024108470d000b200441e8006a200741586a220110be03200441d0046a200428026c10c6024110215f4114216020044198026a41106a2261200441d0046a41146a22622802003602004108216320044198026a41086a2264200441d0046a410c6a290200370300200420042902d40437039802200441e0006a200110be0320042802642201450d5420042802602265200141146c6a2166410421674105216841b9f3ddf1792169417c216a4103216b4101216c4102216d417e216e41ff01216f4119217041fffdfb772171417f217241808182847821734100217420044198026a410c6a217542202176410221774202217841b8d9c4002179200441e0036a217a200441d8036a217b200441f8036a217c200441f0036a217d200441ec036a217e4105215d0c220b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c590b200441e4046a410136020020042080013602ac0320042081013602a803200441013602bc01200442013702d404200441d88bc3003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d208801450d590c6b0b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c570b20042802c0031023410321010c6a0b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d13200d1023410421010c690b202d450d130c6a0b412d1026222d450d04202d41256a41002900cd8b43370000202d41206a41002900c88b43370000202d41186a41002900c08b43370000202d41106a41002900b88b43370000202d41086a41002900b08b43370000202d41002900a88b4337000042ad808080d005212720042802c4030d0a0c090b200a450d02202aa721c701200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441386a200741586a10be0320042802382101200428023c21020c010b410021010b2002410020011b211e200141a886c50020011b211c200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a10be0320042802302101200428023421020c010b410021010b2002410020011b215d200141a886c50020011b2107200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220f210120024104470d000b200441286a200f41586a10be0320042802282101200428022c21020c010b410021010b2002410020011b211f200141a886c50020011b211b200a200e412c6c6a210f200a2101024002400240034041002102200f2001460d0120012d000021052001412c6a2223210120054103470d000b200441206a202341586a10be0320042802244100200428022022011b22050d010c020b410021014100410041001b2205450d010b200541286c2105200141a886c50020011b41186a2101410021020340200220012d0000456a2102200141286a2101200541586a22050d000b0b2007205d41146c6a215d4100211a4100211902400240024002400240024003402007205d460d012007280200210f4138210141e2bdc400210502400240200741086a28020022234106460d0020234104470d074101211a200f41a7c4c400460d01200f28000041e3c2b1e306460d010c070b41012119200f41e5c4c400460d00200f41e5c4c40041061096040d060b2007410c6a2802000d02200741106a280200220120026b220f20014b0d0341ebc4c400210541262101201f200f4d0d05201b200f4102746a220f450d054191c5c400210541202101201e200f280200220f4d0d05201c200f4104746a220f450d05411f210141d7bec4002105200f2802080d05200741146a2107200f2d000d4104460d000c050b0b201a201971410171450d02200a200e412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024106470d000b200441186a200741586a10be03200428021c450d04200041f6bec400360204411f21010c500b41132101419abec40021050c020b412a210141adbec40021050c010b411c411e201941017122081b210141abc4c40041c7c4c40020081b21050b200020053602040c4c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441106a200741586a10be0320042802102101200428021421020c010b410021010b2002410020011b21c801200141a886c50020011b21c901200a200e412c6c6a2105200a2101024002400340410021ca0120052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a10be0320042802082101200428020c21020c010b410021010b412821cb01200141a886c50020011b22cc012002410020011b41286c6a21cd01410321ce0141cae2c40021cf01410121d001410221d101411c21d201410621d30141cbbfc40021d401410421d501200341dc006a21d601410b21d70141bed0c40021d80141e3cec40021d90141e00021da01410d21db014187cfc40021dc01417d21dd01411321de0141cde2c40021df0141b1cfc40021e001410721e10141bdcec40021e20142e5f0d1fbb5ac98b6ec0021e30141c5cec40021e401410a21e50141cfcec40021e60141d9cec40021e70141a7cfc40021e80141fbcec40021e901410c21ea0141eecec40021eb0141c9cfc40021ec01410e21ed0141d7cfc40021ee01419fcec40021ef01410f21f00141aecec40021f10141e5cfc40021f201411021f30141f5cfc40021f40141b8cfc40021f501411121f6014185d0c40021f70141acd0c40021f801411221f9014192cfc40021fa01411521fb014196d0c40021fc01411621fd01410021fe010c050b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c510b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d004200420044180026a3602a80320044198026a200441d0046a10a2010c500b4195bfc40041361021000b412d4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240205d0e0a02030405000106080913130b2004205c3602d4012031280200210120322802002102203620373602002004203836028402203a20044180026a3602002004203b3702d4042004203c3602d0042004200441d4016a3602800220044198026a200441d0046a10a201200429029c022127200428029802212d2001205c4d0da70102402027a7450d00202d10230b2004202f280200220136028002024002400240024002400240204028020020014d0d002002205c203e6c6a2202280214221c450d0120412802002001203d746a22052d000d212320052802002119200228020c21012002280200211f2005280208221b210702402002280208221e450d00201e205274210f201b2102201f21050340200220052802006a22072002490d04200520446a210520072102200f20576a220f0d000b0b204410262202450d2a20022023ad20428320458637020020044180026a202e6a220520044198026a202e6a2d00003a0000200420042f0098023b018002204620233a000020472048360200200441d0046a203f6a220f2049370200204a2002360200200441d0046a20436a204b370300200441d0046a203e6a2223203b37030020362007360200203a201e360200204d201f360200200441d0046a20446a201b360200203320042f0180023b00002033202e6a20052d00003a0000200420193602d404201c203d7421052004200441c0036a3602d004410021020340200420023602e801200420013602ec01200441b8016a200441d0046a200110c403024020042802b801450d00200441a8036a20446a200441b8016a20446a280200360200200420042903b8013703a80320044198026a20356a205136020020044198026a204c6a203836020020044180026a20356a205236020020044198026a20396a200441a8036a36020020044198026a20446a200441e8016a3602002004205336029c0220044180026a20396a20044198026a360200200420543702840220042055360280022004200441ec016a36029802200441f0016a20044180026a10a201024020042802ac03450d0020042802a80310230b20042802f00122070d050b200120396a2101200220376a21022005204e6a22050d000b204f2802000d2b02402050280200450d00202328020010230b200f280200450d05204a2802001023205c20376a215c202f203d6a222f2030470d450c610b20362037360200200420383602ac03203a200441a8036a360200200420593702d4042004205b3602d004200420044180026a3602a80320044198026a200441d0046a10a201200429029c022226205688a721012026a7210220042802980222070d030c040b204310262207450d2b2007203e6a20342900a0cb44370000200720396a2034290098cb44370000200720446a2034290090cb4437000020072034290088cb44370000412021024120210120070d020c030b204310262207450d292007203e6a20342900e8dc44370000200720396a20342900e0dc44370000200720446a20342900d8dc44370000200720342900d0dc44370000412021024120210120070d010c020b20042902f401212602402050280200450d00202328020010230b2026205688215e0240200f280200450d00204a28020010230b205ea721012026a721020b200420073602800220042001ad2056862002ad8437028402200420044180026a3602a80320044198026a204c6a20583602002036202e36020020044198026a20446a200441a8036a3602002004203836029c02203a20044198026a360200200420593702d4042004205a3602d0042004200441d4016a36029802200441d8016a200441d0046a10a2010240200428028402450d0020042802800210230b20042802d801222d0d070b205c20376a215c202f203d6a222f2030470d3e410021010cba010b2065227f450d9f0141002102207f2802082280012101207f280200228101210502402080012067490d0041002102208101210120800121050340200128000020022068777320696c2102200120676a21012005206a6a2205206b4b0d000b208001206a6a22012001206a7122056b210120810120056a20676a21050b0240024002402001206c4d0d002005206d6a2107200220687720052f00007320696c21022001206e6a450d020c010b200521072001450d010b200220687720072d00007320696c21020b207f20606a21652002206877206f7320696c228201207076228301206374208301722201205f7420017221840120642802002185014100218601200428029802218701200428029c02218801208201218901410021010c8c010b0240209401208c016a280200450d0020940128020010230b0240209401208d016a2802002202450d0020940128020c21012002208c017421020340024020012d0000209001470d0020012091016a28020020920171450d002001208c016a28020010230b2001208e016a210120022093016a22020d000b0b209401208a016a21010240209401208e016a280200450d00209401208f016a28020010230b20012194012001208b01470d380cbc010b0240209f012097016a2802002202450d00209f0128020421012002209a017421020340024020012d0000209c01470d0020012098016a280200209d0171450d002001209a016a28020010230b2001209b016a21012002209e016a22020d000b0b0240209f012098016a280200450d00209f01209a016a28020010230b209f012095016a21010240209f012099016a280200450d00209f0128021010230b2001219f012001209601470d380cbb010b024020aa0120a2016a2802002202450d0020aa012802042101200220a5017421020340024020012d000020a701470d00200120a3016a28020020a80171450d00200120a5016a28020010230b200120a6016a2101200220a9016a22020d000b0b024020aa0120a3016a280200450d0020aa0120a5016a28020010230b20aa0120a0016a2101024020aa0120a4016a280200450d0020aa0128021010230b200121aa01200120a101470d380cba010b024020b2012802082202450d0020b2012802002101200220ab017421020340024020012d000020ae01470d00200120af016a28020020b00171450d00200120ab016a28020010230b200120ad016a2101200220b1016a22020d000b0b20b20120ad016a2101024020b20120ab016a280200450d0020b20128020010230b200121b201200120ac01470d380cb9010b20b901220720b5016a21b901024020072802042201450d000240200720b6016a2802002202450d00200220b6016c21020340024020012802002205450d00200120b3016a280200450d00200510230b200120b6016a2101200220b8016a22020d000b0b200720b7016a280200450d00200720b3016a28020010230b20b90120b401470d3a0cb7010b20042902dc01212720042802c4030d5c0c5b0b20bb01450d9a01200420bb0128020022013602800220bd0128020020014d0d01200441d0046a20bb0120be016a20c00128020020bf0128020010c10320042d00d00420c101460d0220042d00d1040d03200441c0006a20bb0110c503024020042802442201450d0020042802402102200120c20174210520c301280200210703402004200228020022013602b801200720014d0d60200420c401280200200120c201746a28020022013602800220c50128020020014d0d61200220be016a2102200520c6016a22050d000b0b20bb0120ba016a22bb0120bc01470d390c9a010b024020cc0120cd01460d00418ec1c4002102412d210120cc0128020820ce01470d0d024020cc01280200220520cf01460d00200520cf0120ce011096040d0e0b024020cc012d0018220120d001460d0020cc0120cb016a2105024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200120d101460d00200120ce01460d2641d1bfc40021024136210120c80120cc0128021c22074d0d3520c901200720d501746a220f450d3520cc01280214212320cc0128020c210720d6012d00000d01202320d701470d0141c2c0c400210241382101200720d801460d35200720d80120d701109604450d350c020b41bbc1c4002102412f210120cc0128021420d301470d34024020cc0128020c220720d401460d00200720d40120d3011096040d350b20fe010d2e20cc0120d2016a21fe01200521cc014108215d0ca7010b419cc0c400210241262101202320dd016a222320de014b0d3320230e14013333330c0e330d000b0a06050f070833330910010b200720d901460d0120d901200720d701109604450d01200720dc01460d0220dc01200720d701109604450d020240200720d801460d0020d801200720d7011096040d2b0b20d10110262223450d48202320ca013b0000200f2d000c20da01470d29200f28020820d101470d29200f280200215d410021010340200120d0014b0d04202320016a2102205d20016a2107200120d0016a210120072d000020022d0000460d000c2a0b0b200720df01460d31200720df0120ce01109604450d3120df01200720ce011096040d3120d0011026225d450d4a205d20ca013a0000200f2d000c20da01470d32200f28020820d001470d32200f280200211f41002102034020020d17205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c330b0b419cc0c400210241262101200f2d000c20da01470d30200f2802080d30200521cc01200f20db016a2d000020d501460d730c300b419cc0c400210241262101200f2d000c20da01470d2f200f2802080d2f200521cc01200f20db016a2d000020d501460d710c2f0b200f20db016a2d0000210120231023200521cc01200120d501460d6f0c260b200720ef01460d0b20ef01200720f001109604450d0b0240200720f101460d0020f101200720f0011096040d2e0b20d0011026221f450d4c201f20ca013a0000200f2d000c20da01470d36200f28020820d001470d36200f280200211b41002107034020070d18201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c370b0b200720ec01460d0b20ec01200720ed01109604450d0b0240200720ee01460d0020ee01200720ed011096040d2d0b20ce011026225d450d47205d20ca013a0002205d20ca013b0000200f2d000c20da01470d38200f28020820ce01470d38200f280200211f410021020340200220d1014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c390b0b200720f501460d0b20f501200720f601109604450d0b0240200720f701460d0020f701200720f6011096040d2c0b20d5011026225d450d42205d20ca01360000200f2d000c20da01470d35200f28020820d501470d35200f280200211f410021020340200220ce014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c360b0b0240200720f801460d0020f801200720f9011096040d2b0b419cc0c400210241262101200f2d000c20da01470d2a200f2802080d2a200521cc01200f20db016a2d000020d501460d570c2a0b0240200720fa01460d0020fa01200720fb011096040d2a0b419cc0c400210241262101200f2d000c20da01470d29200f2802080d29200521cc01200f20db016a2d000020d501460d5f0c290b0240200720eb01460d0020eb01200720db011096040d290b419cc0c400210241262101200f2d000c20da01470d28200f2802080d28200521cc01200f20db016a2d000020d501460d600c280b0240200720e901460d0020e901200720ea011096040d280b419cc0c400210241262101200f2d000c20da01470d27200f2802080d27200521cc01200f20db016a2d000020d501460d5e0c270b0240200720e001460d0020e001200720e1011096040d270b419cc0c400210241262101200f2d000c20da01470d26200f2802080d26200521cc01200f20db016a2d000020d501460d5b0c260b200720e401460d0620e401200720e501109604450d06200720e601460d0e20e601200720e501109604450d0e200720e701460d1420e701200720e501109604450d140240200720e801460d0020e801200720e5011096040d260b20d1011026225d450d41205d20ca013b0000200f2d000c20da01470d33200f28020820d101470d33200f280200211f410021020340200220d0014b0d16205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c340b0b0240200720e201460d00200729000020e301520d250b20e1011026221f450d42201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d22200f28020820e101470d22200f280200211b410021070340200720d3014b0d08201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c230b0b200720f201460d0520f201200720f301109604450d050240200720f401460d0020f401200720f3011096040d240b20ce011026225d450d37205d20ca013a0002205d20ca013b0000200f2d000c20da01470d2e200f28020820ce01470d2e200f280200211f410021020340200220d1014b0d11205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c2f0b0b0240200720fc01460d0020fc01200720fd011096040d230b20d1011026221f450d3c201f20ca013b0000200f2d000c20da01470d21200f28020820d101470d21200f280200211b410021070340200720d0014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c220b0b20d5011026225d450d34205d20ca01360000200f2d000c20da01470d28200f28020820d501470d28200f280200211f410021020340200220ce014b0d08205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c290b0b419cc0c400210241262101200f2d000c20da01470d20200f2802080d20200f20db016a2d0000220720d501460d20200521cc01200720d5017220d501460d520c180b20d1011026225d450d3c205d20ca013b0000200f2d000c20da01470d27200f28020820d101470d27200f280200211f410021020340200220d0014b0d07205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c280b0b20e1011026221f450d36201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d24200f28020820e101470d24200f280200211b410021070340200720d3014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c250b0b419cc0c400210241262101200f2d000c20da01470d1d200f2802080d1d200f20db016a2d0000220720d501460d1d200521cc01200720d5017220d501460d4d0c150b200f20db016a2d0000220720d501460d1a201f1023200521cc01200720d5017220d501460d590c1c0b200f20db016a2d00002101201f1023200521cc01200120d501460d490c130b200f20db016a2d00002101205d1023200521cc01200120d501460d5a0c120b200f20db016a2d00002101205d1023200521cc01200120d501460d580c110b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c100b200f20db016a2d0000220720d501460d1d201f1023200521cc01200720d5017220d501460d530c170b20d1011026225d450d2b205d20ca013b0000200f2d000c20da01470d23200f28020820d101470d23200f280200211f410021020340200220d0014b0d05205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c240b0b200f20db016a2d0000220720d501460d1e201f1023200521cc01200720d5017220d501460d530c150b200f20db016a2d00002101205d1023200521cc01200120d501460d450c0c0b200f20db016a2d00002101205d1023200521cc01200120d501460d460c0b0b200f20db016a2d00002101205d1023200521cc01200120d501460d410c0a0b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c090b419cc0c400210241262101200f2d000c20da01470d10200f2802080d10200521cc01200f20db016a2d000020d501460d4a0c100b200f20db016a2d00002101205d1023200521cc01200120d501460d480c070b4115210120004187c0c4003602040c98010b41142101200041fac0c4003602040c97010b024020fe01450d0020fe01280204450d0620fe0128020022ff0120fe0141086a2802002280024d0d0820004189c2c40036020441c90021010c97010b410021ff0141002180020c080b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c9c010b200441d8046a290300212720042802d404212d20042802c4030d560c550b41201026222d450d2d202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d530c520b202310230b412621012000419cc0c4003602040c91010b20004193c3c400360204413221010c90010b411f2101200041eac1c4003602040c8f010b20800220032802544d0d00200041d2c2c40036020441c10021010c8e010b200441d0046a41086a22024200370300200441f098c4003602d40420042003290308228102a7417f208102428080808010541b3602e00420042003290310228102a7417f208102428080808010541b3602d004200441d0046a4104722201410d10c6032001410c10c6032001410710c6032001410f10c603200441c8016a20042802e004360200200441b8016a41086a2002290300370300200420042903d0043703b801200a450d23200441d0046a410c6a202a3702002004200a3602d80420042028428080808010843703d00420044198026a200441d0046a10c703410110262201450d24200141003a0000200420042f01d0043b01c003200441e0046a41e0083b0100200441d8046a428180808010370300200420013602d404200441013602d004200420042f01c0033b01e20420044198026a200441d0046a10c8032123410310262202450d25200241026a41002d00cce2443a0000200241002f00cae2443b0000410310262205450d26200541026a41002d00cfe2443a0000200541002f00cde2443b0000200441c0036a41026a228202200441d0046a41026a2283022d00003a0000200420042f00d0043b01c003200441ac026a220f280200210720044198026a41106a28020021012083022082022d00003a0000200420042f01c0033b01d00420072001470d07200141016a22072001490da901200141017422820220072007208202491b228202ad42287e228102422088a70da901208102a722074100480da9012001450d05200441a4026a280200200141286c200710272201450d080c060b2084022d0000208b026a2201208c024b0d7b024002400240024020010e0400030102000b20840228020c2201450d7e2001208d026c2102208402280204208e026a2101034002402001208f026a2802000d0020012802002205208202490d00200120052083026a3602000b2001208d026a210120022090026a22020d000c7f0b0b20840228020c2201450d7d20840228020422a40220012091026c6a21a502410121010c7c0b20840228020c2201450d7c20840228020422a60220012093026c6a21a7020c7a0b2084022802042201208202490d7b2084022088026a20012083026a3602002084022086026a228402208702470d470c7c0b201f10232000419cc0c4003602040c8b010b201f10230b200020023602040c89010b205d10232000419cc0c4003602040c88010b200710262201450d020b200441a8026a208202360200200441a4026a2001360200200441ac026a28020021070b200441a4026a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441d2046a2d00003a0000200141196a20042f01d0043b00002001411c6a2023360200200f200f28020041016a360200200441d0046a20044198026a418c011094041a200441a8036a200441d0046a10c903200441a8036a41106a2802002223412c6c210120042802b00322840241586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241586a21022005417f6a21820202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241606a21020240024003402001450d01200141546a2101200241206a21072002412c6a220f210220072d00004104470d000b200f280200210120230d010c780b410021012023450d770b200120056a218502412c2186022084022023412c6c6a2187024104218802200441b8016a4104722189024100218a024178218b024103218c024114218d024110218e02417c218f024101218302416c219002411c21910241022192024118219302410c2194024108219502428080808010219602412d2197024220218102417f219802410b2199024170219a02417e219b0241ec00219c024203219d024202219e0241ff01219f02410521a002410621a102410021a202410021a3024109215d0c700b20074104102a000b201f10232000419cc0c4003602040c83010b205d10232000419cc0c4003602040c82010b205d10232000419cc0c4003602040c81010b201f10232000419cc0c4003602040c80010b205d10232000419cc0c4003602040c7f0b205d10232000419cc0c4003602040c7e0b205d10232000419cc0c4003602040c7d0b205d10232000419cc0c4003602040c7c0b205d10232000419cc0c4003602040c7b0b41084104102a000b41c0cbc400104f000b41204101102a000b41204101102a000b41044101102a000b41034101102a000b41024101102a000b41024101102a000b41044101102a000b41074101102a000b41014101102a000b41024101102a000b41034101102a000b41024101102a000b41024101102a000b41074101102a000b41014101102a000b4195bfc40041361021000b41014101102a000b41034101102a000b41034101102a000b41204101102a000b4100215d0c2d0b4101215d0c2d0b4102215d0c2d0b4103215d0c2d0b4104215d0c2d0b4104215d0c2d0b4106215d0c2e0b4107215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2f0b4109215d0c300b410021010c5e0b410321010c5d0b410221010c5c0b410321010c5b0b410221010c5a0b410321010c590b410221010c580b410321010c570b410221010c560b410421010c550b410521010c540b410621010c530b410721010c520b410821010c510b410821010c500b410821010c4f0b410821010c4e0b410821010c4d0b410821010c4c0b410821010c4b0b410821010c4a0b410821010c490b410821010c480b410821010c470b410821010c460b410821010c450b410821010c440b410821010c430b410821010c420b410821010c410b410821010c400b410821010c3f0b410821010c3e0b410821010c3d0b410821010c3c0b410821010c3b0b410821010c3a0b410821010c390b410821010c380b410821010c370b410821010c360b410821010c350b410821010c340b410821010c330b410821010c320b410821010c310b410821010c300b410821010c2f0b410821010c2e0b410221010b034002400240024002400240024002400240024002400240024002400240024020010e03000102020b02402087012089012088017122016a2800002205208401732202207273200220716a712073712202450d0003400240208001208501200268206b7620016a20880171206b746a220720676a280200470d0020810120072802002207460d082081012007208001109604450d070b200220726a20027122020d000b0b20860120676a22860120016a21890120052005206c7471207371450d03024020612802000d0020044198026a10c702200428029802218701200428029c022188010b410021010340200120676a22012082012088017122026a21820120870120026a2800002073712205450d000b0240208701200568206b7620026a2088017122016a2c000022022074480d0020870120870128020020737168206b7622016a2d000021020b20870120016a2083013a00002087012001206a6a208801716a20676a2083013a0000206120612802002002206c716b36020020752075280200206c6a36020020642802002001206b746a208001ad207686208101ad8437020002400240024002400240024002400240207f28020c2201206c460d0002402001206d460d002001206b470d022004207f28021022013602f001207a28020020014d0d06207b2802002001206c746a2d0001450d030c070b2004207f28021022013602b801200441c0036a20636a28020020014b0d022062206c360200200420773602ac03200441d0046a205f6a200441a8036a360200200420783702d404200420793602d0042004200441b8016a3602a80320044180026a200441d0046a10a201200428028002222d450d020c110b2004207f28021022013602b801200441c0036a20606a28020020014b0d010c030b2004207f28021022013602f001207c28020020014d0d012004207d2802002001206d746a28020022013602b801207e28020020014d0d050b20652066470d0b0c260b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3e0c2c0b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3d0c2b0b200441e4046a4101360200200441023602ac03200442023702d404200441b8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3c0c2a0b200441e4046a4101360200200441023602ac03200442023702d404200441d8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3b0c290b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d0042004200441b8016a3602a80320044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3a0c280b20a40222012091026a21a402024020012802182202450d002001280210210120022092027421020340024020012802002205208202490d00200120052083026a3602000b20012088026a21012002208f026a22020d000b0b20a40220a502470d010c0e0b20a3022111024020a602280214208802742202450d0020a60228020c21010340024020012d0000209902470d0020012088026a22052802002207208202490d00200520072083026a3602000b2001208e026a21012002209a026a22020d000b0b20950210262201450d0620012096023702002088021026221c450d0520a6022094026a2105201c208a0236020020a602208d026a22102802002224450d0841002102410121234101210f4101211b41012107024002400240024041002024221f4f0d000240034020022083026a211f0240024002400240024002400240024020052802002002208802746a2d00002202209b026a208c024f0d00200210ca0321a802200441b8016a2095026a28020021a90220890221aa020c010b0240024002400240024002400240200220a002460d00200220a102470d012007450d0f20072098026a21070c0a0b2007450d0e2023200f470d0120232083026a22022023490d4d202320830274221e20022002201e491b221ead209d0286222620810288a70d4d2026a72202208a02480d4d2023450d0220012023208c02742002102722010d030c040b200210ca0321ab02200441b8016a2095026a28020021ac0220890221ad020c060b2023211e0c010b200210262201450d010b2001200f208c02746a22022083023602042002201f360200024002400240201b20072098026a2223470d00201b208302742202200720072002491b2219ad209e0286222620810288a70d4c2026a72202208a02480d4c201b450d01201c201b2092027420021027221c0d020c040b201b21190c010b20021026221c450d020b200f2083026a2102201c2023209202746a200f360200201f20244f0d180c080b20024104102a000b20024104102a000b410021020c010b410121020b0240024003400240024020020e020001010b20aa0228020022192095026a21a30220192f0106211e410021020240024002400340201e2002460d01208a0220980220830220a30220026a2d0000221a20a802209f0271221d4b1b201a201d461b221a450d0220022083026a2102201a208302460d000b20022098026a211e0b024020a902450d0020a9022098026a21a9022019201e209202746a209c026a21aa02410021020c040b200441b8016a211e20072098026a22022007490d010c0b0b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d0b2019209202470d0020022088026a211e0b20072098026a220220074f0d0a0b200220074b0d09200f201c2002209202746a28020022024d0d0920012002208c02746a22192802042202201e2802006a221e2002490d0920192088026a201e36020002402023200f470d0020232083026a22022023490d49202320830274221e20022002201e491b221ead209d0286222620810288a70d492026a72202208a02480d492023450d0620012023208c02742002102722010d070c0c0b2023211e0c060b20ad0228020022192095026a21a30220192f0106211e4100210202400340201e2002460d01208a0220980220830220a30220026a2d0000221a20ab02209f0271221d4b1b201a201d461b221a450d0320022083026a2102201a208302460d000b20022098026a211e0b024020ac02450d0020ac022098026a21ac022019201e209202746a209c026a21ad02410121020c010b0b200441b8016a211e20072098026a22022007490d010c070b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d072019209202470d0020022088026a211e0b20072098026a220220074f0d060b200220074b0d05200f201c2002209202746a28020022024d0d0520012002208c02746a22192802042202201e2802006a221e2002490d0520192088026a201e3602000b2023211e200f2102201b2119201f2024490d020c120b200210262201450d050b2001200f208c02746a22022083023602042002201f360200024002400240201b2007470d00201b2083026a2202201b490d44201b208302742223200220022023491b2219ad209e0286222620810288a70d442026a72202208a02480d44201b450d01201c201b2092027420021027221c0d020c080b201b21190c010b20021026221c450d060b200f2083026a2102201c2007209202746a200f36020020072083026a2107201f20244f0d100b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d00200110230b410121a2020240201b450d00201c1023201121a3022084022086026a228402208702470d040c130b201121a3020c110b41d0e2c4002002201f1029000b20024104102a000b20024104102a000b4109215d410821010c390b410121010c0b0b410021010c0a0b410121010c360b410121010c350b4105215d410821010c340b41044104102a000b41084104102a000b20042902840221272088010d300c1e0b20012095026a210f410121194101211e0c010b2002450d0120012002208c02746a210f0b200121234101210203402001290200212620042097023a00d00420042026208102883e02d404200520022026a76a22072098026a200441d0046a10cb0320042099023a00d00420042082023602d40420052007200441d0046a10cb0320022092026a2102200f20012095026a2201470d000b202321010b0240201e450d00200110230b02402019450d00201c10230b20a6022093026a21a60202400240200441b8016a208e026a280200450d0020102802002202450d00200528020021012002208802742102410021050340024020012d0000208602470d0020012099023a000020012088026a20850236020020052083026a21050b2001208e026a21012002209a026a22020d000b410121a30220050d010b201121a3020b20a60220a702460d01410221010c000b0b2084022086026a228402208702470d0d0b024020a202410171450d0020042802b0032109200441b4036a2902002227a7210202402027422088a72201450d002001412c6c21082009210103402001109f012001412c6a2101200841546a22080d000b0b02402002450d00200910230b20042802bc01200441c0016a280200200441c4016a28020010d301200041c5c3c400360204411a21010c030b024020a302410171450d00200441d0046a41106a200441a8036a41106a280200360200200441d0046a41086a200441a8036a41086a290300370300200420042903a8033703d004200441c0036a200441d0046a10c703411010262208450d08200841063a0000410110262201450d09200141003a0000410110262202450d0a200220012d00003a000020011023411010262209450d0b200941063a000041f00010262201450d0c200141063a00602001412c3b015020012082023602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441c8016a280200360224024020092d00004109470d00200928020841ffffffff0371450d00200928020410230b20091023024020082d00004109470d00200828020841ffffffff0371450d00200828020410230b20081023200441f4046a4287808080f000370200200441f0046a2001360200200441ec046a4100360200200441d0046a410c6a4281808080800c370200200441d8046a4101360200200441003602fc04200442043702e404200420023602d404200441013602d004200441c0036a200441d0046a10cc03200441d0046a200441c0036a418c011094041a20044180026a200441d0046a10c90320044180026a410c6a2902002127200428028802218402200428028402210120042802800221080c020b20042802b0032184020b200441b4036a290200212720042802ac03210120042802a80321080b20042802bc01200441c0016a280200200441b8016a410c6a28020010d301208402450d02200441c0036a410c6a202737020020042084023602c80320042001ad4220862008ad843703c003200441d0046a200441c0036a200328025010cd0320042802d0044101470d010240200441d8046a280200450d0020042802d40410230b200041dfc3c400360204412321010b20004101360200200041086a2001360200200441e0056a24000f0b200441dc046a280200222c450d01200441e0046a2903002127200441d8046a280200210220042802d40421092003280248212320044100360288022004420137038002410410262201450d02200441043602840220044188026a22082008280200220541046a3602002004200136028002200120056a20093600000240024002402004280284022209200828020022016b41044f0d00200141046a22082001490d2a20094101742201200820082001491b22014100480d2a2009450d012004280280022009200110272208450d020c0c0b20042802800221080c0c0b2001102622080d0a0b20014101102a000b4195bfc40041361021000b4195bfc40041361021000b41044101102a000b41104108102a000b41014101102a000b41014101102a000b41104108102a000b41f0004108102a000b4109215d410821010c1d0b2004200136028402200420083602800220044188026a28020021010b20044180026a41086a200141046a360200200820016a2002360000202c2027422088a72201412c6c22086a21022027a7210f024002400240024002402001450d00200841546a2122200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121202c2101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d02200441c0036a41276a22202005280000360000200441c0036a41206a220a200b290300370300200441c0036a41186a222d2007290300370300200441c0036a41106a220d2006290300370300200441c0036a41086a220e2021290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420093a00d00420044198026a200441d0046a20044180026a109a0120042d0098022209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b202c22012002470d010c020b2001412c6a22012002460d010b200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d01200441c0036a41276a22222005280000360000200441c0036a41206a2220200b290300370300200441c0036a41186a220a2007290300370300200441c0036a41106a222d2006290300370300200441c0036a41086a220d2021290300370300200420042903d0043703c003200820042903c003370000200841086a200d290300370000200841106a202d290300370000200841186a200a290300370000200841206a2020290300370000200841276a2022280000360000200420093a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b20044180026a41086a280200210120042903800221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a208002360200200041086a20ff0136020020002023360204200041003602002000411d6a20042f00a8033b00002000411f6a200441aa036a2d00003a0000200441e0056a24000f0b20044198026a41086a2802002123200428029c0221820202402022450d002001412c6a2101200441d0046a4101722108200441d0046a41276a210b200441d0046a41206a2107200441d0046a41186a2106200441d0046a41106a2121200441d0046a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703d0042005410f460d01200441c0036a41276a2220200b280000360000200441c0036a41206a220a2007290300370300200441c0036a41186a222d2006290300370300200441c0036a41106a220d2021290300370300200441c0036a41086a220e2022290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420053a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b0240200428028402450d0020042802800210230b024020094105470d002023450d0020820210230b20004182c4c40036020420004101360200200041086a4125360200200441e0056a24000f0b20004101360200200041086a2001360200200a450d2a0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b20c701450d2a200a1023200441e0056a24000f0b200428029c02450d0020042802980210230b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a2207210120024103470d000b200441d8006a200741586a10be03200428025c2201450d0020042802582107200141286c210f41002101200441a4026a211f200441e4046a211b200441a0026a211e200441e0046a211c200441ec036a21230340024002400240200720016a220241186a2d000022054101460d00024020054102460d0020054103470d022002411a6a2d0000450d030c090b200441d0046a2002411c6a10c00320042802d004222d450d020c060b200241206a2802004101470d012002411c6a28020021052004200241246a28020022023602b801200520024d0d01201f4102360200201b4102360200201e200441a8036a3602002004410236029c02200420053602a803201c20044198026a360200200442023702d4042004418cd6c4003602d0042004200441b8016a3602980220044180026a200441d0046a10a201200428028002222d450d010c0c0b20042002411c6a280200220236028002202328020020024d0d050b200f200141286a2201470d000b0b0240200441c0036a41146a28020022014102490d00200441d0046a41146a41013602002004410236028402200420013602a803200442013702d404200441e88bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b0240200441c8036a280200220141014d0d00200441e4046a41013602002004410236028402200420013602a803200442013702d404200441f08bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a220721012002410c470d000b200441d0006a200741586a10be03200428025022012004280254411c6c6a2105200441c8036a2107200441e0036a210f200441c0036a41186a2123200441e4046a211f200441e0046a211b034020012005460d01200420012802002202360280020240200728020020024b0d00201f4101360200200441023602ac03201b200441a8036a360200200442023702d404200441b8d9c4003602d004200420044180026a3602a80320044198026a200441d0046a10a201200428029802222d0d0a0b200441d0046a200141046a22012023280200200f28020010c10320042d00d0044101460d08200141186a210120042d00d104450d000b41201026222d450d0a202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d0f0c0e0b200a200e412c6c6a2105200a2101034020052001460d0120012d000021022001412c6a220721012002410a470d000b200441c8006a200741586a10be03200428024c2201450d00411c21ba01200428024822bb012001411c6c6a21bc01200441d4036a21bd01410421be01200441e0036a21bf01200441d8036a21c001410121c101410221c201200441f8036a21c301200441f0036a21c401200441ec036a21c501417c21c6014107215d0c160b024020042802c403450d0020042802c00310230b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d14200d1023410521010c170b20042902d404212720042802c4030d0a0c090b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c010b2002410c6a2802002101200241146a2802002102200441d0046a41146a410136020020042002360284022004200136028002200441013602ac03200442013702d404200441e08bc3003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010b200429029c022127200428029802212d0b20042802c403450d04410221010c120b200441d8046a290300212720042802d404212d20042802c4030d090c080b200429029c02212720042802c4030d0c0c0b0b200429028402212720042802c4030d090c080b41204101102a000b410321010c0d0b410321010c0c0b410221010c0b0b410321010c0a0b410221010c090b410321010c080b410221010c070b410321010c060b410221010c050b410321010c040b410221010c030b410521010c020b410821010c010b2087011023024020042802c4030d00410321010c010b410221010c000b0b101e000b02402027a7450d00202d10230b0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41b9bdc400210141132108202aa7450d0c200a10230c0c0b2020450d0120211023200b0d020c030b2022450d00200610230b200b450d010b200b412c6c210b200a210103402001109f012001412c6a2101200b41546a220b0d000b0b200c450d04200a10230c040b0240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41192108200c450d00200a10230b0b0c010b410021090b200441d0036a2002360200200441cc036a2006360200200441013602c00320042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702c403200441c0036a4104722101200841ff01714105470d010b2001280208450d002001280204102320042802c0030d0041002108200441cc036a2802002209210103402001109f012001412c6a2101200841546a22080d000b200441d0036a280200450d00200910230b41ccbdc4002101411621080b2000200136020420004101360200200041086a20083602000b200441e0056a24000bed0202017e067f024002400240024002400240024002402001450d00200141074b0d01200141016a21010c020b200041086a4280808080c000370200200041046a41a48ec300360200410021010c030b2001ad4203862202422088a70d052002a7220341076e210142808080801021022003410e490d010b417f2001417f6a677641016aad42208621020b2002423d88a70d012002422088a7220141076a417c712203200141046a2204490d0120032002421d88a76a22052003490d012005417d4f0d01200510262206450d022001417f6a220541084921072002422388a741076c2108200641ff012004109304220420036a21030240200141034b0d00200420016a418001410420016b1093041a0b2005200820071b21012000410c6a2003360200200041086a2005360200200041046a20043602000b200041003a0000200041146a2001360200200041106a41003602000f0b41948dc300104f000b20054104102a000b41948dc300104f000be00e03397f017e027f230041206b220124000240024002400240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b0240200320044101764f0d00200241016a210541002106410421074103210841fffefdfb0721094107210a417f210b4181828408210c41004101710d020c030b200141086a200310c60220012d00084101460d062001411c6a280200210d200141086a410c6a280200210e200141106a280200210f200128020c2110417f21114180818284782112410421134101211420002802002215200041046a2802006a41016a21162000410c6a28020021172000280208211841202119417c211a4138211b4105211c41b9f3ddf179211d4103211e4102211f417e212041ff01212141002122411921232015280200417f734180818284787122240d040c030b41948dc300104f000b410121020c030b410021020c020b410321020c010b410421020b0240024002400340024002400240024002400240024002400240024002400240024020020e050100090304040b200620086a220220064922030d04200220054f0d042005200620076a20031b200520022005491b21060c010b200620054f0d0320062102200641016a21060b200028020020026a220220022802002202200a76200b73200c7120022009726a3602004101410171450d09410121020c0a0b201520136a21020340200220164f0d03201820196a211820022802002103200220136a22042102200320127122032012460d000b200320127321242004201a6a2115410421020c090b2018202468201b716a22262802002127410021030240202628020422282013490d00410021032027210220282104034020022800002003201c7773201d6c2103200220136a21022004201a6a2204201e4b0d000b2028201a6a22022002201a7122026b2128202720026a20136a21270b024002400240202820144d0d002027201f6a21022003201c7720272f000073201d6c2103202820206a0d010c020b202721022028450d010b2003201c7720022d000073201d6c21030b202420116a2127410021022003201c77202173201d6c222521030340200220136a22022003200f7122046a2103201020046a2800002012712228450d000b02402010202868201e7620046a200f7122026a2c00002022480d00201028020020127168201e7621020b201020026a202520237622033a000020102002201a6a200f716a20136a20033a0000200e2002201e746a2026290200370200202720247122240d05410321020c080b20002802002102200041046a220428020041016a220341034b0d01200241046a200220031095041a2000280200200428020022026a41016a418001410320026b1093041a0c020b2000200d20176b3602102000410c6a2017360200200041086a200e3602002000280200210320002010360200200041046a221328020021022013200f3602002002450d0a200310230c0a0b200220036a20022800003600000b410421294101212a200041046a222b28020041016a222c450d054100212d418001212e4103212f200041086a21304105213141b9f3ddf1792132417c213341022134417e213541ff01213641808182847821374119213841002139410221020c040b20392225202a6a21390240024002400240202520002802006a2d0000202e460d002039202c470d050c010b0240034020302802002025202f746a223b2802002127410021030240203b28020422282029490d004100210320272102202821040340200228000020032031777320326c2103200220296a2102200420336a2204202f4b0d000b202820336a2202200220337122026b2128202720026a20296a21270b0240024002402028202a4d0d00202720346a2102200320317720272f00007320326c2103202820356a0d010c020b202721022028450d010b200320317720022d00007320326c21030b202b28020021282000280200212741002102200320317720367320326c223c21030340200220296a2202200320287122046a2103202720046a2800002037712226450d000b02402027202668202f7620046a20287122026a2c0000202d480d00202728020020377168202f7621020b02402002203c20287122036b202520036b73202871202f4d0d00202720026a22032d000021042003203c20387622263a00002027200220336a2028716a20296a20263a000020042036460d0220302802002002202f746a2202290200213a2002203b290200370200203b203a3702000c010b0b202720256a203c20387622023a000020272028202520336a716a20296a20023a00002039202c470d030c010b2000280200220320256a20363a00002003202b280200202520336a716a20296a20363a000020302802002002202f746a203b2902003702002039202c470d010b200041046a280200221341084f0d070c080b410221020c040b410221020c030b410421020c020b410221020c010b410021020c000b0b417f21130b2013202a6a41037641076c21130b200020132000410c6a2802006b360210200141206a24000f0b200141206a24000b1c00200128021841bbb0c500410e2001411c6a28020028020c1102000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a41273602002004412c6a4102360200200441013602342004420237021c2004419083c5003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41a083c5001061000b1c00200128021841b0b0c500410b2001411c6a28020028020c1102000bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441ea86c5006a2f00003b00002005417e6a2008419c7f6c20076a41017441ea86c5006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441ea86c5006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441ea86c5006a2f00003b00000b2002200141a886c5004100200341096a20046a412720046b1097012104200341306a240020040be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041f5ccc2004111200141106a1000200141086a220320022903003703002001200129031037030042002104024002402001411041a886c500410041001001417f460d002001420037031020014110200141106a41084100100141016a41084d0d01200129031021040b200242003703002001420037031041f5ccc2004111200141106a100020032002290300370300200120012903103703002001200420007c37031020014110200141106a41081004200141206a24000f0b41d4aac10041331021000b9a820108067f027e037f017e0f7f027e0c7f027e230041d0076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441054b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200341c8056a200141086a41c8001094041a200341d8046a41086a2204200141dc006a290200370300200341d8046a41106a2205200141e4006a2802003602002003200141d4006a2902003703d80420022d000120022d000072450d0a41b394c3002104412821020c5f0b200341c0036a41186a200141196a290000370300200341c0036a41106a200141116a290000370300200341c0036a41086a200141096a290000370300200320012900013703c003200341c8056a41206a200141c1006a2d00003a0000200341c8056a41186a200141396a290000370300200341c8056a41106a200141316a290000370300200341c8056a41086a200141296a2900003703002003200141216a2900003703c805200341b8066a41086a2204200241096a290000370300200341b8066a41106a2205200241116a290000370300200341b8066a41186a2206200241196a290000370300200341b8066a41206a2207200241216a2d00003a0000200341dc046a2208200241266a2f01003b0100200320022900013703b8062003200241226a2801003602d80420022d00002202450d0420034180026a41266a20032802d8043601002003418d026a200429030037000020034195026a20052903003700002003419d026a2006290300370000200341a5026a20072d00003a0000200341aa026a20082f01003b0100200320032903b80637008502200320023a008402200341013a0080020c580b200141c0006a2903002109200141386a290300210a200141306a280200210b2001412c6a280200210c200141286a280200210d2001411d6a290000210e2001411c6a2d0000210f2001411b6a2d00002110200141196a2f00002111200141186a2d00002112200141176a2d00002113200141156a2f00002114200141146a2d00002115200141136a2d00002116200141116a2f00002117200141106a2d000021182001410c6a2802002119200141086a280200211a200141076a2d0000211b200141056a2f0000211c200141046a2d0000211d200141c8006a290300211e2002411a6a290100211f200241196a2d00002120200241186a2d00002121200241166a2f01002122200241156a2d00002123200241146a2d00002124200241126a2f01002125200241116a2d00002126200241106a2d000021272002410e6a2f010021282002410d6a2d00002129200241046a2d0000212a200241026a2f0100212b41db94c3002104412a210520022d0000450d044101210641002107410021080c050b200141386a290300211e200141306a2903002109200141c0006a290300211f200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a001200141246a280200210d200141286a28020021212001412c6a280200212a2002411a6a290100210e200241196a2d0000211a200241186a2d0000211d200241166a2f0100210c200241156a2d00002120200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d054101210641002107410021080c060b2001410c6a280200210c200141086a280200211a200141046a280200211d200141106a290300211f2002411a6a290100210e200241196a2d00002120200241186a2d00002121200241166a2f0100210d200241156a2d00002122200241146a2d00002123200241126a2f01002124200241116a2d00002125200241106a2d000021262002410e6a2f010021272002410d6a2d00002128200241046a2d00002129200241026a2f0100212a412a210541db94c300210420022d0000450d074101210641002107410021080c080b200141d8006a290300210e200141d0006a290300211e200341c0016a41186a200141196a290000370300200341c0016a41106a200141116a290000370300200341c0016a41086a200141096a290000370300200320012900013703c001200341e0016a41186a200141396a290000370300200341e0016a41106a200141316a290000370300200341e0016a41086a200141296a2900003703002003200141216a2900003703e001200141c4006a280200211d200141c8006a280200211a200141cc006a280200212a2002411a6a290100211f200241196a2d0000210c200241186a2d00002120200241166a2f01002121200241156a2d0000210d200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d084101210641002107410021080c090b20034180026a41216a20072d00003a000020034180026a41196a200629030037000020034180026a41116a200529030037000020034180026a41096a2004290300370000200320032903b80637008102200341003a00800220032d00810222024101460d0f20024102470d5320032d00c8054101470d53200341c8056a41017221024200211f0c100b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d4e2003201f3703f801200320203a00f701200320213a00f601200320223b01f401200320233a00f301200320243a00f201200320253b01f001200320263a00ef01200320273a00ee01200320283b01ec01200320293a00eb01200320023600e701200320043600e3012003202a3a00e2012003202b3b01e001201d41ff01714101470d4920034180026a201a4106761087012003280280022104200328028802201a413f7122024d0d0f200420024105746a2202290018210e20022d0017210f20022d0016211020022f0014211120022d0013211220022d0012211320022f0010211420022d000f211520022d000e211620022f000c211720022d000b2118200228000721062002280003210720022d0002211b20022f0000211c41012105200328028402450d480c470b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d412003200e3703d8012003201a3a00d7012003201d3a00d6012003200c3b01d401200320203a00d301200320223a00d201200320233b01d001200320243a00cf01200320253a00ce01200320263b01cc01200320273a00cb01200320023600c701200320043600c301200320283a00c201200320293b01c00120034180026a200341c0016a201f10cf022003280280024101470d052003280288022102200328028402210420210d420c430b200141d0006a2802002102200341b8066a200341c8056a41c8001094041a200341c0036a41106a2005280200360200200341c0036a41086a2004290300370300200320032903d8043703c003200341a8056a41086a22044200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2004290300370300200320032903a8053703a001410021050240200341a0016a411041a886c500410041001001417f460d00200342103702b4042003200341a0016a3602b00420034180026a200341b0046a10c10220032d00dc024102460d2520032802c80221050b41d48fc30021040240200520024f0d002003418c026a200236020020034180026a41086a41033a00002003410a3a0080024100210441a886c500410020034180026a102c20034180026a200341b8066a41c8001094041a200341d4026a200341c0036a41086a290300370200200341dc026a200341c0036a41106a280200360200200320023602c802200320032903c0033702cc02200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341003602b804200342013703b00420034180026a200341b0046a10b20220032802b4042102200341a0016a411020032802b004220520032802b80410042002450d00200510230b413521020c4f0b41012106410021074100210820022d00014101470d002002410c6a2d000021072002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200841ffff0371410874200741187472200541ff017172210220060d062003200e3703e005200320203a00df05200320213a00de052003200d3b01dc05200320223a00db05200320233a00da05200320243b01d805200320253a00d705200320263a00d605200320273b01d405200320283a00d305200320023600cf05200320043600cb05200320293a00ca052003202a3b01c805200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d04200342103702c4032003200341a0016a3602c00320034180026a200341c0036a10c10220032d00dc0222024102460d20200341b8066a20034180026a41dc001094041a20032f00dd022104200341b8066a41df006a20034180026a41df006a2d00003a0000200320043b009507200320023a0094070c050b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d392003201f3703c8042003200c3a00c704200320203a00c604200320213b01c4042003200d3a00c304200320223a00c204200320233b01c004200320243a00bf04200320253a00be04200320263b01bc04200320273a00bb04200320023600b704200320043600b304200320283a00b204200320293b01b00420034180026a200341b0046a10d80120032d00800222044102470d0141012104413421024202211f0c0c0b20034180026a41306a290300210e200341a8026a290300211f200341e0016a41186a20034180026a41206a290300370300200341e0016a41106a20034180026a41186a290300370300200341e0016a41086a20034180026a41106a29030037030020032003290388023703e00120034180026a10d002200320034180026a3602bc03200320034180026a36029005200341c8056a41186a2205200341c0016a41186a290300370300200341c8056a41106a2206200341c0016a41106a290300370300200341c8056a41086a2207200341c0016a41086a290300370300200320032903c0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d31200341f0066a28020021022008450d0e410021040c310b200341a8056a41086a220520034194026a290200370300200341a8056a41106a22062003419c026a280200360200200341c8056a41086a220720034180026a41306a290300370300200341c8056a41106a2208200341b8026a290300370300200341c8056a41186a220c200341c0026a290300370300200341c8056a41206a2220200341c8026a290300370300200341c8056a41286a2221200341d0026a290300370300200341c8056a41306a220d200341d8026a29030037030020032003418c026a2902003703a805200320034180026a41286a2903003703c80520034180026a41086a28020021024202211f42022109024020040d0020034180026a41206a2903002109200341a0016a41106a2006280200360200200341a0016a41086a2005290300370300200341c0036a41086a2007290300370300200341c0036a41106a2008290300370300200341c0036a41186a200c290300370300200341c0036a41206a2020290300370300200341c0036a41286a2021290300370300200341c0036a41306a200d290300370300200320032903a8053703a001200320032903c8053703c0030b20094202520d0941012104413421020c0a0b200341003a00940720034280808480800237038807200342013703f806200342013703f006200342013703e806200342013703e006200342013703d806200342013703d006200342013703c806200342013703c006200342013703b80620034280808080c0003703800720034120360290070b20034180026a200341c8056a201f10cf022003280280024101470d01200328028802210220032802840221040b4100210841012107201a450d31201d10230c310b200341b0026a290300210e200341a8026a290300211f200341a0026a290300210a20034198026a290300212c20034190026a290300211e200329038802212d200341206a20032903b8064200200cad4200109804201e427f200329032020032903284200521b7d2209201e56200950722206450d03412c2102418990c300210541012104201a0d040c2f0b20032d00c8054101460d434200211f200341a8056a41086a22024200370300200342003703a80541b590c300411c200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d00200342003703b806200341a0016a4110200341b8066a41084100100141016a41084d0d1720032903b806211f0b20034180026a41027221020b4100210441012107200341c0036a201f410010d10241ff01714101470d0b4200211f200341a8056a41086a22054200370300200342003703a80541d190c3004118200341a8056a1000200341a0016a41086a2005290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d09200342003703e004200342003703d804200341a0016a4110200341d8046a4110410010012205417f460d192005410f4d0d19200341e0046a290300210e20032903d804211f0c0a0b410021052003280284020d370c380b20034180026a201d200c200341b8066a10c5022003280280024101470d0320034188026a2802002102200328028402210541012104201a450d2b0b201d10230c2a0b200341c8056a41106a200341a0016a41106a280200360200200341c8056a41086a200341a0016a41086a29030037030020034180026a41086a200341c0036a41086a29030037030020034180026a41106a200341c0036a41106a29030037030020034180026a41186a200341c0036a41186a29030037030020034180026a41206a200341c0036a41206a29030037030020034180026a41286a200341c0036a41286a29030037030020034180026a41306a200341c0036a41306a290300370300200320032903a0013703c805200320032903c00337038002410021042009211f0b20034190056a41106a2205200341c8056a41106a28020036020020034190056a41086a2206200341c8056a41086a290300370300200341d8046a41086a220720034180026a41086a290300370300200341d8046a41106a220820034180026a41106a290300370300200341d8046a41186a220c20034180026a41186a290300370300200341d8046a41206a222020034180026a41206a290300370300200341d8046a41286a222120034180026a41286a290300370300200341d8046a41306a220d20034180026a41306a290300370300200320032903c8053703900520032003290380023703d80402402004450d0041d291c3002104201a0d2e0c2f0b200341b8066a41206a20032903d804370300200341c4066a2006290300370200200341cc066a2005280200360200200341b8066a41286a2007290300370300200341b8066a41306a2008290300370300200341f0066a200c290300370300200341f8066a202029030037030020034180076a202129030037030020034188076a200d29030037030020032003290390053702bc06200320023602b8062003201f3703d00642002109200341a8056a41086a22024200370300200342003703a80541af98c300410d200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d002003420037038002200341a0016a411020034180026a41084100100141016a41084d0d1020032903800221090b0240201fa74101470d00200341d8066a2903002009520d00418692c3002104412a2102200341e4066a280200450d2d0c2c0b20034180026a200341c0016a10d80120032d00800222024102470d010c2a0b200341d8046a41186a220420034180026a410472220241186a280200360200200341d8046a41106a2207200241106a290200370300200341d8046a41086a222a200241086a290200370300200320022902003703d80420034180026a41186a2202420037030020034180026a41106a2205420037030020034180026a41086a42003703002003420037038002201d200c20034180026a10022002290300211e20052f0100210820032d009702212020032d009602212120032f019402210d20032d009302212220032d009202212320032d008f02212420032d008e02212520032f018c02212620032d008b0221272003280087022102200328008302210520032d008202212820032f0180022129200341c0036a41186a2004280200360200200341c0036a41106a2007290300370300200341c0036a41086a202a290300370300200320032903d8043703c003411410262204450d14200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d152004201e37002c200420203a002b200420213a002a2004200d3b0028200420223a0027200420233a0026200420083b0024200420243a0023200420253a0022200420263b0020200420273a001f2004200236001b20042005360017200420283a0016200420293b001420034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413420034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341a8056a200341c0036a10b101200410230240200341c0036a41106a280200450d0020032802cc0310230b411510262204450d162004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d172004201e37002d200420203a002c200420213a002b2004200d3b0029200420223a0028200420233a0027200420083b0025200420243a0024200420253a0023200420263b0021200420273a00202004200236001c20042005360018200420283a0017200420293b001520034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413520034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341003602880220034201370380022003200c3602c003200341c0036a20034180026a1041200328028402222b200328028802222a6b200c4f0d02202a200c6a2207202a490d20202b410174220f20072007200f491b220f4100480d20202b450d09200328028002202b200f10272207450d0a0c250b2002450d052003418c026a2d000021022003418d026a290000211f20034195026a280000210420032f008102210520032d0083022106200329028402210a200320034199026a2900003703f004200320043602ec042003201f3702e404200320023a00e3042003200a3700db04200320063a00da04200320053b01d804200341d0066a290300210a200341d8066a290300212c2003201d3602a8052003201d202a4105746a3602ac052003200341b8066a3602b005200341c8056a200341a8056a10a00220032802c805450d0720034180026a41086a2202200341c8056a41086a290300370300200320032903c80537038002411010262205450d192005200329038002370200200541086a2002290300370200200341c0036a41086a200341a8056a41086a280200360200200320032903a8053703c003200341c8056a200341c0036a10a00220032802c805450d0a4101210241012107034020034180026a41086a2206200341c8056a41086a290300370300200320032903c8053703800202400240024020072002470d00200241016a22042002490d2320024101742207200420042007491b2207ad420486221f422088a70d23201fa722084100480d232002450d01200520024104742008102722050d020c140b200241016a21040c010b200810262205450d120b200520024104746a2202200329038002370200200241086a2006290300370200200341c8056a200341c0036a10a0022004210220032802c8050d000c0c0b0b2002417f4c0d33200341ec066a280200211a200341b8066a41306a28020021082002450d05200210262204450d172004200820021094041a201a450d220c210b20032802800221070c230b4200210e0b200341b8066a2002201f200e107e41012106024020032802b8064101470d0020032802c006210220032802bc0621040c2d0b200320032903c0063703b0042003200341c8066a2903003703b8042003200341b0046a3602d804200341d8046a107b0b410121064101211a4101210820012d0000220541064d0d3a0c3b0b200341b4026a280200450d22200341b0026a28020010230c220b41012104201a0d1b0c1c0b4100210741042105410021040c030b200f102622070d1b0b200f4101102a000b41012104410121070b200341e8066a280200210220032802e006210620034100360280022006200220034180026a101321202003280280022206417f460d0b200341c8056a41186a200341e0016a41186a290300370300200341c8056a41106a200341e0016a41106a290300370300200341c8056a41086a200341e0016a41086a290300370300200320032903e0013703c80520034100360288022003420137038002200320063602a805200341a8056a20034180026a1041024002400240200328028402220820032802880222026b20064f0d00200220066a220c2002490d1620084101742221200c200c2021491b22214100480d162008450d01200328028002200820211027220c450d020c110b200328028002220c20026a202020061094041a200220066a2202450d110c120b20211026220c0d0f0b20214101102a000b20034194026a4101360200200341013602bc062003418898c4003602b8062003420137028402200341d497c400360280022003200341b8066a3602900220034180026a41c4cec2001061000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20084104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41154101102a000b41354101102a000b41f8ffc40041381021000b20024101102a000b41104104102a000b20032021360284022003200c3602800220212108200c20026a202020061094041a200220066a22020d010b4101212120080d010c020b20024100480d02200210262221450d032021200c20021094041a2008450d010b200c10230b20024101742208200241206a220c200c2008491b220d4100480d00024002402002450d0020212002200d10272208450d010c040b200d102622080d030b200d4101102a000b101e000b20024101102a000b200820026a220220032903c805370000200241186a200341c8056a41186a290300370000200241106a200341c8056a41106a290300370000200241086a200341c8056a41086a29030037000020034180026a41186a2202420037030020034180026a41106a2221420037030020034180026a41086a220d420037030020034200370380022008200c20034180026a1002200341c0036a41186a2002290300370300200341c0036a41106a2021290300370300200341c0036a41086a200d29030037030020032003290380023703c0032008102302402006450d00202010230b0240024002400240024002400240200341c0036a200341d8046a4120109604450d00200520044104746a21242004450d01200341e8066a2125200341e0066a212620052102034020022802002206450d03200241046a2802002104200241086a28020021082002410c6a280200210c202528020021202026280200212120034180026a41186a220d420037030020034180026a41106a2222420037030020034180026a41086a2223420037030020034200370380022006412020034180026a1002200341a8056a41186a200d290300370300200341a8056a41106a2022290300370300200341a8056a41086a202329030037030020032003290380023703a80520212020200341a8056a41202004200c100b02402008450d00200410230b200241106a22022024470d000c050b0b2004450d04200441047421082005410c6a2102410021060340200228020020066a2106200241106a2102200841706a22080d000c060b0b200522022024470d010c020b200241106a22022024460d010b03402002280200450d010240200241086a280200450d00200241046a28020010230b200241106a22022024470d000b0b02402007450d00200510230b41b092c300210441162102200341e4066a2802000d090c0a0b410021060b200320032802ec0620066b3602ec0602400240411710262202450d002002410f6a41002900abcd42370000200241086a41002900a4cd423700002002410029009ccd4237000020024117413710272202450d01200220032903b0043700172002412f6a200341b0046a41186a290300370000200241276a200341b0046a41106a2903003700002002411f6a200341b0046a41086a29030037000020034180026a41186a2206420037030020034180026a41106a2208420037030020034180026a41086a220c420037030020034200370380022002413720034180026a1002200341a8056a41186a2006290300370300200341a8056a41106a2008290300370300200341a8056a41086a200c29030037030020032003290380023703a805200341a8056a41201003200210232008200e370300200341a8026a2009202c202a1b37030020034180026a41206a4201200a202a1b37030020062009370300200341b0026a200341e0066a2202290300370300200341b8026a200241086a280200360200200341bc026a200341ec066a280200360200200341c0026a20032903e001370300200341c8026a200341e0016a41086a290300370300200341d0026a200341e0016a41106a290300370300200341d8026a200341e0016a41186a2903003703002003201e37038802200341003a008002200341c0016a20034180026a10dd0120034190016a200341b0046a10840120034190016a41086a290300211f200329039001210e20034180026a200341b0046a4200420010dc01024002402003290380024200510d002003200c3602c805200341c8056a10de010c010b2003200c3602c805200341c8056a107b0b20034180016a200341c0016a200e201f108202200320034188016a2903003703d00520032003290380013703c8052003200341c8056a3602a805200341a8056a107b02402004450d0020044104742104200541046a210203400240200241046a280200450d00200228020010230b200241106a2102200441706a22040d000b0b02402007450d00200510230b410021040240201a450d00201d10230b0c0c0b41174101102a000b41374101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c04200320034190056a360288042003200341bc036a36028404200320034180026a36028004200341b0046a200341c0036a2009201e200341e0016a200341a0016a200d202a10e2014101210c41012123024020032d00b00422240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002220200341f0036a280200220441e8006c6a2108201d280200212220202102024002402004450d00200341c1066a211d202021020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202010230b200341e0006a20032903f001200341f8016a29030020032903e801221e420010980420032903e001201e7d10cd02200341f0006a200341c0016a2003290360200341e0006a41086a290300108202200341c8066a200e200341f0006a41086a29030022097d201f2003290370221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122021b22041b220a3703002003201f201e7d201e201f7d20041b222c3703c0062003201e201f562009200e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100210c20032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b200c450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a410472210c200341e1066a21202022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b806200c200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341d8006a200341b8066a200341d8046a10d20220032802582106200341b8066a41086a41043a000020202006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a210c0340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b806200c200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341b8046a280200210241002104024020244101470d0020032802b40421040b024020032802c0032205450d0020032802c403450d00200510230b2023450d09200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d09200341e8036a280200102320210d0a0c0b0b2003200f360284022003200736028002200f212b0b2007202a6a201d200c1094041a200341a8056a41202007202a200c6a10040240202b450d00200710230b200410230240201a450d00201d10230b200341a1026a201e370000200341a0026a20203a00002003419f026a20213a00002003419d026a200d3b00002003419c026a20223a00002003419b026a20233a000020034199026a20083b000020034198026a20243a000020034197026a20253a000020034195026a20263b000020034194026a20273a000020034190026a20023602002003418c026a20053602002003418b026a20283a000020034189026a20293b000020034188026a41023a00002003410a3a0080024100210441a886c500410020034180026a102c0b2003202c200a4200200920061b221e4200109804202d201e7d10cd02200341106a200341c8056a2003290300200341086a29030010820220034190026a200e200341106a41086a29030022097d201f2003290310221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122061b22071b220a3703002003201f201e7d201e201f7d20071b222c370388022003201e201f562009200e5620061b2206ad221f3703800241012107024020060d002003202c3703c0032003200a3703c8032003200341c0036a3602d804200341d8046a10de0141002107200329038002211f0b20034180026a41086a210602400240201f4200510d00200320063602c003200341c0036a107b0c010b2007450d00200320063602c003200341c0036a10de010b410021082005410020041b2104410121070b410121064101211a20012d0000220541064d0d170c180b41c692c3002104412e2102200341e4066a280200450d010b20032802e00610230b201a450d010b201d10230b4100211a41012107410121060c110b2021450d010b200d10230b410021060b410121070c0c0b200410230b200741d9cac40020051b21042006411520051b21022005450d052004211a200221190b20034180026a200341e0016a201e10cf0202402003280280024101470d0020032802880221022003280284022104200c0d060c070b20034180026a41306a290300211e200341a8026a290300211f200341b0046a41186a20034180026a41206a290300370300200341b0046a41106a20034180026a41186a290300370300200341b0046a41086a20034180026a41106a29030037030020032003290388023703b00420034180026a10d002200320034180026a36029005200320034180026a3602a001200341c8056a41186a2205200341e0016a41186a290300370300200341c8056a41106a2206200341e0016a41106a290300370300200341c8056a41086a2207200341e0016a41086a290300370300200320032903e0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d03200341f0066a280200210202402008450d00410021040c040b2002417f4c0d00200341ec066a280200211d200341b8066a41306a280200210802402002450d00200210262204450d022004200820021094041a201d450d040c030b41012104201d0d020c030b101d000b20024101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c042003200341a0016a36028804200320034190056a36028404200320034180026a360280042003200e3703d0062003200f3a00cf06200320103a00ce06200320113b01cc06200320123a00cb06200320133a00ca06200320143b01c806200320153a00c706200320163a00c606200320173b01c406200320183a00c306200320193600bf062003201a3600bb062003201b3a00ba062003201c3b01b806200341003602d005200342013703c805200341c0016a200341c0036a200341b8066a200a2009200341b0046a200d200b200341c8056a10e7014101212041012123024020032802c00122240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002221200341f0036a280200220441e8006c6a2108201d280200212220212102024002402004450d00200341c1066a211d202121020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202110230b200341386a20032903c004200341c8046a29030020032903b804220e420010980420032903b004200e7d10cd02200341c8006a200341e0016a2003290338200341386a41086a290300108202200341c8066a201e200341c8006a41086a29030022097d201f2003290348220e54ad7d2009201e7d200e201f54ad7d200e201f582009201e582009201e5122021b22041b220a3703002003201f200e7d200e201f7d20041b222c3703c0062003200e201f562009201e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100212020032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b2020450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a4104722120200341e1066a21212022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b8062020200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341306a200341b8066a200341d8046a10d20220032802302106200341b8066a41086a41043a000020212006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a21200340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b8062020200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341c8016a280200210220032802c40121050240024002402024450d002005210420032802c00322050d010c020b4100210402402002450d00200510230b20032802c0032205450d010b20032802c403450d00200510230b2023450d00200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d00200341e8036a2802001023200c0d010c020b200c450d010b200d10230b41012106410021070c020b41e990c300210441e90021020b41012107410121060b4101211a0b4101210820012d0000220541064b0d010b024002400240024020050e0705050003010502050b2008450d04200141086a280200450d04200141046a28020010230c040b2006450d03200141286a280200450d03200141246a28020010230c030b201a450d02200141c8006a280200450d02200141c4006a28020010230c020b2007450d012001412c6a280200450d01200141286a28020010230c010b200141c8006a280200450d00200141c4006a28020010230b2000200236020420002004360200200341d0076a24000bc50602027f047e230041e0006b22032400200341386a41086a22044200370300200342003703384186cdc2004116200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821050c010b4280ade20421050b42002106200341386a41086a220442003703002003420037033841f5ccc2004111200341386a1000200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821060b0240200520067d20025a0d0020004188abc40036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841b3cdc2004111200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041a886c500410041001001417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010012204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a2005420020024200109804200341286a2002420020064200109804200341086a420042002006420010980402402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c2208200754724101470d00200041a3abc40036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a2001200329032820084108108502024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000bcf0d06087f097e027f057e017f057e23004190016b22012400200141306a41086a220242003703002001420037033041bc8fc3004118200141306a1000200141106a41086a2002290300370300200120012903303703104100210341102104024002400240200141106a411041a886c500410041001001417f460d00200142103702242001200141106a360220200141306a200141206a10c10220012d008c0122034102460d022001410c6a41026a2001418f016a2d00003a0000200120012f008d013b010c200128028801210520012802840121042001280280012106200128027c210720012802782108200129037021092001290368210a2001290360210b2001290358210c2001290350210d2001290348210e2001290340210f20012903382110200129033021110c010b420121094104210741808004210641202105410021084201210a4201210b4201210c4201210d4201210e4201210f42012110420121110b200141306a41086a22024200370300200142003703304182b6c100411b200141306a1000200141106a41086a2212200229030037030020012001290330370310024002400240024002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012213417f460d022013410f4d0d02200141386a2903002114200129033021150c010b42002115420021140b200242003703002001420037033041f492c3004111200141306a10002012200229030037030020012001290330370310024002400240200141106a411041a886c500410041001001417f460d0020014100360230200141106a4110200141306a41044100100141016a41044d0d02200128023021120c010b41e40021120b42002116200141306a41086a2202420037030020014200370330418593c3004114200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d042002410f4d0d04200141386a2903002116200129033021170c010b421521170b42002118200141306a41086a2202420037030020014200370330419993c3004114200141306a1000200141106a41086a221320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012219417f460d052019410f4d0d05200141386a290300211a2001290330211b0c010b4200211b4200211a0b200242003703002001420037033041ad93c3004114200141306a1000201320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d062002410f4d0d06200141386a290300211c200129033021180c010b4200211c0b200141306a41086a220242003703002001420037033041c193c3004114200141306a1000200141106a41086a2002290300370300200120012903303703100240024002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d022001290330211d0c010b428701211d0b200141306a41086a220242003703002001420037033041d593c3004116200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d032001290330211e0c010b42af01211e0b200020033a005c2000200536025820002004360254200020063602502000200736024c20002008360248200020093703402000200a3703382000200b3703302000200c3703282000200d3703202000200e3703182000200f3703102000201037030820002011370300200020012f010c3b005d200041df006a2001410e6a2d00003a0000200041e8006a201437030020002015370360200020123602b0012000201e3703a8012000201d3703a00120004198016a201c370300200020183703900120004188016a201a3703002000201b37038001200041f8006a20163703002000201737037020014190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000ba01b09017f017e017f017e047f087e017f027e037f230041b0036b2203240020034190026a200010d801024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d009002417f6a41ff017141014d0d0020034190016a41086a200341d8026a29030037030020034190016a41106a200341e0026a29030037030020034190016a41186a200341e8026a2903003703002003200341d0026a2903003703900120034190026a41106a290300210420034190026a41086a22052903002106200341cc026a2802002107200341c8026a2802002108200341c4026a2802002109200341c0026a280200210a20034190026a41186a290300210b20054200370300200342003703900241af98c300410d20034190026a100020034190036a41086a20052903003703002003200329039002370390034200210c024020034190036a411041a886c500410041001001417f460d00200342003703900220034190036a411020034190026a41084100100141016a41084d0d04200329039002210c0b024042004200200c20017d22012001200c561b2201200b7d220b200b2001561b220d500d0020034180016a200010840120034180016a41086a2903002101200329038001210e4200210b20034190026a41086a22054200370300200342003703900241f1cdc200411a20034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d072005410f4d0d070240200329039002220b20034190026a41086a290300220f84500d00200341f0006a200e2001200b200f109704200341f0006a41086a29030021102003290370210b0c020b4200210b0b420021100b20034190026a41086a22054200370300200342003703900241c4cdc200411420034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d082005410f4d0d0820034198026a290300210f20032903900221110c010b420021114200210f0b200341c0006a4200420020107d2007ad2210200b54ad7d22122010200b7d220b20105620124200522012501b22051b2210420020114200109804200341d0006a200f42004200200b20051b220b4200109804200341e0006a200b420020114200109804427f20032903602010420052200f42005271200329034842005272200329035842005272200341e0006a41086a290300220b200329034020032903507c7c2211200b547222051b220f427f201120051b221184500d004200210b20034190026a41086a2205420037030020034200370390024182b6c100411b20034190026a100020034190036a41086a2207200529030037030020032003290390023703900320034190036a411041a886c500410041001001417f460d022003420037039802200342003703900220034190036a411020034190026a4110410010012213417f460d072013410f4d0d0720034198026a290300211220032903900221140c030b2009450d00200a10230b410021050c170b42002114420021120b20054200370300200342003703900241d8cdc200411920034190026a1000200720052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d062005410f4d0d0620034198026a2903002115200329039002210b0c010b420021150b200341186a20114200200d42ffffffff0f8342ffffffff0f200d428080808010541b22104200109804200341286a200f420020104200109804200341086a42004200200f4200109804200341386a200041084200200e2006427f20032903282003290320200329031084420052200341286a41086a290300220f200329031820032903087c7c2211200f547222051b22102010200656427f201120051b220f200456200f2004511b22051b22117d22062006200e5620012004200f20051b7d200e201154ad7d220420015620042001511b22071b22064200200420071b22041083022003280238210702402006200b20147c2211542004201520127c2011200b54ad7c220b542004200b511b22130d0020070d0020050d00410221052002450d1420034190026a20002010200f41081085022003280290024101460d072003200341a0026a290300220b3703b801200320034190026a41086a29030022013703b00120034190026a200010d80120032d009002220241024622050d06410020034190026a20051b22052d00000d062005200c37031820052005290308220c20017d370308200541106a22052005290300200b7d200c200154ad7d370300411710262205450d082005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020054117413710272205450d09200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190036a41186a2200420037030020034190036a41106a2207420037030020034190036a41086a2208420037030020034200370390032005413720034190036a1002200341f0026a41186a2000290300370300200341f0026a41106a2007290300370300200341f0026a41086a200829030037030020032003290390033703f00220034120360294032003200341f0026a3602900320034190026a20034190036a10b30220051023024020020d00200341c4026a280200450d00200341c0026a28020010230b2003200341b0016a3602900220034190026a10de014102210520090d150c160b0240024020130d0020070d0020034190026a20002010200f4108108502410121052003280290024101460d0b2003200341a0026a2903003703c801200320034190026a41086a2903003703c0012003200341c0016a3602900320034190036a10de01200e2011542001200b542001200b511b450d010c150b024002400240200e2011542001200b542001200b511b450d00200341f0016a20004200420010dc01200341f8016a210020032903f0014200510d01200320003602900220034190026a10de014101210520090d180c190b200341d0016a20002011200b10dc01200341d8016a210520032903d0014200510d01200320053602900220034190026a10de010c020b200320003602900220034190026a107b4101210520090d160c170b200320053602900220034190026a107b0b2003410036029002200a200820034190026a101321162003280290022202417f460d0a20034190026a41186a20034190016a41186a29030037030020034190026a41106a20034190016a41106a29030037030020034190026a41086a20034190016a41086a29030037030020032003290390013703900220034100360298032003420137039003200320023602f002200341f0026a20034190036a1041024002400240200328029403220720032802980322056b20024f0d00200520026a22132005490d1320074101742217201320132017491b22174100480d132007450d012003280290032007201710272213450d020c0e0b200328029003221320056a201620021094041a200520026a2205450d0e0c0f0b2017102622130d0c0b20174101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41b8ccc20041351021000b41a2cac30041f10020032802940220034190026a41086a28020010c902000b41174101102a000b41374101102a000b4193cbc300412b20032802940220034190026a41086a28020010c902000b41f8ffc40041381021000b2003201736029403200320133602900320172107201320056a201620021094041a200520026a22050d010b4101211720070d010c020b20054100480d02200510262217450d032017201320051094041a2007450d010b201310230b20054101742207200541206a221320132007491b22184100480d00024002402005450d0020172005201810272207450d010c040b2018102622070d030b20184101102a000b101e000b20054101102a000b200720056a2205200329039002370000200541186a20034190026a41186a290300370000200541106a20034190026a41106a290300370000200541086a20034190026a41086a29030037000020034190036a41186a2205420037030020034190036a41106a2217420037030020034190036a41086a2218420037030020034200370390032007201320034190036a1002200341f0026a41186a22132005290300370300200341f0026a41106a22052017290300370300200341f0026a41086a2217201829030037030020032003290390033703f00220071023200341a9026a2013290300370000200341a1026a200529030037000020034199026a201729030037000041012105200341013a009002200320032903f00237009102200020034190026a10dd01200a2008100d2002450d00201610230b2009450d010b200a1023200341b0036a240020050f0b200341b0036a240020050bc46309077f017e147f017e0d7f037e047f027e047f23004190046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410c4b0d000240024020040e0d002a05080c0b0607040a030901000b200141086a29030020022d000020022d000110ea0221044124210541012106410121070c460b200141086a280200210820012802042104200341e0026a41086a2001411c6a290200370300200341e0026a410d6a200141216a2900003700002003200141146a2902003703e002410121092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002106200241116a2d00002107200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241086a2d00002116200241066a2f01002117200241056a2d00002118200241046a2d00002119200241026a2f0100211a20022d0001210520022d0000210220044101460d0b20044102470d2a200141106a280200211b2001410c6a280200211c200341c0036a410d6a200341e0026a410d6a290000370000200341c0036a41086a200341e0026a41086a290300370300200320032903e0023703c0034101210941db94c30021044100211d412a211e200241ff01710d1541002102200541ff01714101470d1620174108742018722016411874722104410021092015211e2014211d201321020c160b200141086a2802002208417f6a220441044b0d2a200141106a290300210a2001410c6a280200211020022d0001210520022d00002102024020040e050014121311000b200aa72108200241ff01710d1841012107200541ff01714101470d18412a210520080d330c340b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341306a200341c8006a20034198026a10fc02200328023421052003280230210441012106410121070c430b418f94c3002104412421054101210620022d00000d0920022d000141ff01714102470d09200141086a290300210a4200211f20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a2204200229030037030020032003290380043703800320034180036a411041a886c500410041001001417f470d2920024200370300200342003703800441af98c300410d20034180046a100020042002290300370300200320032903800437038003024020034180036a411041a886c500410041001001417f460d002003420037034820034180036a4110200341c8006a41084100100141016a41084d0d272003290348211f0b201f200a540d2a20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a20022903003703002003200329038004370380032003200a37034820034180036a4110200341c8006a4108100441002104410121070c420b200341c8006a200141086a41c8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341086a200341c8006a20034198026a109902200328020c21052003280208210441012106410121070c410b200341c8006a41386a200141c0006a290300370300200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341206a200341c8006a20034198026a109a0220032802242105200328022021044100210941012106410121074101210b4101210c0c430b20034198026a41206a200141246a29020037030020034198026a41186a2001411c6a29020037030020034198026a41106a200141146a29020037030020034198026a41086a2001410c6a2902003703002003200129020437039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341286a20034198026a200341c8006a10fd02200328022c2105200328022821044100210d41012106410121074101210b4101210c410121090c430b200141086a280200212020012802042121200341c8006a2001410c6a41c4001094041a2002411a6a290100211f200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002114200241146a2d00002117200241126a2f01002118200241116a2d0000211e200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241086a2d00002128200241066a2f01002129200241056a2d0000212a200241046a2d0000212b200241026a2f0100212c20022d0001210c20022d00002109200341f0016a20034184016a290200370300200341e8016a200341fc006a290200370300200341e0016a200341f4006a290200370300200341d8016a200341ec006a290200370300200341b8016a41186a200341e4006a290200370300200341b8016a41106a200341c8006a41146a290200370300200341b8016a41086a200341c8006a410c6a2902003703002003200329024c3703b80141012102412a21054100210841db94c300210420090d0841002109200c41ff01714101470d092029410874202a722028411874722104410021022025210820262109202721050c090b200341c8006a200141086a41e8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341386a200341c8006a20034198026a10ce02200328023c2105200328023821044100210841012106410121074101210b4101210c410121094101210d4101210e0c430b200141086a280200210c2001280204210d412a210541db94c300210420022d0000450d0441012108410021094100210b0c050b20034198026a41206a200141286a29030037030020034198026a41186a200141206a29030037030020034198026a41106a200141186a29030037030020034198026a41086a200141106a2903003703002003200141086a29030037039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341186a20034198026a200341c8006a1057200328021c2105200328021821044100210c41012106410121074101210b0c3d0b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341106a200341c8006a20034198026a10830120032802142105200328021021044100210b41012106410121070c3b0b41db94c30021044100211d412a211e200241ff01710d0b41002102200541ff01714101470d0c20174108742018722016411874722104410021092015211e2014211d201321020c0c0b410121070c380b41012108410021094100210b20022d00014101470d002002410c6a2d000021092002410a6a2f0100210b200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021080b200b41ffff0371410874200941187472200541ff017172210502402008450d004100210e410121060240200c450d00200d10230b410121074101210b4101210c410121094101210d0c3c0b410121060240200c450d00200d10230b4100210e410121074101210b4101210c410121094101210d0c280b410021090b200941ffff0371410874200841187472200541ff017172210502402002450d002020450d340c330b2003201f370390022003200d3a008f022003200e3a008e022003200f3b018c02200320143a008b02200320173a008a02200320183b0188022003201e3a008702200320223a008602200320233b018402200320243a008302200320053600ff01200320043600fb012003202b3a00fa012003202c3b01f80120034198026a200341f8016a10fe02200341b8016a41206a2125200341b9026a212620034198026a4101722127410421244100211e41002117410021020c200b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d2f0c2e0b200aa72108200220057241ff0171450d0e41b394c300210441282105410121074100210620080d2f0c320b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d2c0c2d0b41012107200220057241ff0171450d0e41b394c300210441282105410021060c300b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d262003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b0320032005360087032003200436008303200320193a0082032003201a3b01800320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d172002411f4d0d1720034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d05200320193a0082032003201a3b0180032003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b032003200536008703200320043600830320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d162002411f4d0d1620034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b41db94c3002104412a2105410121074100210620080d280c2b0b200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a4200370300200342003703480b024020034180036a200341c8006a4120109604450d0041e8cec3002104413121050c220b200341c8006a410d6a2202200341c0036a410d6a290000370000200341c8006a41086a2204200341c0036a41086a290300370300200320032903c003370348200841ff01714101470d08200341f8016a201c41067610870120032802f8012104200328028002201c413f7122024d0d0b200341c0016a200420024105746a220241136a290000370300200341c5016a200241186a2900003700002003200229000b3703b80120022f0000200241026a2d00004110747221052002280007211b2002280003211c4101210220032802fc01450d1d0c1c0b200341e0006a4200370300200341c8006a41106a4200370300200341d0006a4200370300200342003703480b20034180036a200341c8006a4120109604450d014199cfc3002104412221050b20081024200810230c1e0b200341c8006a200841f0001094041a41002104200341003b019802200341c0006a200341c8006a20034198026a10d20220032802402202450d0520022003280244100f410021020c060b02402009410c6c2202450d00201020026a21042010210203402002280200200241086a28020010032002410c6a22022004470d000b0b02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d120c110b41f9c7c30041052010200a422088a71004412a21054101210720080d120c130b0240200941186c2202450d00201020026a21042010210203402002280200200241086a2802002002410c6a280200200241146a2802001004200241186a22022004470d000b0b02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d0f0c100b410810262202450d0c2002200a37000041efc7c300410a2002410810042002102341002106412a21050c120b200341b8016a410d6a2002290000370000200341b8016a41086a2004290300370300200320032903483703b801200841087621050c150b410121020b200320023a004a2003410b3b014841a886c5004100200341c8006a102c200810230c150b4100210220032802fc010d100c110b10ff02000b41d4aac10041331021000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41d0cec3001061000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41949bc3001061000b41b0a4c100104f000b41c4a5c100104f000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000104040b02400240201741014622020d0041a886c50021144100210420170d0141202104200341b8016a21140c010b41202104202521140b41012122410021180240024002400240024020032d0098024101470d0002400240024020020d0020170d014120210e202721184100212241202004470d030c020b4120210e202621184100212241202004460d010c020b4100210e41a886c50021184100212241002004470d010b024020182014460d002004210e2018201420041096040d010b201e2017470d03201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a201e450d012024201e4104742004102722240d020c160b410e10262202450d0b200241066a41002900edcd44370000200241002900e7cd443700002002410e411c10272202450d0c2002201736000e200341e0036a41186a22054200370300200341e0036a41106a22084200370300200341e0036a41086a22094200370300200342003703e00320024112200341e0036a1002200341c0036a41186a2005290300370300200341c0036a41106a2008290300370300200341c0036a41086a2009290300370300200320032903e0033703c00302400240200341c0036a412041a886c500410041001001417f460d00200342203702e4032003200341c0036a3602e00320034180036a200341e0036a10a802200328028003220d450d11200329028403211f0c010b4200211f4104210d0b20021023410021020240201f422088222da72223450d00024020234101460d004100210220232105034002400240200d2005410176220920026a220c410c6c6a22082802002014200420082802082208200820044b1b109604220f450d00417f4101200f4100481b21080c010b4100417f410120082004491b20082004461b21080b2002200c20084101461b2102200520096b220541014b0d000b0b02400240200d2002410c6c6a22052802002014200420052802082205200520044b1b1096042208450d00417f410120084100481b21050c010b20052004460d08417f410120052004491b21050b20022005417f466a21020b024002402004450d00200410262209450d102009201420041094041a2002202da722054b0d0f0c010b410121092002202da722054b0d0e0b0240024002402005201fa7470d00200541016a22082005490d0c2005410174220c20082008200c491bad222e420c7e222f422088a70d0c202fa722084100480d0c2005450d01200d2005410c6c20081027220d0d020c130b201f212e0c010b20081026220d450d110b200d2002410c6c6a2208410c6a2008200520026b410c6c1095041a200820043602082008200436020420082009360200202e42ffffffff0f83222f202d42017c222e42208684212d0240024002400240024020220d00202ea7220f450d02410021020240200f4101460d0041002102200f2104034002400240200d2004410176220820026a2209410c6c6a22052802002018200e200528020822052005200e4b1b109604220c450d00417f4101200c4100481b21050c010b4100417f41012005200e491b2005200e461b21050b2002200920054101461b2102200420086b220441014b0d000b0b200d2002410c6c6a220428020022092018200e200428020822052005200e4b1b10960421082005200e470d0220080d022002200f4f0d192004280204210520042004410c6a200f2002417f736a410c6c1095041a202f201f4280808080708384212d20050d010b201e2017460d020c030b20091023201e2017460d010c020b41f5cdc400412a100f201e2017470d010b201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a02400240201e450d002024201e4104742004102722240d010c140b200410262224450d130b2002211e0b202420174104746a2202200d36020420022017360200200241086a202d370200201741016a22174102490d1b0c030b200410262224450d140b2002211e0b202420174104746a4100360204201741016a22174102490d170b4104211120174104742202450d01202420026a21304110211d410e211b4106213141002115411c21324118211c4200210a41082106411221334201213442202135410c210b412021364174211241012116202421190c180b2019201d6a21180240201928020422220d002018211920182030470d1a0c010b201928020021042019290208211f201b10262202450d0d200220316a20152900edcd44370000200220152900e7cd443700002002201b203210272219450d0e2019200436000e200341e0036a201c6a2202200a370300200341e0036a201d6a2204200a370300200341e0036a20066a2205200a3703002003200a3703e00320192033200341e0036a1002200341c0036a201c6a2002290300370300200341c0036a201d6a2004290300370300200341c0036a20066a2005290300370300200320032903e0033703c00320034180036a20066a220d201536020020032034370380032003201f203588a722233602e0032023200b6c210c200341e0036a20034180036a104102400240024020230d002003280284032102200341c0036a20362003280280032209200d280200100420020d010c020b2022200c6a21142022210403402004280200210e2003200420066a28020022023602e003200341e0036a20034180036a104102400240024002402003280284032208200d28020022056b20024f0d00200520026a22092005490d0b2008201674220f20092009200f491b220f2015480d0b2008450d012003280280032008200f102722090d020c0c0b20032802800321090c020b200f10262209450d0a0b2003200f360284032003200936028003200f21080b200d200520026a220f360200200920056a200e20021094041a2004200b6a22042014470d000b200341c0036a20362009200f10042008450d010b200910230b2019102302402023450d002022210203400240200220116a280200450d00200228020010230b2002200b6a2102200c20126a220c0d000b0b0240201fa7450d00202210230b2018211920182030470d180b0240201e450d00202410230b200341e0026a41186a200341f8016a41186a290300370300200341e0026a41106a200341f8016a41106a290300370300200341e0026a41086a200341f8016a41086a290300370300200320032903f8013703e00220034180036a41386a200341b8016a41386a29030037030020034180036a41306a200341b8016a41306a29030037030020034180036a41286a200341b8016a41286a29030037030020034180036a41206a200341b8016a41206a29030037030020034180036a41186a200341b8016a41186a29030037030020034180036a41106a200341b8016a41106a29030037030020034180036a41086a200341b8016a41086a290300370300200320032903b80137038003411210262202450d10200241106a41002f00c4ad443b0000200241086a41002900bcad44370000200241002900b4ad4437000020024112413210272202450d11200220032903e0023700122002412a6a200341e0026a41186a290300370000200241226a200341e0026a41106a2903003700002002411a6a200341e0026a41086a290300370000200341e0036a41186a22044200370300200341e0036a41106a22054200370300200341e0036a41086a22084200370300200342003703e00320024132200341e0036a1002200341c0036a41186a2004290300370300200341c0036a41106a2005290300370300200341c0036a41086a2008290300370300200320032903e0033703c003412010262204450d122004200329038003370000200441186a20034180036a41186a290300370000200441106a20034180036a41106a290300370000200441086a20034180036a41086a2903003700002004412041c00010272204450d13200420032903a003370020200441386a20034180036a41386a290300370000200441306a20034180036a41306a290300370000200441286a20034180036a41286a290300370000200341c0036a4120200441c00010042004102320021023200341013a00e00320034180046a41086a22024200370300200342003703800441dfbac400410f20034180046a100020034180036a41086a200229030037030020032003290380043703800320034180036a4110200341e0036a410110044100210402402020450d00202110230b0c2d0b02402023450d00201f422088a7410c6c2104200d210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b0240201fa7450d00200d10230b2017450d0141042110202420174104746a213741102138410c210741082139417421132024211a410221020c190b201a220520386a211a024020052802042202450d000240200520076a2802002204450d00200420076c210403400240200220106a280200450d00200228020010230b200220076a2102200420136a22040d000b0b200520396a280200450d00200520106a28020010230b201a2037470d170b0240201e450d00202410230b41d1cdc40021044116210520200d290c2a0b101e000b200f4101102a000b410e4101102a000b411c4101102a000b4180e4c400104f000b20044101102a000b41d4aac10041331021000b20084104102a000b20044104102a000b410e4101102a000b411c4101102a000b41fcc3c200104f000b20044104102a000b41124101102a000b41324101102a000b41204101102a000b41c0004101102a000b410021020c050b410021020c040b410121020c030b410121020c020b410121020c010b410221020c000b0b201010230b412a21054101210702402008417f6a220241044b0d00410021064101210b4101210c410121094101210d4101210e410121084101210f41002104024002400240024020020e05001d020301000b4100210641000d06200aa70d040c060b410021062012450d050240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa70d030c040b4100210641000d04200aa70d020c040b410021062011450d030240200a422088a72202450d00200241186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b200aa70d010c020b0240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa7450d010b201010230b410021060b4101210b4101210c410121094101210d4101210e0b410121084101210f4100210420012802002202410c4d0d150c160b200410230b20020d00410121024115211b41d9cac400211c0c010b200341c8006a410d6a200341b8016a410d6a290000370000200341c8006a41086a200341b8016a41086a290300370300200320032903b801370348410021020b20034198026a41106a200341c8006a41106a29030037030020034198026a41086a2204200341c8006a41086a290300370300200320032903483703980202402002450d00201b2105201c21040c020b200341e0036a410d6a20034198026a410d6a290000370000200341e0036a41086a200429030037030020032003290398023703e00320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b80102400240200341b8016a411041a886c500410041001001417f460d00200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d042002411f4d0d0420034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2208200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092008290300370300200c200b29030037030020032003290398023703480c010b200341e0006a4200370300200341d8006a4200370300200341d0006a4200370300200342003703480b20034198026a41186a2202200341c8006a41186a29030037030020034198026a41106a2204200341c8006a41106a29030037030020034198026a41086a2209200341c8006a41086a22082903003703002003200329034837039802200341d2006a2009290300370100200341da006a2004290300370100200341e2006a20022903003701002003418b023b0148200320032903980237014a4100210441a886c5004100200341c8006a102c200341c8006a410d6a2209200341e0036a410d6a2900003700002008200341e0036a41086a290300370300200320032903e00337034820034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801412010262202450d03200220053b00002002201b3600072002201c3600032002200329034837000b200241026a20054110763a0000200241136a2008290300370000200241186a2009290000370000200341b8016a4110200241201004200210230b0b4100210f41012106410121074101210b4101210c410121094101210d4101210e4101210820012802002202410c4d0d0f0c100b41d4aac10041331021000b41204101102a000b201010230b41b394c300210441282105410121074100210602402008417f6a220241044b0d004101210b4101210c410121094101210d4101210e410121084101210f024002400240024020020e05000f020301000b200aa70d040c070b2012450d060240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa70d030c060b4100210641000d05200aa70d020c050b2011450d040240200a422088a72202450d00200241186c21082010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200aa70d010c040b0240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa7450d030b201010230c020b202110230b41002107410121060b4101210b0b4101210c0b410121090b4101210d0b4101210e0b410121080b4101210f0b20012802002202410c4b0d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0d02151515000507040615011503020b2007450d14200141086a280200450d14200128020410230c140b200e450d13200141086a280200450d13200128020410230c130b2006450d12200141086a280200220241044b0d0c024020020e051300130c0b130b200141106a280200450d122001410c6a28020010230c120b2008450d11200141086a2d0000220241054b0d0d024020020e061212000f0d12120b200141106a280200450d112001410c6a28020010230c110b2009450d10200141086a28020022024102460d0320024101470d10200141106a280200450d102001410c6a28020010230c100b200b450d0f200141086a2d00002202410c4b0d0d20024106470d0f200141106a280200450d0f2001410c6a28020010230c0f0b200d450d0e20012d000422024102460d0220024101470d0e200141086a22022802001024200228020010230c0e0b200c450d0d200141086a2d0000417f6a220241074b0d0d024020020e08000e0e0e040e0305000b2001410c6a22022802001024200228020010230c0d0b200141106a280200450d0c2001410c6a28020010230c0c0b2001410c6a22022802001024200228020010230c0b0b2001410c6a22022802001024200228020010230c0a0b2001410c6a22022802001024200228020010230c090b2001410c6a22022802001024200228020010230c080b0240200141146a2802002208450d002001410c6a2802002102200841186c210803400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200141106a280200450d072001410c6a28020010230c070b200141106a280200450d062001410c6a28020010230c060b0240200141146a2802002208450d002001410c6a28020021022008410c6c210803400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200141106a280200450d052001410c6a28020010230c050b200141306a280200450d042001412c6a28020010230c040b200141d0006a280200450d03200141cc006a28020010230c030b200141346a280200450d02200141306a28020010230c020b200141106a280200450d012001410c6a28020010230c010b200f450d0020012802044101470d00200141086a22022802001024200228020010230b200020053602042000200436020020034190046a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b20012802002002200410272203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d0620012802002002200410272203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a20012802002002200410272203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d090b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d0120012802002002200010272202450d020c040b200128020021020c040b2000102622020d020b20004101102a000b101e000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bbe0202047f017e230041c0006b22012400200141306a41086a2202420037030020014200370330418d9dc3004115200141306a1000200141086a41086a20022903003703002001200129033037030802400240200141086a411041a886c500410041001001417f460d002001200141086a3602182001411036021c200141003a00302001200141086a4110200141306a41014100100141016a220241014b36022020024102490d0120012d00302102200141306a200141186a102820012802302203450d012001412a6a41026a22042001412d6a41026a2d00003a0000200120012f002d3b012a20012902342105200020023a00002000200537020820002003360204200020012f012a3b0001200041036a20042d00003a0000200141c0006a24000f0b20004100360204200141c0006a24000f0b41d4aac10041331021000bf70605017f017e037f027e017f230041d0006b2201240042002102200141286a41086a220342003703002001420037032841fd98c300410d200141286a1000200141086a41086a20032903003703002001200129032837030841002103024002400240024002400240200141086a411041a886c500410041001001417f460d002001421037021c2001200141086a360218200141286a200141186a10a90220012802282204450d02200129022c2202422088a721032002a721050c010b41042104410021050b200141286a41206a200041206a280200360200200141286a41186a200041186a290200370300200141286a41106a200041106a290200370300200141286a41086a200041086a2902003703002001200029020037032820032005470d0320032002a7470d020240200341016a22002003490d0020034101742205200020002005491bad220642247e2207422088a70d002007a722004100480d00024002402003450d002004200341246c200010272204450d010c040b2000102622040d030b20004104102a000b101e000b41d4aac10041331021000b20024280808080708320068421020b2002422088a721030b2004200341246c22056a22002001290328370200200041206a200141286a41206a280200360200200041186a200141286a41186a290300370200200041106a200141286a41106a290300370200200041086a200141286a41086a22002903003702002001200242ffffffff0f83200341016a2203ad4220868437021c20012004360218200042003703002001420037032841fd98c300410d200141286a1000200141086a41086a2000290300370300200120012903283703082001411036022c2001200141086a360228200141186a200141286a10d6022002a7210802402003450d00200541246a21002004210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a21032000415c6a22000d040c050b2003410c6a280200450d02200341086a2802001023200341246a21032000415c6a22000d030c040b2003410c6a280200450d01200341086a2802001023200341246a21032000415c6a22000d020c030b200341086a280200450d00200341046a28020010230b200341246a21032000415c6a22000d000b0b02402008450d00200410230b200141d0006a24000b8803010a7f230041206b22022400200241003602082002420137030020002802002103200220002802082200360210200241106a20021041024002400240024002402000450d00200041246c2104200241086a22052802002100200228020421060340200241106a2003108f03200228021021070240024002400240200620006b200241106a41086a28020022084f0d00200020086a22092000490d062006410174220a20092009200a491b220b4100480d062006450d0120022802002006200b1027220a0d020c070b200020086a21092002280200210a0c020b200b1026220a450d050b2002200b3602042002200a360200200b21060b20052009360200200a20006a200720081094041a02402002280214450d00200710230b200341246a2103200921002004415c6a22040d000b20012802002001280204200a200910042006450d040c030b20022802042100200128020020012802042002280200220a200241086a280200100420000d020c030b101e000b200b4101102a000b200a10230b200241206a24000bec0203027f017e027f230041c0006b2201240002400240411310262202450d002002410f6a41002800a99943360000200241086a41002900a299433700002002410029009a994337000020024113413310272202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141206a41186a22004200370300200141206a41106a22044200370300200141206a41086a220542003703002001420037032020024133200141206a1002200141186a2000290300370300200141106a2004290300370300200141086a200529030037030020012001290320370300024002402001412041a886c500410041001001417f460d002001420037032020014120200141206a41084100100141016a41084d0d01200129032021030b20021023200141c0006a240020030f0b41d4aac10041331021000b41134101102a000b41334101102a000b800201017f02400240024020002d0000417b6a220141054b0d00024002400240024020010e06000104020403000b200041086a2d00004101470d03200041146a280200450d03200041106a2802001023200041fc006a2802000d040c050b200041046a2d00004103470d0202402000410c6a280200450d00200041086a28020010230b200041186a280200450d02200041146a2802001023200041fc006a2802000d030c040b200041086a280200450d01200041046a2802001023200041fc006a2802000d020c030b200041086a2d00004105490d00200041306a280200450d002000412c6a28020010230b200041fc006a280200450d010b200028027810230b0bec0301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02402000418080014f0d00200320004106763a000141022104200341013a0005200320004102744101723a00000c010b024020004180808080044f0d00200341033a0005200320004106763a000120032000410e763a0002200320004116763a0003200320004102744102723a0000410421040c010b200341043a0005200341033a0000200320003a0001200320004108763a0002200320004110763a0003200320004118763a0004410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d012000200320021094041a200341003a0005200341e0006a24000f0b20022001108c01000b2003200341086a36024020032003410c6a360244200341c8006a41146a4100360200200341286a41146a4103360200200341346a4104360200200341106a41146a4103360200200341a886c5003602582003420137024c200341a881c5003602482003410436022c20034203370214200341d480c5003602102003200341c8006a3602382003200341c4006a3602302003200341c0006a3602282003200341286a360220200341106a41e481c5001061000bda0601077f230041106b220224000240024002400240024002400240024002400240024002400240024020002802704101470d00200141046a280200200141086a2802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d0320012802002003200510272204450d040c090b200141046a280200200141086a2802002203470d01200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041f4006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0820044101742203200520052003491b22034100480d082004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c020b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b2000200110dd0220002802782103200220004180016a280200220036020c2002410c6a2001104102402000450d0020004105742106200141086a2104200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22082000490d0620054101742200200820082000491b22004100480d062005450d01200128020020052000102722050d020c070b200128020021050c020b200010262205450d050b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b101e000b20004101102a000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10e2032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bfecb0103077f027e027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410a4b0d00024020030e0b00070405020809060b030a000b200141046a280200200141086a2802002203470d11200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d2320012802002003200510272204450d240c4a0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4b20034101742205200420042005491b22054100480d4b2003450d1620012802002003200510272204450d170c470b200141046a2205280200200141086a22042802002203470d0a200341016a22062003490d4a20034101742207200620062007491b22074100480d4a2003450d1720012802002003200710272206450d180c420b200141046a280200200141086a2802002203470d0a200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d1820012802002003200510272204450d190c3c0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d1920012802002003200510272204450d1a0c390b200141046a280200200141086a2802002203470d0a200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d1a20012802002003200510272204450d1b0c360b200141046a280200200141086a2802002203470d0a200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d1b20012802002003200510272204450d1c0c330b200141046a280200200141086a2802002203470d0b200341016a22042003490d4520034101742205200420042005491b22054100480d452003450d1e20012802002003200510272204450d1f0c300b200141046a280200200141086a2802002203470d0b200341016a22042003490d4420034101742205200420042005491b22054100480d442003450d1f20012802002003200510272204450d200c2d0b200141046a2205280200200141086a22032802002204470d0b200441016a22062004490d4320044101742207200620062007491b22074100480d432004450d2020012802002004200710272206450d210c2a0b200141046a280200200141086a2802002203470d0b200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d2120012802002003200510272204450d220c270b200141046a280200200141086a2802002203470d0b200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d2220012802002003200510272204450d230c240b200128020021040c3d0b200128020021060c380b200128020021040c320b200128020021040c2f0b200128020021040c2c0b200128020021040c290b200128020021040c390b200128020021040c250b200128020021040c220b200128020021060c1f0b200128020021040c1c0b200128020021040c190b2005102622040d300b20054101102a000b2007102622060d2a0b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d260b20054101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2007102622060d090b20074101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d0f20012802002003200510272204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1b20044101742203200020002003491b22034100480d1b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1920044101742203200020002003491b22034100480d192004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1720044101742203200520052003491b22034100480d172004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1520044101742203200020002003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d1920034101742205200020002005491b22054100480d192003450d0320012802002003200510272200450d040c090b20062003470d01200341016a22002003490d1820034101742205200020002005491b22054100480d182003450d0420012802002003200510272200450d050c060b200128020021000c080b200128020021000c050b2005102622000d050b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d1520034101742205200020002005491b22054100480d152003450d0120012802002003200510272200450d020c030b200128020021000c030b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a000002400240024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41073a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220441044b0d000240024002400240024020040e050004020301000b200528020020032802002204470d08200441016a22062004490d2f20044101742207200620062007491b22074100480d2f2004450d1120012802002004200710272206450d120c210b200528020020032802002204470d04200441016a22062004490d2e20044101742207200620062007491b22074100480d2e2004450d0a20012802002004200710272206450d0b0c1e0b200528020020032802002204470d04200441016a22062004490d2d20044101742207200620062007491b22074100480d2d2004450d0b20012802002004200710272206450d0c0c1b0b200528020020032802002204470d04200441016a22062004490d2c20044101742207200620062007491b22074100480d2c2004450d0c20012802002004200710272206450d0d0c180b200528020020032802002204470d05200441016a22062004490d2b20044101742207200620062007491b22074100480d2b2004450d0f20012802002004200710272206450d100c150b200528020020032802002204470d05200441016a22062004490d3520044101742207200620062007491b22074100480d352004450d1020012802002004200710272206450d110c120b200128020021060c1a0b200128020021060c170b200128020021060c140b200128020021060c190b200128020021060c100b200128020021060c0d0b2007102622060d130b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d0b0b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41003a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1b20064101742204200820082004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a20073600000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1b20004101742204200520052004491b22044100480d1b2000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41023a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1920054101742204200620062004491b22044100480d192005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41043a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1720064101742204200720072004491b22044100480d172006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1720044101742206200520052006491b22064100480d172004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41033a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1520054101742204200620062004491b22044100480d152005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41053a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1320064101742204200720072004491b22044100480d132006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1320044101742206200520052006491b22064100480d132004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41013a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a290000370000200420062900003700000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22062004490d1120044101742207200620062007491b22074100480d112004450d0120012802002004200710272206450d020c030b200128020021060c030b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a200041c5006a2d00003a0000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1120064101742204200820082004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a2007360000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1120004101742204200520052004491b22044100480d112000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0b20012802002003200510272204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0620012802002003200510272204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0720012802002003200510272204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a20012802002003200510272204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d090b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110410240024002402004450d0020044105742107200141046a21080340024002400240024020082802002206200528020022046b41204f0d00200441206a220b2004490d1d20064101742204200b200b2004491b22044100480d1d2006450d01200128020020062004102722060d020c060b200128020021060c020b200410262206450d040b2001200636020020082004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110412004450d1120044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22082004490d1c20054101742204200820082004491b22044100480d1c2005450d01200128020020052004102722050d020c060b200128020021050c020b200410262205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c120b0b20044101102a000b20044101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034102460d00024020034101460d0020030d1e200141046a280200200141086a2802002203470d04200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0520012802002003200510272204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102622040d070b20054101102a000b2005102622040d030b20054101102a000b2005102622040d050b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a370000200041e8006a2903002109200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1a20044101742203200520052003491b22034100480d1a2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22044100480d0b2003450d0120012802002003200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110412000450d0b2003200041286c6a2108200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c050b200128020021060c020b200010262206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002109024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20093700002008200341286a2203470d000c0e0b0b20004101102a000b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0720012802002003200510272204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0420012802002003200510272204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d0720012802002003200510272204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005102622040d070b20054101102a000b2005102622040d070b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1420044101742203200520052003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1420044101742203200020002003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1220044101742203200520052003491b22034100480d122004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a20012802002003200510272204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0c20012802002003200510272204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d1020012802002003200510272204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005102622040d130b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0f20044101742203200020002003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0b20044101742203200520052003491b22034100480d0b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0920044101742203200520052003491b22034100480d092004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0720044101742203200520052003491b22034100480d072004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d0720004101742204200520052004491b22044100480d072000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341094b0d0002400240024002400240024002400240024020030e0a00060304010708050a02000b200528020020042802002203470d0f200341016a22062003490d4720034101742207200620062007491b22074100480d472003450d1f20012802002003200710272206450d200c3f0b200528020020042802002203470d09200341016a22062003490d4620034101742207200620062007491b22074100480d462003450d1420012802002003200710272206450d150c3c0b200528020020042802002203470d09200341016a22062003490d4520034101742207200620062007491b22074100480d452003450d1520012802002003200710272206450d160c390b200528020020042802002203470d09200341016a22062003490d4420034101742207200620062007491b22074100480d442003450d1620012802002003200710272206450d170c360b200528020020042802002203470d09200341016a22062003490d4320034101742207200620062007491b22074100480d432003450d1720012802002003200710272206450d180c330b200528020020042802002203470d09200341016a22062003490d4220034101742207200620062007491b22074100480d422003450d1820012802002003200710272206450d190c300b200528020020042802002203470d0a200341016a22002003490d4120034101742205200020002005491b22054100480d412003450d1b20012802002003200510272200450d1c0c2d0b200528020020042802002203470d0a200341016a22062003490d4020034101742207200620062007491b22074100480d402003450d1c20012802002003200710272206450d1d0c2a0b200528020020042802002203470d0a200341016a22062003490d3f20034101742207200620062007491b22074100480d3f2003450d1d20012802002003200710272206450d1e0c270b200528020020042802002203470d0a200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d1e20012802002003200710272206450d1f0c240b200528020020042802002203470d0a200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d1f20012802002003200710272206450d200c210b200128020021060c330b200128020021060c300b200128020021060c2d0b200128020021060c2a0b200128020021060c270b200128020021060c300b200128020021000c230b200128020021060c200b200128020021060c1d0b200128020021060c1a0b200128020021060c170b2007102622060d270b20074101102a000b2007102622060d230b20074101102a000b2007102622060d1f0b20074101102a000b2007102622060d1b0b20074101102a000b2007102622060d170b20074101102a000b2007102622060d1f0b20074101102a000b2005102622000d110b20054101102a000b2007102622060d0d0b20074101102a000b2007102622060d090b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41093a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1d20064101742203200820082003491b22034100480d1d2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002109200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1d20004101742203200520052003491b22034100480d1d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120093700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1b20064101742203200820082003491b22034100480d1b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1b20034101742206200520052006491b22064100480d1b2003450d0120012802002003200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1920004101742203200520052003491b22034100480d192000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1520064101742203200720072003491b22034100480d152006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1520054101742203200620062003491b22034100480d152005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1120064101742203200820082003491b22034100480d112006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d1d20034101742205200020002005491b22054100480d1d2003450d0720012802002003200510272200450d080c0f0b200528020020042802002203470d01200341016a22002003490d1c20034101742205200020002005491b22054100480d1c2003450d0420012802002003200510272200450d050c0c0b200528020020042802002203470d02200341016a22002003490d1b20034101742205200020002005491b22054100480d1b2003450d0720012802002003200510272200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005102622000d070b20054101102a000b2005102622000d070b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0a0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a410a3a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041296a220641186a290000370000200341106a200641106a290000370000200341086a200641086a29000037000020032006290000370000200041d0006a29030021090240024002400240024020052802002200200428020022036b41084f0d00200341086a22052003490d0f20004101742203200520052003491b22034100480d0f2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341086a360200200020036a2009370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d0d20004101742203200520052003491b22034100480d0d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d0b20064101742203200820082003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002109200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0b20064101742203200720072003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320093700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110412000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22082000490d0b20064101742200200820082000491b22004100480d0b2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d0d20034101742200200420042000491b22004100480d0d2003450d0320012802002003200010272204450d040c090b20042003470d01200341016a22042003490d0c20034101742200200420042000491b22004100480d0c2003450d0420012802002003200010272204450d050c060b200128020021040c080b200128020021040c050b2000102622040d050b20004101102a000b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004105360204200041b89ec3003602000b130020004106360204200041baa3c3003602000bce0101047f230041206b22002400024002400240418595c300411041a886c500410041001001417f460d002000410036021041012101418595c3004110200041106a41044100100141016a41044d0d0220002802102102418595c300411010030c010b410021010b200041106a41086a220342003703002000420037031041a895c3004115200041106a1000200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041004200041206a24000f0b41d4aac10041331021000b13002000410d360204200041c0a3c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000b7901027f230041106b2202240020024100360208200242013703000240410110262203450d00200341003a00002002428180808010370204200220033602002002410036020c2002410c6a20021041200041086a200241086a28020036020020002002290300370200200241106a24000f0b41014101102a000b8e1206037f017e057f017e047f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141a895c3004115200141b0016a1000200141f0006a41086a22032002290300370300200120012903b001370370200141f0006a4110100320024200370300200142003703b00141bd95c300411a200141b0016a100020032002290300370300200120012903b001370370200141f0006a41101003200141af98c300410d109201200129030821042001280200210520024200370300200142003703b00141fc9cc3004111200141b0016a100020032002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b4200210a200141b0016a41086a22024200370300200142003703b00141fd98c300410d200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10a90220012802b0012206450d0520012902b401210a200141f0006a411010030c010b410421060b200141b0016a41086a22024200370300200142003703b00141bc98c3004115200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a1015200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a4120200141f0006a1016450d0620014190016a41186a220c200229030037030020014190016a41106a220d200329030037030020014190016a41086a220e200929030037030020012001290370370390012002200c2903003703002003200d2903003703002009200e29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220fa72202200aa7470d00200241016a22032002490d05200fa74101742209200320032009491bad221042247e220f422088a70d05200fa722034100480d052002450d012006200241246c200310272206450d020c070b200a21100c070b2003102622060d050b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b101e000b41d4aac10041331021000b200a422088220fa721020b2006200241246c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200220012f0090013b0021200241236a20014192016a2d00003a0000201042ffffffff0f83200f4220864280808080107c84210a0b2000200129031037001420002004420020051b370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000bac0101027f230041206b22002400200041106a41086a2201420037030020004200370310419595c3004113200041106a1000200041086a200129030037030020002000290310370300024002402000411041a886c500410041001001417f460d00200041003a001020004110200041106a41014100100141016a41014d0d0120002d001021012000411010032001450d00200041206a24000f0b41d895c300104f000b41d4aac10041331021000b130020004101360204200041b4bcc3003602000b1300200041093602042000418cc0c3003602000b13002000410436020420004198c0c3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242033700000f0b41084101102a000bb23b07027f027e017f017e2a7f0a7e027f23004190056b22032400418f94c30021040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341f0046a41086a22044200370300200342003703f004419595c3004113200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f470d0020044200370300200342003703f00441a298c300410d200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a411041a886c500410041001001417f460d01200342003703e801024002400240200341d0036a4110200341e8016a41084100100141016a41084d0d0020032903e801500d04200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003420021050240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0220032903e80121050b20044200370300200342003703f00441e698c3004117200341f0046a100020012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0420032903e80120057c2000560d010c060b420320057c2000580d050b41bc97c300104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41f496c300104f000b200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003200320003703e801200341d0036a4110200341e8016a41081004200341013a00e80120044200370300200342003703f004419595c3004113200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a4110200341e8016a4101100420014200370300200342003703d00341e698c3004117200341d0036a1000200341e8016a41086a2001290300370300200320032903d0033703e80102400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0920032903d00321050c010b420321050b200341d0036a41086a22014200370300200342003703d0034180adc4004112200341d0036a1000200341e8016a41086a22022001290300370300200320032903d0033703e8014100210402400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0a20032903d0032106410021070c010b410121070b20014200370300200342003703d0034180adc4004112200341d0036a100020022001290300370300200320032903d0033703e801200320003703d003200341e8016a4110200341d0036a410810042006500d0020070d00427f200520057c220820082005541b22054200510d172000200580220020062005802205580d182000200542017c2206510d00200341d0036a41086a22044200370300200342003703d00341a2adc4004112200341d0036a1000200341e8016a41086a2004290300370300200320032903d0033703e80141002104200341e8016a411041a886c500410041001001417f460d00200342103702bc022003200341e8016a3602b802200341d0036a200341b8026a102820032802d0032209450d1e20032802d403210a024020002005427f857c2200a7417f2000428080808010541b220b450d00200341d8036a280200220c200b4d0d002006a7417f2006428080808010541b210d200341f9036a210e200341d0036a41096a210f200341b8026a4104722110200341e8016a41286a2111200341e8016a41206a2112200341e8016a41246a211320034188046a2114200341d0036a412c6a2115410021160340200341c8016a41186a20092016200d6a200c704105746a220441186a290000370300200341c8016a41106a200441106a290000370300200341c8016a41086a200441086a290000370300200320042900003703c801200341e8016a200341c8016a106b02402012280200223e450d00200341b8026a41086a201141086a290300370300200341b8026a41106a201141106a290300370300200341b8026a41186a201141186a290300370300200341b8026a41206a201141206a280200360200200320112903003703b8022013280200213d200341e0026a41186a2217201041186a290000370300200341e0026a41106a2218201041106a290000370300200341e0026a41086a2219201041086a290000370300200320102900003703e002200341f0046a41086a22224200370300200342003703f0044181f5c0004115200341f0046a1000200341c0036a41086a22232022290300370300200320032903f0043703c0030240024002400240200341c0036a411041a886c500410041001001417f470d0041014100200341e0026a10eb020d020c010b200342103702f4042003200341c0036a3602f004200341d0036a200341f0046a102820032802d0032204450d1620032802d40321012004200341d0036a41086a280200200341e0026a10eb02210202402001450d00200410230b20020d010b411210262204450d16200441106a41002f00a6f54022013b0000200441086a410029009ef540220037000020044100290096f540220537000020044112413210272204450d17200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000200341d0046a41186a221a4200370300200341d0046a41106a221b4200370300200341d0046a41086a221c4200370300200342003703d00420044132200341d0046a1002200341d0036a41186a221d201a290300370300200341d0036a41106a221e201b290300370300200341d0036a41086a221f201c290300370300200320032903d0043703d00302400240200341d0036a412041a886c500410041001001417f460d00200341003602f004200341d0036a4120200341f0046a41044100100141016a41044d0d1220032802f0042120200410234112102622040d010c1a0b4100212020041023411210262204450d190b200441106a20013b0000200441086a20003700002004200537000020044112413210272204450d19200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0032003202041016a22213602f004200341d0036a4120200341f0046a410410042004102320224200370300200342003703f00441a8f5c0004119200341f0046a100020232022290300370300200320032903f0043703c00302400240200341c0036a411041a886c500410041001001417f460d00200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1320032802d00321240c010b410021240b20034180036a41186a2204201729030037030020034180036a41106a2201201829030037030020034180036a41086a22022019290300370300200320032903e002370380034200210820224200370300200342003703f00441af98c300410d200341f0046a100020232022290300370300200320032903f0043703c0030240200341c0036a411041a886c500410041001001417f460d00200342003703d003200341c0036a4110200341d0036a41084100100141016a41084d0d1020032903d00321080b200341a0036a41186a22252004290300370300200341a0036a41106a22262001290300370300200341a0036a41086a2227200229030037030020032003290380033703a00320224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c00302400240024002400240024002400240200341c0036a411041a886c500410041001001417f460d00200342103702c4042003200341c0036a3602c004200341c0016a200341c0046a104a20032802c001450d1020032802c4012228ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d01200410262229450d282028450d030c020b200341f0046a41186a22042025290300370300200341f0046a41106a2201202629030037030041082129200341f0046a41086a2202200341a0036a41086a290300370300200320032903a0033703f004201d2004290300370300201e2001290300370300200341d0036a41086a2002290300370300200320032903f0043703d0034100212a420021060c040b410821292028450d010b200341c0046a41086a2207280200212a4100212b20032802c404212c20032802c004212d41002102410021042028212e0340201a4200370300201b4200370300201c4200370300200342003703d00420074100202d202c200341d0046a4120202a100122012001417f461b220141202001412049222f1b202a6a2201360200202f0d0d201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d003200342003703d00420074100202d202c200341d0046a410820011001222a202a417f461b222a4108202a4108491b20016a2201360200202a41074d0d0d20032903d0042100200341003602d00420074100202d202c200341d0046a410420011001222a202a417f461b222f4104202f4104491b20016a222a360200202f41034d0d0d200441016a210120032802d004212f200341f0046a41186a2230201d290300370300200341f0046a41106a2231201e2903003703002022201f290300370300200320032903d0033703f00402402004202e470d00202b20012001202b491b222ead42307e2205422088a70d0d2005a722324100480d0d02402004450d00202920022032102722290d010c160b203210262229450d150b202920026a22042000370300200441206a2030290300370300200441186a2031290300370300200441106a2022290300370300200441086a20032903f004370300200441286a202f360200202b41026a212b200241306a21022001210420012028490d000b20290d010c0d0b410021014100212e2029450d0c0b200341f0046a41186a222b2025290300370300200341f0046a41106a222c202629030037030020222027290300370300200320032903a0033703f00402402001ad422086202ead842206422088a7222a4120490d0041302104202a41306c21072029ad42208621054201210020292102034002402002290300202920046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d22200542ffffffff0f580d22201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d003202a2005a722044d0d252029200441306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d003370308200441013602280c030b201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d0032006a7202a470d010b202a4101742204202a41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202a450d002029202a41306c2004102722290d010c230b200410262229450d220b2006422088a7212a200021060b2029202a41306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d00337030820044101360228200642ffffffff0f83202a41016aad4220868421060b20224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c003201f4100360200200342013703d00320032006422088a722043602f004200341f0046a200341d0036a1041024002402004450d00200441306c212c4158201f28020022046b212a2004412c6a210420032802d403210220292101034002400240024002402002202a6a41286a41204f0d00200441546a222b41206a2207202b490d0d2002410174222b20072007202b491b222b4100480d0d2002450d0120032802d0032002202b102722070d020c100b20032802d00321070c020b202b10262207450d0e0b2003202b3602d403200320073602d003202b21020b201f200441746a222d360200200720046a222b416c6a200141206a290000370000202b41646a200141186a290000370000202b415c6a200141106a290000370000202b41546a200141086a2900003700002001290300210002400240024002402002202a6a222b41086a202b4f0d00202d41086a222b202d490d0d2002410174222d202b202b202d491b222b4100480d0d2002450d0120072002202b102722070d020c110b2002212b0c020b202b10262207450d0f0b2003202b3602d403200320073602d0030b201f2004417c6a2202360200200720046a41746a2000370000200141286a280200212d0240024002400240202b202a6a41034b0d00200241046a222f2002490d0d202b4101742202202f202f2002491b22024100480d0d202b450d012007202b2002102722070d020c120b202b21020c020b200210262207450d100b200320023602d403200320073602d0030b200141306a2101201f2004360200200720046a417c6a202d360000202a41546a212a2004412c6a2104202c41506a222c0d000c020b0b20032802d403210220032802d00321070b200341c0036a41102007201f280200100402402002450d00200710230b02402006a7450d00202910230b411210262204450d1a200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d1b200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0030240024002400240024002400240200341d0036a412041a886c500410041001001417f460d00200342203702f4042003200341d0036a3602f004200341b8016a200341f0046a104a20032802b801450d1b20032802bc012101200341a0016a200341f0046a104c20032802a001450d1b20041023410a2104200141094d0d012021410a20246a4d0d030c020b20041023410321010b20212001220420246a4d0d010b200341d0036a200341e0026a106d201f290300210020032903d00321050240200341d0036a41246a2207280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441fcf5c0004114200341f0046a100020232022290300370300200320032903f0043703c003200341c0036a411041a886c500410041001001417f460d01200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1620032802d00321010c020b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410121040c020b41c0843d21010b200341f0006a20052000428094ebdc034200109704200341e0006a20032903702206200341f0006a41086a29030022084280ec94a37c427f109804200341d0006a200620082001ad22334200109804200341c0006a200329035022062033200520032903607c7e428094ebdc038042ffffffff0f837c2208200341d0006a41086a2903002008200654ad7c2004109904200341c0006a41086a290300210620032903402108200341d0036a200341e0026a106d20034180016a200341e0026a20032903d003223420052008200441ff004b2005200854200020065420002006511b7222041b22352034203554201f29030022362000200620041b22375420362037511b22041b2208201e29030022382038200856201d29030022392036203720041b22065620392006511b22041b22332006203920041b223a10840220034180016a41086a290300210020032903800121050240200329039001223b20337d223c20087c220820034180016a41186a290300203a7d203b203354ad7d20067c2008203c54ad7c223384500d00203420387d223a203620397d2034203854ad7d223684500d00200341d0036a41286a2802002201450d00200341d0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203310980420032003290310200341106a41086a290300203a2036109704200341206a200441106a2003290300200341086a290300108402427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b200320053703f004200320003703f8042003200341f0046a3602d004200341d0046a10de0102402007280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441a2adc4004112200341f0046a1000201f2022290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342103702d4042003200341d0036a3602d004200341f0046a200341d0046a102820032802f004222d450d252022280200210420032802f40421290c010b4101212d41002104410021290b202d20044105746a212c41002101202d21040240024002400340202c20046b41ff004d0d01200341c8016a2004460d022004200341c8016a41201096042207450d02200441206a2202200341c8016a460d022002200341c8016a4120109604222a450d02200441c0006a2202200341c8016a460d022002200341c8016a41201096042202450d02200441e0006a222b200341c8016a460d0220044180016a2104200120074100476a202a4100476a20024100476a202b200341c8016a412010960422024100476a210120020d000c020b0b2004202c460d010340200341c8016a2004460d012004200341c8016a41201096042202450d01200120024100476a2101202c200441206a2204470d000c020b0b200341013a00d00420224200370300200342003703f00441dfbac400410f200341f0046a1000201f2022290300370300200320032903f0043703d003200341d0036a4110200341d0046a410110040b02402029450d00202d10230b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410221040b20142037370300200341d0036a41306a2035370300201f20043a0000200f20032903f004370000200e20032f00d0043b000020152020360200200f41086a2022290300370000200f41106a200341f0046a41106a290300370000200f41186a200341f0046a41186a290300370000200e41026a200341d0046a41026a2d00003a0000200341043a00d00341a886c5004100200341d0036a102c203d0d010c020b203d450d010b203e10230b201641016a2216200b470d000b0b41002104200a450d00200910230b20034190056a240020040f0b101e000b202e450d00202910230b41d4aac10041331021000b202b4101102a000b202b4101102a000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b20324108102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b101d000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41fcaec400104f000b41f8afc400104f000b41d8f5c00041131021000b20044108102a000b20044108102a000b41ecf5c0002004202a1029000b41d4aac10041331021000b41d4aac10041331021000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d02200420024120109604450d02200441206a22062002460d02200620024120109604450d02200441c0006a22062002460d02200620024120109604450d02200441e0006a22062002460d0220044180016a21042006200241201096040d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d02200420024120109604450d022006200441206a2204470d000b0b41000f0b20050b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241808004490d01200141046a280200200141086a2802002200470d03200041016a22032000490d1b20004101742204200320032004491b22044100480d1b2000450d0920012802002000200410272203450d0a0c190b200141046a280200200141086a2802002202470d01200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0420012802002002200410272203450d050c160b200241f001490d02200141046a280200200141086a2802002200470d05200041016a22032000490d1920004101742204200320032004491b22044100480d192000450d09200128020020002004102722030d0a0c120b200128020021030c150b200128020021030c160b200141046a280200200141086a2802002200470d03200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004102722030d0a0c100b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2004102622030d0f0b20044101102a000b200410262203450d080b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d04200128020020032000102722030d050c090b200128020021030c050b200410262203450d060b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b200010262203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b20044101102a000b20044101102a000b20004101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d0120012802002003200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b101e000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b9a0b06037f037e037f027e017f027e230041b0016b22012400200141c0006a41086a220242003703002001420037034041becbc300411d200141c0006a1000200141306a41086a2002290300370300200120012903403703300240200141306a411041a886c500410041001001417f460d002001200141306a360200200141103602042001420037034020014100200141306a4110200141c0006a41084100100122022002417f461b2202410820024108491b220336020802400240024002400240024002400240024002400240200241074d0d002001290340210420014200370340200141086a4100200141306a4110200141c0006a41082003100122022002417f461b2202410820024108491b20036a360200200241074d0d0020012903402105200141c0006a200110890220012802402202450d0020012902442106200141003a0040200141086a2203200328020022032001280200220720012802042208200141c0006a41012003100141016a41014b22036a22093602000240024002402003450d0020012d00404101470d004200210a20014200370340200141086a410020072008200141c0006a41082009100122032003417f461b2203410820034108491b20096a360200200341074d0d012001290340210b4201210a0c020b4200210a0b0b200141246a2006370200200141186a200b370300200120023602202001200a370310200120053703082001200437030020042000520d082006422088a7210802400240024002400240200a500d002008ad42287e220a422088a70d06200aa72203417f4c0d062003450d0120031026220c450d072008450d020c0b0b2008ad42287e220a422088a70d05200aa72203417f4c0d052003450d0220031026220c450d072008450d030c080b4108210c20080d090b410021090c090b4108210c20080d050b410021090c050b41d4aac10041331021000b101d000b20034108102a000b20034108102a000b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141d8006a2009360200200141d4006a2008360200200141d0006a200c3602002001200537034820014200370340200141c0006a10ee02200520047c2000510d030c040b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141e0006a2009360200200141dc006a2008360200200141d8006a200c360200200141d0006a20053703002001200b37034820014201370340200141c0006a10ee020b200520047c2000520d010b200141c0006a41086a220242003703002001420037034041dbcbc300411b200141c0006a1000200141306a41086a2209200229030037030020012001290340370330200141103602442001200141306a360240200141206a2203200141c0006a108f02200141cb006a200341086a28000036000020012003290000370043200120012900403703302001200141c7006a29000037003720022001290037370000200141083a00402001200129033037004141a886c5004100200141c0006a102c200242003703002001420037034041becbc300411d200141c0006a10002009200229030037030020012001290340370330200141306a41101003200141b0016a24000f0b200141246a280200450d00200141206a28020010230b200141b0016a24000bfc0d05017f017e037f017e067f230041d0006b220124002001410036023020014201370328024002400240024002400240024002400240024002400240024002400240024002400240024002400240200029030022024201520d00410110262203450d09200141286a41086a22042004280200220541016a3602002001410136022c20012003360228200320056a41013a000020002903082106200128022c2205200428020022036b41084f0d01200341086a22042003490d0f20054101742203200420042003491b22034100480d0f2005450d0320012802282005200310272204450d040c0d0b410110262203450d092001410136022c200141286a41086a22072007280200220441016a36020020012003360228200320046a41003a0000200041106a28020021082001200041186a2802002209360208200141086a200141286a104102402009450d002008200941286c6a210a2008210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d142005410174220c20042004200c491b22044100480d142005450d012001280228200520041027220c0d020c0c0b2001280228210c0c020b20041026220c450d0a0b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d1120054101742204200b200b2004491b22044100480d11024002402005450d00200c200520041027220c0d010c0c0b20041026220c450d0b0b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b20002903082106200128022c2204200728020022036b41084f0d01200341086a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d0420012802282004200310272204450d050c0a0b200128022821040c0c0b200128022821040c090b2003102622040d090b20034101102a000b2003102622040d050b20034101102a000b20044101102a000b20044101102a000b41014101102a000b41014101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700000c070b2001200336022c20012004360228200141306a28020021030b200141286a41086a2207200341086a360200200420036a2006370000200041186a28020021092001200041206a2802002203360208200141086a200141286a104102402003450d002009200341286c6a210a2009210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d062005410174220c20042004200c491b22044100480d062005450d012001280228200520041027220c0d020c070b2001280228210c0c020b20041026220c450d050b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d0320054101742204200b200b2004491b22044100480d03024002402005450d00200c200520041027220c0d010c070b20041026220c450d060b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b200041106a2903002106024002400240200128022c2204200728020022036b41084f0d00200341086a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802282004200310272204450d020c060b200128022821040c060b2003102622040d040b20034101102a000b101e000b20044101102a000b20044101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700002006a721080b200141086a41086a2203200141286a41086a28020036020020012001290328370308200141246a20032802003600002001200129030837001c200141346a200141206a290000370000200141286a41146a2001290208370200200141286a411c6a2003290200370200200141c6a4b9da04360029200141023a00282001200129001937002d200141286a10d5020240024020024200510d002000411c6a280200450d0120091023200141d0006a24000f0b200041146a280200450d00200810230b200141d0006a24000bfb0c03017f017e097f230041306b2204240042002105200441186a41086a220642003703002004420037031841becbc300411d200441186a1000200441086a41086a2207200629030037030020042004290318370308024002400240024002400240024002400240024002400240200441086a411041a886c500410041001001417f460d00200041046a280200450d0120002802001023200441306a24000f0b200642003703002004420037031841af98c300410d200441186a100020072006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d05200429031821050b02402002a74101470d00200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d0720042903182005580d00200041046a280200450d0220002802001023200441306a24000f0b200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703082004200520014201867c370318200441086a4110200441186a410810040b200028020821062000280204210820002802002109200441186a41086a220042003703002004420037031841becbc300411d200441186a1000200441086a41086a2000290300370300200420042903183703082004410036022020044201370318410810262200450d0620044288808080800137021c200420003602182000200537000020004108411010272200450d0720044290808080800237021c20002001370008200420003602182004200636022c2004412c6a200441186a104102402006450d002009200641286c6a210a200441186a41086a220b280200210c200428021c210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d072007410174220d20062006200d491b220e4100480d072007450d0120042802182007200e1027220d0d020c080b200c41206a21062004280218210d0c020b200e1026220d450d060b2004200e36021c2004200d360218200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d042007410174220e200c200c200e491b220c4100480d04024002402007450d00200d2007200c1027220d0d010c080b200c1026220d450d070b2004200c36021c2004200d360218200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441206a2802002100200428021c2107024002400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0e20004101742207200620062007491b22074100480d0e2000450d03200428021820002007102722060d040c150b20072000470d01200041016a22062000490d0d20004101742207200620062007491b220d4100480d0d2000450d0520042802182000200d102722060d060c150b200428021821060c030b200428021821062007210d0c050b200710262206450d110b2004200736021c200420063602180b200441186a41086a220b200041016a220c360200200620006a41013a000002402007200c6b41074b0d00200c41086a220d200c490d092007410174220e200d200d200e491b220d4100480d092007450d0420062007200d102722060d050c120b2007210d0c050b200d10262206450d0f0b2004200d36021c200420063602180b200441206a200041016a2207360200200620006a41003a00000c030b200d10262206450d0d0b2004200d36021c200420063602180b200b200041096a22073602002006200c6a20033700000b200441086a41102006200710040240200d450d00200610230b2008450d00200910230b200441306a24000f0b101e000b200e4101102a000b200c4101102a000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b41104101102a000b20074101102a000b200d4101102a000b200d4101102a000b130020004102360204200041f0ccc3003602000b1300200041023602042000419cfcc4003602000b130020004101360204200041fc92c4003602000b130020004103360204200041d8b0c1003602000b130020004101360204200041c8fac4003602000b130020004103360204200041a0c3c0003602000b13002000410b360204200041bc80c0003602000b130020004104360204200041f4acc1003602000b130020004106360204200041908bc4003602000b130020004101360204200041c0f9c4003602000b13002000410536020420004180e9c3003602000b130020004106360204200041ecc5c2003602000bba2806027f027e037f017e0f7f047e230041e0056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d0002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341d4006a41026a200141076a2d00003a0000200341c0016a41086a200141186a290200370300200341c0016a410d6a2001411d6a290000370000200320012f00053b01542003200141106a2902003703c001200141086a28020021072001410c6a280200210820012d000421092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d00002114200241046a2d00002115200241026a2f01002116412a210141db94c300210420022d0000450d054101211741002118410021190c060b41ef94c4002104410e211820022d0000450d1f200241086a2802004104490d1f200241046a28020041ff01710d1f20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2204420037030020034180046a41106a2218420037030020034180046a41086a2207420037030020034200370380042002411620034180046a1002200341e0036a41186a2004290300370300200341e0036a41106a2018290300370300200341e0036a41086a200729030037030020032003290380043703e003200341e0036a412041a886c5004100410010012104200210232004417f460d0a20034180046a41086a22024200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a2002290300370300200320032903800437036041002104200341e0006a411041a886c500410041001001417f460d0b200342103702f4042003200341e0006a3602f00420034180046a200341f0046a109202200328028004220b450d1520034188046a28020021042003290284042206422088a722022006a7460d0c200328028404210c0c170b20022d000120022d0000720d02200141186a2903002106200141106a290300210a200141086a2802002104200141206a29030021052001280204210120034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a20022903003703002003200329038004370360410410262202450d0d20022001360000200341e0006a41102002410410042002102320034180046a41086a22024200370300200342003703800441d289c400411c20034180046a1000200341e0006a41086a22012002290300370300200320032903800437036020032006370388042003200a37038004200341e0006a411020034180046a4110100420024200370300200342003703800441c687c400411420034180046a10002001200229030037030020032003290380043703602003200537038004200341e0006a411020034180046a41081004200242003703002003420037038004418688c400410d20034180046a1000200120022903003703002003200329038004370360410410262202450d0e20022004360000200341e0006a411020024104100420021023410021040c1d0b41ef94c4002104410e211820022d0000450d1d200241086a2802004102490d1d200241046a28020041ff01710d1d20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2201420037030020034180046a41106a2204420037030020034180046a41086a2218420037030020034200370380042002411620034180046a1002200341e0036a41186a2001290300370300200341e0036a41106a2004290300370300200341e0036a41086a201829030037030020032003290380043703e003200341e0036a412041a886c500410041001001417f460d07200342203702d4052003200341e0036a3602d00520034180046a200341d0056a10ab032003290380044201520d122003280288042101200341f0046a2003418c046a41dc001094041a200341e0036a4120100320034180036a200341f0046a41dc001094041a200341a0026a20034180036a41dc001094041a20021023200341c0016a200341a0026a41dc001094041a20032001360260200341e0006a410472200341c0016a41dc001094041a200341c0006a200341e0006a41206a2003290370200341f8006a290300109302200329034021062003200341c8006a290300370388042003200637038004200320034180046a3602f004200341f0046a10de01410021040c1c0b20022d000120022d000072450d030b41b394c3002104412821180c1b0b41012117410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002101200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021170b201941ffff0371410874201841187472200141ff017172211820170d192003200a370388052003200b3a0087052003200c3a0086052003200d3b0184052003200e3a0083052003200f3a008205200320103b018005200320113a00ff04200320123a00fe04200320133b01fc04200320143a00fb04200320183600f704200320043600f304200320153a00f204200320163b01f004200341d0056a41026a2202200341d4006a41026a2d00003a000020034180046a41086a2201200341c0016a41086a29030037030020034180046a410d6a2204200341c0016a410d6a290000370000200320032f01543b01d005200320032903c00137038004200941ff01714101470d01200341e0036a200741067610870120032802e003210120032802e8032007413f7122024d0d02200341dc036a41026a200120024105746a220241026a2d00003a000020034188036a200241136a2900003703002003418d036a200241186a290000370000200320022f00003b01dc032003200229000b3703800320022800072108200228000321074101210220032802e403450d150c140b200141086a2903002106200141106a290300210a20034180046a41086a22024200370300200342003703800441aaedc300410c20034180046a1000200341e0006a41086a200229030037030020032003290380043703602003200a370388042003200637038004200341e0006a411020034180046a41101004410021040c170b200341dc036a41026a20022d00003a000020034180036a41086a200129030037030020034180036a410d6a2004290000370000200320032f01d0053b01dc032003200329038004370380030c140b4100210220032802e4030d110c120b20034180036a200341f0046a41dc001094041a200210230b41998ac4002104411921180c140b4104210b410021020b200241016a22182002490d0b20024101742207201820182007491b220cad4202862206422088a70d0b2006a722184100480d0b024002402002450d00200b200241027420181027220b450d010c0b0b20181026220b0d0a0b20184104102a000b20034194046a4101360200200341013602642003418898c4003602602003420137028404200341d497c400360280042003200341e0006a3602900420034180046a41a4eec3001061000b41044101102a000b41044101102a000b41124101102a000b41244101102a000b41124101102a000b41244101102a000b41d4aac10041331021000b41d4aac10041331021000b200421020b200b20024102746a200136020020034180046a41086a22094200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a20092903003703002003200329038004370360200341003602880420034201370380042003200441016a22023602f004200341f0046a20034180046a1041024002402002450d00200441027441046a21194100200928020022026b21012003280284042118200b21040340200428020021080240024002400240201820016a41044f0d00200241046a22072002490d0720184101742217200720072017491b22174100480d072018450d0120032802800420182017102722070d020c080b20032802800421070c020b201710262207450d060b20032017360284042003200736028004201721180b200441046a21042009200241046a2217360200200720026a20083600002001417c6a2101201721022019417c6a22190d000c020b0b20092802002117200328028404211820032802800421070b200341e0006a411020072017100402402018450d00200710230b41002104200c450d06200b10230c060b101e000b20174101102a000b200110230b20020d00410121024115210841d9cac40021070c010b200341e0036a41026a200341dc036a41026a2d00003a000020034180046a41086a20034180036a41086a29030037030020034180046a410d6a20034180036a410d6a290000370000200320032f01dc033b01e003200320032903800337038004410021020b200341dc006a41026a2218200341e0036a41026a2d00003a0000200341e0006a41086a220120034180046a41086a2204290300370300200341e0006a41106a20034180046a41106a290300370300200320032f01e0033b015c200320032903800437036002402002450d0020082118200721040c020b200341d8006a41026a20182d00003a0000200341a0026a41086a2001290300370300200341a0026a410d6a200341e0006a410d6a290000370000200320032f015c3b0158200320032903603703a00220044200370300200342003703800441d289c400411c20034180046a100020012004290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d0020034200370388042003420037038004200341e0006a411020034180046a4110410010012202417f460d052002410f4d0d0520034188046a290300210a200329038004211a0c010b4200211a4200210a0b20034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a2002290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0420032802800421020c010b410021020b200341286a2006200542c0843d4200109704200341186a2003290328221b200341286a41086a290300221c42c0fb42427f109804200341086a201b201c2002ad221d4200109804200341386a200341f0046a201a2003290308221c201d200620032903187c7e42c0843d8042ffffffff0f837c221b201b201a54200341086a41086a290300201b201c54ad7c221b200a54201b200a511b22021b221a200a201b20021b220a105b02402003280238450d0041b889c4002104411a21180c020b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a20022903003703002003200329038004370360410021010240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0520032802800421010b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a2204200229030037030020032003290380043703602003200141016a36028004200341e0006a411020034180046a41041004200341e0006a41186a200341f0046a41186a290300370300200341e0006a41106a200341f0046a41106a2903003703002004200341f0046a41086a29030037030020034180036a41086a200341a0026a41086a29030037030020034180036a410d6a200341a0026a410d6a290000370000200320032903f004370360200320032f01583b01d0052003200341da006a2d00003a00d205200320032903a00237038003411210262202450d05200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272204450d062004200136001220034180046a41186a2202420037030020034180046a41106a2218420037030020034180046a41086a2217420037030020034200370380042004411620034180046a1002200341e0036a41186a2002290300370300200341e0036a41106a2018290300370300200341e0036a41086a201729030037030020032003290380043703e003412010262202450d0720022003290360370000200241186a200341e0006a41186a290300370000200241106a200341e0006a41106a290300370000200241086a200341e0006a41086a2903003700002002412041c00010272202450d0820022006370020200241286a2005370000200241c00041800110272202450d092002201a370050200220032f01d0053b00302002200836003720022007360033200220032903800337003b200241d8006a200a370000200241326a20032d00d2053a0000200241c3006a20034180036a41086a290300370000200241c8006a2003418d036a290000370000200341e0036a4120200241e000100420021023200410232003418c046a20013602004100210420034180046a41086a41003a0000200341093a00800441a886c500410020034180046a102c0b0b2000201836020420002004360200200341e0056a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b41204101102a000b41c0004101102a000b4180014101102a000bc15004047f017e117f027e230041d0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d00024020044102460d0020044103470d0f200141216a2d00002105200141246a2802002106200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211341db94c3002114412a211520022d0000450d024101211641002117410021180c030b200141086a2802002116200141046a28020021052002411a6a2901002107200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f01002106412a211541db94c300211420022d0000450d034101211741002118410021080c040b200141046a2802002117024020022d00000d0020022d00014101470d00200241196a2d00002114200241186a2d00002115200241166a2f01002116200241156a2d00002118200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002106200241026a2f0100210520032002411a6a290100370370200320143a006f200320153a006e200320163b016c200320183a006b200320083a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320063a005a200320053b015820032010200f410874200e411874727236005f2003201320124108747220114118747236005b200341d8006a10b803450d0941002115200341003602e003200342013703d8032017200341d8036a103920032802dc03211420032802e003211620032802d8032102200341d8026a41186a22184200370300200341d8026a41106a22084200370300200341d8026a41086a22094200370300200342003703d80220022016200341d8026a1002200341c8016a41186a2018290300370300200341c8016a41106a22182008290300370300200341c8016a41086a2009290300370300200320032903d8023703c80102402014450d00200210230b200341d8036a201741f0001094041a200341d8026a410d6a200341d8006a41086a290300370000200341d8026a41156a200341d8006a41106a290300370000200341d8026a411d6a200341d8006a41186a29030037000041012116200341013a00dc02200341013a00d802200320032903583700dd022003200341d8036a200341d8026a10d202200341fd036a2003280200453a0000200341d8036a410d6a200341c8016a41086a290300370000200341d8036a41156a2018290300370000200341d8036a411d6a200341c8016a41186a290300370000200341053a00dc03200341073a00d803200320032903c8013700dd0341a886c5004100200341d8036a102c20171023410021140c2d0b41db94c3002114412a21020c2b0b41012116410021174100211820022d00014101470d002002410c6a2d000021182002410a6a2f01002117200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021160b201741ffff0371410874201541ff017172201841187472210220160d1420032007370350200320083a004f200320093a004e2003200a3b014c2003200b3a004b2003200c3a004a2003200d3b01482003200e3a00472003200f3a0046200320103b0144200320113a00432003200236003f2003201436003b200320123a003a200320133b0138200341386a10b803450d02200341d8036a200341186a10b60320032802e0032209450d05200341f0036a280200210b200341ec036a280200210a4110210220032802e40321184182aac4002114200620032802d803220f470d13200341f4036a280200210820032802dc03210e2009200341d8036a41106a280200220c4105746a211620092102410021150340201620026b41ff004d0d09200341386a2002460d0a20152002200341386a412010960422144100476a21152014450d0a200241206a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241c0006a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241e0006a2214200341386a460d0a20024180016a210220152014200341386a412010960422144100476a211520140d000c0a0b0b41012117410021184100210820022d00014101470d002002410c6a2d000021182002410a6a2f01002108200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021170b200841ffff0371410874201841187472201541ff017172210220170d0220032007370350200320093a004f2003200a3a004e2003200b3b014c2003200c3a004b2003200d3a004a2003200e3b01482003200f3a0047200320103a0046200320113b0144200320123a00432003200236003f2003201436003b200320133a003a200320063b0138200341386a10b803450d01200341003602e003200342013703d8032016200341d8036a103920032802dc03211420032802e003211520032802d8032102200341d8026a41186a22174200370300200341d8026a41106a22184200370300200341d8026a41086a22084200370300200342003703d80220022015200341d8026a1002200341d8006a41186a22152017290300370300200341d8006a41106a22172018290300370300200341d8006a41086a22182008290300370300200320032903d80237035802402014450d00200210230b200341d8036a41186a2015290300370300200341d8036a41106a2017290300370300200341d8036a41086a2018290300370300200320032903583703d803411910262202450d0a200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d0b200220032903d803370019200241316a200341d8036a41186a290300370000200241296a200341d8036a41106a290300370000200241216a200341d8036a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341b8026a412041a886c5004100410010012114200210232014417f460d054187a9c4002114411f21020c020b41eea9c4002114411421020c110b41f0a8c4002114411721020b201610242016102341012115410021160c250b41dba9c4002114411321020c0e0b41f0a8c4002114411721020c220b200341d8036a41086a22024200370300200342003703d8030240200541014b0d004195b7c1004115200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802410021020240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0a20032902dc032207422088a721022007a7450d00201410230b200341d8036a201641f0001094041a200341e4026a2002360200200341d8026a41086a4101360200200341003a00dc02200341013a00d802200341086a200341d8036a200341d8026a10d202200341fd036a2003280208453a0000200341e5036a200341d8006a41086a290300370000200341ed036a200341e8006a290300370000200341f5036a200341f0006a290300370000200341043a00dc03200341073a00d803200320032903583700dd0341a886c5004100200341d8036a102c0c1a0b41bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d8024100210c0240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0720032802d803210c0b200341d8036a41086a22024200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0920032802d80341016a21020c010b410121020b42002107200341d8036a41086a22144200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a22152014290300370300200320032903d8033703d802200320023602d803200341d8026a4110200341d8036a4104100420144200370300200342003703d8034188a8c4004118200341d8036a100020152014290300370300200320032903d8033703d8024100210202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220b450d0b20032902dc032107200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a290300370300200341d8036a41086a200341d8006a41086a290300370300200320032903583703d803200341d8036a21142007422088a722022007a7460d010c1a0b200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a2903003703002014200341d8006a41086a290300370300200320032903583703d8034101210b200341d8036a21140b200241016a22152002490d1a20024101742217201520152017491bad2219420586221a422088a70d1a201aa722154100480d1a024002402002450d00200b200241057420151027220b450d010c190b20151026220b0d180b20154101102a000b20022016460d012009200c4105746a21160340200341386a2002460d0120152002200341386a412010960422144100476a21152014450d014100210d2016200241206a2202470d000c0a0b0b4101210d0c080b4100210d0c070b200341ec036a4101360200200341013602dc022003418898c4003602d802200342013702dc03200341d497c4003602d8032003200341d8026a3602e803200341d8036a41c498c4001061000b41194101102a000b41394101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200a20084105746a2117200a21024100211402400240024002400240024002400340201720026b41ff004d0d01200341386a2002460d0220142002200341386a412010960422164100476a21142016450d02200241206a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241c0006a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241e0006a2216200341386a460d0220024180016a210220142016200341386a412010960422164100476a211420160d000c020b0b20022017460d020340200341386a2002460d0120142002200341386a412010960422164100476a21142016450d01410021162017200241206a2202470d000c020b0b410121160b200541ff0171450d010c020b41002116200541ff01710d010b20160d01200341d8036a41186a2214200341386a41186a290300370300200341d8036a41106a2216200341386a41106a290300370300200341d8036a41086a2217200341386a41086a290300370300200320032903383703d80302400240024002400240200b2008470d00200b41016a2202200b490d16200b4101742210200220022010491b2211ad4205862207422088a70d162007a722024100480d16200b450d01200a200b41057420021027220a0d020c030b200b21110c010b20021026220a450d010b200a20084105746a220220032903d803370000200241186a2014290300370000200241106a2016290300370000200241086a2017290300370000200841016a21080240200d450d00200c20154d0d022009200c417f6a220c4105746a22022900002107200229000821192002290010211a200920154105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000b201821102011210b0c060b20024101102a000b41a8aac4002015200c1029000b200d0d00200341d8036a41186a2215200341386a41186a290300370300200341d8036a41106a2217200341386a41106a290300370300200341d8036a41086a220d200341386a41086a290300370300200320032903383703d8030240024002402018200c470d00201841016a22022018490d1320184101742210200220022010491b2210ad4205862207422088a70d132007a722024100480d132018450d01200920184105742002102722090d020c070b201821100c010b200210262209450d050b2009200c4105746a220220032903d803370000200241186a2015290300370000200241106a2017290300370000200241086a200d290300370000200c41016a210c2016450d03200820144d0d05200a2008417f6a22084105746a22022900002107200229000821192002290010211a200a20144105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000c030b4192aac4002114411621020b02402018450d00200910230b200b450d00200a10230b41012116410121150c150b200341fd036a2003290318370000200341e5036a200341386a41086a290300370000200341d8036a41156a200341386a41106a290300370000200341f5036a200341386a41186a29030037000020034185046a200341186a41086a2903003700002003418d046a200341186a41106a29030037000020034195046a200341186a41186a290300370000200341013a00dc03200341073a00d803200320032903383700dd03200341a4046a2008360200200341a0046a200c3602002003419d046a20053a00004100210241a886c5004100200341d8036a102c200341d8036a41086a22144200370300200342003703d8034195b7c1004115200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d8020240024002400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0120032902dc032207422088a721022007a7450d00201410230b0240200c200e4f0d004100200220086b2214201420024b1b200e490d00200341f4036a2008360200200341f0036a200b360200200341e8036a200c360200200341e4036a20103602002003200a3602ec03200320093602e0032003200e3602dc032003200f3602d803411510262202450d022002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a84437000020024115413510272202450d03200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22164200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2016290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad03200210232010450d0c0c0b0b02400240200c200e490d00200341e5036a200341186a41086a290300370000200341ed036a200341186a41106a290300370000200341f5036a200341186a41186a290300370000200341023a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411910262214450d07201441186a41002d00bea9443a0000201441106a41002900b6a944370000201441086a41002900aea944370000201441002900a6a94437000020144119413910272214450d0820142003290318370019201441316a200341186a41186a290300370000201441296a200341186a41106a290300370000201441216a200341186a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22174200370300200342003703d80220144139200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2017290300370300200320032903d8023703b802410e21150240200341b8026a412041a886c500410041001001417f460d00200342203702cc032003200341b8026a3602c803200341d8036a200341c8036a102f20032802d8032215410e460d0a200341d8026a200341d8036a41047241ec001094041a200341b8026a412010030b200341c8016a200341d8026a41ec001094041a2015410e470d0120141023411521144115102622020d0a0c0b0b200341e5036a200341206a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341033a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c41152114411510262202450d0a0c090b200341d8006a200341c8016a41ec001094041a20141023200320153602d803200341d8036a410472200341d8006a41ec001094041a200341e4026a2002360200200341d8026a41086a200e360200200341003a00dc02200341013a00d802200341106a200341d8036a200341d8026a10d202200341fd036a2003280210453a0000200341e5036a200341186a41086a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341043a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411521144115102622020d080c090b41d4aac10041331021000b41154101102a000b41354101102a000b20024101102a000b41a8aac400201420081029000b41194101102a000b41394101102a000b41d4aac10041331021000b2002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a8443700000240024020022014413510272202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000042002107200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22144200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2014290300370300200320032903d8023703b802200341b8026a4120100320021023200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a100020142002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220d450d0320032902dc0321070c010b4101210d0b4100210802400240024002402007422088a72216450d0041002117410021084100211402400340024002402008450d00200d20144105746a2102200d201420176a4105746a21150340201420164f0d06200341186a2002460d022002200341186a4120109604450d02201720146a221820164f0d0720152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000200241206a2102201541206a21152016201441016a2214470d000c050b0b200d20144105746a21020340201420164f0d05200341186a2002460d012002200341186a4120109604450d01200241206a21022016201441016a2214470d000c030b0b2017417f6a2117200841016a2108201441016a22142016470d000c020b0b410021080b200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802200341003602e003200342013703d8032003201620086b22143602c801200341c8016a200341d8036a1041024002402014450d00201641057420084105746b21184100200228020022146b211620032802d803210820032802dc032117200d210203400240201720166a411f4b0d00201441206a22152014490d0f2017410174220c20152015200c491b22154100480d0f024002402017450d00200820172015102722080d010c080b201510262208450d070b201521170b200820146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201641606a2116201441206a2114200241206a2102201841606a22180d000b200341e0036a2014360200200320173602dc03200320083602d8030c010b2002280200211420032802dc03211720032802d80321080b200341d8026a411020082014100402402017450d00200810230b02402007a7450d00200d10230b20100d060c070b41b4c4c200201420161029000b4194c5c200201820161029000b20154101102a000b41354101102a000b41d4aac10041331021000b20144101102a000b200910230b0240200b450d00200a10230b4100211441012116410121150c0b0b2007422088a72102201921070b200b200241057422176a22152014290000370000201541186a201441186a290000370000201541106a201441106a290000370000201541086a201441086a290000370000200341d8036a41086a22144200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d802200341003602e003200342013703d8032003200241016a22023602c801200341c8016a200341d8036a1041024002402002450d00201741206a21084100201428020022146b211720032802d803210920032802dc032118200b210203400240201820176a411f4b0d00201441206a22152014490d052018410174220a20152015200a491b22154100480d05024002402018450d00200920182015102722090d010c080b201510262209450d070b201521180b200920146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201741606a2117201441206a2114200241206a2102200841606a22080d000b200341e0036a2014360200200320183602dc03200320093602d8030c010b2014280200211420032802dc03211820032802d80321090b200341d8026a411020092014100402402018450d00200910230b02402007a7450d00200b10230b200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341d8036a201641f0001094041a411910262202450d03200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d04200220032903c801370019200241316a200341c8016a41186a290300370000200241296a200341c8016a41106a290300370000200241216a200341c8016a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341003602e002200342013703d802200341d8036a200341d8026a103920032802dc022114200341b8026a412020032802d802221520032802e002100402402014450d00201510230b20021023200341d8036a1024412010262202450d0520022003290338370000200241186a200341386a41186a290300370000200241106a200341386a41106a290300370000200241086a200341386a41086a290300370000200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341f4036a4100360200200341e4036a428180808010370200200342013702ec03200320023602e003200320053602dc032003200c3602d803411510262214450d062014410d6a41002900ada844370000201441086a41002900a8a844370000201441002900a0a84437000020144115413510272214450d07201420032903c8013700152014412d6a200341c8016a41186a290300370000201441256a200341c8016a41106a2903003700002014411d6a200341c8016a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22174200370300200341d8026a41086a22184200370300200342003703d80220144135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2017290300370300200341b8026a41086a2018290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad032014102320021023200341d8036a410d6a200341386a41086a290300370000200341ed036a200341386a41106a290300370000200341d8036a411d6a200341386a41186a290300370000200341d8036a41256a2003290358370000200341d8036a412d6a200341d8006a41086a290300370000200341d8036a41356a200341d8006a41106a29030037000020034195046a200341d8006a41186a290300370000200341003a00dc03200341073a00d803200320032903383700dd03200341a4046a2005360200200341a0046a200c36020041a886c5004100200341d8036a102c0b201610234100211641012115410021140c080b101e000b20154101102a000b41194101102a000b41394101102a000b41204101102a000b41154101102a000b41354101102a000b201710242017102341002115410121160b02400240200441037122044101460d0020044102470d012016450d01200141086a28020022011024200110230c010b2015450d00200141046a28020022011024200110230b2000200236020420002014360200200341d0046a24000bfc09010b7f230041a0026b2202240002400240411210262203450d00200341106a41002f00c4ad443b0000200341086a41002900bcad44370000200341002900b4ad4437000020034112413210272203450d01200320012900003700122003412a6a200141186a290000370000200341226a200141106a2900003700002003411a6a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a220542003703002002420037036020034132200241e0006a1002200241c0006a41186a2001290300370300200241c0006a41106a2004290300370300200241c0006a41086a200529030037030020022002290360370340024002400240200241c0006a412041a886c500410041001001417f460d0020014200370300200241f0006a4200370300200241e8006a420037030020024200370360200241c0006a4120200241e0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a2204290300370300200241106a2205200241e0006a41106a2206290300370300200241086a2207200241e0006a41086a22082903003703002002200229036037030020024180026a41186a2209200129030037030020024180026a41106a2201200529030037030020024180026a41086a220520072903003703002002200229030037038002200241c0016a41186a2009290300370300200241c0016a41106a2001290300370300200241c0016a41086a200529030037030020022002290380023703c00120044200370300200642003703002008420037030020024200370360200241c0006a4120200241e0006a4120412010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a290300370300200241106a2204200241e0006a41106a290300370300200241086a2205200241e0006a41086a2903003703002002200229036037030020024180026a41186a2206200129030037030020024180026a41106a2207200429030037030020024180026a41086a220820052903003703002002200229030037038002200241e0016a41186a22092006290300370300200241e0016a41106a22062007290300370300200241e0016a41086a2207200829030037030020022002290380023703e00120024180016a41186a2208200241c0016a41186a29030037030020024180016a41106a220a200241c0016a41106a29030037030020024180016a41086a220b200241c0016a41086a29030037030020024180016a41286a220c200729030037030020024180016a41306a2207200629030037030020024180016a41386a22062009290300370300200220022903c00137038001200220022903e0013703a001200241386a22092006290300370300200241306a22062007290300370300200241286a2207200c290300370300200241206a220c20022903a001370300200120082903003703002004200a2903003703002005200b2903003703002002200229038001370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a200c290300370000200041296a2007290300370000200041316a2006290300370000200041396a20092903003700000c010b200041003a00000b20031023200241a0026a24000f0b41d4aac10041331021000b41124101102a000b41324101102a000b4d01017f230041206b22002400200041146a41013602002000410136021c2000418898c40036021820004201370204200041d497c4003602002000200041186a360210200041b498c4001061000b130020004100360204200041a886c5003602000b13002000410f360204200041a7e4c3003602000b130020004104360204200041d4dec3003602000b130020004101360204200041d4ddc3003602000b130020004104360204200041cdddc3003602000b130020004101360204200041b8dcc3003602000b13002000410236020420004194d8c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000bb00901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210410240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d0120022802002003200610272203450d020c030b200441046a2105200228020021030c030b2006102622030d010b20064101102a000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210410240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d0120022802002003200710272204450d020c030b2006410e6a2105200228020021040c030b2007102622040d010b20074101102a000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900bce543370000200641002900b6e5433700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41df003600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d0120022802002005200310272205450d020c030b200228020021050c030b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41df003600002002410736020c2002410c6a200210412008280200210641c4e5c30021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009102722030d020c060b200641086a2104200228020021030c020b200910262203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006102722030d010c060b200610262203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a22074198e6c300470d000b200241106a24002006ad4220862003ad840f0b101e000b20094101102a000b20064101102a000bad1d03037f027e077f23004180096b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024188076a200241086a108f0120024198076a2802002101200228029407210320022802900721042002290388072105200241f8036a2002419c076a41e4001094041a0240024002400240024002400240024002400240024002400240024002402004450d00200241f8006a200241f8036a41e4001094041a20024188076a200241086a10aa0202402002280288072200450d00200229028c072106200241146a200241f8006a41e4001094041a20024188016a200136020020024184016a20033602002002200436028001200220053703782002418c016a200241146a41e4001094042101200241f4016a2006370200200220003602f001200241f8006a108a0320022903782205500d0620024188076a2005427f7c10970220024188076a200141201096040d06200241f0016a28020021004104210741002108410021090240200241f8016a280200220141f8016c41f801490d002001410c6c220a10262207450d0e200121090b02402001450d00200141f8016c210a200141037441786a2104200721010340200220003602f80320024188076a200241f8036a108b03200141086a20024188076a41086a28020036020020012002290388073702002001410c6a2101200041f8016a2100200a41887e6a220a0d000b200441037641016a21080b4104210b4100210a4100210c02402008410c6c2201410c490d002001410c6e220c41037422004100480d0f20001026220b450d100b0240200720016a22032007460d004100210a200b210120072100034020002802002104200141046a200041086a28020036020020012004360200200141086a2101200a41016a210a2000410c6a22002003470d000b0b20024188076a200b200a108c030240200c450d00200b10230b02402008450d002008410c6c21002007210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b0b02402009450d00200710230b0240200241cc016a220120024188076a4120109604450d0041defdc400410e100f20014120101720024188076a412010170b200120024188076a41201096040d0a200241f4016a2802002108200241f8006a41f8006a2802002107200241f8006a4180016a280200210a20024180026a200241f8006a41f8001094041a2007200a41f8016c6a21002002290380022106200721010240200a450d00200241f8036a41f8006a210420024188076a41086a210320072101034020024198066a200141f0001094041a200141f0006a2903002105200241f8026a200141f8006a4180011094041a20054203510d04200241f8036a20024198066a41f0001094041a200241f8036a41f0006a20053703002004200241f8026a4180011094041a2002200241f8036a3602f00520024188076a200241f0056a108b032003280200210a0240200228028c07450d0020022802880710230b20024188076a200241f8036a41f8011094041a2002410036028006200241f0056a20024188076a200a20024180066a108d0320022802f0054101460d07024020022802f405220a450d00200a200241f0056a41086a280200100f0b200141f8016a22012000470d000b200021010b20012000470d030c040b02402001450d00200141246c21002004210103400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b2003450d00200410230b2002419c076a4101360200200241013602fc032002419ce6c3003602f8032002420137028c07200241a4e6c300360288072002200241f8036a3602980720024188076a41ace6c3001061000b200141f8016a22012000460d010b20024190086a210a20024188076a41f8006a21040340200241f8026a200141f0001094041a200141f0006a290300210520024188076a200141f8006a4180011094041a20054203510d0120024198066a200241f8026a41f0001094041a200241f8036a20024188076a4180011094041a20024188076a20024198066a41f0001094041a20024188076a41f0006a20053703002004200241f8036a4180011094041a200a1024200141f8016a22012000470d000b0b02402008450d00200710230b10e00220024188076a41086a22014200370300200242003703880741f5ccc200411120024188076a1000200241f8036a41086a200129030037030020022002290388073703f803200241f8036a411010032006108e03200610ed0210910110e50220024188076a10e402200220024180026a41106a2802002209360290062002280288022103200220024188076a41106a28020022013602940620092001470d06024002402009450d0020022802900721074100210a410021080340024002402003200a6a22012d000022042007200a6a22002d0000470d0002400240024002402004417f6a220b41034b0d000240200b0e0400040203000b024020032007460d00200141016a280000200041016a280000470d050b200141106a280200220b200041106a280200470d04200141086a280200220c200041086a280200220d460d05200c200d200b1096040d040c050b20032007460d04200141016a200041016a41201096040d030c040b024020032007460d00200141016a280000200041016a280000470d030b200141106a280200220b200041106a280200470d02200141086a280200220c200041086a280200220d460d03200c200d200b1096040d020c030b2001410c6a280200220b2000410c6a280200470d01200141046a280200220c200041046a280200220d460d02200c200d200b1096040d010c020b024020032007460d00200141016a280000200041016a280000470d010b200141106a280200220b200041106a280200470d00200141086a280200220c200041086a280200220d460d01200c200d200b109604450d010b41b4eec3004114100f200241f8036a2001108f0320022802f803220b200241f8036a41086a22042802001017024020022802fc03450d00200b10230b200241f8036a2000108f0320022802f803220b20042802001017024020022802fc03450d00200b10230b20012d000020002d00002204470d030b024002400240024002402004417f6a220441034b0d00024020040e0400040203000b024020032007460d00200141016a280000200041016a280000470d080b200141106a2802002204200041106a280200470d07200141086a2802002201200041086a2802002200460d04200120002004109604450d040c070b20032007460d03200141016a200041016a4120109604450d030c060b024020032007460d00200141016a280000200041016a280000470d060b200141106a2802002204200041106a280200470d05200141086a2802002201200041086a2802002200460d02200120002004109604450d020c050b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d01200120002004109604450d010c040b024020032007460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002201200041086a2802002200460d002001200020041096040d030b200a41246a210a200841016a22082009490d000b0b024020024180026a41346a220120024188076a41346a22004120109604450d0041defdc400410e100f2001412010172000412010170b2001200041201096040d08024020024198076a2802002200450d0020024188076a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b024020024194076a280200450d0020024190076a28020010230b024020024190026a2802002200450d0020024180026a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b02402002418c026a280200450d0020024188026a28020010230b20024180096a240042010f0b41dcc6c400104f000b20022802f4052201450d0120014103460d0220014104460d0341acc6c400104f000b41b4c5c400104f000b41fcc5c400104f000b41e4c5c400104f000b4194c6c400104f000b41ccc5c400104f000b200220024190066a36028006200220024194066a3602f005200241f8036a41146a4100360200200241f8026a41146a410336020020024184036a410436020020024198066a41146a4103360200200241a886c50036028804200242013702fc03200241c4c6c4003602f803200241043602fc022002420337029c06200241d480c500360298062002200241f8036a360288032002200241f0056a36028003200220024180066a3602f8022002200241f8026a3602a80620024198066a41ccc6c4001061000b41f4c6c400104f000b200a4104102a000b101e000b20004104102a000be3780b0c7f017e017f017e067f037e0b7f0b7e017f027e177f230041800a6b22012400200141003602c003200142043703b803024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041106a28020041246c2202450d0020002802082103410421044100210541002106410021070340024020032d00004101470d00200341106a2802002208417f4c0d04200341016a2800002109024002402008450d00200341086a280200210a20081026220b450d07200b200a20081094041a0c010b4101210b0b200141f0086a41086a220c200141b0056a41086a290200370300200120012902b0053703f008024020072006470d0002400240024020052006470d00200541016a220a2005490d1120054101742206200a200a2006491b2206ad42247e220d422088a70d11200da7220a4100480d112005450d012004200541246c200a102722040d020c0a0b200521060c020b200a10262204450d080b200120063602bc03200120043602b803200621050b2004200741246c6a220a2008360210200a200836020c200a200b360208200a2009360001200a41013a0000200a20012903f008370214200a411c6a200c290300370200200141b8036a41086a200741016a22073602000b200341246a21032002415c6a22020d000c020b0b4104210441002105410021070b200141003602f008418595c3004110200141f0086a41041004200141e0066a41086a22034200370300200142003703e00641af98c300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d00720012000290300220d3703f008200141d0076a4110200141f0086a4108100420034200370300200142003703e00641fd98c300410d200141e0066a1000200a2003290300370300200120012903e0063703d007200141103602f4082001200141d0076a3602f008200141b8036a200141f0086a10d60220034200370300200142003703e00641fc9cc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110200041146a220a41201004411010262203450d03200341086a410029009299433700002003410029008a994337000020034110412010272203450d042003200d427f7c370010200141f0086a41186a22084200370300200141f0086a41106a22024200370300200141f0086a41086a220b4200370300200142003703f00820034118200141f0086a1002200141e8036a41186a2008290300370300200141e8036a41106a2002290300370300200141e8036a41086a200b290300370300200120012903f0083703e803200141e8036a4120200a4120100420031023200141e0066a41086a22034200370300200142003703e00641bc98c3004115200141e0066a1000200141d0076a41086a2003290300370300200120012903e0063703d007200141d0076a4110200041d4006a41201004200141f0086a10d4020240024002400240024020012802f4082203450d00200120033602880420012c00f008210220012802f808210e200141fc086a280200220a41d0004b0d02200e21080c010b200141013602880441002108410021024100210a0b20014188096a2000412c6a29000037030020014180096a200041246a290000370300200141f8086a2000411c6a290000370300200120002900143703f0080240200a2008470d00200841016a22032008490d0d2008410174220a20032003200a491b220ead420586220d422088a70d0d200da7220a4100480d0d2008450d022001280288042008410574200a10272203450d030c0a0b20012802880421032008210e0c0a0b200141f0086a41186a220b2000412c6a290000370300200141f0086a41106a2206200041246a290000370300200141f0086a41086a22092000411c6a290000370300200120002900143703f008200a20024d0d07200320024105746a220820012903f008370000200841186a200b290300370000200841106a2006290300370000200841086a2009290300370000200241187441808080086a41187541d1006f21020c0a0b200a102622030d070b200a4101102a000b101d000b20084101102a000b200a4104102a000b41104101102a000b41204101102a000b41a49dc3002002200a1029000b20012003360288042008210a0b2003200a4105746a220820012903f008370000200841186a200141f0086a41186a290300370000200841106a200141f0086a41106a290300370000200841086a200141f0086a41086a290300370000200a41016a210a0b200141e0066a41086a22084200370300200142003703e006418d9dc3004115200141e0066a1000200141d0076a41086a2008290300370300200120012903e0063703d007200141003602f808200142013703f008024002400240024002400240024002400240024002400240410110262208450d00200820023a000020014281808080103702f408200120083602f0082001200a3602b005200141b0056a200141f0086a104102400240024002400240200a450d00200a41057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b03400240200b20026a411f4b0d00200a41206a2208200a490d13200b410174220c20082008200c491b22084100480d1302400240200b450d002009200b2008102722090d010c060b200810262209450d050b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080c010b200141f8086a280200210a20012802f408210b20012802f00821090b200141d0076a41102009200a10040240200b450d00200910230b0240200e450d0020012802880410230b200141e0066a41086a22034200370300200142003703e00641b49dc300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d007200141d0076a4110100320034200370300200142003703e00641c19dc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110100341121026220a450d04200a41106a41002f00e29d433b0000200a41086a41002900da9d43370000200a41002900d29d43370000200141f0086a41186a22034200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f008200a4112200141f0086a1002200141c8036a41186a220b2003290300370300200141c8036a41106a2008290300370300200141c8036a41086a2002290300370300200120012903f0083703c803412010262203450d05200320012903c803370000200341186a200b290300370000200341106a200141c8036a41106a290300370000200341086a200141c8036a41086a290300370000200a1023200341201018200310232000290300210f200141a8036a41d198c3004115109201024020012802a8034101470d0020012903b003210d200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141f0086a411041a886c500410041001001417f470d00200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f0082001200d3703b005200141f0086a4110200141b0056a410810040b200f423c824200520d09200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410021100240200141f0086a411041a886c500410041001001417f460d00200141003602b005200141f0086a4110200141b0056a41044100100141016a41044d0d0320012802b00521100b200141e0066a41086a22034200370300200142003703e00641dfbac400410f200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410221030240200141f0086a411041a886c500410041001001417f460d00200141003a00b005200141f0086a4110200141b0056a41014100100141016a41014d0d0720012d00b0052103200141f0086a411010030b200141f0076a20101075024002400240024020012802f007220e450d00200141f0076a41086a280200210020012802f4072111200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141003602b805200142013703b005200120003602880420014188046a200141b0056a10412000450d01200041057421064100200141b0056a41086a280200220a6b210220012802b005210920012802b405210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d15200b410174220c20082008200c491b22084100480d1502400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141b8056a200a3602002001200b3602b405200120093602b0050c020b200341ff01714102472003712112200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f00841002111200141f0086a411041a886c500410041001001417f460d022001421037028c042001200141f0086a36028804200141b0056a20014188046a102820012802b005220e450d0a200141b8056a280200210020012802b40521110c0b0b200141b0056a41086a280200210a20012802b405210b20012802b00521090b200141f0086a41102009200a10040240200b450d00200910230b410121120c090b4101210e410021000c080b20084101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b41124101102a000b41204101102a000b41d4aac10041331021000b41d4aac10041331021000b200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410121132001201041016a22033602b005200141f0086a4110200141b0056a41041004200120033602f408200141033a00f0084100210241a886c5004100200141f0086a102c0240024002400240024002400240024002400240024002400240024002400240024002400240024020004105742203450d0020034105752210ad42e0007e220d422088a70d1a200da7220a4100480d1a200a10262213450d03200e20036a200e470d010c020b41002110200e20036a200e460d010b2000410574210b200141f0086a41206a2103200141b0056a41017221084100210220132106200e210a0340200141f0076a41186a2209200a41186a290000370300200141f0076a41106a220c200a41106a290000370300200141f0076a41086a2200200a41086a2900003703002001200a2900003703f007200141b0056a200141f0076a10fe020240024020012d00b0054101470d0020014188046a41386a200841386a29000037030020014188046a41306a200841306a29000037030020014188046a41286a200841286a29000037030020014188046a41206a200841206a29000037030020014188046a41186a200841186a29000037030020014188046a41106a200841106a29000037030020014188046a41086a200841086a29000037030020012008290000370388040c010b20014188046a41386a420037030020014188046a41306a420037030020014188046a41286a420037030020014188046a41206a420037030020014188046a41186a420037030020014188046a41106a420037030020014188046a41086a420037030020014200370388040b200a41206a210a2003200129038804370000200141f0086a41186a2009290300370300200141f0086a41106a200c290300370300200141f0086a41086a2000290300370300200341086a20014188046a41086a290300370000200341106a20014188046a41106a290300370000200341186a20014188046a41186a290300370000200341206a20014188046a41206a290300370000200341286a20014188046a41286a290300370000200341306a20014188046a41306a290300370000200341386a20014188046a41386a290300370000200120012903f0073703f008200241016a21022006200141f0086a41e00010940441e0006a2106200b41606a220b0d000b0b02402011450d00200e10230b2012450d0f4108210e410021084100211102402013200241e0006c6a220320136b221441e000490d00201441e0006e221141286c220a4100480d18200a1026220e450d030b0240201320034622150d00200241e0006c210b201341206a210a41002108200e21030340200141f0086a41186a200a41186a2900002216370300200141f0086a41106a200a41106a2900002217370300200141f0086a41086a200a41086a2900002218370300200a290000210d200141e8036a41086a22062018370300200141e8036a41106a22092017370300200141e8036a41186a220c20163703002001200d3703e8032001200d3703f008200141c8036a41186a2200200c290300370300200141c8036a41106a220c2009290300370300200141c8036a41086a22092006290300370300200120012903e8033703c803200341186a2000290300370200200341106a200c290300370200200341086a2009290300370200200320012903c803370200200341206a4201370300200341286a2103200a41e0006a210a200841016a2108200b41a07f6a220b0d000b0b4108210c200141d0076a41086a22034200370300200142003703d00741dbcbc300411b200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880441002100024020014188046a411041a886c500410041001001417f460d00200142103702b405200120014188046a3602b005200141f0086a200141b0056a10890220012802f008220c450d0220012802f40821002008200141f8086a280200470d050c040b20084100460d030c040b200a4101102a000b41d4aac10041331021000b200a4108102a000b200e200c460d01417f210b200e2103200c210a0340200b41016a220b20084f0d022003200a41201096040d01200a41206a2106200341206a2109200341286a2103200a41286a210a20092903002006290300510d000b0b200141d0076a41086a22034200370300200142003703d00741aec8c3004117200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880420014188046a411041a886c500410041001001417f460d01200142003703f00820014188046a4110200141f0086a41084100100141016a41084d0d0520012903f008210d200142003703f00820014188046a4110200141f0086a41084108100141016a41084d0d0520012903f008211620014188046a41101003200120083602f808200120113602f4082001200e3602f008200141f0086a200d4201201610ef0220000d020c030b02402000450d00200c10230b2011450d02200e102320120d030c090b200120083602f808200120113602f4082001200e3602f008200141f0086a42004200200d10ef022000450d010b200c10230b2012450d060b4101210e41002108410021120240201441e000490d00201441e0006e221241057422031026220e450d030b024020150d00200241e0006c2102201341c0006a210341002108200e210a0340200141f0086a41186a200341186a2900002216370300200141f0086a41106a200341106a2900002217370300200141f0086a41086a200341086a29000022183703002003290000210d200141e8036a41086a220b2018370300200141e8036a41106a22062017370300200141e8036a41186a220920163703002001200d3703e8032001200d3703f008200141c8036a41186a220c2009290300370300200141c8036a41106a22092006290300370300200141c8036a41086a2206200b290300370300200120012903e8033703c803200a41186a200c290300370000200a41106a2009290300370000200a41086a2006290300370000200a20012903c803370000200341e0006a2103200841016a2108200a41206a210a200241a07f6a22020d000b0b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200142103702b4052001200141e0066a3602b005200141f0086a200141b0056a102820012802f0082211450d0220012802f40821142008200141f8086a280200470d050c040b410121114100211420084100460d030c040b41d4aac10041331021000b41d4aac10041331021000b20034101102a000b0240200e2011460d002008450d0041002102200e21032011210a03402003200a41201096040d02200341206a2103200a41206a210a200241016a22022008490d000b0b02402014450d00201110230b2012450d01200e102320100d020c030b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006200141003602f808200142013703f008200120083602b005200141b0056a200141f0086a1041024002402008450d00200841057421094100200141f0086a41086a280200220a6b210b20012802f008210c20012802f4082106200e2103034002402006200b6a411f4b0d00200a41206a2202200a490d0c20064101742200200220022000491b22024100480d0c024002402006450d00200c200620021027220c0d010c090b20021026220c450d080b200221060b200c200a6a22022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200b41606a210b200a41206a210a200341206a2103200941606a22090d000b200141f8086a200a360200200120063602f4082001200c3602f0080c010b200141f0086a41086a280200210a20012802f408210620012802f008210c0b200141e0066a4110200c200a100402402006450d00200c10230b200141003602f808200142013703f008410110262203450d06200341003a000020014281808080103702f408200120033602f008200120083602b005200141b0056a200141f0086a104102402008450d00200841057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d0b200b410174220c20082008200c491b22084100480d0b02400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080b20014188046a41086a2203200141f0086a41086a280200360200200120012903f00837038804200141bb056a200328020036000020012001290388043700b30502402012450d00200e10230b200141fc086a200141b7056a290000370000200141e1eac98b063600f108200141023a00f008200120012900b0053700f508200141f0086a10d5022014450d00201110230b2010450d010b201310230b0240200f4280e20e82500d00200141e0066a21190c050b200141d0076a41086a22034200370300200142003703d00741f186c000411f200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200141003a00f008200141e0066a4110200141f0086a41014100100141016a41014d0d0320012d00f0082103200141e0066a411010032003450d00200141e0066a2119200f101f450d05200f102e1a0c050b200141e0066a2119200f102e450d04200f101f1a0c040b20024101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b200141d0076a41086a22034200370300200142003703d007419087c0004113200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006410021030240024002400240024002400240024002402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0120012802f00821030b200141d0076a41086a220a4200370300200142003703d00741a387c0004119200141d0076a1000200141e0066a41086a200a290300370300200120012903d0073703e0064100210a02402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0220012802f008210a0b02400240024002402003200a4f0d00200141fc086a210b200141f8086a210802400340200141f0086a2003103820082802002202410e470d01200341016a2203200a490d000c020b0b20012903f008210d20014188046a200b41fc001094041a200141f0076a20014188046a41fc001094041a20014180096a220820023602002001200d3703f808200120033602f00820014184096a200141f0076a41fc00109404210b0240200d200f520d00200141e0066a41086a2208200141f0086a41086a290300370300200120012903f0083703e006200141b0056a200b41fc001094041a20014188046a41086a220b2008290300370300200120012903e00637038804200141f0086a200141b0056a41fc001094041a4190011026221a450d07201a200129038804370300201a2002360210201a41086a200b290300370300201a41146a200141f0086a41fc001094041a200341016a2203200a4f0d03200141f0086a41106a2109200141f0086a41146a210c200141fc086a2100200141f0086a41086a21024101211b410121080340200141f0086a2003103802402002280200220b410e470d00200341016a2203200a490d010c040b20012903f008210d20014188046a200041fc001094041a200141f0076a20014188046a41fc001094041a2009200b3602002002200d370300200120033602f008200c200141f0076a41fc001094042106200d200f520d05200141e0066a41086a220e2002290300370300200120012903f0083703e006200141b0056a200641fc001094041a200141d0076a41086a2213200e290300370300200120012903e0063703d007200141f0086a200141b0056a41fc001094041a0240201b2008470d00201b41016a2206201b490d0f201b410174220e20062006200e491b2206ad4290017e220d422088a70d0f200da7220e4100480d0f02400240201b450d00201a201b4190016c200e1027221a0d010c0c0b200e1026221a450d0b0b2006211b0b201a20084190016c6a220620012903d007370300200641086a2013290300370300200641106a200b360200200641146a200141f0086a41fc001094041a200841016a2108200341016a2203200a490d000c030b0b200810240b4100211b4108211a410021080b419001211c201a20084190016c6a211d2008450d060c070b4101211b419001211c201a41014190016c6a211d41010d060c050b20091024419001211c201a20084190016c6a211d20080d050c040b41d4aac10041331021000b41d4aac10041331021000b4190014108102a000b200e4108102a000b201a2223201d460d020c010b20014188046a41086a211e200141f0086a41086a210e200141f0086a410472210320014188046a410c6a211f20014188046a41f8006a2120200141f9086a212120014188056a2122201a212302400340202341106a280200210a2023290208210d20232802002102200141f0086a202341146a41fc001094041a2023201c6a2123200a410e460d01200141f0076a200141f0086a41fc001094041a201e200a3602002001200d37038804201f200141f0076a41fc001094041a200141b0056a2002103020012802b0052109024002400240200141b0056a41086a2213280200220a450d00200a410574210b420021242009210a4200212542002126420021274200212842002129034020014198036a200a103420014198036a41086a2903002116200129039803210d2003200a290000370000200341086a200a41086a290000370000200341106a200a41106a290000370000200341186a200a41186a290000370000200120023602f00820014190036a200141f0086a103120012d00900341017121080240024020012d0091032206450d00200141f0026a201642002006ad2217420010980420014180036a200d420020174200109804200141e0026a42004200200d4200109804427f20014180036a41086a290300221720012903f00220012903e0027c7c221820012903f80220012903e8028442005220182017547222061b2117427f20012903800320061b21180c010b200141d0026a200d2016420a420010970420012903d0022218210d200141d0026a41086a290300221721160b200a41206a210a4200201720081b20277c4200201820081b222a20267c2226202a54ad7c21272017420020081b20297c2018420020081b221720287c2228201754ad7c2129201620257c200d20247c2224200d54ad7c2125200b41606a220b0d000b20012802b405450d020c010b42002128420021294200212642002127420021244200212520012802b405450d010b200910230b200141b0056a2002103020012802b00521100240024002402013280200220a450d00200a410574210b420021182010210a4200212b4200212a4200212c4200212d4200212e03402003200a290000370000200341086a200a41086a2208290000370000200341106a200a41106a2206290000370000200341186a200a41186a2209290000370000200120023602f008200141c8026a200141f0086a103120012d00c802210c20012d00c9022100200141f0086a41186a2009290000370300200141f0086a41106a2006290000370300200e20082900003703002001200a2900003703f008200141a8026a2002200141f0086a200041101032200141a8026a41186a290300202b7c20012903b802220d20187c2218200d54ad7c212b4200200141a8026a41086a290300220d200c41017122081b202c7c420020012903a802221620081b2217202a7c222a201754ad7c212c200d420020081b202e7c2016420020081b220d202d7c222d200d54ad7c212e200a41206a210a200b41606a220b0d000b20012802b405450d020c010b4200212d4200212e4200212a4200212c420021184200212b20012802b405450d010b201010230b42002116200141d0076a41086a222f4200370300200142003703d00741ecb5c1004116200141d0076a1000200141e0066a41086a2214202f290300370300200120012903d0073703e006024002402019411041a886c500410041001001417f460d00200142003703f808200142003703f008200141e0066a4110200141f0086a411041001001220a417f460d09200a410f4d0d09200e290300210d20012903f00821160c010b4200210d0b024002400240201820247c2217420288202b20257c2017201854ad7c2218423e868422242017852018420288222520188584500d002024202584500d004100210a0240034020014198026a20172018200a41046a41fe0071109a04200a41026a210a200129039802222420178520014198026a41086a290300222520188584500d0120242025844200520d000b0b20014188026a20172018200a41fe0071109a0420012903880220014188026a41086a29030084212442002125200a450d012024420052ad21240340200141e8016a201720184100200a417e6a22082008200a4b1b220a41ff0071109a04200141f8016a20244201862230420184222b20254201862024423f88842225202b20251098042030202b20012903f80120012903e80156200141f8016a41086a2903002224200141e8016a41086a29030022315620242031511b1b2124200a0d000c030b0b420021252017201884420052ad21240c010b2024420052ad21240b0240024002400240024002402016420288200d423e86842217201685200d4202882218200d8584500d002017201884500d004100210a02400340200141d8016a2016200d200a41046a41fe0071109a04200a41026a210a20012903d8012217201685200141d8016a41086a2903002218200d8584500d0120172018844200520d000b0b200141c8016a2016200d200a41fe0071109a0420012903c801200141c8016a41086a29030084211742002118200a450d012017420052ad21170340200141a8016a2016200d4100200a417e6a22082008200a4b1b220a41ff0071109a04200141b8016a20174201862230420184222b20184201862017423f88842218202b20181098042030202b20012903b80120012903a80156200141b8016a41086a2903002217200141a8016a41086a29030022315620172031511b1b2117200a0d000b202420258450450d020c030b420021182016200d84420052ad2117202420258450450d010c020b2017420052ad21172024202584500d010b202c20277c202a20267c2216202a54ad7c212b202e20297c202d20287c220d202d54ad7c212a20222d0000220a4102460d010240200a4101470d000340202521252024212620172018844200510d0a20014188016a200d202a2026202510970420014198016a2016202b2017201810970441012115200129039801222720012903880122285420014198016a41086a290300222420014188016a41086a290300222d542024202d51220a1b0d042028202754202d202454200a1b0d02200141f8006a2027202420172018109804200141e8006a2028202d20262025109804200d200129036822247d222d202a200141e8006a41086a2903007d200d202454ad7d222784500d02202b200141f8006a41086a2903007d212820162001290378220d54210a2016200d7d21242017210d2018212a202d211720272118202621162025212b20242028200aad7d22258450450d000c040b0b0340200141d8006a2016202b202420251097042017222620182227844200510d0a200141d8006a41086a290300211720012903582118200141c8006a200d202a2026202710970441012115201820012903482228542017200141c8006a41086a290300222d542017202d51220a1b0d032028201854202d201754200a1b0d01200141386a2018201720242025109804200141286a2028202d20262027109804200d200129032822177d2218202a200141286a41086a2903007d200d201754ad7d222d84500d01202b200141386a41086a2903007d212820162001290338220d54210a2016200d7d21172024210d2025212a20182124202d2125202621162027212b20172028200aad7d22188450450d000c030b0b410021150c010b200d201656202a202b56202a202b511b21150b200141f0086a2002103020012802f408213220012802f00821330240200e280200220a450d00200a41057421342033210a0340200141c8036a41186a2208200a41186a2209290000370300200141c8036a41106a220b200a41106a220c290000370300200141c8036a41086a2206200a41086a22002900003703002001200a2900003703c803200141d0076a41186a22352009290000370300200141d0076a41106a2236200c290000370300202f2000290000370300200a290000210d200141e8036a41086a22102006290300370300200141e8036a41106a2212200b290300370300200141e8036a41186a221120082903003703002001200d3703d007200120012903c8033703e803200a290000210d200341186a22372009290000370000200341106a2238200c290000370000200341086a223920002900003700002003200d370000200120023602f008200141206a200141f0086a1031410221090240201520012d0020410171220c45734101470d0020012d0021213a200141b0056a41186a2011290300370300200141b0056a41106a201229030037030020132010290300370300200120012903e8033703b005200c21090b200141e0066a41186a2200200141b0056a41186a223b290300370300200141e0066a41106a223c200141b0056a41106a223d29030037030020142013290300370300200120012903b0053703e006024020094102470d00200a41206a210a203441606a22340d010c020b0b200141c0066a41186a223e2000290300370300200141c0066a41106a223f203c290300370300200141c0066a41086a22402014290300370300200120012903e0063703c00620014190056a41186a2241203e29030037030020014190056a41106a2242203f29030037030020014190056a41086a22432040290300370300200120012903c00637039005200141f0086a41186a22442041290300370300200141f0086a41106a22452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a203a41187441187541027441a8f9c4006a3502004280e90f7e200f7c106320344120460d00203441406a21464100210c03402008200a200c6a220941386a2234290000370300200b200941306a223a2900003703002006200941286a22472900003703002001200941206a22092900003703c803203520342900003703002036203a290000370300202f20472900003703002009290000210d201020062903003703002012200b290300370300201120082903003703002001200d3703d007200120012903c8033703e803200120023602f0082009290000210d20472900002116203a29000021172037203429000037000020382017370000203920163700002003200d370000200141186a200141f0086a1031410221090240201520012d0018410171223445734101470d0020012d00192148203b2011290300370300203d201229030037030020132010290300370300200120012903e8033703b005203421090b2000203b290300370300203c203d29030037030020142013290300370300200120012903b0053703e0060240024020094102470d002046200c470d010c030b203e2000290300370300203f203c29030037030020402014290300370300200120012903e0063703c0062041203e2903003703002042203f29030037030020432040290300370300200120012903c006370390052044204129030037030020452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a204841187441187541027441a8f9c4006a3502004280e90f7e200f7c10632046200c460d020b200c41206a210c0c000b0b02402032450d00203310230b2002103502400240024002400240024002402015450d00200141f0086a410c6a220a2002360200200e41043a0000200141053a00f00841a886c5004100200141f0086a102c2020290300220d4200510d01200141b0056a20014188046a4188011094041a200141c0066a200d200f7c220d1036200141f0086a200141b0056a4188011094041a200141e0066a200e41f0001094041a20012802c4062206200141c0066a41086a2208280200220a470d02200a41016a220b200a490d0b200a4101742206200b200b2006491b2206ad42f8007e2216422088a70d0b2016a722094100480d0b200a450d0320012802c006200a41f8006c20091027220b0d040c110b200141f0086a410c6a2002360200200e41053a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a41041004201e10242023201d470d060c050b200141f0086a201e41f0001094041a200141003b01b005200141106a200141f0086a200141b0056a10d20220012802102108200a200236020020212008453a0000200e41073a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d050c040b20012802c006210b0c020b20091026220b450d0d0b200120063602c4062001200b3602c0060b200b200a41f8006c22006a200141e0066a41f00010940421092008200a41016a220c360200200941f0006a200236020041171026220a450d09200a410f6a41002900cb8740370000200a41086a41002900c48740370000200a41002900bc8740370000200a4117412e1027220a450d0a200a200d370017200141f0086a41186a22084200370300200141f0086a41106a22094200370300200e4200370300200142003703f008200a411f200141f0086a1002200141d0076a41186a2008290300370300200141d0076a41106a2009290300370300202f200e290300370300200120012903f0083703d007200141203602f4082001200141d0076a3602f008200141c0066a200141f0086a105c200a10230240200c450d00200041f8006a2108200b210a03400240200a280200410e460d00200a10240b200a41f8006a210a200841887f6a22080d000b0b02402006450d00200b10230b202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d010b0b201d21230b2023201d460d010b200141f0086a41106a210a200141f0086a41146a210b0340200141e0066a41086a2208202341086a290300370300200120232903003703e006202341106a2802002103200141f0086a202341146a41fc001094041a2003410e460d0120014188046a41086a22022008290300370300200120012903e00637038804200141b0056a200141f0086a41fc001094041a200a2003360200200141f0086a41086a200229030037030020012001290388043703f008200b200141b0056a41fc001094041a200a102420234190016a2223201d470d000b0b0240201b450d00201a10230b411710262203450d072003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d082003200f370017200141f0086a41186a220a4200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f0082003411f200141f0086a1002200141d0076a41186a200a290300370300200141d0076a41106a2008290300370300200141d0076a41086a2002290300370300200120012903f0083703d00702400240200141d0076a412041a886c500410041001001417f460d00200142203702b4052001200141d0076a3602b005200141f0086a200141b0056a103720012802f008220e450d0b20012902f408210d200141d0076a41201003200d422088a7210a200da721130c010b410021134108210e4100210a0b20031023200e200a41f8006c22036a210202400240024002402003450d00200341887f6a2108200141f0086a4104722106200141fc086a2109200141f9086a210c200141f8086a2100200e210303402003280200210a200141b0056a200341046a41ec001094041a200a410f460d02200141f0086a200141b0056a41ec001094041a024002400240200a410e470d0020080d010c020b200341f0006a280200210b20014188046a200141f0086a41ec001094041a2001200a3602f008200620014188046a41ec001094041a200141003b01b005200141086a200141f0086a200141b0056a10d2022001280208210a2009200b360200200c200a453a0000200041073a0000200141053a00f00841a886c5004100200141f0086a102c2008450d010b200341f8006a2103200841887f6a21080c010b0b200222032002470d020c030b200e22032002470d010c020b200341f8006a22032002460d010b200141f0086a410472210803402003280200210a200141f0086a200341046a41f4001094041a200a410f460d01200141b0056a200141f0086a41f4001094041a2001200a3602f0082008200141b0056a41f4001094041a0240200a410e460d00200141f0086a10240b200341f8006a22032002470d000b0b02402013450d00200e10230b200f10880202402007450d00200741246c210a2004210303400240024020032d0000220841034b0d0002400240024020080e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200a415c6a220a0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200a415c6a220a0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200a415c6a220a0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200a415c6a220a0d000b0b02402005450d00200410230b200141800a6a24000f0b101e000b418c95c400104f000b418c95c400104f000b41d4aac10041331021000b41174101102a000b412e4101102a000b20094108102a000b41174101102a000b412e4101102a000b41d4aac10041331021000bf31103057f027e087f230041206b22022400024002400240024002400240024002400240024002400240024041fa0110262203450d00200242fa0137020420022003360200200341003b0000410221042002410236020820022802002105200228020421060240200128020022032903704202520d0041022101024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021010b200520016a41013a0000200241086a2205200528020041016a3602000c060b024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021040b200520046a4181013a0000200241086a2205200528020041016a360200200341086a200210ec0202400240024020022802042201200528020022056b41c0004f0d00200541c0006a22062005490d0920014101742205200620062005491b22054100480d092001450d0120022802002001200510272201450d020c060b200228020021010c060b2005102622010d040b20054101102a000b41fa014101102a000b41044101102a000b41044101102a000b2002200536020420022001360200200241086a28020021050b200241086a2206200541c0006a360200200120056a220541086a200341346a290000370000200541106a2003413c6a290000370000200541186a200341c4006a290000370000200541206a200341cc006a290000370000200541286a200341d4006a290000370000200541306a200341dc006a290000370000200541386a200341e4006a2900003700002005200329002c3700002003200210980202400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782207420c882208420120084201561b22084200510d0620034180016a290300200880210820022802042201200241086a28020022056b41024f0d01200541026a22062005490d0c20014101742205200620062005491b22054100480d0c2001450d0420022802002001200510272201450d050c090b0240200228020420062802002205470d00200541016a22012005490d0c20054101742206200120012006491b22064100480d0c2005450d0220022802002005200610272201450d030c070b200228020021010c070b200228020021010c080b2006102622010d040b20064101102a000b2005102622010d040b20054101102a000b41b099c300104f000b2002200636020420022001360200200241086a28020021050b200241086a200541016a360200200120056a41003a00000c020b2002200536020420022001360200200241086a28020021050b200241086a200541026a360200200120056a2008a741047420077aa7417f6a22054101200541014b1b2205410f2005410f491b723b00000b20034188016a20021039200241086a22032802002105200241003602182002420137031020022005417e6a36021c2002411c6a200241106a1041024002400240024002402003280200220541014d0d002002280218210620022802102104200228021421092003410036020020022802002103024002400240024002400240024002402005417e6a220a450d004102210b2006450d12200320042d00003a00004101210c200241086a2201200128020041016a36020020064101460d12200420066a210d200320042d00013a00012001200128020041016a3602004102210b200441026a21014100210e2006417e6a2203450d052002280204220b20056b20034f0d01200520036a220c2005490d0d200b4101742205200c200c2005491b220c4100480d0d200b450d022002280200200b200c102722050d030c0a0b0240024002402002280204220520064f0d0020054101742201200620062001491b22014100480d0f2005450d0120032005200110272203450d020c110b4100210b2006450d120c110b2001102622030d0f0b20014101102a000b200228020021050c020b200c10262205450d070b2002200c360204200220053602000b200520066a200541026a200a1095041a02402006200241086a220b280200220c460d002002280200200c6a210520062103034020034102460d03200520012d00003a0000200b200b28020041016a360200200541016a2105200141016a2101200c2003417f6a2203470d000b200d20016b2203450d030b20034100480d0820031026220c450d042006210b2003210e0b200d2001460d060c050b2006210b200a0d0b0c0c0b4101210c2006210b200d2001470d030c040b41cce3c400104f000b20034101102a000b200c4101102a000b200c20012d00003a00004101210f0240200141016a2203200d460d00200c41016a2105200620016b21010340200520032d00003a0000200541016a2105200d200341016a2203470d000b200420016a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22056b200f4f0d002005200f6a22012005490d0520034101742205200120012005491b22054100480d052003450d01200228020020032005102722030d020c060b200228020021030c020b200510262203450d040b20022005360204200220033602000b2003200f200b6a22106a2003200b6a200a1095041a02402010200241086a22012802002203460d00200228020020036a2105200f200b6a20036b2106200c21030340200d2003460d01200520032d00003a00002001200128020041016a360200200341016a2103200541016a21052006417f6a22060d000b0b2010210b0b0240200e450d00200c10230b200a450d060c050b101e000b20054101102a000b2002200136020420022003360200200241086a280200210b0b2003200b6a220520042d00003a0000024020064101470d00200b41016a210b0c010b2006417f6a2101200441016a2103200541016a21050340200520032d00003a0000200541016a2105200341016a21032001417f6a22010d000b200b20066a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22052802002203460d002002280200220120036a2001200b6a200a1095041a0b20052003200a6a3602000b02402009450d00200410230b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204102622050d0120044104102a000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d1027220a0d020c080b200820046a21070c020b200d1026220a450d060b200d210b0b200a20046a200c20081094041a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031019200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a10230b02402002450d00200510230b200341206a24000f0b101e000b200d4101102a000bd41805017f017e037f017e067f230041c0066b22042400200441e8036a200141f8011094041a200441c0026a200441e8036a10960202400240024020042802c0024101470d00200041086a20042902c4023702002000420137020020032802002200450d020c010b200441c0026a41086a2903002105200441a8016a200441d0026a4198011094041a20042005370308200441086a41086a200441a8016a419801109404210602400240024020042802382201410d460d0020014102460d010c020b2004413c6a2802000d01200441fc036a4101360200200441013602c4022004418898c4003602c002200442013702ec03200441d497c4003602e8032004200441c0026a3602f803200441e8036a41d0cec3001061000b10ff02000b200441a8016a41086a22014200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a2001290300370300200420042903a8013703e80341002101024002400240024002400240024002400240024002400240024002400240200441e8036a411041a886c500410041001001417f460d00200441003602c002200441e8036a4110200441c0026a41044100100141016a41044d0d0120042802c00221010b41042107200120026a41818080024f0d0d410021080240200441106a410020042903084201511b2201450d002001450d00024002400240200110d702220520012903202209520d0041032107200120021086020d11411310262207450d0d2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a994337000020074113413310272207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a220a4200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a200a290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441c0026a412041a886c500410041001001417f460d01200442003703e803200441c0026a4120200441e8036a41084100100141016a41084d0d0820042903e80342017c2105200710234113210a4113102622070d020c0f0b4101410220092005541b21070c100b42012105200710234113210a411310262207450d0d0b2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a99433700002007200a413310272207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a22014200370300200441e8036a41106a220a4200370300200441e8036a41086a220b4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a2001290300370300200441c0026a41106a200a290300370300200441c0026a41086a200b290300370300200420042903e8033703c002200420053703e803200441c0026a4120200441e8036a41081004200710230b024020032802002207450d00200341086a28020021012003280204210d4100210b0240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0520042802e803210b0b411410262208450d06200841106a41002800ef9643360000200841086a41002900e79643370000200841002900df96433700002008411441281027220a450d07200a200b360014200441e8036a41186a22084200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e803200a4118200441e8036a1002200441c0026a41186a2008290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441003602f003200442013703e803200420013602a801200441a8016a200441e8036a1041024002400240024020042802ec03220c20042802f003220b6b20014f0d00200b20016a2208200b490d0c200c410174220e20082008200e491b220e4100480d0c200c450d0120042802e803200c200e102722080d020c0d0b20042802e80321080c020b200e10262208450d0b0b2004200e3602ec03200420083602e803200e210c0b2008200b6a200720011094041a200441c0026a41202008200b20016a10040240200c450d00200810230b200a102341012108200d450d00200710230b20042903082105200441e8036a200441306a41f8001094041a200441c0026a200441e8036a41086a41f0001094041a200441a8016a41186a220a200641186a290300370300200441a8016a41106a220b200641106a290300370300200441a8016a41086a220c200641086a290300370300200420062903003703a80141002101024020054201520d0020044180066a41186a200a29030037030020044180066a41106a200b29030037030020044180066a41086a200c290300370300200420042903a80137038006410121010b200441a8016a200441c0026a41f0001094041a200441a0066a41186a220620044180066a41186a220a290300370300200441a0066a41106a220b20044180066a41106a220c290300370300200441a0066a41086a220d20044180066a41086a220e29030037030020042004290380063703a006200441c0026a200441a8016a41f0001094041a200441e0056a41186a220f2006290300370300200441e0056a41106a2206200b290300370300200441e0056a41086a220b200d290300370300200420042903a0063703e005200441e8036a200441c0026a41f0001094041a200a200f290300370300200c2006290300370300200e200b290300370300200420042903e005370380064102210602402001450d00200441a0066a41186a20044180066a41186a290300370300200441a0066a41106a20044180066a41106a290300370300200441a0066a41086a20044180066a41086a29030037030020042004290380063703a006410121060b200441b2016a200441a0066a41086a290300370100200441ba016a200441a0066a41106a290300370100200441a8016a411a6a200441b8066a290300370100200420063a00a901200441003a00a801200420042903a0063701aa012004200441e8036a200441a8016a10d202200428020421062004200428020022014100473a00e903200441003a00e80341a886c5004100200441e8036a102c02400240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0320042802e80341016a210a0c010b4101210a0b200441a8016a41086a220b4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200b290300370300200420042903a8013703e80302400240200441e8036a411041a886c500410041001001417f460d00200441003602a801200441e8036a4110200441a8016a41044100100141016a41044d0d0420042802a801210b0c010b4100210b0b2004200a3602e803418595c3004110200441e8036a41041004200441a8016a41086a220a4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200a290300370300200420042903a8013703e8032004417f2002200b6a220a200a2002491b3602a801200441e8036a4110200441a8016a410410040240024002402001450d0002402006411b470d0020014188abc400460d0220014188abc400411b109604450d020b200041086a2006360200200041046a200136020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b200041046a4104360200200041013602002007452008720d100b200341046a280200450d0f200710230c0f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41284101102a000b101e000b200e4101102a000b41134101102a000b41334101102a000b200a4101102a000b41334101102a000b2000410136020020002007360204200441386a102420032802002200450d010b200341046a280200450d0020001023200441c0066a24000f0b200441c0066a24000bda1508027f027e027f017e0c7f017e027f017e230041c0036b22012400200141b0026a41086a22024200370300200142003703b00241c687c4004114200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368024002400240024002400240024002400240024002400240200141e8006a411041a886c500410041001001417f460d00200142003703b002200141e8006a4110200141b0026a41084100100141016a41084d0d0220012903b00222034200510d054200210420002003824200510d010c0b0b4200210420004201824200520d0a0b200141b0026a41086a22022004370300200120043703b00241aaedc300410c200141b0026a1000200141e8006a41086a22052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142003703b802200142003703b002200141e8006a4110200141b0026a4110410010012206417f460d062006410f4d0d06200141b8026a290300210020012903b00221040c010b420021000b2001200437034020012000370348200141c8026a2000370300200141b0026a41106a2004370300200241013a0000200141093a00b00241a886c5004100200141b0026a102c200141003a005742002107200142003703602001420037035820024200370300200142003703b00241f487c4004112200141b0026a100020052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142103702d4012001200141e8006a3602d001200141b0026a200141d0016a10920220012802b0022208450d0820012902b40221070c010b410421080b410021090240024002402007422088a72205450d00200141b0026a41096a210a20014190026a210b200141d0016a41206a210c200141e8006a41086a210d200141e8026a210e200141e0026a210f200141dc026a2110410021114100210941002102024003400240024002402009450d00200820024102746a21062008200220116a4102746a21120340200220054f0d07200141e8006a2006280200221310aa0320012903684201520d02200141d0016a200d41e0001094041a2001290340221420012903d001220354200141c0006a41086a2903002200200141d0016a41086a29030022045420002004511b450d03200141013a0057201120026a221320054f0d0a20122006280200360200200641046a2106201241046a21122005200241016a2202470d000c060b0b200820024102746a21060340200220054f0d06200141e8006a2006280200221310aa0320012903684201520d01200141d0016a200d41e0001094041a2001290340221420012903d00122035a200141c0006a41086a2903002200200141d0016a41086a29030022045a20002004511b0d02200141013a0057200641046a21062005200241016a2202470d000c040b0b2011417f6a2111200941016a2109200241016a22022005470d010c030b200241016a21022001201420037d3703402001200020047d2014200354ad7d370348411210262206450d0c200641106a41002f00c6ed433b0000200641086a41002900beed43370000200641002900b6ed4337000020064112412410272206450d0d20062013360012200141b0026a41186a22154200370300200141b0026a41106a22164200370300200141b0026a41086a22124200370300200142003703b00220064116200141b0026a1002200141a0036a41186a2015290300370300200141a0036a41106a2016290300370300200141a0036a41086a2012290300370300200120012903b0023703a003200141a0036a4120100320061023200c200141d0016a41106a290300200141d0016a41186a290300102b200141306a200b20032004108202200141d8006a41086a2206427f20062903002200200141306a41086a2903007c2001290358221420012903307c22172014542206ad7c22142006201420005420142000511b22061b3703002001427f201720061b370358200e2004370300200f2003370300201241023a000020102013360200200a200b290000370000200a41086a200b41086a290000370000200a41106a200b41106a290000370000200a41186a200b41186a290000370000200141093a00b00241a886c5004100200141b0026a102c2011417f6a2111200941016a210920022005470d000c020b0b410021090b200141b0026a41086a220b4200370300200142003703b00241f487c4004112200141b0026a1000200141e8006a41086a200b290300370300200120012903b002370368200141003602b802200142013703b0022001200520096b22023602d001200141d0016a200141b0026a1041024002402002450d00200541027420094102746b210d200b280200210220012802b4022112200821060340200628020021110240024002400240201220026b41044f0d00200241046a22052002490d0820124101742213200520052013491b22094100480d082012450d0120012802b00220122009102722130d020c0b0b200241046a210520012802b00221130c020b200910262213450d090b200120093602b402200120133602b002200921120b200641046a2106200b2005360200201320026a201136000020052102200d417c6a220d0d000c020b0b200b280200210520012802b402211220012802b00221130b200141e8006a411020132005100402402012450d00201310230b02402007a7450d00200810230b200129035821042001200141d8006a41086a2903003703b802200120043703b0022001200141b0026a360268200141e8006a107b024020012d00570d00200141b0026a41086a22024200370300200142003703b002418688c400410d200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368410021020240200141e8006a411041a886c500410041001001417f460d00200141003602b002200141e8006a4110200141b0026a41044100100141016a41044d0d0920012802b00221020b200141206a20012903402204200141c0006a41086a2205290300220042c0843d4200109704200141106a20012903202203200141206a41086a290300221442c0fb42427f1098042001200320142002ad22074200109804200520002000200141086a29030020012903002214200420012903107c20077e42c0843d8042ffffffff0f837c2203201454ad7c22142003200456201420005620142000511b22021b22147d20042004200320021b220054ad7d3703002001200420007d370340200141c8026a2014370300200141c0026a2000370300200141b0026a41086a41033a0000200141093a00b00241a886c5004100200141b0026a102c0b20012903402104200141c8026a200141c0006a41086a2205290300370300200141b0026a41106a2004370300200141b0026a41086a220241043a0000200141093a00b00241a886c5004100200141b0026a102c200529030021042001290340210020024200370300200142003703b00241aaedc300410c200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368200120043703b802200120003703b002200141e8006a4110200141b0026a41101004200141c0036a24000f0b41b4c4c200200220051029000b101e000b41d4aac10041331021000b4194c5c200201320051029000b20094101102a000b41dc87c400104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b200141c0036a24000be20f01057f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220341034b0d00024020030e0400040203000b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41063a000020022802042205200428020022036b41044f0d07200341046a22042003490d2220054101742203200420042003491b22034100480d222005450d0f20022802002005200310272204450d100c200b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d03200341206a22042003490d2120054101742203200420042003491b22034100480d212005450d0820022802002005200310272204450d090c1d0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41053a000020022802042205200428020022036b41044f0d03200341046a22042003490d2020054101742203200420042003491b22034100480d202005450d0920022802002005200310272204450d0a0c1a0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41003a0000200141046a280200210620022001410c6a280200220136020c2002410c6a2002104120022802042205200428020022036b20014f0d03200320016a22042003490d1f20054101742203200420042003491b22034100480d1f2005450d0a20022802002005200310272204450d0b0c170b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41043a000020022802042205200428020022036b41044f0d04200341046a22042003490d1e20054101742203200420042003491b22034100480d1e2005450d0d20022802002005200310272204450d0e0c140b200228020021040c1a0b200228020021040c170b200228020021040c140b200228020021040c190b200228020021040c100b2003102622040d140b20034101102a000b2003102622040d100b20034101102a000b2003102622040d0c0b20034101102a000b2003102622040d100b20034101102a000b2003102622040d060b20034101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c0b0b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c090b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0920044101742203200520052003491b22034100480d092004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c070b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a290000370000200320012900013700000c050b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a2002104102400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0b200020022201290200370200200041086a200141086a280200360200200241106a24000bac0301027f23004180026b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024180016a2002108f010240200228028801450d00200241086a20024180016a41f8001094041a200241086a108a030240200241186a2802002200450d0020022802102101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200241146a280200450d00200241106a28020010230b20024180026a240042010f0b2002411c6a4101360200200241013602fc01200241a8e7c3003602f8012002420137020c200241a4e6c3003602082002200241f8016a360218200241086a41ace6c3001061000bdc0d01087f230041206b22022400200241003602182002420137031002400240024002400240024002400240410410262203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d0120022802102003200410272205450d020c040b200228021021050c040b2004102622050d020b20044101102a000b41044101102a000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41053a0000410f200241106a1092034100210302400340200341c0cfc3006a280200200341c4cfc3006a280200200241106a10930302400240024002400240024002400240024002400240024002400240024002400240200341c8cfc3006a2802004101470d00200341cccfc3006a280200200341d0cfc3006a280200200241106a109303200341d4cfc3006a22062802004102460d010c020b2002200341cccfc3006a28020011010020022802002002280204200241106a109303200341d4cfc3006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007102722060d020c040b200228021021060c020b200710262206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341e4cfc3006a22062802004102470d020c030b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008102722070d020c0d0b200228021021070c020b200810262207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109403200341e4cfc3006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008102722070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007102722060d050c0a0b200228021021060c050b200810262207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109503200341f4cfc3006a22062802004102460d030c080b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341f4cfc3006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007102722060d020c070b200228021021060c020b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341b808470d050c060b20084101102a000b20084101102a000b20074101102a000b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008102722070d020c070b200228021021070c020b200810262207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109603200341c8006a220341b808470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a104102400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d0120022802102005200810272205450d020c050b2002280210220520046a200620031094041a200420036a21032007450d060c050b2008102622050d030b20084101102a000b101e000b20084101102a000b2002200836021420022005360210200520046a200620031094041a200420036a21032007450d010b200610230b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0520012802002002200410272203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d0820012802002003200210272203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2002102622030d0b0b20024101102a000b200210262203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002102722030d020c070b200128020021030c020b200210262203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b101e000b20024101102a000b20044101102a000b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0520022802002003200510272204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d0820022802002004200310272204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003102722040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005102722040d0a0c0d0b2005102622040d100b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0a0b20034101102a000b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b200510262204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003102722040d020c060b200228020021040c020b200310262204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a200020011094041a0bf70901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d01200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a102722070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a102722070d060c0e0b200128020021070c030b200128020021070c050b200a10262207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c030b2009200041cc006a280200200110f3032004200541d8006a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d00200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a102722070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a102722070d060c0f0b200128020021070c030b200128020021070c050b200a10262207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c020b2009200041cc006a280200200110f3032004200541d8006a2205470d000b0b200241206a24000f0b101e000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000be00301017f230041a0066b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024198046a20021094020240024002400240024002402002290388054203510d00200241086a20024198046a41f8011094041a20024180026a200241086a41f8011094041a200220024180026a36029804200241f8036a20024198046a108b03200228028004210120024198046a20024180026a41f8011094041a20024198066a200228028004360200200220022903f8033703900620024188046a20024198046a200120024190066a108d03024002402002280288044101470d004280828898f01f200228028c04410374ad88a7210041011026210141010d010c050b200228028c0441004721004101102621014100450d040b2001450d01200141013a000020014101410210272201450d020c040b20024194026a41013602002002410136020c200241c0e7c3003602082002420137028402200241a4e6c300360280022002200241086a3602900220024180026a41ace6c3001061000b41014101102a000b41024101102a000b2001450d01200141003a0000200141014102102722010d0041024101102a000b200120003a0001200241a0066a24002001ad428080808020840f0b41014101102a000b831403037f017e0a7f230041c0016b2202240010e00220024180016a41086a22034200370300200242003703800141af98c300410d20024180016a1000200241086a41086a2204200329030037030020022002290380013703084200210502400240024002400240024002400240200241086a411041a886c500410041001001417f460d00200242003703a001200241086a4110200241a0016a41084100100141016a41084d0d0120022903a00121050b20034200370300200242003703800141f5ccc200411120024180016a1000200420032903003703002002200229038001370308200241086a411010032005108e03200510ed0210910110e50220034200370300200242003703800141a895c300411520024180016a100020024190016a41086a200329030037030020022002290380013703900120024190016a411041a886c500410041001001417f460d0141002106200241003602084104210741012108024020024190016a4110200241086a41044100100141016a41044d0d0020022802082209450d032009ad420c7e2205422088a70d042005a722034100480d040240200310262207450d00200721044100210a03400240024002400240024002400240411410262203450d00200341106a41002800ef9643360000200341086a41002900e79643370000200341002900df96433700002003411441281027220b450d01200b200a360014200241086a41186a22034200370300200241086a41106a220c4200370300200241086a41086a2206420037030020024200370308200b4118200241086a1002200241a0016a41186a2003290300370300200241a0016a41106a200c290300370300200241a0016a41086a2006290300370300200220022903083703a001200241a0016a412041a886c500410041001001417f460d052002422037020c2002200241a0016a3602082002200241086a104a02402002280200450d0020022802042203417f4c0d03024002402003450d00200310ac01220c450d0620062006280200220d200341002002280208200228020c200c2003200d1001220d200d417f461b220d200d20034b1b220d6a360200200d2003470d010c070b4101210c2002280208200228020c41014100200628020010011a41002003460d060b2003450d00200c10230b41d4aac10041331021000b41144101102a000b41284101102a000b101d000b20034101102a000b200241a0016a41201003200c0d010b4101210c410021030b200b1023200441086a2003360200200441046a20033602002004200c3602002004410c6a21042009200a41016a220a470d000b41002108200921060c040b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b4100210641012108410421070b410421094100210b4100210d02400240024002402006410c6c2203410c490d002003410c6e220d41037422044100480d04200410262209450d010b0240200720036a220a2007460d004100210b200921032007210403402004280200210c200341046a200441086a2802003602002003200c360200200341086a2103200b41016a210b2004410c6a2204200a470d000b0b200241a0016a2009200b108c030240200d450d00200910230b02402006450d002006410c6c21042007210303400240200341046a280200450d00200328020010230b2003410c6a2103200441746a22040d000b0b024020080d00200710230b200241086a41186a200241a0016a41186a290300370300200241086a41106a200241a0016a41106a290300370300200241086a41086a200241a0016a41086a290300370300200220022903a00137030820024180016a41086a22034200370300200242003703800141bc98c300411520024180016a100020024190016a41086a220b200329030037030020022002290380013703900120024190016a4110200241086a41201004200241086a10e402200241003602980120024201370390010240412010262203450d00200242a080808080043702940120022003360290012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a20024190016a1098020240024002402002280294012204200b280200220c6b41204f0d00200c41206a2203200c490d072004410174220b20032003200b491b220a4100480d072004450d012002280290012004200a1027220b450d020c050b200c41206a2103200228029001210b0c050b200a1026220b0d030b200a4101102a000b41204101102a000b20044104102a000b2002200a360294012002200b36029001200a21040b20024190016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200420036b411f4b0d00200341206a220c2003490d0120044101742206200c200c2006491b220c4100480d010240024002402004450d00200b2004200c1027220b450d010c020b200c1026220b0d010b200c4101102a000b2002200c360294012002200b360290010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602a001200241a0016a20024190016a10410240200f450d00200f41246c210d20024190016a41086a22082802002103200228029401210a200e210b0340200241a0016a200b108f0320022802a00121060240024002400240200a20036b200241a0016a41086a280200220c4f0d002003200c6a22042003490d06200a4101742209200420042009491b22074100480d06200a450d01200228029001200a2007102722090d020c070b2003200c6a210420022802900121090c020b200710262209450d050b200220073602940120022009360290012007210a0b20082004360200200920036a2006200c1094041a024020022802a401450d00200610230b200b41246a210b20042103200d415c6a220d0d000b0240200f450d00200f41246c210b200e210303400240024020032d0000220c41034b0d00024002400240200c0e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200b415c6a220b0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200b415c6a220b0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200b415c6a220b0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200b415c6a220b0d000b0b200241146a280200450d040c030b20024198016a28020021042002280290012109200241146a2802000d020c030b101e000b20074101102a000b200e10230b200241c0016a24002004ad4220862009ad840bba0d03017f037e0a7f23004180026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024190016a200241086a10ab010240024002402002280290012201450d0020022002290294013702142002200136021020024190016a200241106a109a032002280290014101460d0120024190016a41086a2201290300210320014200370300200242003703900141a298c300410d20024190016a1000200241206a41086a22002001290300370300200220022903900137032042002104024002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d0120022903900121040b20014200370300200242003703900141e698c300411720024190016a100020002001290300370300200220022903900137032002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d03200229039001210541f801210141f80110262206450d010c060b4203210541f801210141f801102622060d050b20014108102a000b41d4aac10041331021000b41d4aac10041331021000b200241a4016a410136020020024101360224200241d8e7c3003602202002420137029401200241a4e6c300360290012002200241206a3602a00120024190016a41ace6c3001061000b41c99bc300412820022802940120024198016a28020010c902000b200620024190016a41f000109404220742023703702007410136028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241206a41e0001094041a200241106a210120022802142108024002400240024003402001280200220941086a210a20092f0106220b4103742100417f210102400240024003402000450d01200141016a2101417f410141fec7c300200a4108109604220c4100481b4100200c1b220c450d03200041786a2100200a41086a210a200c4101460d000b20080d010c040b200b21012008450d030b2008417f6a2108200920014102746a41e4016a21010c010b0b200941e0006a2001410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b1094041a200141074d0d01200229039001210320024190016a41086a2201420037030020024200370390014198a4c100411520024190016a1000200241206a41086a200129030037030020022002290390013703204100210102400240200241206a411041a886c500410041001001417f460d0020024210370284012002200241206a3602800120024190016a20024180016a109301200228029001220a450d0420024198016a280200210120022802940121090c010b4108210a410021090b4100210002402001417f6a220c20014b0d00200c20014f0d00200a200c4103746a2201450d00200129030020035221000b02402009450d00200a10230b024002402000450d00200741f80141f00310272206450d05200641f8016a20024190016a41f0001094041a200642023703e8022006200337038803200641093602800320062002290380013703f002200641f8026a20024188016a29030037030020064190036a200241206a41e0001094041a4102210d0c010b4101210d0b20022802102002280214200228021810ae0120024100360228200242013703202002200d36029001200d41f8016c210e20024190016a200241206a1041200228022421092002280228210120024190016a41086a210f4100210a02400240034020022006200a6a3602800120024190016a20024180016a108b03200228029001210c0240024002400240200920016b200f28020022074f0d00200120076a22002001490d0520094101742208200020002008491b220b4100480d052009450d0120022802202009200b102722080d020c060b200120076a2100200228022021080c020b200b10262208450d040b2002200b36022420022008360220200b21090b200241206a41086a2000360200200820016a200c20071094041a0240200228029401450d00200c10230b20002101200e200a41f8016a220a470d000b200d41f8016c210a410021010340200620016a4188016a1024200a200141f8016a2201470d000b2006102320024180026a24002000ad4220862008ad840f0b101e000b200b4101102a000b41c8a6c100412b4186c8c300412810c902000b41c8a6c100412b4188f8c400412910c902000b41d4aac10041331021000b41f0034108102a000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141cdf8c400200641081096042208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b1094041a200141074d0d01200041086a2002290308370300410021010c030b200041fef8c400360204200041086a41283602000c010b200041d5f8c400360204200041086a41293602000b410121010b20002001360200200241106a24000bb42515057f017e087f017e077f017e0c7f017e027f027e017f017e017f037e037f037e077f027e027f037e157f230041b0026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c0006a200241086a108f0102400240024002400240024020022802482203450d00200241d0006a2802002104200228024c2105200241c0006a200241086a10aa02024020022802402206450d0020022902442107200241c0006a200241086a10ab0120022802402201450d03200220022902443702142002200136021041012108200241013b012c2002420037022441f098c4002109200241f098c4003602202007422088a7220a450d0241f801210b2006200a41f8016c6a210c4108210d200241206a41086a210e41f000210f42022110410121114117211241e698c30021134100211441a886c500211541102116417f2117427f2118410321194102211a41e401211b4180f8c400211c410c211d41e000211e4107211f418801212041782121410d2122200241206a410d6a212341f098c400212442f4d2b59bc7ae98b830212541dc012126200241d4006a21274201212842818080801021294109212a42898080809001212b41a298c300212c423c212d428080808070212e4225212f20062130410021310c050b02402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b2005450d00200310230b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b4100214041002147410021480c010b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b410021010c010b410121010b037e024002400240024002400240024002400240024002400240024002400240024020010e020001010b20022802102002280214200228021810ae0102402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b02402005450d00200310230b2007a721000240200a450d00200a41f8016c210120064188016a2149034020491024204941f8016a2149200141887e6a22010d000b0b02402000450d00200610230b2002410036024820024201370340024002400240410110262249450d00200242818080801037024420022049360240204920083a000020494101410210272249450d01200242828080802037024420022049360240204920403a00012049410241061027224a450d0220024286808080e0003702442002204a360240204a20473600022009214902402048450d002048210120092149034020492802e40121492001417f6a22010d000b0b02402047450d004100214b4106214c417f214d4101214e410c214f41e00021504103215141082152410721534102215441e8012155410621564100215720472158410121310c0b0b4280808080e00021070c040b41014101102a000b41024101102a000b41064101102a000b0240024020310e020001010b2030200f6a2903002010520d0e20302802880122322011470d0a2030290390012133200241c0006a200d6a220142003703002002420037034020132012200241c0006a1000200241a0026a200d6a2001290300370300200220022903403703a00202400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d04200229034021340c010b420321340b2018203420347c223520352034541b22344200510d05200241106a2136200228021421370c090b024002400240205720492f01064f0d0020492057204f6c6a20506a2101204920572051746a20526a21002057204e6a2157204c20566b20534d0d010c020b41012101024020492f01042200204928020022492f0106490d004101210103402001204e6a210120492f01042200204928020022492f01064f0d000b0b20492000204f6c6a213c204920002051746a2131204920002054746a20556a280200214902402001204e460d00204e20016b2101034020492802e40121492001204e6a22010d000b0b203c20506a2101203120526a210041002157204c20566b20534b0d010b205620526a223c2056490d0d204c204e742231203c203c2031491b223c204b480d0d02400240204c450d00204a204c203c1027224a0d010c050b203c1026224a450d040b2002203c3602442002204a3602400b200241c0006a20526a223c205620526a360200204a20566a2000290000370000200128020021312002200128020822013602a002200241a0026a200241c0006a104102400240024002402002280244224c203c28020022006b20014f0d00200020016a224a2000490d10204c204e742256204a204a2056491b2256204b480d10204c450d012002280240204c20561027224a0d020c070b2002280240214a0c020b20561026224a450d050b200220563602442002204a3602402056214c0b203c200020016a2256360200204a20006a203120011094041a2058204d6a22580d052056ad42208621070b20092048204710ae01200241b0026a24002007204aad840f0b41d4aac10041331021000b203c4101102a000b20564101102a000b41c8adc400104f000b410121310c010b410121010c070b410121010c060b4100213a0c010b410121010c010b410221010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000108080b2039201e6a203b201d6c6a2200450d09200028020821012000280200210020024200370340200241c0006a20002001200d2001200d491b1094041a2001201f4d0d0120332034802002290340223d520d02203020206a2802002132410121010c210b20322011470d072030290390012135200241c0006a200241106a109a030240024020022802402011470d00200241c0006a200d6a350200213e2002280244213f4101214020232d00000d060c010b200241c0006a200d6a220129030021414200213e2001420037030020024200370340202c2022200241c0006a1000200241a0026a200d6a22002001290300370300200220022903403703a0020240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d042002290340213e0b200142003703002002420037034020132012200241c0006a100020002001290300370300200220022903403703a002024002400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d072002290340214220352041202d7c580d020c010b4203214220352041202d7c580d010b2043202e83202f84213e41a49bc300213f4101214020232d0000450d010c060b4100214020352042203e7c223e5a0d0820232d00000d050b024002402040450d0020022802202002280224200e28020010ae012002420037022420022024360220200220253703a0020c010b20022802202144200220253703a00220442024460d00200228022421450c1b0b201b10262244450d0541002145204441003b0106204441003602002044200d6a200241c0006a20261094041a20024100360224200220443602200c190b203d4280808080708342298421354188f8c40021090c080b41c8aec4002109413121472002412d6a2d0000450d080c090b41d4aac10041331021000b41d4aac10041331021000b4194e5c300412241b6e4c300413110c902000b41e4014104102a000b02400240203a0e020001010b20362802002239200d6a210020392f0106223820197421014100213b024003402001450d01201c2000200d109604223c450d17200120216a2101203b20116a213b2000200d6a2100203c20174a0d000b203b20176a21380b2037450d02203720176a213720392038201a746a201b6a21364100213a0c160b2044200d6a210020442f010622462019742101417f213c02400240024003402001450d01200241a0026a2000200d1096042138200120216a2101203c20116a213c2000200d6a21002017201120382014481b201420381b22382011460d000b2038450d0d20450d010c020b2046213c2045450d010b204520176a21452044203c201a746a201b6a28020021444101213a0c170b20272025370200200241c0006a20166a200e360200200241c0006a201d6a203c360200200241c0006a200d6a200241206a3602002002204436024420022014360240200241a0026a200d6a22002014360200200220283703a0022011102621010240024002400240024002402040450d002001450d11200120113a0000200220293702a402200220013602a0022002203ea72201360230200241306a200241a0026a104120022802a40222382000280200223c6b20014f0d01203c20016a2232203c490d2020382011742246203220322046491b22322014480d202038450d0220022802a00220382032102722380d030c120b2001450d12200120143a0000200220293702a402200220013602a00220012011202a10272201450d132001203e3700012002202b3702a402200220013602a0020c040b20022802a00221380c020b203210262238450d0f0b200220323602a402200220383602a0020b2000203c20016a3602002038203c6a203f20011094041a0b200241306a200d6a2000280200360200200220022903a002370330200241c0006a200241306a10ad01202320403a0000200241206a201d6a20143a0000203e214320400d050b2030200b6a2230200c470d100c1a0b203d42808080807083421c84213541b1f8c40021090b2035a721472002412d6a2d00000d010b20022802202002280224200241206a41086a28020010ae0120024200370224200241f098c400360220200242e1eac98bb68edbb7f4003703a00241e40110262201450d0c200141003b010620014100360200200141086a200241c0006a41dc011094041a200241003602242002200136022020012f01062238410374214041002100417f213c034020402000460d03200120006a2148200041086a2100203c41016a213c417f4101200241a0026a204841086a410810960422484100481b410020481b22484101460d000b2048450d0b0c030b4194e5c300412241b6e4c300413110c902000b200241286a28020021470c020b2038213c0b200242e1eac98bb68edbb7f4003702542002200e3602502002203c36024c20022001360244200241003602402002200241206a360248200241003602a802200242013703a00220022047360230200241306a200241a0026a1041024002400240024020022802a402220020022802a80222016b20474f0d00200120476a223c2001490d1620004101742248203c203c2048491b223c4100480d162000450d0120022802a0022000203c10272200450d050c020b20022802a00221000c020b203c10262200450d030b2002203c3602a402200220003602a0020b200241a0026a41086a223c200120476a360200200020016a200920471094041a200241306a41086a203c280200360200200220022903a002370330200241c0006a200241306a10ad012002412c6a4180023b0100200241206a41086a2802002147410121400b200228022421482002280220210941002108410021010c130b203c4101102a000b4194e5c300412241e7e4c300412d10c902000b41014101102a000b20324101102a000b41014101102a000b41094101102a000b4194e5c300412241e7e4c300412d10c902000b41e4014104102a000b41002131410121010c0a0b4101213a0c040b4101213a0c040b410021010c040b410221010c030b410221010c020b410221010c010b410221010c000b0b101e000b2002412d6a2d000021402002412c6a2d00002108200241286a28020021472002280224214820022802202109410021010c000b0b7901027f230041206b22022400200241a886c500410010e3010240412010262203450d0020032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840f0b41204101102a000bbe1503057f027e077f230041c0086b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c8066a200241086a1094020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903b8074203510d00200241106a200241c8066a41f8011094041a20024188026a200241106a41f8011094041a200220024188026a3602a005200241c8066a200241a0056a108b0320022802d0062101024020022802cc06450d0020022802c80610230b200241c8066a20024188026a41f8011094041a200241a0056a200241c8066a1096020240024002400240024002400240024020022802a0054101470d0020022802a405210120022802a8052200411a460d0120004115470d024102210341f6012104200141d9cac400460d10200141d9cac40041151096040d020c100b20024180046a200241a0056a41086a41a0011094041a4100210320024180046a41086a2205410020022903800442015122061b210002402006450d002000450d03410321040240200520011086020d00200510d702210741012104200041206a290300220820075a0d080b200241b0046a1024200241003602d006200242013703c8060c120b2000450d0441ec0121040c030b41002104200141eecac400460d0441002103200141eecac400411a109604450d0e0b4100210341810121040c0d0b41f60121040b0c0a0b200241a0056a200241a8046a41f8001094041a200241c8066a200241a8056a41f0001094041a41002104200241003a00b807200241c8066a1024410021030c0b0b410021030c090b410c1026220f450d01412010262200450d0220002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0320002008370020200f42c08080808005370204200f200036020002400240200720085a0d00410c1026220b450d06412010262200450d0720002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0820002008427f7c370020200b42c08080808005370204200b2000360200410121090c010b410021094104210b0b2001ad210741012104410121030c070b2002419c026a4101360200200241013602142002418ce8c3003602102002420137028c02200241a4e6c300360288022002200241106a3602980220024188026a41ace6c3001061000b410c4104102a000b41204101102a000b41c0004101102a000b410c4104102a000b41204101102a000b41c0004101102a000b200241b0046a10240c010b0b200241003602d006200242013703c80620034101460d0120034102470d00410110262201450d0c200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41023a000020022802cc0620002802002201470d04200141016a22002001490d1020014101742206200020002006491b22064100480d102001450d0920022802c8062001200610272200450d0a0c150b410110262201450d0a200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41003a000020022802cc0620002802002201470d01200141016a22002001490d0f20014101742206200020002006491b22064100480d0f2001450d0420022802c8062001200610272200450d050c120b410110262201450d0b200241c8066a41086a22002000280200220641016a360200200241013602cc06200220013602c806200120066a41013a000020022802cc062206200028020022016b41084f0d01200141086a22002001490d0e20064101742201200020002001491b22014100480d0e2006450d0520022802c8062006200110272200450d060c0c0b20022802c80621000c110b20022802c80621000c0b0b20022802c80621000c110b2006102622000d0d0b20064101102a000b2001102622000d060b20014101102a000b2006102622000d0b0b20064101102a000b41014101102a000b41014101102a000b41014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2205200141086a360200200020016a2007370000200220093602880220024188026a200241c8066a104102400240024002402009450d00200b2009410c6c6a210a200b210603402006280200210c2002200641086a28020022013602880220024188026a200241c8066a1041024002400240024020022802cc06220d200528020022006b20014f0d00200020016a220e2000490d09200d4101742200200e200e2000491b22004100480d09200d450d0120022802c806200d20001027220d0d020c060b20022802c806210d0c020b20001026220d450d040b200220003602cc062002200d3602c806200528020021000b2005200020016a360200200d20006a200c20011094041a2006410c6a2206200a470d000b0b200241013602880220024188026a200241c8066a1041200f280200210d2002200f28020822013602880220024188026a200241c8066a104102400240024020022802cc062206200528020022006b20014f0d00200020016a22052000490d0620064101742200200520052000491b22004100480d062006450d0120022802c8062006200010272206450d020c040b20022802c80621060c040b2000102622060d020b20004101102a000b20004101102a000b200220003602cc06200220063602c806200241d0066a28020021000b200241c8066a41086a2205200020016a360200200620006a200d20011094041a0240024002400240024020022802cc062200200528020022016b41084f0d00200141086a22062001490d0520004101742201200620062001491b22014100480d052000450d0120022802c8062000200110272200450d020c030b20022802c80621000c030b2001102622000d010b20014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2206200141086a360200200020016a427f37000002400240024020022802cc0620062802002201470d00200141016a22002001490d0320014101742206200020002006491b22064100480d032001450d0120022802c8062001200610272200450d020c040b20022802c80621000c040b2006102622000d020b20064101102a000b101e000b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a2206200141016a360200200020016a20043a00002006280200210620022802c806210520034101470d0502402009450d002009410c6c2100200b210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b2009450d00200b10230b0240200f41046a280200450d00200f28020010230b200f10230c050b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000c020b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000b200241d0066a280200210620022802c80621050b200241c0086a24002006ad4220862005ad840b6101017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002410136021c200241a8e8c30036021820024201370204200241a4e6c3003602002002200241186a360210200241ace6c3001061000baa0a05027f027e027f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a1090010240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a0030240024002400240200229032022054202520d0041002100410021060c010b200241386a2802002101200241346a28020021072002290328210820054201520d010240200228023c450d00200110230b41002100410021060b0c010b200241306a280200220021060b2002410036022820024201370320410110262109024002400240024002402006450d002009450d06200242818080801037022420022009360220200941013a000020022001360248200241c8006a200241206a10412001450d012000200141286c6a210a200241206a41086a220b2802002100200228022421092006210103400240024002400240200920006b41204f0d00200041206a220c2000490d0e2009410174220d200c200c200d491b220e4100480d0e2009450d0120022802202009200e1027220d0d020c080b200041206a210c2002280220210d0c020b200e1026220d450d060b2002200e3602242002200d360220200e21090b200b200c360200200d20006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a290300210502400240024002402009200c6b41084f0d00200c41086a2200200c490d0e2009410174220e20002000200e491b220e4100480d0e2009450d01200d2009200e1027220d0d020c090b200c41086a21000c020b200e1026220d450d070b2002200e3602242002200d360220200e21090b200b2000360200200d200c6a2005370000200a200141286a2201470d000b41082101200920006b41084f0d020c080b2009450d06200242818080801037022420022009360220200941003a000042808080801021050c0b0b4108210120022802242209200241286a28020022006b4108490d060b200228022021090c080b200e4101102a000b200e4101102a000b200241346a410136020020024101360214200241c0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41014101102a000b200020016a22012000490d002009410174220c20012001200c491b22014100480d00024002402009450d0020022802202009200110272209450d010c030b2001102622090d020b20014101102a000b101e000b20022001360224200220093602200b200241206a41086a200041086a2201360200200920006a20083700002001ad42208621052006450d002007450d00200610230b2004a7210d02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200d450d00200310230b200241d0006a240020052009ad840be10803067f017e017f230041e0006b220324002003200236021020032001280200220236020820032002200128020841246c22016a220436020c2003200341086a41086a3602140240024002400240024002402001419001490d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a2202200141086a2204290300370300200341186a41106a2205200141106a2206290300370300200341186a41186a2207200141186a220829030037030020032001290300370318200329033822094202520d0220032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0320032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0420032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d05200328020c2204200328020822026b418f014b0d000b0b0240024020022004460d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a200141086a290300370300200341186a41106a200141106a290300370300200341186a41186a200141186a29030037030020032001290300370318200329033822094202520d0220032802082202200328020c470d000b0b20004202370300200341e0006a24000f0b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c040b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c030b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c020b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c010b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380b2000200937030020002003290338370308200041106a200341c0006a290300370300200041186a200341386a41106a290300370300200041206a200341386a41186a290300370300200341e0006a24000bd50a05027f027e047f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a10900102400240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a00302400240200229032022054202520d0041002101410021060c010b200241c0006a2802002100200241386a2802002101200241306a2802002107200228023c2108200228023421092002290328210a024020054201520d00200121060c010b02402009450d002007102341002101410021060c010b4100210141002106410021090b200241003602282002420137032041011026210b024002400240024002402006450d00200b450d0620024281808080103702242002200b360220200b41013a0000200b410141091027220c450d072002428980808090013702242002200c360220200c200a37000120022000360248200241c8006a200241206a10412000450d012001200041286c6a210d200241206a41086a220e280200210f2002280224210c03400240024002400240200c200f6b41204f0d00200f41206a2200200f490d0f200c410174220b20002000200b491b22104100480d0f200c450d012002280220200c20101027220b0d020c080b200f41206a21002002280220210b0c020b20101026220b450d060b200220103602242002200b3602202010210c0b200e2000360200200b200f6a220f41186a200141186a290000370000200f41106a200141106a290000370000200f41086a200141086a290000370000200f2001290000370000200141206a290300210a0240200c20006b41074b0d00200041086a220f2000490d0c200c4101742210200f200f2010491b220f4100480d0c02400240200c450d00200b200c200f1027220b0d010c080b200f1026220b450d070b2002200f3602242002200b360220200f210c0b200e200041086a220f360200200b20006a200a370000200d200141286a2201470d000b41082101200c200f6b41084f0d020c090b200b450d074101210f200241013602242002200b360220200b41003a00000c0c0b410821012002280224220c200241286a280200220f6b4108490d070b2002280220210b0c090b20104101102a000b200f4101102a000b200241346a410136020020024101360214200241e0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41094101102a000b41014101102a000b200f20016a2201200f490d00200c4101742200200120012000491b22014100480d0002400240200c450d002002280220200c20011027220b450d010c030b20011026220b0d020b20014101102a000b101e000b200220013602242002200b3602200b200b200f6a2009ad4220862007ad84370000200f41086a210f2008450d00200610230b2004a7210e02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200e450d00200310230b200241d0006a2400200fad422086200bad840baa05020b7f017e230041306b2202240041082103200241206a41086a220442003703002002420037032041dbcbc300411b200241206a1000200241086a20042903003703002002200229032037030041002104024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a10890220022802202203450d02200241286a2802002104200228022421050c010b410021050b2002410036022820024201370320200220043602002002200241206a104102400240024002402004450d002003200441286c6a2106200241206a41086a22072802002108200228022421092003210403400240024002400240200920086b41204f0d00200841206a220a2008490d062009410174220b200a200a200b491b220c4100480d062009450d0120022802202009200c1027220b0d020c070b200841206a210a2002280220210b0c020b200c1026220b450d050b2002200c3602242002200b360220200c21090b2007200a360200200b20086a220841186a200441186a290000370000200841106a200441106a290000370000200841086a200441086a29000037000020082004290000370000200441206a290300210d02400240024002402009200a6b41084f0d00200a41086a2208200a490d062009410174220c20082008200c491b220c4100480d062009450d01200b2009200c1027220b0d020c080b200a41086a21080c020b200c1026220b450d060b2002200c3602242002200b360220200c21090b20072008360200200b200a6a200d3700002006200441286a2204470d000b2005450d060c050b200241286a28020021082002280220210b20050d040c050b101e000b200c4101102a000b200c4101102a000b41d4aac10041331021000b200310230b200241306a24002008ad422086200bad840be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041e698c3004117200241106a1000200241086a20032903003703002002200229031037030002400240024002402002411041a886c500410041001001417f460d002002420037031020024110200241106a41084100100141016a41084d0d022002290310210441082105410810262203450d010c030b42032104410821054108102622030d020b20054101102a000b41d4aac10041331021000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b940403017f017e087f230041306b2202240042002103200241206a41086a22044200370300200242003703204192adc4004110200241206a1000200241086a200429030037030020022002290320370300024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a102820022802202205450d02200229022421030c010b410121050b200241003602282002420137032020022003422088a722043602002002200241206a10410240024002402004450d0020044105742106200241206a41086a280200210720022802202108200228022421092005210403400240024002400240200920076b41204f0d00200741206a220a2007490d062009410174220b200a200a200b491b220b4100480d062009450d0120082009200b102722080d020c070b200741206a210a0c020b200b10262208450d050b200b21090b200820076a22072004290000370000200741186a200441186a290000370000200741106a200441106a290000370000200741086a200441086a290000370000200a2107200441206a2104200641606a22060d000b200241286a200a36020020022009360224200220083602202003a7450d050c040b200241286a280200210a200228022021082003a70d030c040b101e000b200b4101102a000b41d4aac10041331021000b200510230b200241306a2400200aad4220862008ad840be20602047f027e230041206b220324002001280200280200220128020421042001280200210102400240024002400240024002400240024020022d0000417f6a220541034b0d00024020050e0400040203000b200241086a210641012105200241016a210220014101470d050c040b200241016a21024100210520014101460d030c040b200241086a2106200241016a21024103210520014101470d030c020b41042105200241046a210220014101470d020c010b200241086a2106200241016a21024102210520014101470d010b20054102470d0220022004460d0120022800002004280000470d020c010b0240024020014102460d0020014103470d012002210620054104460d020c030b20054103470d0220022004460d0120022800002004280000470d020c010b20054101470d0120022004460d0020022800002004280000470d010b2006280200210120032006280208220236020c20032001360208200341003a0010200341106a2001200241004722051094041a20022005490d012003200220056b220636020c2003200120056a22013602082002450d00024002400240024020032d001022024101460d0020020d04200341106a200341086a10a70220032802102205450d04200329021421074200210820034200370310200341106a20032802082206200328020c2202410820024108491b22011094041a2003200220016b36020c2003200620016a3602082007a72101200241074d0d022007422088a72102200329031021070c010b20034200370310200341106a20012006410820064108491b22021094041a2003200620026b36020c2003200120026a360208200641074d0d0320032903102107200341106a200341086a10a70220032802102202450d032003290214210820034200370310200341106a20032802082206200328020c2201410820014108491b22051094041a2003200120056b36020c2003200620056a3602082008a72106200141074d0d022008422088a721042003280214210120032802102105420121080b2000200636021c200020013602142000200737030820002008370300200041206a2004360200200041186a2002360200200041106a2005360200200341206a24000f0b2001450d01200510230c010b2006450d00200210230b20004202370300200341206a24000f0b200520021048000b130020004105360204200041c8f0c3003602000b130020004108360204200041c1fbc3003602000b130020004108360204200041ccfbc3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242013700000f0b41084101102a000b870301047f23004180026b22022400024002400240411210262203450d00200341106a41002f00c6ed433b0000200341086a41002900beed43370000200341002900b6ed4337000020034112412410272203450d012003200136001220024198016a41186a2201420037030020024198016a41106a2204420037030020024198016a41086a2205420037030020024200370398012003411620024198016a1002200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903980137036802400240200241e8006a412041a886c500410041001001417f460d002002422037028c012002200241e8006a3602880120024198016a20024188016a10ab032002290398014201520d04200241086a20024198016a41086a41e0001094041a20004201370300200041086a200241086a41e0001094041a0c010b200042003703000b2003102320024180026a24000f0b41124101102a000b41244101102a000b41d4aac10041331021000bf20904067f027e027f027e230041e0016b22022400200241c0016a41186a22034200370300200241c0016a41106a22044200370300200241c0016a41086a22054200370300200242003703c0012001410020012802002001280204200241c0016a41202001280208100122062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241a0016a41186a22062003290300370300200241a0016a41106a22032004290300370300200241a0016a41086a22042005290300370300200220022903c0013703a00120024180016a41186a2205200629030037030020024180016a41106a2206200329030037030020024180016a41086a22032004290300370300200220022903a00137038001200241c0006a41186a2005290300370300200241c0006a41106a2006290300370300200241c0006a41086a20032903003703002002200229038001370340200242003703c801200242003703c001200141086a220341002001280200200141046a2204280200200241c0016a41102007100122062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d01200241c0016a41086a2207290300210820022903c0012109200241c0016a41186a220a4200370300200241c0016a41106a220b420037030020074200370300200242003703c001200141086a2205410020012802002004280200200241c0016a41202003100122062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241a0016a41186a2206200a290300370300200241a0016a41106a2204200b290300370300200241a0016a41086a220a2007290300370300200220022903c0013703a00120024180016a41186a2207200629030037030020024180016a41106a2206200429030037030020024180016a41086a2204200a290300370300200220022903a00137038001200241e0006a41186a2007290300370300200241e0006a41106a2006290300370300200241e0006a41086a20042903003703002002200229038001370360200242003703c801200242003703c001200541002001280200200141046a280200200241c0016a41102003100122012001417f461b2201411020014110491b20052802006a3602002001410f4d0d03200241c0016a41086a290300210c20022903c001210d200241206a41186a2201200241c0006a41186a290300370300200241206a41106a2206200241c0006a41106a290300370300200241206a41086a2203200241c0006a41086a290300370300200241086a2204200241e0006a41086a290300370300200241106a2205200241e0006a41106a290300370300200241186a2207200241e0006a41186a2903003703002002200229034037032020022002290360370300200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a2002290320370300200041306a2003290300370300200041386a2006290300370300200041c0006a2001290300370300200041c8006a2002290300370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120044101200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000ba90601097f230041106b220224002002410036020820024201370300200028020021030240024002400240410410262204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810272204450d012002428880808080013702042004200336000420022004360200200028020821042002200041106a280200220336020c2002410c6a2002104102400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a102722090d020c070b200341206a2108200228020021090c020b200a10262209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b2000280214210420022000411c6a280200220336020c2002410c6a2002104102402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a102722090d020c080b200228020021090c020b200a10262209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10042007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100420040d050c060b101e000b200a4101102a000b200a4101102a000b41044101102a000b41084101102a000b200910230b200241106a24000b130020004103360204200041849ac4003602000b13002000410e36020420004198a0c4003602000b130020004104360204200041a8a0c4003602000b3101017f0240410110262202450d00200042818080801037020420002002360200200241003a00000f0b41014101102a000b130020004100360204200041a886c5003602000b130020004107360204200041b2a5c4003602000b130020004102360204200041bca5c4003602000bda0401097f230041d0006b2202240002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272204450d012004200036000f200241286a41186a22004200370300200241286a41106a22054200370300200241286a41086a220342003703002002420037032820044113200241286a1002200241086a41186a2000290300370300200241086a41106a2005290300370300200241086a41086a20032903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002402000450d00200041057421072003280200210020022802282108200228022c21092006210303400240024002400240200920006b41204f0d00200041206a22052000490d072009410174220a20052005200a491b220a4100480d072009450d0120082009200a102722080d020c080b200041206a21050c020b200a10262208450d060b200a21090b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200741606a22070d000b200241306a20053602002002200936022c200220083602280c010b20032802002105200228022c2109200228022821080b200241086a412020082005100402402009450d00200810230b200410230240200141046a280200450d00200610230b200241d0006a24000f0b101e000b200a4101102a000b410f4101102a000b411e4101102a000bde0402047f037e230041d0006b220224000240024002400240411510262203450d002003410d6a41002900ada844370000200341086a41002900a8a844370000200341002900a0a84437000020034115413510272203450d01200320012900003700152003412d6a200141186a290000370000200341256a200141106a2900003700002003411d6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034135200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002200236022020024120360224200241003602302002410020024120200241306a41044100100122012001417f461b2201410420014104491b2204360228200141034d0d052002350230210620024100360230200241286a410020024120200241306a41042004100122012001417f461b2201410420014104491b20046a360200200141034d0d0520023502302107200241306a200241206a102820022802302201450d0520022902342108200241306a200241206a10282008a7210420022802302205450d04200041186a2002290234370200200041146a2005360200200041106a20084220883e02002000200436020c20002001360208200020074220862006843702000c010b200041003602080b20031023200241d0006a24000f0b41154101102a000b41354101102a000b2004450d00200110230b41d4aac10041331021000bc01904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a22044200370300200142003703204195b7c1004115200141206a1000200141086a200429030037030020012001290320370300024002402001411041a886c500410041001001417f460d002001421037021420012001360210200141206a200141106a10890220012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d02200420004120109604450d02200441286a22082000460d02200820004120109604450d02200441d0006a22082000460d02200820004120109604450d02200441f8006a22082000460d02200441a0016a21042008200041201096040d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d02200420004120109604450d022008200441286a2204470d000b0b410021070b02402003a7450d00200210230b200141306a240020070f0b41d4aac10041331021000b130020004101360204200041b8b0c4003602000b1300200041073602042000419fb4c4003602000b130020004105360204200041a8b4c4003602000b9e0e050c7f057e017f017e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200220f41086a2110200f2f010622114105742112417f21090240024002400240024003402012450d01200941016a2109417f410120042010412010960422134100481b410020131b2213450d03201241606a2112201041206a211020134101460d000b200c0d010c030b20112109200c450d020b200c417f6a210c200f20094102746a41880b6a210e410021090c090b200f41e8026a200941e0006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a28020028021c110400200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22194101460d0020194102470d0220094190016a21094200211a20172016844200520d030c0d0b20094180016a21094200211a20172016844200510d0c0c020b200d280200220f201d6a2110200f2f0106220d201e742112417f210902400240024003402012450d01200920196a2109201f201920032010202210960422132023481b202320131b2213450d03201220246a2112201020226a211020132019460d000b201c0d010c050b200d2109201c450d040b201c201f6a211c200f20092020746a20216a210d410121090c060b200f41e8026a200941e0006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941f0006a21094200211a20172016844200510d0a0b200841186a2009290300200941086a290300201720161097042001201a200129030822172008290318427f200841186a41086a290300501b7d221620162017562016507222091b37030802402009450d0041e0bbc4002109412221070c090b200a28020022094100480d04200941ffffffff07460d04410121192007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f4102212041880b21214120212241002123416021240c020b200841086a2007411c6a2802002003200741206a28020028021c110400200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d221a201756201620067d2017200554ad7d221720165620172016511b450d004182bcc4002109411d21070c070b024020184200520d00200741c0006a2802002209290360200556200941e8006a290300221620065620162006511b450d00419fbcc4002109411f21070c070b200820034102201a2017108302024020082802002209450d00200828020421070c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041bebcc4002109412d21070c070b4100210920032004460d05200320044120109604450d05200a2003201a2017108102200a200420182016108102200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22192009490d0320094101742212201920192012491b2212ad42e8007e2216422088a70d032016a722104100480d032009450d01200741286a280200200941e8006c201010272219450d020c070b200741286a28020021190c070b2010102622190d050b20104108102a000b101e000b410121090c000b0b10e401000b2007412c6a2012360200200741286a2019360200200741306a28020021090b2019200941e8006c6a2219200829036037000141002109201941003a0000201941096a200841e0006a41086a290300370000201941116a200841e0006a41106a290300370000201941196a200841e0006a41186a290300370000201941216a2008290340370000201941296a200841c0006a41086a290300370000201941316a200841c0006a41106a290300370000201941396a200841c0006a41186a290300370000201941c1006a2008280039360000201941c4006a2008413c6a280000360000201941e0006a410036020020194201370358201941d0006a2006370300201941c8006a2005370300200741306a2207200728020041016a3602000b0b200020073602042000200936020020084180016a24000f0b41c8adc400104f000bc60101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10d401200141306a24000b160020002001280208360204200020012802003602000b0e0020003502004101200110cc020b8f0301037f230041c0006b22022400200141086a280200210320012802042104200220012802002201360210024002400240200141818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c200241fcd5c4003602282002200241186a3602382002200241286a10a2012002280200450d010c020b02402004450d00200220033602140240200120034d0d00200241246a41023602002002413c6a41023602002002410236021c2002420237022c2002418cd6c4003602282002200241106a3602202002200241146a3602182002200241186a3602382002200241286a10a20120022802000d030c020b200341818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c2002419cd6c4003602282002200241186a3602382002200241286a10a20120022802000d020c010b2002410036020020022802000d010b20004100360200200241c0006a24000f0b20002002290300370200200041086a200241086a280200360200200241c0006a24000bcf0601037f230041c0006b22042400024002400240024002400240024002400240024020012802084102470d00200128020022052d0000416e6a2201411e4b0d0141002106024020010e1f0002020202020202020202020202020202020202020202020202020a030405000b20042005280204220136020c200120034f0d05200220014101746a22012d0001450d06200441346a41013602002004410236023c2004420237022420044198d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b412e10262201450d06200041013a0000200141266a4100290090d844370000200141206a410029008ad844370000200141186a4100290082d844370000200141106a41002900fad744370000200141086a41002900f2d744370000200141002900ead744370000200041086a42ae808080e005370200200041046a2001360200200441c0006a24000f0b412010262201450d06200041013a0000200141186a41002900d0d844370000200141106a41002900c8d844370000200141086a41002900c0d844370000200141002900b8d844370000200041086a42a08080808004370200200041046a2001360200200441c0006a24000f0b410121060c060b410221060c050b410321060c040b200441346a41013602002004410236023c20044202370224200441a8d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b20012d000021060c020b412e4101102a000b41204101102a000b0240200541106a2d00004106470d00200041003a0000200020063a0001200441c0006a24000f0b0240412910262201450d00200041013a0000200141286a41002d0080d9443a0000200141206a41002900f8d844370000200141186a41002900f0d844370000200141106a41002900e8d844370000200141086a41002900e0d844370000200141002900d8d844370000200041086a42a98080809005370200200041046a2001360200200441c0006a24000f0b41294101102a000b90010002400240024020002d000022004101460d0020004102460d0120004103470d02200128021841b8f6c40041032001411c6a28020028020c1102000f0b200128021841b2f6c40041032001411c6a28020028020c1102000f0b200128021841b5f6c40041032001411c6a28020028020c1102000f0b200128021841aff6c40041032001411c6a28020028020c1102000b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010ba1d10103037f037e067f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d0000417f6a220441aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01f602001b0f01aa01a701a901a301230c13a80104141a9a01531d2454063507a101880172269101a001a60134090e8a01399d01a40105023a43744b73568d01030a4616797b4184017825287a8901080d272e1218940196012298019c01a5015da201179b01601e5c119e019f0120920177750b1044472a1597011c6231930190018b012b193699013c29664d5767644c8001427e308c0187012d8e0195011f48402f8f01713d217f614a7c85012c3332383f6f5e6e83018201378601505181017668637d6b5f3b553e694e456c4f6d596a654958525a5bf6020b200141306a2802002204200141346a22052802004f0dad0120023100012106200141206a350200210720042001412c6a280200470df402200441016a22022004490de60220044101742205200220022005491b2202ad4203862208422088a70de6022008a722054100480de6022004450de401200141286a2802002004410374200510272204450de5010cf3020b200141306a2802002202417f6a220420024f0d9f02200420024b0d9f02200141286a220228020020044103746a22042d00044101470da90120043100052106200341d8006a200141186a200210ce032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110cf032003280258450df30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0da80120022001411c6a280200470def02200241016a22042002490de30220024101742205200420042005491b22044100480de3022002450ddf01200141186a2802002002200410272202450de0010cee020b200341d8006a200141186a2202200141286a2204410010d00320032d00584101470da801200341e0006a2903002106200328025c22010df0010cf1020b200341d8006a2001200241046a2802004102410010cf032003280258450df00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210d1032003280258450def0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dee0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ded0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dec0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d3032003280258450deb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360248200441386a28020020024d0da2012003200428023020024102746a28020022023602282004412c6a28020020024d0db801200428022420024104746a22042d000d2109024020042802082202450d002004280200417f6a2104200141286a2105200141186a210a0340200341d8006a200a2005200420026a2d000010d00320032d00584101460de7012002417f6a22020d000b0b20094104460de902200141206a2802002202200141246a22042802004f0df30120022001411c6a280200470de402200241016a22042002490dda0220024101742205200420042005491b22044100480dda022002450d8702200141186a2802002002200410272202450d88020ce3020b200341d8006a2001410110d2032003280258450de80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410010cf032003280258450de70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20023100012106200341d8006a200141186a200141286a2204410010d00320032d00584101470da0012000200329025c370200200041086a200341e4006a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450de40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241046a280200210a2001280200210220034100360228200241146a280200450dac01200341d8006a200141186a2204200141286a2205410010d00320032d00584101470daf01200341e0006a2903002106200328025c22010df3010ce2020b200341d8006a200141046a200241046a28020010d50320032d00584101470d9c01200328025c2201450de102200341e0006a29030021060cb3010b200341d8006a2001410010d4032003280258450de00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450ddf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dde0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360248200341d8006a200141046a200210d50320032d00584101470d9701200328025c21012003200341e0006a290300220637022c2003200136022820010daf010cdb020b200141306a2802002204200141346a22052802004f0d970120023100012106200141206a350200210720042001412c6a280200470dd302200441016a22022004490dcb0220044101742205200220022005491b2202ad4203862208422088a70dcb022008a722054100480dcb022004450dcb01200141286a2802002004410374200510272204450dcc010cd2020b200341d8006a2001410010d4032003280258450dd90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a28020022023602202001280200210420032002360254200441206a28020020024d0d9601200428021820024101746a22022d0001450db501200320022d000022023a0027200341d8006a200141186a200141286a410410d00320032d00584101470db801200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d9b020cd8020b200341d8006a2001410310d2032003280258450dd70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dd60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dd50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dd40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dd30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012d003822024104470d91010cc2020b200341d8006a2001200241046a2802004104410010d1032003280258450dd10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dd00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450dcf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dce0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dcd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dcc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dcb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dca0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dc70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dc60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dc40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dc10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310d1032003280258450dc00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450dbf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450dbe0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dbd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210cf032003280258450dbc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110cf032003280258450dbb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450dba0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450db80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450db70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450db60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450db50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450db40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110cf032003280258450db20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450db10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450db00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450daf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dae0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dad0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410310d7032003280258450dac0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dab0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012802002102200341003602282002280208450d750c94020b200341d8006a2001410110d4032003280258450da90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450da80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450da70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410210d7032003280258450da60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450da50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410010d7032003280258450da40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360228200441206a28020020024d0d62200141206a2802002205200141246a220a2802004f0d78200428021820024101746a2d0000210220052001411c6a280200470d8b02200541016a22042005490d93022005410174220a20042004200a491b22044100480d93022005450daa01200141186a2802002005200410272205450dab010c8a020b200341d8006a2001200241046a2802004108410110d1032003280258450da10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d6020022001411c6a280200470d8602200241016a22042002490d900220024101742205200420042005491b22044100480d90022002450d9201200141186a2802002002200410272202450d93010c85020b200341d8006a2001410110d4032003280258450d9e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450d9d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d9c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d9b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d9a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d990220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450d980220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d970220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450d960220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d950220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450d940220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450d930220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d920220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d910220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d900220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8f0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d8d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d8c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d8b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450d8a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450d890220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d880220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d870220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450d860220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002202417f6a220420024f0db101200420024b0db101200128022820044103746a220a2802002205200141206a28020022024d0d482001411c6a280200220420026b200520026b22094f0d5d200220096a220b2002490df6012004410174220c200b200b200c491b220b4100480df6012004450d7c200141186a2802002004200b1027220c450d7d0ce6010b200341d8006a2001410210d4032003280258450d840220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450d830220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d4420022001411c6a280200470de201200241016a22042002490df30120024101742205200420042005491b22044100480df3012002450d77200141186a2802002002200410272202450d780ce1010b20012802002102200341003602282002280208450d4d0cda010b200341d8006a2001410010d4032003280258450d800220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450dff0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dfe0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfa0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450df80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450df40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450df10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450df00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450def0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dee0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450ded0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d3032003280258450dec0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410110cf032003280258450deb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450de90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d2c20022001411c6a280200470dc001200241016a22042002490dd90120024101742205200420042005491b22044100480dd9012002450d61200141186a2802002002200410272202450d620cbf010b200341d8006a2001410210d6032003280258450de70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450de40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450de30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dde0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a200141046a200241046a28020010d50320032d00584101470d20200328025c2201450ddb01200341e0006a29030021060c420b200341d8006a2001410210d2032003280258450dda0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310cf032003280258450dd80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dd50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dd40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241086a280200210a200241046a280200210420032002410c6a2802002205360240200141306a280200220220054d0d1820022005417f736a220520024f0d83014104210c0240200141286a220d280200220920054103746a22052d00044103460d0020052d0005210c0b2003200c3a0038200a450d34200c41ff0171220e4104470d33200a410274210a0340200320042802002205360240200220054d0d3e20022005417f736a220520024f0d7d0240200920054103746a22052d00044103460d0020052d00054104470d3e0b200441046a2104200a417c6a220a0d000b4104210c0c340b200341d8006a2001200241046a2802004101410010cf032003280258450dd10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dcf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360240200141306a280200220420024d0d1520042002417f736a220220044f0d8001200141286a220428020020024103746a22022d00044103460d9f0120022d0005220241ff01714104460d9f01200341d8006a200141186a22052004200210d00320032d00584101470d36200328025c2202450d9f01200341e0006a29030021060c9e010b200341d8006a200141186a200141286a410410d00320032d00584101470dcd01200328025c2201450dcd012000200341e0006a29030037020420002001360200200341f0006a24000f0b200241046a2802002102200341d8006a200141186a220a200141286a2205410010d00320032d00584101470d14200341e0006a2903002106200328025c22010d92010ccc010b200141306a2802002202417f6a220420024f0d78200420024b0d78200141286a220a28020020044103746a22042d0005210520042d00044101470d14200541ff01714104460d14200341ec006a41013602002003412936022c2003200441056a3602282003420237025c200341d4d1c4003602582003200341286a360268200341086a200341d8006a10a201200041086a200341086a41086a28020036020020002003290308370200200341f0006a24000f0b411a10262201450d7d200141186a41002f00d0d1443b0000200141106a41002900c8d144370000200141086a41002900c0d144370000200141002900b8d1443700002000429a808080a00337020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc9012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a20022004410410d00320032d00584101470d16200341e0006a2903002106200328025c22010d470cc8010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc7012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc7012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a41013602002003410236023c2003420237025c20034188dac4003602582003200341c8006a3602382003200341386a360268200341086a200341d8006a10a201200329020c2106200328020822010d510cc6010b200141306a2802002202200141346a22052802004f0d15200141206a350200210720022001412c6a280200470d9b01200241016a22052002490db6012002410174220a20052005200a491b2205ad4203862208422088a70db6012008a7220a4100480db6012002450d4920042802002002410374200a10272202450d4a0c9a010b200141206a2802002202200141246a22042802004f0d1520032d0059210420022001411c6a280200470d9801200241016a22052002490db5012002410174220a20052005200a491b22054100480db5012002450d4a200141186a2802002002200510272202450d4b0c97010b200320032d005922023a0038200341d8006a200141186a200141286a410410d00320032d00584101470d16200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d170cc3010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc2012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc2012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341d4006a3602402003200341c0006a360268200341086a200341d8006a10a2010c1f0b200341d8006a200141186a2205200141286a200210d00320032d00584101470d15200328025c2202450db001200341e0006a29030021060c250b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a20120032802082201450dbf01200329020c21060c160b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbe012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbe012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbd012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbd012000200329022c37020420002001360200200341f0006a24000f0b2005200220052002491b21040ca1010b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbb012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbb012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a200141186a2205200141286a20032d0059220410d00320032d00584101470d13200328025c2201450dba01200341e0006a29030021060c210b200341086a410c6a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c2003200236022820032802282202450d7b0c8b010b200341146a4102360200200341ec006a220241023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821042003200329022c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d8601200328020810230c86010b200141306a280200210420032002360240200420024d0d1120042002417f736a220220044f0d6b200528020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200a2005200210d00320032d00584101470d38200328025c2201450db701200341e0006a29030021060c7d0b20024101470d1120012d003822024104470d1f0c83010b200341d8006a41146a41013602002003410236024c2003420237025c200341e8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d460cb5010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d9e01200329020c21060c9f010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d8c01200329020c21060c8d010b20012802002209412c6a28020021022003200a3602282002200a4d0d112009280224200a4104746a220a2d000d21090240200a2802082202450d00200a280200417f6a210a0340200341d8006a20042005200a20026a2d000010d00320032d00584101460d372002417f6a22020d000b0b200941ff01714104460db201200141206a2802002202200141246a22052802004f0d4220022001411c6a280200470d7e200241016a22052002490da3012002410174220a20052005200a491b22054100480da3012002450d5620042802002002200510272202450d570c7d0b200341d8006a2002200420032d0059220510d00320032d00584101470d14200341e0006a2903002106200328025c22010d300cb1010b200341ec006a4101360200200341023602442003420237025c20034198dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a201200329020c2106200328020822010d3b0cb0010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450daf012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450daf012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dae012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dae01200329022c21060b2000200637020420002001360200200341f0006a24000f0b200320032d005922013a004020014104460dac01200241ff01712001460dac01200341086a41146a412b360200200341146a4123360200200341d8006a41146a41033602002003410236020c2003420337025c200341f4d1c4003602582003200341c0006a3602182003200341386a3602102003200341c8006a3602082003200341086a360268200341286a200341d8006a10a201200329022c210620032802282201450dac010b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d0e20042001411c6a280200470d74200441016a220a2004490d9b0120044101742209200a200a2009491b220a4100480d9b012004450d3c20052802002004200a10272204450d3d0c730b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450da9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450da901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141186a280200220c200222046a210b20094102490d89010c8a010b200141206a2802002202200141246a220a2802004f0d0c20022001411c6a280200470d6e200241016a220a2002490d970120024101742209200a200a2009491b220a4100480d97012002450d3a20052802002002200a10272202450d3b0c6d0b200341146a4102360200200341ec006a220141023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200329022c210620032802282201450da5010c6b0b200341d8006a200141186a2202200a10ce032003280258450d1f20002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002204200141346a22052802004f0d0f200141206a350200210720042001412c6a280200470d68200441016a22052004490d94012004410174220a20052005200a491b2205ad4203862208422088a70d94012008a7220a4100480d94012004450d3b20022802002004410374200a10272202450d3c0c670b200341ec006a41013602002003410236024c2003420237025c200341c8dac4003602582003200341d4006a3602482003200341c8006a360268200341086a200341d8006a10a2010b200328020821012003200329020c220637022c200320013602282001450da1010c640b200341ec006a41013602002003410236024c2003420237025c20034198dac4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d310ca0010b200320032d005922013a00482001200241ff0171460d9f0120014104460d9f01200341086a41146a412b360200200341146a412b360200200341d8006a41146a41033602002003410236020c2003420337025c2003418cd2c4003602582003200341c8006a3602182003200341276a3602102003200341206a3602082003200341086a360268200341286a200341d8006a10a201200329022c2106200328022822010d620c9f010b200a410274210a0340200320042802002205360240200220054d0d0a20022005417f736a220520024f0d49200920054103746a22052d00044103460d0920052d0005220b4104460d09200e200b470d09200441046a2104200a417c6a220a0d000b0b200341d8006a200141186a2202200d410010d003024020032d00584101470d00200341306a200341e4006a2802003602002003200329025c370328200328022822020d700c600b200c41ff01714104470d1a0c5e0b200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d5c200441016a220a2004490d8d0120044101742209200a200a2009491b220a4100480d8d012004450d3620022802002004200a10272202450d370c5b0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d8b012003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d8b01200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d99012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d9901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d1720042001411c6a280200470d55200441016a220a2004490d880120044101742209200a200a2009491b220a4100480d88012004450d3320052802002004200a10272204450d340c540b200341d8006a200141186a2205200a200210d00320032d00584101470d18200328025c2202450d63200341e0006a29030021060c250b200341146a4129360200200341ec006a41023602002003200541056a3602102003412936020c2003420237025c200341e4d1c4003602582003200341386a3602082003200341086a360268200341286a200341d8006a10a201200328022822020d670c570b200341146a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c20032002360228200328022822020d660c560b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d93012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d93012000200329022c37020420002001360200200341f0006a24000f0b2004102622020d8e010b20044101102a000b2005102622040d8e010b20054104102a000b2005102622040d86010b20054104102a000b2004102622020d720b20044101102a000b2004102622020d690b20044101102a000b200b1026220c0d690b200b4101102a000b2004102622020d5d0b20044101102a000b200541ff01714104460d8401200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d40200441016a220a2004490d7520044101742209200a200a2009491b220a4100480d752004450d2a20022802002004200a10272202450d2b0c3f0b200341e0006a2903002106200328025c22010d0e0c83010b200341d8006a2002200d200c10d00320032d00584101470d0e200328025c2202450d432003200341e0006a29030037022c20032002360228200328022822020d540c440b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d81012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d8101200329022c21060b2000200637020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d502003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d4d20032802081023200328022822020d4e0c500b200141206a2802002204200141246a22052802004f0d0b20042001411c6a280200470d38200441016a22052004490d6f20044101742209200520052009491b22054100480d6f2004450d1e200a2802002004200510272204450d1f0c370b200141206a2802002204200141246a22092802004f0d0b20042001411c6a280200470d35200441016a22092004490d6e2004410174220b20092009200b491b22094100480d6e2004450d1f20052802002004200910272204450d200c340b200341e0006a2903002106200328025c22010d0d0c7c0b200a102622020d500b200a4104102a000b2005102622020d4c0b20054101102a000b2004102622050d5f0b20044101102a000b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d752003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d75200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a22052802004f0d0a20042001411c6a280200470d29200441016a22052004490d642004410174220a20052005200a491b22054100480d642004450d1b20022802002004200510272202450d1c0c280b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d722003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d72200329022c21060c380b200341ec006a220241013602002003410236024c200320093602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d3e2003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d3e200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d6f2003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d6f200329022c21060b2000200637020420002001360200200341f0006a24000f0b200a102622040d360b200a4101102a000b200a102622020d320b200a4101102a000b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d692003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d692000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d292003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d292003200329022c37022c20032002360228200328022822020d3a0c2a0b200a102622020d2b0b200a4104102a000b200a102622020d240b200a4101102a000b200a102622040d200b200a4101102a000b2004102622020d5b0b20044101102a000b2005102622040d180b20054101102a000b2009102622040d140b20094101102a000b2005102622020d260b20054101102a000b200a102622020d140b200a4101102a000b2005102622020d0c0b20054101102a000b4182dcc400411d1021000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b4182dcc400411d1021000b4182dcc400411d1021000b411a4101102a000b4182dcc400411d1021000b2001411c6a2005360200200141186a2002360200200141206a28020021040b200141186a28020020046a200c3a0000200141206a2202200228020041016a3602000c0a0b2001411c6a2009360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c140b2001411c6a2005360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2201200128020041016a3602000c450b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c430b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c120b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c3f0b20034100360228200328022822020d100b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d382004410174220c200b200b200c491b220b4100480d382004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c3d0b2000200637020420002001360200200341f0006a24000f0b2001412c6a2005360200200141286a2002360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080802084370200200141306a2201200128020041016a3602000c3a0b2000200637020420002001360200200341f0006a24000f0b2001411c6a200a360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c370b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c250b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c330b200341d8006a200141186a200a10ce032003280258450d3220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20032802282202450d020b200329022c21060b2000200637020420002002360200200341f0006a24000f0b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d292004410174220c200b200b200c491b220b4100480d292004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c2e0b2000200329022c37020420002002360200200341f0006a24000f0b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c2b0b2001412c6a2005360200200141286a2002360200200141306a28020021020b200141286a28020020024103746a200642288620078442808080801084370200200141306a2201200128020041016a3602000c290b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41023a0000200141206a2201200128020041016a3602000c270b0240200141206a2802002202200141246a22042802004f0d0020022001411c6a280200470d05200241016a22042002490d1820024101742205200420042005491b22044100480d182002450d02200141186a2802002002200410272202450d030c040b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d262003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d26200329022c21060b2000200637020420002002360200200341f0006a24000f0b2004102622020d010b20044101102a000b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c210b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c1f0b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c1a0b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41013a0000200141206a2201200128020041016a3602000c180b2001411c6a2004360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000c160b200341d8006a200141186a2204200141286a410010d003024020032d00584101470d00200328025c2202450d16200341e0006a29030021060c010b0240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d072002410174220a20052005200a491b22054100480d072002450d0220042802002002200510272202450d030c040b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d152003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d15200329022c21060b2000200637020420002002360200200341f0006a24000f0b2005102622020d010b20054101102a000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c100b200141306a2802002202417f6a220420024f0d01200420024b0d010240024002400240200128022820044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d042004410174220c200b200b200c491b220b4100480d042004450d02200141186a2802002004200b1027220c450d030c060b2005200220052002491b21040c090b200141186a280200220c200222046a210b20094102490d050c060b200b1026220c0d030b200b4101102a000b101e000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c080b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080803084370200200141306a2201200128020041016a3602000c060b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c040b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41033a0000200141206a2201200128020041016a3602000c020b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a2006422886200784370200200141306a2201200128020041016a3602000b20004100360200200341f0006a24000b19002000200141186a280200360204200020012802103602000bb310012e7f230041a0016b2202240002400240024002402000280200220341f098c400460d00200028020421040c010b41ec0010262203450d0141002104200341003b010620034100360200200341086a200241086a41e4001094041a20004100360204200020033602000b200141ff017121050c010b41ec004104102a000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b1095041a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b4103741095041a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec001026220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010940421092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a22071094042109200b41146a200341cc006a2007410374109404210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b1095041a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b4103741095041a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b1095041a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b4103741095041a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b201210262208450d02200820133b010620082013360200200820146a200241086a20151094042106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a2207109404212c2008201d6a2010201c6a2007201e74109404212d200820206a2010201f6a200920216a222e202274109404212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e1095041a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e741095041a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b2022741095041a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b1095041a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e741095041a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b2022741095041a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c0110262207450d03200741003b010620074100360200200741086a200241086a419401109404210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a1095041a2009200c3a0000201041146a220920064103746a200920274103746a2209200a4103741095041a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b4102741095041a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c014104102a000b41ec004104102a000b419c014104102a000b410121070c000b0b200241a0016a24000bbb3101a6017f23004190016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a280200210320012802082104024002400240200141106a2802002205450d0041002106417f2107412c2108417e2109410d210a4104210b4170210c4158210d4109210e4108210f41ffffffff03211041142111416c2112411c21134118211441ff012115410221164174211741012118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021230c010b4104215f410021604100216141002162410021634104216441002165410021664104216741002168410021694104216a4100216b4100216c4104216d41002105410021264104216e4100216f41002170410421714100217241002173410421744100217541002176410421774100217841002179410021010c010b410121010b034002400240024002400240024002400240024002400240024020010e020001010b4104210641002153410021500c010b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020230e050001020304040b20252124202221262004200520076a220520086c6a2201280024212720012800202128200128001821292001280014212a2001280010212b200128000c212c2001280008212d2001280004212e4101212f0240024020012d0000223020096a2201200a4b0d0041012131410121324101213341012134410121354101213641012122202e2125024002400240024002400240024002400240024020010e0e000203040501062d07080927272f000b02402021450d0002402037450d002037200b74212520212101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000b0b2038450d00202110230b410121314100212f202c2137202d2138202e21210c0a0b201c450d1d2039450d1c201c2039200b746a213a201c213b4100213c0c260b02402020450d000240203e450d00203e41286c212520202101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000b0b203f450d00202010230b410021314101212f202c213e202d213f202e21200c080b02402040450d00201f450d00201f10230b2026212220242125202e211f202d2140202c214120050d0e0c2a0b02402042450d00201e450d00201e10230b2026212220242125202e211e202d2142202c214320050d0c0c290b02402044450d00201d450d00201d10230b2026212220242125202e211d202d2144202c214520050d0a0c280b0240201b450d0002402046450d00204620116c2125201b2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000b0b2047450d00201b10230b410021334101212f202c2146202d2147202e211b41012131410121320c1f0b201a450d192048450d18201a204820136c6a2149201a214a4101213c0c210b2019450d1a204c450d192019204c20146c6a214d2019214e4102213c0c210b2006450d1b2050450d1a2006205020136c6a2151200621524103213c0c210b410121310b41012132410821010c200b02402082012802082223450d0020820128020021012023207b7421230340024020012d0000207e470d002001207f6a28020020800171450d002001207b6a28020010230b2001207d6a210120232081016a22230d000b0b208201207d6a21010240208201207b6a280200450d0020820128020010230b20012182012001207c470d060c240b0240208e012086016a2802002223450d00208e01280204210120232089017421230340024020012d0000208b01470d0020012087016a280200208c0171450d0020012089016a28020010230b2001208a016a21012023208d016a22230d000b0b0240208e012087016a280200450d00208e012089016a28020010230b208e012084016a21010240208e012088016a280200450d00208e0128021010230b2001218e012001208501470d060c240b0240209a012092016a280200450d00209a0128020010230b0240209a012093016a2802002223450d00209a0128020c210120232092017421230340024020012d0000209601470d0020012097016a28020020980171450d0020012092016a28020010230b20012094016a210120232099016a22230d000b0b209a012090016a21010240209a012094016a280200450d00209a012095016a28020010230b2001219a012001209101470d060c240b024020a701209f016a2802002223450d0020a7012802042101202320a2017421230340024020012d000020a401470d00200120a0016a28020020a50171450d00200120a2016a28020010230b200120a3016a2101202320a6016a22230d000b0b024020a70120a0016a280200450d0020a70120a2016a28020010230b20a701209d016a2101024020a70120a1016a280200450d0020a70128021010230b200121a7012001209e01470d060c240b410021230c060b410021230c060b410021230c060b410121230c060b410221230c060b410321230c060b410421230c060b410121010c220b410121010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410021010c0d0b410121010c0c0b410221010c0b0b410321010c0a0b410421010c090b410521010c080b410621010c070b410721010c060b410921010c050b410a21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010b0240024002400340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0c000102030405060708090b0d0d0b203d450d17201c1023410121010c2a0b410021324101212f202c2139202d213d202e211c410121310c1a0b204b450d16201a1023410321010c280b410021344101212f202c2148202d214b202e211a4101213141012132410121330c060b204f450d1520191023410521010c260b410021354101212f202c214c202d214f202e211941012131410121324101213341012134410121362030200a4d0d060c270b2053450d1420061023410721010c240b410021364101212f202c2150202d2153202e210641012131410121324101213341012134410121352030200a4d0d040c250b41012133410921010c220b410121340b4101213541012136410a21010c200b2030200a4b0d210b202621222024212502400240024002400240024002400240024020300e0e2800010228282803042b05060708280b0240202d450d00202e10230b202a450d29202b10230c290b202f450d28202c450d26202c200b742125202e2101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000c270b0b2031450d27202c450d25202c41286c2125202e2101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000c260b0b2032450d26202c450d24202e202c200b746a2154202e21554104213c0c190b2033450d25202c450d23202c20116c2125202e2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000c240b0b2034450d24202c450d22202e202c20136c6a2156202e21574105213c0c190b2035450d23202c450d21202e202c20146c6a2158202e21594106213c0c1a0b2036450d22202c450d20202e202c20136c6a215a202e215b4107213c0c1b0b02400240202e20157122012016460d0020012018460d01202c450d23202d10230c230b202a450d02202c202a200b746a215c202c215d4108213c0c1d0b202a450d01202a410c6c212e202c21010340024020012802002225450d002001200b6a280200450d00202510230b2001410c6a2101202e20176a222e0d000c020b0b024002400240024002400240024002400240203c0e09000102030405060708080b0240203b2802082225450d00203b28020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b203b41106a21010240203b200b6a280200450d00203b28020010230b2001213b2001203a470d09410021010c250b0240204a410c6a2802002225450d00204a28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240204a200f6a280200450d00204a200b6a28020010230b204a20136a21010240204a20116a280200450d00204a28021010230b2001214a20012049470d09410221010c240b0240204e200b6a280200450d00204e28020010230b0240204e20116a2802002225450d00204e28020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b204e20146a21010240204e41106a280200450d00204e410c6a28020010230b2001214e2001204d470d09410421010c230b02402052410c6a2802002225450d00205228020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402052200f6a280200450d002052200b6a28020010230b205220136a21010240205220116a280200450d00205228021010230b2001215220012051470d09410621010c220b024020552802082225450d00205528020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205541106a210102402055200b6a280200450d00205528020010230b2001215520012054470d090c220b02402057410c6a2802002225450d00205728020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402057200f6a280200450d002057200b6a28020010230b205720136a21010240205720116a280200450d00205728021010230b2001215720012056470d090c210b02402059200b6a280200450d00205928020010230b0240205920116a2802002225450d00205928020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205920146a21010240205941106a280200450d002059410c6a28020010230b2001215920012058470d090c200b0240205b410c6a2802002225450d00205b28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240205b200f6a280200450d00205b200b6a28020010230b205b20136a21010240205b20116a280200450d00205b28021010230b2001215b2001205a470d090c1f0b205d225e41106a215d0240205e2802042201450d000240205e410c6a2802002225450d002025410c6c21250340024020012802002222450d002001200b6a280200450d00202210230b2001410c6a2101202520176a22250d000b0b205e200f6a280200450d00205e200b6a28020010230b205d205c470d090b202b450d1f202c10230c1f0b4100213c0c0d0b4101213c0c0d0b4102213c0c0d0b4103213c0c0d0b4104213c0c0e0b4105213c0c0f0b4106213c0c100b4107213c0c110b4108213c0c120b410121010c120b410321010c110b410521010c100b410721010c0f0b410821010c0e0b410b21010c0d0b410b21010c0c0b410b21010c0b0b410b21010c0a0b410b21010c090b410b21010c080b410b21010c070b410b21010c060b410b21010c050b410b21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010c000b0b202d450d01202e10230c010b0240202d450d00202e10230b0240202a450d002029450d00202a10230b2027450d00202810230b20262122202421250b20050d070b4100210520252124202221260b204c410020191b2160204f410020191b216120484100201a1b2179204b4100201a1b217820464100201b1b216220474100201b1b216320394100201c1b2176203d4100201c1b217520454100201d1b216520444100201d1b216620434100201e1b217320424100201e1b217220414100201f1b216820404100201f1b2169203e410020201b2170203f410020201b216f2037410020211b216b2038410020211b216c2019410420191b215f201a4104201a1b2177201b4104201b1b2164201c4104201c1b2174201d4104201d1b2167201e4104201e1b2171201f4104201f1b216a2020410420201b216e2021410420211b216d20060d00410021010c0a0b2002280200217a0240200241086a2802002201450d0020014104742123207a210103400240200141046a280200450d00200128020010230b200141106a2101202341706a22230d000b0b02402002280204450d00207a10230b2002410c6a280200217a0240200241146a2802002201450d00200141286c2123207a210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101202341586a22230d000b0b0240200241106a280200450d00207a10230b02402002411c6a280200450d00200241186a28020010230b0240200241286a280200450d00200241246a28020010230b0240200241346a280200450d00200241306a28020010230b2002413c6a280200217a200241c4006a2802002201450d004104217b207a20014104746a217c4110217d4109217e4108217f41ffffffff032180014170218101207a218201410121230c050b0240200241c0006a280200450d00207a10230b200241c8006a2802002183010240200241d0006a2802002201450d00200141146c2123208301210103400240200141046a280200450d00200128020010230b200141146a21012023416c6a22230d000b0b0240200241cc006a280200450d0020830110230b200241dc006a280200218301200241e4006a2802002201450d00411c2184012083012001411c6c6a218501410c2186014108218701411421880141042189014110218a014109218b0141ffffffff03218c014170218d01208301218e01410221230c050b0240200241e0006a280200450d0020830110230b200241e8006a280200218f01200241f0006a2802002201450d004118219001208f01200141186c6a219101410421920141142193014110219401410c2195014109219601410821970141ffffffff032198014170219901208f01219a01410321230c050b0240200241ec006a280200450d00208f0110230b418001219b01200241f4006a280200219c01200241fc006a2802002201450d00411c219d01209c012001411c6c6a219e01410c219f01410821a001411421a101410421a201411021a301410921a40141ffffffff0321a501417021a601209c0121a701410421230c050b2002209b016a21010240200241f8006a280200450d00209c0110230b200110ef03024020024184016a2201280200450d0020024180016a28020010230b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2050360200200241f8006a2053360200200241f4006a2006360200200241f0006a2060360200200241ec006a2061360200200241e8006a205f360200200241e4006a2079360200200241e0006a2078360200200241dc006a2077360200200241d8006a2024360200200241d4006a2026360200200241d0006a2062360200200241cc006a2063360200200241c8006a2064360200200241c4006a2076360200200241c0006a20753602002002413c6a2074360200200241386a2065360200200241346a2066360200200241306a20673602002002412c6a2073360200200241286a2072360200200241246a2071360200200241206a20683602002002411c6a2069360200200241186a206a360200200241146a2070360200200241106a206f3602002002410c6a206e360200200241086a206b3602002002206c3602042002206d36020020002002418c011094041a20024190016a24000f0b41002123410121010c040b410121010c030b410121010c020b410121010c010b410121010c000b0b9a0c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a200010be0320022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d10272209450d020c120b200028020021090c120b201d102622090d100b201d4104102a000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b20011023200241106a2400200b0f0b101e000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010be032002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c10262207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e10272207450d020c040b2009210d0c040b200e102622070d020b200e4104102a000b412c4104102a000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021140c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021190c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101211e0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101212a0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c202810272207450d010c020b2028102622070d010b20284104102a000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c203010272207450d020c040b200920016a21010c040b2030102622070d020b20304104102a000b101e000b202e210d0b20072009412c6c6a200e202d1094041a0240202c450d00200e10230b0240024002400240024041c00510262209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10ef03200910232028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c0054104102a000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e20131023410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a28020010230b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a28020010230b203b20316a21010240203b20356a280200450d00203b28021010230b2001213b20012032470d09410021010c150b02402047203f6a280200450d00204728020010230b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a28020010230b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a28020010230b200121472001203e470d090b2026450d00202710230b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a28020010230b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a28020010230b205220486a210102402052204c6a280200450d00205228021010230b2001215220012049470d070b2023450d00202410230b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d00200128020010230b200141146a21012009416c6a22090d000b0b201f450d00202010230b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a28020010230b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a28020010230b2001215a20012054470d050b201a450d00201b10230b02402017410047201941017371450d00201810230b02402015410047201141017371450d00201610230b0240200f410047201441017371450d00201010230b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200941586a22090d000b0b200a450d00200b10230b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d00200128020010230b200141106a2101200941706a22090d000b0b2003450d00200410230b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d0120002802002003410474200810272205450d020c050b200341016a2104200028020021050c050b2008102622050d030b20084108102a000b101e000b4180e4c400104f000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b4104741095041a200541086a200241086a29030037030020052002290300370300200041086a20043602000b9e0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10c8032103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a2802002004410274200810272205450d020c030b200041186a28020021050c030b2008102622050d010b20084104102a000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c200610272205450d020c040b200041e8006a28020021050c040b2006102622050d020b20064104102a000b101e000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000b929601150b7f017e587f037e047f017e387f027e1c7f027e137f037e3e7f027e017f017e047f047e277f017e227f23002203210420034180096b41607122032400024002400240024002400240024002400240411010262205450d00200541063a0000412010262206450d01200641063a00104100210720064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410230b20051023200141106a2802002208412c6c21092001280208210a024002400240024002400240034020092007460d01200a20076a21052007412c6a220b210720052d00004107470d000b200320032f01a0033b01c005200a200b6a220541586a210a2005415c6a2208280200200541606a22092802002207470d01200741016a220b2007490d0e2007410174220c200b200b200c491b220dad420486220e422088a70d0e200ea7220c4100480d0e2007450d04200541586a2802002007410474200c1027220b450d050c0b0b411010262205450d0720054180023b010c200542828080802037020420052006360200200520032f01a0033b010e2001410c6a2802002008470d09200841016a22072008490d0d20084101742209200720072009491b2207ad422c7e220e422088a70d0d200ea722094100480d0d2008450d01200a2008412c6c20091027220a450d020c080b200a280200210b0c0a0b20091026220a0d060b20094104102a000b200c1026220b0d060b200c4104102a000b41104108102a000b41204108102a000b41104104102a000b2001410c6a2007360200200141086a200a3602000b200141106a200841016a220c360200200a2008412c6c6a220720032f00b0043b0001200741073a0000200742818080801037000820072005360004200720032902c005370210200741036a200341b2046a2d00003a0000200741186a200341c8056a290200370200200741206a200341c0056a41106a290200370200200741286a200341c0056a41186a2802003602004100210f0c020b2008200d360200200541586a200b360200200928020021070b200b20074104746a22074180023b010c200742828080802037020420072006360200200720032f01c0053b010e2009200928020041016a360200200341c0006a200a10be032003280244417f6a210f200141106a280200210c200141086a280200210a0b200c412c6c2107200a41586a210502400340410021062007450d01200741546a2107200541286a21092005412c6a220b210520092d00004103470d000b200b41086a2802002207450d00200741286c2105200b28020041186a2107410021060340200620072d0000456a2106200741286a2107200541586a22050d000b0b200c412c6c2107200a41586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b200c412c6c2107200a41606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a220a2105200b2d00004104470d000b200a28020021070c010b410021070b0240200720096a2210ad220e421e88a70d00200e420286a72207417f4c0d0002400240024002400240024002402007450d00200710ac01220a450d0220100d010c030b4104210a2010450d030b200a20104102746a2111410021124101211341042114200141106a2115412c211641082117200141086a2118415821194154211a4128211b410b211c4118211d4103211e200a211f410021200c030b20074104102a000b410021070c020b410021070c010b410121070b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e020001010b200141086a2802002121412c2123200141106a280200220d450d360c010b02400240024002400240024002400240024020200e050001030405050b024020122006490d002015280200220d20166c220921072018280200222120196a220b210502400340410021082007450d012007201a6a21072005201b6a210c200520166a22222105200c2d0000201e470d000b202220176a2802002207450d002007201b6c21052022280200201d6a2107410021080340200820072d0000456a21082007201b6a2107200520196a22050d000b0b201220086b220820124b0d0603402009450d032009201a6a2109200b201b6a2107200b20166a2205210b20072d0000201c470d000b200520176a28020020084d0d0720052802002008201d6c6a2802082105200341c0056a2008200110e30320032802c405210720032802c0052013460d08201f200720056a3602000b201220136a2112201f20146a221f2011470d0c410021070c420b20212d0000202a470d3b202128020c2207450d3b202128020422702007202b6c6a2171410021720c1f0b412c10262207450d07200741286a41002800e6de44360000200741206a41002900dede44370000200741186a41002900d6de44370000200741106a41002900cede44370000200741086a41002900c6de44370000200741002900bede443700000c350b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020ca01209a01712207209201460d002007209b01470d01208b0121d201410021070c4c0b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c150b034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c190b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1b0b034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1d0b024020c701209201470d00208b0120c801470d390b0340209101209701460d4d200341286a20910110c5032003280228228b01450d4d2091012096016a219101208b01208b01200328022c209b01746a22c801460d000b410321070c490b20c701209201470d28208b0120c801470d380c270b2007209901460d4a2007209d016a21d4010340200728020c450d1020d4012098016a21d40120072098016a2207209901470d000c4b0b0b2007209901460d102007209d016a21d4010340200728020c450d1420d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d2d0c2e0b410121c9012007209901460d102007209d016a21d4010340200728020c450d1520d4012098016a21d40120072098016a2207209901470d000b209901219001208b0121d2012094010d310c480b2007209901460d102007209d016a21d4010340200728020c450d1720d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d270c280b2007209d016a21d40120072098016a2190010c0c0b2007209d016a21d40120072098016a2190010c100b2007209d016a21d40120072098016a2190010c110b2007209d016a21d40120072098016a2190010c130b2007209f016a21d401200720a0016a2190010c080b2007209f016a21d401200720a0016a2190010c0c0b2007209f016a21d401200720a0016a2190010c0d0b2007209f016a21d401200720a0016a2190010c0f0b200720a2016a21d401200720a3016a2190010c040b200720a2016a21d401200720a3016a2190010c080b200720a2016a21d401200720a3016a2190010c090b200720a2016a21d401200720a3016a2190010c0b0b20d401208f016a2190010b410121c901208b0121d201410421070c360b200721900120c701209201470d1b0c1a0b2007219001208b0121d2012094010d1f0c370b200721900120c701209201470d150c140b20d401208f016a2190010b410121ca01410021c9010c020b20d401208f016a2190010b410021ca01410121c9010b208b0122d201218b01200320d40128020022d30136027c200a0d1c0c2f0b20d401208f016a2190010b410021c901410021ca01208b0122d201218b01200320d40128020022d30136027c200a0d190c2d0b20d001220720f4016a21d001200728020021c302200341e0006a21c402200328026421c5020c140b024020d1022d0000220720d302460d000240200720df02460d00200720d702470d2e20d10228020c2207450d2e20d10228020422e102200720e0026c6a21e202410b21720c290b20d10228020421e602200341e0006a21e702200328026421e8020c150b20d10228020c2207450d2c20d10228020422e902200720d4026c6a21ea02410d21720c290b412c10262207450d04200741286a41002800bade44360000200741206a41002900b2de44370000200741186a41002900aade44370000200741106a41002900a2de44370000200741086a410029009ade4437000020074100290092de443700000c310b411e10262207450d04200741166a4100290080df44370000200741106a41002900fade44370000200741086a41002900f2de44370000200741002900eade44370000429e808080e003210e0c310b200341c8056a290300210e200a102320070d314100210a412c2123200d450d350b2021200d20236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c412c216d4201216e4198dfc400216f410121200c040b412c4101102a000b412c4101102a000b411e4101102a000b41002120410121070c350b410121070c340b410321720c120b410421720c120b410521720c120b410621720c120b410521720c120b410621720c120b410721720c120b410821720c120b410721720c120b410821720c120b410921720c120b410c21720c130b410121070c140b410121070c130b410221070c120b410221070c110b410321070c100b410521070c0f0b410621070c0e0b410621070c0d0b410621070c0c0b410621070c0b0b410621070c0a0b410621070c090b410621070c080b410621070c070b410621070c060b410621070c050b410621070c040b410621070c030b410621070c020b410621070c010b410621070b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e0700010203070811110b209401450d3c410121070c390b4100219401410221ca0120930121d301410021930120d201218b01200320d30136027c200a450d39410221070c380b201020d3014d0d07200a20d301209b01746a2802002205450d0d20cc0120cb01470d0320cb012092016a220720cb01490d4c20cb01209201742209200720072009491b22cc01ad20a70186220e20a80188a70d4c200ea72207208e01480d4c20cb01450d0120ce0120cb01209b01742007102722cd010d020c0b0b208b01450d39208b01208f016a21d201410121c701410221c901208b0121d4010c190b2007102622cd01450d090b20cd0121ce0120cd0121cf0120cd0121d0010b20d00120cb01209b01746a20d301360200200341c0056a200328027c22d501200341c8006a10e50320ab0128020021d60120032802c40521d10120032802c00522d701209201460d0420d101280208220720ac014c0d4720d101280200210920d1012d000c210b024002402007450d002007102622080d010c080b410121080b200820092007109404210920d10120ad016a2d000021082003200536029c012003200328027c360298012003208e0136029001200320083a008d012003200b3a008c0120032007360288012003200736028401200320093602800102400240200328027022d801209501460d00200328027421d9010c010b20ae01102622d801450d09410021d90120d80141003b010620d801410036020020d80120aa016a200341c0056a20af011094041a20034100360274200320d8013602700b20cb012092016a21cb010c0b0b410121ca010c010b208b01208f016a21d201410021ca01410221c901410121c701208b0121d401208b01450d100b20d201218b01200320d40128020022d30136027c200a0d110c310b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341b8e4c4003602c0052003200341fc006a3602a003200341b0046a200341c0056a10a20120032902b404220e422088a7210520032802b00421d101200ea721d6010c010b20a90128020021050b20032802702003280274200341f8006a28020010e603024020cc01450d0020cd0110230b0240208c01450d00208c01412c6c218b01208d01210703402007109f012007412c6a2107208b0141546a228b010d000b0b0240200341d4006a280200450d00208d0110230b200020d10136020420004101360200200041086a2005ad42208620d601ad84370200200a450d392010450d39200a1023200424000f0b20074101102a000b20074104102a000b4194034104102a000b41022120410121070c3c0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0e000102060708090c0d0e0f101112120b207020256a22732802002274450d4e2070202c6a2175410021760c420b20d80120aa016a210920d8012f01062208209b01742105417f21070240024002400240024003402005450d0120072092016a2107208e0120ac012092012009280200220b20d5014b1b200b20d501461b220b450d04200520c4016a21052009208f016a2109200b209201460d000b20d9010d010c020b2008210720d901450d010b20d90120ac016a21d90120d8012007209b01746a20ae016a28020021d801410121720c370b200341f0006a20aa016a220520052802002092016a360200200329039801210e20032903900121da0120032903880121db0120032903800121dc0120d8012f0106220520b1014f0d0120d80120aa016a220920072092016a220b209b01746a20092007209b01746a2209200520076b209b01741095041a200920d50136020020d80120a1016a2205200b20b201746a2005200720b201746a220520d80120b0016a22092f010020076b20b201741095041a200520b3016a200e370200200520da01370210200520db01370208200520dc01370200200920092f01002092016a3b010020d701450d230c490b20d801200720b201746a220720a6016a200329039801370200200720bb016a220529020021da012005200329039001370200200720a3016a200329038801370200200720a1016a2207290200210e200720032903800137020020da0120c6018320a70185500d47200e20c50183500d47200ea710230c470b20ae0110262205450d1c2005208e013b01062005208e01360200200520aa016a200341c0056a20af01109404210b200341c0056a20b3016a22dd0120d80120b4016a290200370300200341c0056a209d016a22de0120d80120b5016a29020037030020ab0120d80120b6016a290200370300200320d8012902f4013703c00520d80128022021df01200b20d801209f016a20d80120b0016a22082f010020b7016a2209209b0174109404210b200520a1016a20d80120b8016a200920b20174109404210c200820b0013b0100200520093b0106200341b0046a20b3016a22e00120dd01290300370300200341b0046a209d016a22e10120de01290300370300200341b0046a20aa016a22e20120ab01290300370300200320032903c0053703b00402400240200720b0014b0d0020d80120aa016a220920072092016a220b209b01746a20092007209b01746a220820d80120b0016a22092f010020076b209b01741095041a200820d50136020020d80120a1016a2208200b20b201746a2008200720b201746a220b20092f010020076b20b201741095041a200b20b3016a200e370200200b20da01370210200b20db01370208200b20dc013702000c010b200b200720c1016a2220209b01746a200b200720b7016a2208209b01746a2207200920bc017120086b209b01741095041a200720d501360200200c202020b201746a200c200820b201746a2207200520b0016a22092f010020086b20b201741095041a200720b3016a200e370200200720da01370210200720db01370208200720dc013702000b200920092f01002092016a3b0100200341a0036a20b3016a22e30120e001290300370300200341a0036a209d016a22e40120e101290300370300200341a0036a20aa016a22e50120e201290300370300200320032903b0043703a00320034190026a20b3016a22e60120e30129030037030020034190026a209d016a22e70120e40129030037030020034190026a20aa016a22e80120e501290300370300200320032903a0033703900220d80128020022e901450d0120d8012f010421ea01200521eb010c270b20e30120e60129030037030020e40120e70129030037030020e50120e80129030037030020032003290390023703a00320ea0120bc0171210820e9012f0106220720bd014d0d0220b9011026220b450d1c200b208e013b0106200b208e01360200200b20aa016a200341c0056a20ba01109404210520e901209e016a280200212220dd0120e90120b4016a29020037030020de0120e90120b5016a29020037030020ab0120e90120b6016a290200370300200320e90120bf016a2902003703c005200520e901209f016a20e90120b0016a22202f0100220920b7016a2207209b0174109404218901200b20a1016a20e90120b8016a200720b20174109404218a01200b20ae016a20e90120c0016a200920c1016a220c209b0174109404210d202020b0013b0100200b20073b01060240200c450d0041002107200d210503402005280200220920073b01042009200b3602002005208f016a2105200c20072092016a2207470d000b0b20e00120dd0129030037030020e10120de0129030037030020e20120ab01290300370300200320032903c0053703b00420dd0120e00129030037030020de0120e10129030037030020ab0120e201290300370300200320032903b0043703c0050240024020ea0120bc0171220520b0014b0d0020e90120aa016a220720082092016a220c209b017422096a20072008209b0174220d6a220720202f010022890120086b228a01209b01741095041a200720df0136020020e90120a1016a2207200c20b201746a2007200820b201746a2207208a0120b201741095041a200720b3016a20e3012903003702002007209d016a20e401290300370200200720aa016a20e501290300370200200720032903a00337020020202089012092016a22073b010020e90120ae016a2220200d6a20aa016a202020096a2220200720bc01712209200c6b209b01741095041a202020eb01360200200520094f0d0120e901200d6a20be016a210703402007280200220520082092016a22083b0104200520e9013602002007208f016a210720092008470d000c020b0b208901200820c1016a2209209b017422206a208901200820b7016a2207209b01746a2205200b20b0016a220c2f010020076b209b01741095041a200520df01360200208a01200920b201746a208a01200720b201746a2205200c2f010020076b20b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a003370200200c200c2f01002092016a22053b0100200d2008209b01742289016a20c2016a200d20206a220c200520bc0171220820096b209b01741095041a200c20eb01360200200920084b0d00200b2089016a20c3016a210503402005280200220920072092016a22073b01042009200b3602002005208f016a210520082007470d000b0b20e60120dd0129030037030020e70120de0129030037030020e80120ab01290300370300200320032903c00537039002024020e9012802002207450d0020e9012f010421ea01200721e901202221df01200b21eb01410221720c360b202221df0120b901102622070d010c1d0b2005210b20b90110262207450d1c0b2007208e013b01062007208e01360200200720aa016a200341c0056a20ba01109404210820072003280270220536029403200320032802742092016a3602742005208e013b01042003200736027020052007360200200720072f0106220920b201746a220520a6016a20e601290300370200200520bb016a20e701290300370200200520a3016a20e801290300370200200520a1016a20032903900237020020082009209b01746a20df01360200200720ae016a20092092016a2205209b01746a200b360200200720053b0106200b20053b0104200b200736020020d7010d440c1d0b20e90120aa016a220520082092016a2209209b0174220b6a20052008209b0174220c6a2205200720086b2220209b01741095041a200520df0136020020e90120a1016a2205200920b201746a2005200820b201746a2205202020b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a00337020020e90120b0016a20072092016a22073b010020e90120ae016a2205200c6a20aa016a2005200b6a2205200720bc0171220b20096b209b01741095041a200520eb013602002008200b4f0d4220e901200920ac016a2207209b01746a20be016a210503402005280200220920072092016a22073b0104200920e9013602002005208f016a2105200b2007470d000c430b0b410121c701208b0121c801410421720c330b410221c901209101209701460d02200341186a20910110c5032091012096016a21910120032802182207450d032007228b012007200328021c209b01746a22c801460d22410521070c480b208b0120c801470d2b410121c701208b0121c801410621720c330b410221c901209101209701460d00200341106a20910110c5032091012096016a21910120032802102207450d0120072003280214209b01746a21c8012007218b010c210b2097012191010b208b0121d2012094010d240c470b208b0120c801470d25410821720c310b209101209701460d45200341206a20910110c5032003280220228b01450d452091012096016a219101208b012003280224209b01746a21c8010c1e0b20c402280200220b20ee016a2109200b2f0106220c20f001742105417f210702400240024003402005450d01200720f7016a210720f80120f50120f7012009280200220820c3024b1b200820c302461b2208450d03200520f9016a2105200920f4016a2109200820f701460d000b20c5020d010c090b200c210720c502450d080b20c50220f5016a21c502200b200720f001746a20f6016a21c402410921720c310b200b20fb016a200720fa01746a22c602450d0620c602280218210520c60228021c210720fc01200f36020020fd0120fe013a000020ff012080023a000020810220073602002082022083023a0000208402200f3602002085022086023a000020870220053602002088022089023a0000208a02208b023a0000208c0220f8013a0000208d02208e023b0100208f022090023a000020910220023602002092022083023a0000209302200f3602002094022086023a0000200341c0056a20fb016a22c702200f36020020950220fe013a00002097022098023a0000209a02200736020020ed012083023a00002003200f3602c40520032086023a00c00520c602280208220b20ec016a22c802ad220e209c0288a70d55200e209b0286a7220720f5014c0d5520c60220ee016a21c902024002400240024002402007450d002007102622ca02450d0f20c902280200220b450d020c010b410821ca02200b450d010b410021094100210703400240200720c802470d0020c80220f7016a220520c802490d5b20c80220f701742208200520052008491b2205ad209b0286220e209e0288a70d5b200ea7220820f801480d5b0240024020c802450d0020ca0220c80220f401742008102722ca020d010c0c0b2008102622ca02450d0b0b200521c8020b20ca0220096a2205209d023a0000200520f4016a2007360200200520c2026a200341a0036a20f0016a2d00003a0000200520f7016a20032f01a0033b0000200920ec016a2109200720f7016a22cb022107200b20cb02470d000b20c80220cb026b209d024f0d020c010b410021cb0220c80241006b209d024f0d010b20cb02209d026a220720cb02490d5720c80220f701742205200720072005491b2207ad209b0286220e209e0288a70d57200ea7220520f801480d570240024020c802450d0020ca0220c80220f401742005102722ca020d010c100b2005102622ca02450d0f0b200721c8020b20ca0220cb0220f401746a21cc02200341c0056a21cd020c1e0b20cb02210b024002400240024020cd022d00002205209f026a220820a0024b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020080e2f291c202d2d121d162d1b082d2d0b0a1a2417091319211f0f0e2526031807060d2214230211041e050100152827100c290b20cd022d00012109412b21050c2c0b20cd0241046a280200210720cd02350208210e412a21050c2a0b20cd0241046a280200210720cd02350208210e412521050c290b20cd0241046a280200210720cd02350208210e411d21050c280b20cd0241046a280200210720cd02350208210e412721050c270b20cd0241046a280200210720cd02350208210e412921050c260b20cd0241046a280200210720cd02350208210e412021050c250b20cd0241046a280200210720cd02350208210e411f21050c240b20cd0241046a280200210720cd022d00012109410c21050c240b20cd0241046a280200210720cd02350208210e411421050c220b20cd0241046a2802002107411021050c210b20cd0241046a2802002107410f21050c200b20cd02290308210e413021050c1e0b20cd0241046a280200210720cd02350208210e412121050c1e0b20cd0241046a280200210720cd02350208210e411a21050c1d0b20cd0241046a280200210720cd02350208210e411921050c1c0b20cd0241046a2802002107412f21050c1b0b20cd0241046a280200210720cd02350208210e412621050c1a0b20cd0241046a2802002107410721050c190b20cd0241046a280200210720cd02350208210e411521050c180b20cd0241046a280200210720cd02350208210e412321050c170b20cd022d00012109412c21050c170b20cd022802082209ad220e421e88a70d6b200e420286a72205417f4c0d6b4104210702402005450d00200510262207450d1e0b02402009450d0020cd0241046a28020021052009410274210820072109034020092005280200360200200941046a2109200541046a21052008417c6a22080d000b0b20cd02410c6a350200422086200e84210e410921050c150b20cd0241046a2802002107411321050c140b20cd0241046a280200210720cd02350208210e411e21050c130b20cd0241046a280200210720cd02350208210e411621050c120b20cd0241046a2802002107411121050c110b20cd0241046a2802002107410b21050c100b20cd022d00012109410321050c100b20cd0241046a2802002107410821050c0e0b20cd0241046a280200210720cd02350208210e412821050c0d0b20cd0241046a280200210720cd02350208210e411821050c0c0b20cd022d00012109410421050c0c0b20cd0241046a280200210720cd02350208210e411721050c0a0b20cd0241046a280200210720cd02350208210e412221050c090b20cd0241046a280200210720cd02350208210e412421050c080b20cd0241046a2802002107411221050c070b20cd0241046a280200210720cd02350208210e411b21050c060b20cd0241046a280200210720cd02350208210e411c21050c050b20cd02290308210e412e21050c030b20cd0241046a2802002107412d21050c030b20cd022d00012109410221050c030b0b0b0b20cc0220093a000120cc0220053a000020cc0220ee016a200e37030020cc0220f4016a2007360200200b20f7016a21cb0220cc0220ec016a21cc0220cd0220ec016a22cd0220f301470d1e024002400240024020c80220cb02470d0020c80220f7016a220720c802490d5920c80220f701742205200720072005491b220cad209b0286220e209e0288a70d59200ea7220720f801480d5920c802450d0120ca0220c80220f401742007102722ca020d020c110b20c802210c0c020b2007102622ca02450d0f0b20c80221cb020b20ca0220cb0220f401746a2207208b023a0000200720ee016a20a102290000370000200720032900b004370001200341b0046a20034180016a20a2021094041a20ec0110262205450d072005208b023a0000200341a0036a200341b0046a20a2021094041a20c902280200220720f5014c0d5420c6022802002120410121094101210802402007450d00200710262208450d0b0b200820202007109404210802400240024020070d00410021204101200820071094041a20070d010c020b200710262209450d0d200721202009200820071094041a2007450d010b200810230b200341b0046a200341a0036a20a2021094041a20c60231000d210e200341a0036a200341b0046a20a2021094041a200341b0046a200341a0036a20a2021094041a20034190026a200341b0046a20a2021094041a20ec0110262208450d08200b20f0016a210b20ce0220a3028322ce022007ad84200e20a502868420a60284210e2008208b023a000020081023200341a0036a20034190026a20a2021094041a200341b0046a200341a0036a20a2021094041a024020052d000020a702470d00200528020820a80271450d00200528020410230b2005102320034190026a200341b0046a20a2021094041a200341b0046a20034190026a20a2021094041a20a90220f80136020020ab02200b36020020ad02200c360200200341a0036a2096026a20ca0236020020ae0220f801360200200341a0036a2099026a209b0237020020af02200e370200200341a0036a20ee016a2020360200200320093602a403200320f7013602a003200341b0046a200341a0036a10cc0320034180016a200341b0046a20a2021094041a20c60220f70136021020c60220f201360214024020032d00c00520a702470d0020ef0128020020a80271450d0020032802c40510230b024020ed012d000020a702470d0020b00228020020a80271450d00209a0228020010230b02402097022d000020a702470d00200341c0056a20aa026a28020020a80271450d00200341c0056a20ac026a28020010230b02402095022d000020a702470d0020b10228020020a80271450d0020c70228020010230b02402094022d000020a702470d0020b20228020020a80271450d0020930228020010230b02402092022d000020a702470d0020b30228020020a80271450d0020910228020010230b0240208f022d000020a702470d0020b40228020020a80271450d0020b50228020010230b0240208d022d000020a702470d0020b60228020020a80271450d0020b70228020010230b0240208c022d000020a702470d0020b80228020020a80271450d0020b90228020010230b0240208a022d000020a702470d0020ba0228020020a80271450d0020bb0228020010230b02402088022d000020a702470d0020bc0228020020a80271450d0020870228020010230b02402085022d000020a702470d0020bd0228020020a80271450d0020840228020010230b02402082022d000020a702470d0020be0228020020a80271450d0020810228020010230b024020ff012d000020a702470d0020bf0228020020a80271450d0020c00228020010230b024020fd012d000020a702470d0020c10228020020a80271450d0020fc0128020010230b20ce0220a4028421ce0220f20120f7016a21f20120d00120f101470d140c440b20e10228020c0d3620e10228021021e302200341e0006a21e402200328026421e5020c330b20e702280200220b20d7026a2109200b2f0106220c20d502742105417f21070240024003402005450d01200720da026a210720db0220d80220da022009280200220820e6024b1b200820e602461b2208450d04200520dc026a2105200920d6026a2109200820da02460d000b20e8020d010c420b200c210720e802450d410b20e80220d8026a21e802200b200720d502746a20d9026a21e702410c21720c300b20e9022802182207450d3320e90228021022eb02200720d502746a21ec02410221070c320b200b20de026a200720dd02746a2207450d3e2007280210450d0d20d10220d6026a20072802143602000c3e0b20084108102a000b41c8e4c4004180011021000b20054104102a000b41104108102a000b41104108102a000b20074108102a000b20074101102a000b20074101102a000b20054108102a000b20074108102a000b4194034104102a000b41c4034104102a000b41c4034104102a000b41c8e5c40041351021000b410221200c020b410221200c020b410321200c020b410121070c3d0b410121070c3c0b410121070c3b0b410121720c0c0b410221720c0d0b410321720c0e0b410521720c0f0b410721720c100b410a21720c120b410a21720c120b410021070c200b410121070c1f0b410221070c1e0b410321070c1d0b410421070c1c0b410521070c1b0b410621070c1a0b410621070c190b410621070c180b410621070c170b410621070c160b410621070c150b410621070c140b410621070c130b410621070c120b410621070c110b410621070c100b410621070c0f0b410621070c0e0b410621070c0d0b410021070c010b410121070b0340024002400240024002400240024002400240024002400240024002400240024002400240024020070e03000102020b207620744f0d024101210720752802002076202d74220c6a22052d0000202a470d1120032005202d6a220536029002200a450d0302402010200528020022054d0d00200a2005202e746a2802002209450d12202f200f360200203020313a0000203220333a000020342009360200203520363a00002037200f360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200f360200204720393a00002048200f360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200f3602c40520732802002278207620286a2279490d052073207636020020752802002107200341b0046a202b6a227a2027360200200341b0046a204d6a227b207536020020502007200c6a2208204d6a220b360200200320793602b004200341b0046a202c6a227c20072079202d74227d6a22203602002026200341c0056a3602002003207820796b227e3602b404200b2107024002400240024020082d000022092051460d00410021070340200820076a210502402009206c712052470d002005204f6a280200205371450d002005202d6a28020010230b2007450d0220502005204a6a3602002007204d6a21072005204d6a2d000022092051470d000b200820076a204d6a21070b20072020470d010c020b2005204d6a22072020460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b02400240207e450d00207920702802142207470d012027227f200341c0056a2280016b202d762281010d0b0c100b2075202610e70320502802002207207c280200220b470d110c120b200c2007202d7422076b218201207528020020076a218301200341c0056a2284012027460d0741002185010c0b0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a10a20120032802b0042207450d1c20032902b404210e0c280b20e402280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024003402005450d01200720da026a210720db0220d80220da022009280200220820e3024b1b200820e302461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20e5020d010c160b200c210720e502450d150b20e50220d8026a21e502200b200720d502746a20d9026a21e402410121070c120b200b20de026a200720dd02746a2207450d132007280210450d0420e10220cf026a20072802143602000c130b20eb0222ed0220d6026a21eb0220ed0228020021ee02200341e0006a21ef02200328026421f0020c050b4188dfc400207620741029000b41c6ddc40041cc001021000b41cce3c400104f000b41c8e5c40041351021000b41012185010c020b41042185010c030b410021070c030b410121070c020b410121070c010b410121070b034002400240024002400240024002400240024002400240024020070e020001010b02400240024002400240207b280200228601202d6a2205280200220720786b2081014f0d0020782081016a22092078490d362007202874220b20092009200b491b2209ad206886220e206988a70d36200ea7220b203f480d362007450d012086012802002007202d74200b102722070d020c040b20860128020021070c020b200b10262207450d020b2086012007360200200520093602000b200720792081016a2205202d746a2007207d6a207e202d741095041a200320053602b00420052086012802082207460d0d20762081016a202d742007202d7422076b21870120860128020020076a218801208001207f470d030c020b200b4108102a000b024002400240024002400240024002402085010e050001030406060b2026208401204d6a3602000c010b41002184010b200341a0036a20840110e80320032d00a0032051460d1120830120032903a003370300208301204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240208201450d00208301204d6a218301208201206b6a2182012026280200228401207a280200470d0541012185010c090b207a280200227f20262802002280016b202d76228101450d10410021070c0f0b2026208001204d6a3602000c010b41002180010b200341a0036a20800110e80320032d00a0032051460d0e20880120032903a003370300208801204f6a200341a0036a204f6a290300370300208601204f6a2207200728020020286a360200208701450d0d208801204d6a218801208701206b6a2187012026280200228001207a280200227f460d0441022185010c0a0b20ef02280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024002400240024003402005450d01200720da026a210720db0220d80220da022009280200220820ee024b1b200820ee02461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20f0020d010c030b200c210720f002450d020b20f00220d8026a21f002200b200720d502746a20d9026a21ef0241042185010c0e0b200b20de026a200720dd02746a2207450d002007280210450d0120ed0220072802143602000b20eb0220ec02470d010c140b41c8e5c40041351021000b410221070c110b41002185010c040b41032185010c040b41022185010c040b41032185010c040b410121070c060b410121070c050b410121070c040b410121070c030b410121070c020b410121070c010b410121070c000b0b200341a0036a204f6a2207203f360200200320673703a003200341a0036a202610e70320032802a003222220072802002205202d7422086a210b20032802a403218901202221070240024002400240024002402005450d000240024002400240207b280200220d202d6a2274280200220720032802b404220c20032802b00422056a22206b2008202d7522094f0d00202020096a228a012020490d2e20072028742220208a01208a012020491b2220ad206886220e206988a70d2e200ea7228a01203f480d2e2007450d01200d2802002007202d74208a01102722070d020c050b200d28020021070c020b208a0110262207450d030b200d2007360200207420203602000b2007200520096a2209202d7422206a20072005202d746a200c202d741095041a200320093602b004202221072009200d2802082205460d00200d280200220720206a217420072005202d746a21092022210503402008450d04200341a0036a202e6a22072005206a6a2d00003a0000200320052f00013b01a00320052d0000220c2051460d032005202d6a290200210e2005202c6a28020021202009200c3a00002009202c6a20203602002009202d6a200e37020020032f01a003210c2009206a6a20072d00003a0000200920286a200c3b0000200d204f6a2207200728020020286a3602002008206b6a21082005204d6a220721052009204d6a22092074470d000b0b2007200b460d040c030b208a014108102a000b2005204d6a2207200b470d010c020b200b2207200b460d010b03400240024020072d000022052052460d0020052051470d010c030b2007204f6a280200205371450d002007202d6a28020010230b2007204d6a2207200b470d000b0b208901450d00202210230b20502802002207207c280200220b460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b024020032802b4042207450d00024020032802b004220b207b2802002208204f6a22092802002205460d00200828020022082005202d746a2008200b202d746a2007202d741095041a0b2009200720056a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c40510230b0240204e2d00002052470d00200341c0056a202b6a280200205371450d00207728020010230b0240204b2d00002052470d002054280200205371450d00205528020010230b024020492d00002052470d002056280200205371450d00204828020010230b024020472d00002052470d002057280200205371450d00204628020010230b024020452d00002052470d002058280200205371450d00204428020010230b024020422d00002052470d002059280200205371450d00205a28020010230b024020402d00002052470d00205b280200205371450d00205c28020010230b0240203e2d00002052470d00205d280200205371450d00205e28020010230b0240203c2d00002052470d00205f280200205371450d00206028020010230b0240203b2d00002052470d002061280200205371450d00203a28020010230b024020382d00002052470d002062280200205371450d00203728020010230b024020352d00002052470d002063280200205371450d00203428020010230b024020322d00002052470d002064280200205371450d00206528020010230b024020302d00002052470d002066280200205371450d00202f28020010230b410f21070b200720766a2276207328020022744f0d0a410021070c000b0b20e90220d4026a22e90220ea02460d0b410d2172410621070c090b20e10220e0026a22e10220e202460d0a410b2172410621070c080b20d701450d010b20d601450d0120d1011023410221200c020b410221200c020b410221200c020b410121070c160b410121070c150b410121070c140b2070202b6a22702071460d0d41002172410621070c000b0b41c6ddc40041cc001021000b20d10220d0026a22d10220d202460d0241042120410121070c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360208c01412c6c2107208d0141586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b208c01412c6c2107208d0141606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a22082105200b2d00004104470d000b200828020021070c010b410021070b411021ec01200341c0056a41106a22ed01200341c8006a41106a280200360200410821ee01200341c0056a41086a22ef01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a10c70320cb01450d00410221f00120d00120cb014102746a21f101200720096a21f201200341b0076a21f301410421f401417f21f50141940321f601410121f701410021f801417c21f901410521fa01413421fb01200341a4076a21fc01200341a0076a21fd01411321fe0120034190076a21ff0141d70021800220034184076a21810220034180076a218202412d218302200341f4066a218402200341f0066a2185024112218602200341e4066a218702200341e0066a218802410b218902200341d0066a218a024106218b02200341c0066a218c02200341b0066a218d02418408218e02200341a0066a218f02413721900220034194066a21910220034190066a21920220034184066a21930220034180066a219402200341f0056a2195024120219602200341c0056a41206a21970241d6002198024114219902200341c0056a41146a219a024204219b02421c219c02410f219d024220219e02417e219f02412e21a002200341b7046a21a102418c0121a202428080808080804021a3024280808080808c0121a402422821a5024280808080800c21a602410921a70241ffffffff0321a802200341cc036a21a902412821aa02200341a0036a41286a21ab02412421ac02200341a0036a41246a21ad02200341bc036a21ae02200341ac036a21af02200341d8056a21b002200341f8056a21b10220034188066a21b20220034198066a21b302200341a8066a21b402200341a4066a21b502200341b8066a21b602200341b4066a21b702200341c8066a21b802200341c4066a21b902200341d8066a21ba02200341d4066a21bb02200341e8066a21bc02200341f8066a21bd0220034188076a21be0220034198076a21bf0220034194076a21c002200341a8076a21c102410321c2020c020b024020cc01450d0020cf0110230b200341c0056a20034180016a418c011094041a200341b0046a200341c0056a10c903411021cf02200341b0046a41106a2802002207450d00412c21d00220032802b80422d1022007412c6c6a21d202410a21d302411c21d402410221d502410421d602410821d702417f21d80241940321d902410121da02410021db02417c21dc02410521dd02413421de02410921df02411421e002410421200c020b200341bc046a290200210e20032802b004210720032902b404216920032802602003280264200328026810e603200020cf026a200e370200200041086a20693702002000200736020420004100360200200a450d062010450d06200a1023200424000f0b41032120410121070c0c0b410121070c0b0b42ac808080c005210e0b200a10230b4100210a0b2000200736020420004101360200200041086a200e3702000240200a450d002010450d00200a10230b200141086a280200218b010240200141106a2802002203450d002003412c6c2107208b01210303402003109f012003412c6a2103200741546a22070d000b0b2001410c6a280200450d00208b0110230b200424000f0b202120236a22212024470d010b200341c8006a41106a2207200141106a280200360200200341c8006a41086a228b01200141086a290200370300200320012902003703482007280200228c0120236c2107208b01280200228d0141586a218b010240024003402007450d01200741546a2107208b0141286a2105208b0120236a228e01218b0120052d00004108470d000b200341386a208e0110be0320032802382105200328023c21070c010b410021050b2007410020051b218f01208c01412c6c2107208d0141586a218b01200541a886c50020051b2190010240024003402007450d01200741546a2107208b0141286a2105208b01412c6a228e01218b0120052d0000410a470d000b200341306a208e0110be0320032802302105200328023421070c010b410021050b2007410020051b2109208c01412c6c2107208d0141586a218b01200541a886c50020051b2191010240024003404100218e012007450d01200741546a2107208b0141286a2105208b01412c6a229201218b0120052d00004109470d000b20920128020021930141012194010c010b41002194010b2003420037027441f098c400219501200341f098c400360270411c2196012091012009411c6c6a2197014114219801209001208f0141146c6a2199014104218f0141ff01219a0141012192014102219b0141cf00219c014110219d014120219e014124219f01412821a001413421a101413821a201413c21a30141d00021a40141c80021a50141cc0021a601420221a701422021a801200341cc056a21a901410821aa01200341c0056a41086a21ab01417f21ac01410d21ad0141940321ae01418c0321af01410621b001410b21b101410521b201411821b301418c0221b40141840221b50141fc0121b601417921b70141940221b80141c40321b90141bc0321ba0141c40021bb0141ffff0321bc01410a21bd0141980321be0141f40121bf0141b00321c001417a21c101416c21c20141fc0221c301417c21c40142808080807021c50142ffffffff0f21c601410021c701410021c801410021c901410021ca01410021cb01410021cc01410421cd01410421ce01410421cf01410421d0010c010b410121200c010b410221200c010b410121070c010b410121070c000b0b101d000b101e000bda0502047f017e230041d0006b2203240002400240024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044b0d002002280200220620054103746a2d000522054104460d02200341386a20012002200510d00320032d00384101470d012000200329023c370200200041086a200341c4006a280200360200200341d0006a24000f0b411810262202450d05200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d0320032802201023200341d0006a24000f0b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d020b411810262202450d03200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d00200328022010230b200341d0006a24000f0b200141086a280200210220032007370308024020022007a7470d0020004100360200200341d0006a24000f0b2003412c6a4102360200200341cc006a410236020020034102360224200320023602342003420237023c200341c8d4c4003602382003200341086a3602282003200341346a3602202003200341206a360248200341106a200341386a10a201200041086a200341106a41086a28020036020020002003290310370200200341d0006a24000f0b41184101102a000b41184101102a000bc90301017f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005412c6a4102360200200541cc006a4102360200200541023602242005420337023c200541a4d2c40036023820052005410c6a3602282005200541086a3602202005200541206a360248200541106a200541386a10a201200041086a200541106a41086a28020036020020002005290310370200200541d0006a24000f0b2001280200210220054100360234024020022802080d00200541cc006a4101360200200541023602142005420237023c200541b8d9c4003602382005200541346a3602102005200541106a360248200541206a200541386a10a20120052802202202450d002000200529022437020420002002360200200541d0006a24000f0b200541386a200141186a2202200141286a2203200410d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b200541386a20022003410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b20004100360200200541d0006a24000bc00601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054b0d00200141086a2802002105200228020020064103746a22062802002102024020062d0006450d0020052002460d040b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d000022024104460d0520024105470d01411810262202450d04200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020044298808080800337022420042002360220200441c4006a41013602002004412a36024c20044201370234200441e8d5c4003602302004200441206a3602482004200441c8006a360240200441106a200441306a10a20102402004280224450d00200428022010230b200041013a0000200041046a20042903103702002000410c6a200441106a41086a280200360200200441d0006a24000f0b412b10262202450d02200041013a0000200241276a41002800a2d544360000200241206a410029009bd544370000200241186a4100290093d544370000200241106a410029008bd544370000200241086a4100290083d544370000200241002900fbd444370000200041086a42ab808080b005370200200041046a2002360200200441d0006a24000f0b0240200341ff017122054104460d0020022005460d00200420023a0048200441206a410c6a412b360200200441c4006a41023602002004412b36022420044202370234200441a8d5c4003602302004200441c8006a36022820042004410f6a3602202004200441206a360240200441106a200441306a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441d0006a24000f0b200041003a0000200020023a0001200441d0006a24000f0b02404118102622020d0041184101102a000b2004421837023420042002360230200441306a4100411810db0320042004280238220241186a3602382002200428023022056a411841a6dbc400411810dc0320042004290234370234200420053602304184d1c4004134200441306a10dd03000b412b4101102a000b41184101102a000b20004180083b0100200441d0006a24000ba10601037f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005411c6a4102360200200541cc006a4102360200200541023602142005420337023c200541a4d2c40036023820052005410c6a3602182005200541086a3602102005200541106a360248200541206a200541386a10a201200041086a200541206a41086a28020036020020002005290320370200200541d0006a24000f0b200541386a200141186a2203200141286a410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b2001280200210220054100360220024020022802080d00200541cc006a4101360200200541023602342005420237023c200541b8d9c4003602382005200541206a3602302005200541306a360248200541106a200541386a10a20120052802102202450d002000200529021437020420002002360200200541d0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d03200241016a22062002490d0520024101742207200620062007491b22064100480d052002450d01200328020020022006102722020d020c060b200541cc006a2202410136020020054102360234200520063602302005420137023c200541a0dcc4003602382005200541306a360248200541106a200541386a10a20120052802102201450d032005200529021437021420052001360210200241013602002005412a3602342005420137023c200541e8d5c4003602382005200541106a3602302005200541306a360248200541206a200541386a10a20102402005280214450d00200528021010230b20052802202202450d032000200529022437020420002002360200200541d0006a24000f0b200610262202450d040b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2202200228020041016a3602000b20004100360200200541d0006a24000f0b101e000b20064101102a000bb80401047f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d03200241016a22052002490d0520024101742206200520052006491b22054100480d052002450d01200428020020022005102722020d020c060b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200510262202450d040b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20054101102a000bf70301047f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d0320024101742206200520052006491b22054100480d032002450d0120042802002002200510272202450d020c040b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2005102622020d020b20054101102a000b101e000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bb80401057f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d03200541016a22062005490d0520054101742207200620062007491b22064100480d052005450d01200428020020052006102722040d020c060b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200610262204450d040b2001411c6a2006360200200141186a2004360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20064101102a000bc10301057f230041c0006b220324002003200236020002402001280204220420024d0d00200041003a00002000200128020020026a2d00003a0001200341c0006a24000f0b2001280208417c6a21052001410c6a28020041037421010240024003402001450d012004200541046a2802006a22062004490d02200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a0001200341c0006a24000f0b20032004360204200341306a410c6a41023602002003412c6a4102360200200341023602342003420337021c200341f0dcc4003602182003200341046a360238200320033602302003200341306a360228200341086a200341186a10a201200041013a00002000410c6a200341106a280200360200200041046a2003290308370200200341c0006a24000f0b0240412010262204450d00200041013a0000200441186a41002900e8dc44370000200441106a41002900e0dc44370000200441086a41002900d8dc44370000200441002900d0dc44370000200041086a42a08080808004370200200041046a2004360200200341c0006a24000f0b41204101102a000bf70301057f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d05200541016a22062005490d0320054101742207200620062007491b22064100480d032005450d0120042802002005200610272205450d020c040b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2006102622050d020b20064101102a000b101e000b2001411c6a2006360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bf70301047f230041c0006b22042400200441286a200141186a2205200141286a200210d003024020042d00284101470d002000200429022c370200200041086a200441346a280200360200200441c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d05200241016a22062002490d0320024101742207200620062007491b22064100480d032002450d0120052802002002200610272202450d020c040b2004413c6a2201410136020020044102360214200420063602102004420137022c200441a0dcc4003602282004200441106a360238200441186a200441286a10a20120042802182202450d052004200429021c37021c20042002360218200141013602002004412a3602142004420137022c200441e8d5c4003602282004200441186a3602102004200441106a3602382004200441286a10a2010240200428021c450d00200428021810230b20042802002201450d052000200429020437020420002001360200200441c0006a24000f0b2006102622020d020b20064101102a000b101e000b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20033a0000200141206a2201200128020041016a3602000b20004100360200200441c0006a24000bad0201027f230041106b220224000240024020002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010bad0201027f230041106b220224000240024020002d00004104470d00200128021841a4d3c40041032001411c6a28020028020c11020021010c010b2002200128021841a7d3c40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0d3c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b810101017f0240200041046a280200220320016b20024f0d0002400240200120026a22022001490d0020034101742201200220022001491b22014100480d00024002402003450d0020002802002003200110272202450d010c030b2001102622020d020b20014101102a000b101e000b20002002360200200041046a20013602000b0bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d002000200220011094041a200441e0006a24000f0b2004200441086a36024020042004410c6a360244200441c8006a41146a4100360200200441286a41146a4103360200200441346a4104360200200441106a41146a4103360200200441a886c5003602582004420137024c200441a881c5003602482004410436022c20044203370214200441d480c5003602102004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441286a360220200441106a41e481c5001061000b6c01017f230041306b2203240020032001360204200320003602002003412c6a412d3602002003411c6a410236020020032002360228200341013602242003420237020c2003419083c500360208200320033602202003200341206a360218200341086a41a083c5001061000bf10202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d004101210420062802184184b1c50041a2b1c50020051b4102410120051b2006411c6a28020028020c1102000d0120012000280200200228020c11030021040c010b024020050d0041012104200628021841a0b1c50041022006411c6a28020028020c1102000d01200028020021060b41012104200341013a00102006290210210720062902082108200341346a220541e8b0c50036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b20032008370320200320073703282003200a370340200320093703382003200b3703182003200341086a3602302001200341186a200228020c1103000d00200341306a2802004182b1c5004102200528020028020c11020021040b200041086a20043a00002000200028020441016a360204200341d0006a240020000b820201027f230041106b220224002002200128021841a8b1c50041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0dcc40010de031a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b160020002802002200280200200028020820011099010b110020012000280200200028020810b3010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1102000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001103000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110200450d010c050b0b41f88bc500200220041029000b41b88ac500104f000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1102000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001103000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110200450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110200450d010b200341c0006a240041010f0b200341c0006a240041000bdb39030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a200910be03200328021420014d0d03200328021020014102746a2207450d03200341086a200410be03200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b0130411010262207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010e90320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210ea0320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110ea0320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110ea0320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210ea032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c200141047420121027220f0d140c5c0b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d2f200341306a200341186a2003280234280204220510ea0320032802300d41200341306a200341186a410110ea0320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210ea0320032802300d34200341306a200341186a410110ea0320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110ea032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110ea032003280230450d0d0c2f0b2003200410be032003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810ea0320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d32200341306a200341186a200328023428020410ea0320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210e50320032802304101460d25200341306a200341186a2003280234220528020810ea0320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110ea0320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110ea032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010e90320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010e90320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10ea0320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b20121026220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110ea0320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c1023200341c0006a24000f0b411310262207450d382007410f6a41002800aae644360000200741086a41002900a3e6443700002007410029009be644370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900b5e644370000200741002900aee644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900c4e644370000200741002900bde644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412710262207450d3a2007411f6a4100290090e744370000200741186a4100290089e744370000200741106a4100290081e744370000200741086a41002900f9e644370000200741002900f1e644370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e10262207450d3a200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e10262207450d39200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e10262207450d38200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e10262207450d37200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e10262207450d36200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b412710262207450d352007411f6a41002900dce744370000200741186a41002900d5e744370000200741106a41002900cde744370000200741086a41002900c5e744370000200741002900bde744370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e10262207450d34200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b411710262207450d332007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e10262207450d33200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e10262207450d30200741066a41002900eae744370000200741002900e4e744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e10262207450d2b200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b411710262207450d292007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b411710262207450d282007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b411710262207450d232007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e10262207450d22200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b411710262207450d212007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b41134101102a000b410f4101102a000b410f4101102a000b41f4e7c400200720051029000b41254101102a000b41254101102a000b41104104102a000b41274101102a000b101e000b20124104102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41274101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b200328021c10230b200341c0006a24000b110020002802003502004101200110cc020bbf0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810be0320032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741a886c50020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810be032003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41a886c500200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810be0320032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341d4e1c4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10a2012003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41f7e0c40041dd001021000b41b5e0c40041c2001021000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c200341e4e1c4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a10a201200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b200010232007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b200110232007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d00200610230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002105200110232005450d00024020052802002201450d000340200510232001210520012802002200210120000d000b0b200510230b0b940302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d0120002802002003410474200410272203450d020c040b2000280200210320062005460d040c050b2004102622030d020b20044108102a000b101e000b20002003360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b410021060c010b2001200641106a3602000b2002200610e803024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a2903003703000240024020012802002203200141046a280200460d002001200341106a3602000c010b410021030b200441016a2104200641106a21062002200310e80320022d000041ac01470d000b0b200041086a2004360200200241106a24000bc80903037f017e017f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001450d0020012d00002202417e6a2203412e4b0d01024020030e2f001f233030152019301e0b30300e0d1d271a0c161c242212112829061b0a091025172605140721080403182b2a130f000b20012d00012104410221020c2f0b200041ac013a00000f0b0c2b0b20012d00012104412b21020c2c0b200141046a280200210620013502082105412a21020c2a0b200141046a280200210620013502082105412521020c290b200141046a280200210620013502082105411d21020c280b200141046a280200210620013502082105412721020c270b200141046a280200210620013502082105412921020c260b200141046a280200210620013502082105412021020c250b200141046a280200210620013502082105411f21020c240b200141046a280200210620012d00012104410c21020c240b200141046a280200210620013502082105411421020c220b200141046a2802002106411021020c210b200141046a2802002106410f21020c200b20012903082105413021020c1e0b200141046a280200210620013502082105412121020c1e0b200141046a280200210620013502082105411a21020c1d0b200141046a280200210620013502082105411921020c1c0b200141046a2802002106412f21020c1b0b200141046a280200210620013502082105412621020c1a0b200141046a2802002106410721020c190b200141046a280200210620013502082105411521020c180b200141046a280200210620013502082105412321020c170b20012d00012104412c21020c170b20012802082204ad2205421e88a70d122005420286a72202417f4c0d124104210602402002450d00200210262206450d140b02402004450d00200141046a28020021022004410274210320062104034020042002280200360200200441046a2104200241046a21022003417c6a22030d000b0b2001410c6a3502004220862005842105410921020c150b200141046a2802002106411321020c140b200141046a280200210620013502082105411e21020c130b200141046a280200210620013502082105411621020c120b200141046a2802002106411121020c110b200141046a2802002106410b21020c100b20012d00012104410321020c100b200141046a2802002106410821020c0e0b200141046a280200210620013502082105412821020c0d0b200141046a280200210620013502082105411821020c0c0b20012d00012104410421020c0c0b200141046a280200210620013502082105411721020c0a0b200141046a280200210620013502082105412221020c090b200141046a280200210620013502082105412421020c080b200141046a2802002106411221020c070b200141046a280200210620013502082105411b21020c060b200141046a280200210620013502082105411c21020c050b20012903082105412e21020c030b200141046a2802002106412d21020c030b101d000b20024104102a000b0b0b200020043a0001200020023a0000200041086a2005370300200041046a20063602000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d00411610262201450d01200020013602042001410e6a41002900bee944370000200141086a41002900b8e944370000200141002900b0e944370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b10262201450d0220002001360204200141176a41002800dde944360000200141106a41002900d6e944370000200141086a41002900cee944370000200141002900c6e944370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b41164101102a000b411b4101102a000b41e4e9c400200220031029000bf60201037f230041106b22032400024002402002450d0020032001410010e90320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f10262202450d022000428f808080f00137020420002002360200200241076a41002900a8e944370000200241002900a1e944370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b412510262202450d01200042a5808080d004370204200020023602002002411d6a4100290099e944370000200241186a4100290094e944370000200241106a410029008ce944370000200241086a4100290084e944370000200241002900fce844370000200341106a24000f0b410f4101102a000b41254101102a000be40601087f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841a7b1c50041012001411c6a28020028020c11020021050240024002402003450d002002200036020402400240024020050d00024020012d00004104710d00200241046a200110dc0221044101210620034101460d020c030b41012104200141186a220528020041a5b1c50041012001411c6a28020028020c1102000d002001280200210741012104200241086a41086a41013a0000200241186a411c6a41e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022007360218200241186a41186a200241086a360200200220052902003703082002200141046a28020036021c200241046a200241186a10dc020d00200241306a2802004182b1c5004102200241346a28020028020c11020021040b4101210620034101470d010b4101210020040d020c030b200041046a21002003410274417c6a2103200141186a21072001411c6a210820042105034020022000360204200541ff0171210441012105024020040d000240200128020022044104710d0020072802004184b1c5004102200828020028020c1102000d01200241046a200110dc022105200041046a21002003417c6a22030d020c030b200241086a41086a20063a0000200241186a411c6a220941e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022004360218200241186a41186a2204200241086a360200200220072902003703082002200141046a28020036021c200241046a200241186a10dc020d0020042802004182b1c5004102200928020028020c1102002105200041046a21002003417c6a22030d010c020b200041046a21002003417c6a22030d000b0b410121002005450d010b200241d0006a240020000f0b200141186a28020041a6b1c50041012001411c6a28020028020c1102002100200241d0006a240020000bdd0202027f027e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f55200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000bdb0203027f017e017f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210020034120710d012000ac2204420020047d2000417f4a22001b2000200110cc02210020024180016a240020000f0b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20034180011048000b20004180011048000bd20201037f23004180016b22022400200028020021000240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01834101200110cc02210020024180016a240020000f0b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200102320022003470d140c150b0240200441086a280200450d00200441046a28020010230b0240200441146a2802002200450d00200441186a280200450d00200010230b200441246a280200450d12200441206a280200102320022003470d130c140b0240200441086a280200450d00200441046a28020010230b200441146a280200450d11200441106a280200102320022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d00200028020010230b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200102320022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d00200028020010230b0240200041106a280200450d002000410c6a28020010230b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200102320022003470d100c110b200441086a280200450d0e200441046a280200102320022003470d0f0c100b200441086a280200450d0d200441046a280200102320022003470d0e0c0f0b200441086a280200450d0c200441046a280200102320022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d00200028020010230b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200102320022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200102320022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200102320022003470d080c090b2004410c6a280200450d06200441086a28020010230c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d00200728020010230b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a28020010230b200a411c6a21000240200a41146a280200450d00200a28021010230b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d28020010230b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a28020010230b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a28020010230b2010411c6a21000240201041146a280200450d00201028021010230b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a28020010230b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200102320022003470d050c060b200441086a280200450d03200f280200102320022003470d040c050b200441086a280200450d02200c280200102320022003470d030c040b200441086a280200450d012009280200102320022003470d020c030b200441086a280200450d002006280200102320022003470d010c020b20022003470d000b0b0b0c002000280200200110c2030bb20201027f230041106b2202240002400240200028020022002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470ba41b01037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d01200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0420012802002002200410272203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0720012802002002200410272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2004102622030d070b20044101102a000b2004102622030d070b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a28020020011093030f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d2020024101742204200320032004491b22044100480d202002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1f20024101742204200320032004491b22044100480d1f2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a280200200110930302400240024002400240200141046a280200200141086a2802002202470d00200241016a22032002490d0720024101742204200320032004491b22044100480d072002450d0120012802002002200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041026a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1b20024101742204200320032004491b22044100480d1b2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a2802002001109303200041206a280200200041246a28020020011093030240024002400240024002400240024002400240024002400240024002400240024002400240200041026a2d0000417f6a220041034b0d00024020000e0400040203000b200141046a280200200141086a2802002200470d07200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c1c0b200141046a280200200141086a2802002200470d03200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d0820012802002000200310272202450d090c190b200141046a280200200141086a2802002200470d03200041016a22022000490d1120004101742203200220022003491b22034100480d112000450d0920012802002000200310272202450d0a0c160b200141046a280200200141086a2802002200470d03200041016a22022000490d1020004101742203200220022003491b22034100480d102000450d0a20012802002000200310272202450d0b0c130b200141046a280200200141086a2802002200470d04200041016a22022000490d0f20004101742203200220022003491b22034100480d0f2000450d0d20012802002000200310272202450d0e0c100b200128020021020c160b200128020021020c130b200128020021020c100b200128020021020c150b200128020021020c0c0b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d080b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0520022802002003200510272204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d0820022802002004200310272204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003102722040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005102722040d0a0c0e0b2005102622040d110b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0b0b20034101102a000b200310262204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b200510262204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003102722040d020c070b200228020021040c020b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b101e000b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a2802002002109303200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a280200220020011092032000450d01200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000c020b0b200041086a280200220020011092032000450d00200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000b0b0b2700200028020c200041106a280200100f200041146a350200101a200041186a350200101a00000b080020002001100f0b06002000101b0b06002000101c0b2801017f02402002101b2203450d002003200020022001200120024b1b1094041a2000101c0b20030b1c01017f02402000101b2201450d002001410020001093041a0b20010b7601017f230041c0006b220024002000413336020c200041dc82c500360208200041346a412f360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000b1c00200128021841a8b1c50041052001411c6a28020028020c1102000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d0120002802002003200410272203450d020c040b200028020021030c040b2004102622030d020b20044101102a000b101e000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a200120021094041a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d0120002802002003200410272203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d0320002802002004200310272204450d040c060b200028020021040c060b2004102622030d060b20044101102a000b2003102622040d020b20034101102a000b101e000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a20011094041a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c482c500200241086a10e2032101200241206a240020010b02000b0c0042afd4e7bdc6bbf3dc230b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101103000d010b2002450d012000280218200220032000411c6a28020028020c11020021040b20040f0b41000bd30801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441a886c50041da89c50020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4101360200200441e4006a4101360200200441c8006a41146a4130360200200441d4006a4131360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441d08ac5003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41f88ac5001061000b20042002200320081b360228200441c8006a41146a4101360200200441d4006a4101360200200441306a41146a41033602002004410236024c20044203370234200441e089c5003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41f889c5001061000b200441e4006a4101360200200441c8006a41146a4101360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441888ac5003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a41a88ac5001061000b41b88ac500104f000b830101037f230041206b2202240002400240200028020020011087040d002001411c6a2802002103200128021821042002411c6a4100360200200241a886c5003602182002420137020c200241e08bc50036020820042003200241086a10e203450d010b200241206a240041010f0b200028020420011087042101200241206a240020010b860c03037f017e167f410121020240200128021841272001411c6a2802002802101103000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b2003108604450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641a098c5002107410021084102210941b002210a41f098c500210b41f098c500210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe0371410876211341db9dc50021144100211541022116419f012117419d9ec5002118419d9ec5002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff03712100419f9bc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41db9dc500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241db9dc500470d000b0b41012102200f410171450d0c0c0e0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041bb9fc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41b8a2c500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241b8a2c500470d000b0b41012102200f410171450d0b0c0d0b200820111048000b201141af02108c01000b201520111048000b2011419e01108c01000b41b88ac500104f000b41b88ac500104f000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110300450d000b41010f0b200141186a28020041272001411c6a28020028021011030021020b20020b960201017f0240024002400240024002400240200041ff0f4b0d00200041037641f8ffffff017141a88cc5006a21010c010b0240200041ffff034b0d00200041067641606a220141df074b0d02200141c08ec5006a2d0000220141c9004b0d03200141037441b0a3c5006a21010c010b2000410c7641706a220141ff014b0d03200141a096c5006a2d00004106742000410676413f7172220141ff034b0d0420014180a8c5006a2d0000220141364b0d0520014103744180acc5006a21010b200129030042012000413f71ad86834200520f0b41b8a2c500200141e0071029000b41c8a2c500200141ca001029000b41d8a2c50020014180021029000b41e8a2c50020014180041029000b41f8a2c500200141371029000bb30201037f23004180016b220224000240024002400240200128020022034110710d0020034120710d012000ad4101200110cc02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20004180011048000b20004180011048000b0e0020003502004101200110cc020bc50501077f41002104024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024002400340200620096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210603402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b20002005360204200041013602000f0b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024002400340200220096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210203402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b2000200520046a360204200041013602000f0b2000200520076a20046a360204200041003602000f0b200420031048000b2701017f20002802002201280200200128020420002802042802002000280208280200108304000be104010d7f230041306b2203240002402002450d00200341286a2104200041086a2105200341206a21062003411c6a2107200341246a2108200041046a210902400240024002400340024020052d0000450d00200028020041e4b0c5004104200928020028020c1102000d020b2004410a3602002006428a8080801037030020072002360200200341106a41086a220a41003602002003200236021420032001360210200341086a410a200120021089040240024002400240024020032802084101470d00200328020c210b0340200a200b200a2802006a41016a220b36020002400240200b2008280200220c4f0d002003280214210d2007280200220e200b4f0d010c040b02402003280214220d200b490d00200c41054f0d062003280210200b200c6b220f6a220e2004460d05200e2004200c109604450d050b2007280200220e200b490d030b200d200e490d022003200341106a200c6a41176a2d00002003280210200b6a200e200b6b1089042003280204210b20032802004101460d000b0b200a20072802003602000b200541003a00002002210b0c020b200541013a0000200f41016a210b0c010b200c4104108c01000b2009280200210e2000280200210c0240200b452002200b4672220a0d002002200b4d0d042001200b6a2c000041bf7f4c0d040b200c2001200b200e28020c1102000d010240200a0d002002200b4d0d052001200b6a2c000041bf7f4c0d050b2001200b6a21012002200b6b22020d000c020b0b200341306a240041010f0b200341306a240041000f0b200120024100200b108304000b20012002200b2002108304000b200341306a240041000b02000bfa0101017f230041106b220224002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b02000b0e00200028020020012002108b040b810201017f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b22052400200520012002200320044100109b04200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bc30502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d0020034200510d0120044200510d03200479a7200279a76b220741c0004f0d0241ff0020076b2108200741016a21070c0c0b20044200520d012005450d0520034200510d0d20054200370308200520012003823703000c060b20044200510d0c20014200510d032004427f7c22092004834200510d07200479a7200279a76b2207413f490d090b2005450d012005200137030020052002370308420021010c070b2003427f7c22092003834200510d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa7109a04200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff0071109904200641106a20012002200741ff0071109a04200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bb8b1050100418080c0000badb10518001000240000001d411100170000004002000009000000547269656420746f20736872696e6b20746f2061206c61726765722063617061636974790000000098061100080000000000000020021000020000000000000000000000284311000000000000000000000000003002100006000000000000003802100003000000000000000000000028431100000000000000000000000000500210000e0000000000000028431100000000000000000000000000284311000000000000000000000000005e021000070000000000000068021000020000000000000000000000284311000000000000000000000000007802100006000000000000008002100001000000000000000000000028431100000000000000000000000000880210000900000000000000800210000100000000000000000000002843110000000000000000000000000091021000090000000000000080021000010000000000000000000000284311000000000000000000000000003c07110008000000000000009c02100002000000000000000000000028431100000000000000000000000000ac021000090000000000000028a4100002000000000000000000000028431100000000000000000000000000b50210000b00000000000000ece6100001000000000000000000000028431100000000000000000000000000c00210000600000000000000c802100003000000000000000000000028431100000000000000000007031000090000005bf61000070000005461626c6564000007031000090000005bf6100007000000e65710000e00000045787465726e616c5461626c656453746172746564000000eb0210000f000000fa0210000d0000005061737365640000eb0210000f0000004e6f7450617373656443616e63656c6c65640000eb0210000f0000002f1c11000400000044656c656761746564556e64656c6567617465645665746f65640000f6081100090000000408110004000000e00210000b000000426c6f636b4e756d6265725265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c6173745461626c656457617345787465726e616c44656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d44656d6f6372616379205075626c696350726f7073000000c0041000480000008d0a00000e0000004e6f207075626c69632070726f706f73616c732077616974696e67002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000c00d11000700000000000000c8071000020000000000000000000000f80710000600000000000000000000002808100006000000000000003008100001000000000000000000000048081000060000000000000000000000180e1100040000000000000078081000020000000000000000000000a8081000070000000000000000000000e00810000a0000000000000078081000020000000000000000000000ec0810000700000000000000000000002409100011000000000000003809100004000000000000000000000098091000060000000000000000000000c80910001000000000000000d8091000010000000000000000000000f0091000020000000000000000000000000a100010000000000000006cec1000010000000000000000000000100a1000020000000000000000000000200a100019000000000000006cec10000100000000000000000000003c0a10000200000000000000000000004c0a10000d000000000000005c0a1000010000000000000000000000740a10000100000000000000000000007c0a10001100000000000000900a1000010000000000000000000000a80a1000010000000000000000000000b00a10000d00000000000000c00a1000030000000000000000000000080b1000010000000000000000000000100b100009000000000000001c0b1000010000000000000000000000340b10000500000000000000000000005c0b10000c0000000000000028431100000000000000000000000000680b1000050000000000000000000000900b10000c000000000000001c0b10000100000000000000000000009c0b1000050000000000000000000000c40b10000800000000000000cc0b1000020000000000000000000000fc0b1000050000000000000000000000240c10000a0000000000000028431100000000000000000000000000300c1000050000000000000000000000fc0e1100080000000000000026ee100010000000000000008efd100005000000000000004cfc10001500000008111000280000002843110000000000d31911000b000000de191100080000004211100020000000fc1911000c0000007365636f6e64000000000000fc0e11000800000000000000301110001200000008111000280000002843110000000000d31911000b000000de19110008000000dc36100010000000fc1911000c00000000000000670d100009000000000000003a0d10001800000000000000180e110004000000000000000411100004000000881010004d000000d51010002f0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c00000070726f78795f766f74650000d70f1000540000002b1010003e0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c000000656d657267656e63795f70726f706f736500000000000000fc0e1100080000000000000026ee100010000000000000007f0f11000900000000000000fa0210000d00000000000000c50f10000d00000000000000e30011000e00000000000000d20f10000500000000000000e30011000e000000c60e1000220000002843110000000000e80e100058000000400f1000460000002843110000000000860f10003f000000656d657267656e63795f63616e63656c00000000670d10000900000000000000eb0210000f000000720e100054000000660e10000c00000065787465726e616c5f70726f706f73651a0e10004c000000660e10000c00000065787465726e616c5f70726f706f73655f6d616a6f72697479000000ac0d100056000000020e1000180000007665746f5f65787465726e616c000000000000009f0d10000d00000000000000040f110007000000700d10002f00000063616e63656c5f7265666572656e64756d00000000000000670d100009000000000000003a0d100018000000520d10001500000063616e63656c5f717565756564000000000000002d0d100004000000000000006dfc10001700000000000000310d10000500000000000000266810000c00000000000000360d100004000000000000003a0d100018000000050d1000280000007365745f70726f787900000000000000000d10000500000000000000561c11000c000000da0c1000260000002843110000000000d31911000b000000e619110016000000fc1911000c00000072657369676e5f70726f7879b40c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000072656d6f76655f70726f78798e0c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000064656c656761746500000000780c10000200000000000000561c11000c000000000000007a0c10000a00000000000000840c10000a000000690c10000f0000002843110000000000d31911000b000000e619110016000000fc1911000c000000756e64656c65676174650000580c1000110000002843110000000000d31911000b000000de19110008000000fc1911000c00000020556e64656c656761746520766f74652e2044656c656761746520766f74652e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e776869636877686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d65205363686564756c6520616e20656d657267656e6379207265666572656e64756d2e20546869732077696c6c206372656174652061206e6577207265666572656e64756d20666f7220746865206070726f706f73616c602c20617070726f766564206173206c6f6e6720617320636f756e74656420766f7465732065786365656420607468726573686f6c646020616e642c20696620617070726f7665642c20656e61637465642061667465722074686520676976656e206064656c6179602e204974206d61792062652063616c6c65642066726f6d206569746865722074686520526f6f74206f722074686520456d657267656e6379206f726967696e2e766f74696e675f706572696f6464656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e44656d6f63726163790000000000941610000f000000000000000000000007031000090000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000a416100001000000000000000100000000000000ac1610000b0000000000000000000000b71610002b0000000000000000000000000000000000000000000000000000000000000028431100101810000000000000000000e416100001000000000000000100000000000000ec161000090000000101000000000000070310000900000000000000f51610002100000000000000000000000000000000000000284311001817100000000000000000002817100001000000000000000000000000000000301710000f0000000000000000000000eb0210000f0000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000401710000100000000000000010000000000000048171000090000000000000000000000eb0210000f000000000000000000000000000000000000000000000000000000000000002843110054171000000000000000000064171000010000000000000001000000000000006c171000100000000101000000000000eb0210000f000000000000007c1710002d0000000000000000000000000000000000000028431100881810000000000000000000ac17100001000000000000000000000000000000b41710000d0000000101000000000000e30011000e00000000000000c11710002b0000000000000000000000000000000000000028431100ec1710000000000000000000fc1710000100000000000000010000000000000004181000090000000101000000000000eb0210000f00000000000000ea1b11001100000000000000000000000000000000000000284311001018100000000000000000002018100001000000000000000100000000000000281810000600000001010000000000002e1810001f0000000000000004111000040000000000000000000000000000000000000028431100501810000000000000000000601810000400000000000000010000000000000080181000050000000101000000000000561c11000c00000000000000561c11000c00000000000000000000000000000000000000284311008818100000000000000000009818100002000000000000000000000000000000a81810000b0000000101010000000000561c11000c00000000000000b31810001a0000000000000000000000000000000000000028431100d01810000000000000000000e018100001000000000000000100000000000000e81810001500000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100c419100000000000000000000019100002000000000000000100000000000000101910000c00000000000000000000001c1910001c0000000000000000000000000000000000000000000000000000000000000028431100381910000000000000000000481910000400000000000000000000000000000068191000090000000101000000000000040f1100070000000000000071191000230000000000000000000000000000000000000028431100941910000000000000000000a419100002000000000000000000000000000000b41910000d0000000101000000000000040f110007000000000000002f1c1100040000000000000000000000000000000000000028431100c41910000000000000000000d41910000100000000000000010000005075626c696350726f70436f756e7400441f10003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000241f1000200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29000032000000000000000100000033000000031f1000210000005265666572656e64756d436f756e7400b71e10004c0000004e65787454616c6c7900000032000000000000000100000034000000851e1000320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000581e10002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e32000000000000000100000035000000281e100030000000566f74657273466f7200000032000000000000000100000035000000ff1d100029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642900000032000000000000000100000036000000c01c100058000000181d1000530000006b1d100057000000c21d10003d00000050726f787900000032000000000000000100000036000000521c10004c0000009e1c10002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e2900000032000000000000000100000037000000021c1000500000004c6173745461626c656457617345787465726e616c000000a21b100056000000f81b10000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c642932000000000000000100000038000000b41a1000560000000a1b1000550000005f1b100029000000881b10001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000261a1000540000007a1a10003a00000043616e63656c6c6174696f6e7300000032000000000000000100000036000000dc1910004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e000000703b1100280000009c1f1000440000003f010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e72739c1f1000440000003f0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f7744656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d6164656964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636544656d6f637261637920426c61636b6c6973746e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656470726f706f73616c206e6f7420666f756e64756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e00000000000024221000060000000000000074f510000100000000000000000000002c221000010000000000000000000000342210000e000000000000004422100002000000000000000000000054221000020000000000000000000000642210000c00000000000000e8581000020000000000000000000000702210000100000000000000526577617264000056231000380000004f66666c696e655761726e696e670000f608110009000000821c110003000000c12210005200000013231000430000004f66666c696e65536c6173687822100049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c65646765720000000000000c26100004000000000000001026100003000000000000000000000058261000110000000000000000000000e02610000a00000000000000ec261000010000000000000000000000042710000c00000000000000000000006427100006000000000000006c271000010000000000000000000000842710001700000000000000000000003c28100011000000000000002843110000000000000000000000000050281000100000000000000000000000d02810000800000000000000d8281000010000000000000000000000f02810000b000000000000000000000048291000080000000000000050291000010000000000000000000000682910000b0000000000000000000000c0291000050000000000000028431100000000000000000000000000c82910000b0000000000000000000000202a100009000000000000002c2a1000010000000000000000000000442a10000b00000000000000000000009c2a10000e00000000000000ac2a1000010000000000000000000000c42a10000b00000000000000000000001c2b10001300000000000000302b1000010000000000000000000000482b1000010000000000000000000000502b10000d0000000000000028431100000000000000000000000000602b1000080000000000000000000000a02b10001700000000000000302b1000010000000000000000000000b82b1000010000000000000000000000c02b10001100000000000000d42b1000010000000000000000000000ec2b10000100000000000000626f6e6400000000cf2e10000a000000000000009efd100023000000000000008efd100005000000000000004cfc100015000000000000002e2f10000500000000000000332f100011000000bf37100059000000183810002200000028431100000000003a381000490000002843110000000000d31911000b0000008338100035000000de19110008000000b83810001a0000002843110000000000d23810005b0000002d3910004900000028431100000000007639100041000000b739100069000000203a10005a000000fc1911000c000000626f6e645f6578747261000000000000b13710000e000000000000004cfc100015000000f6361000590000004f3710000e00000028431100000000005d371000540000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000de19110008000000dc36100010000000fc1911000c000000756e626f6e640000000000008efd100005000000000000004cfc10001500000007331000550000005c331000400000009c3310004d0000002843110000000000e9331000520000003b3410003000000028431100000000006b3410004f000000ba3410004f000000093510003f0000002843110000000000d92e100055000000284311000000000048351000260000002843110000000000d31911000b0000006e35100050000000772e100026000000be35100059000000173610005c0000007336100069000000dc36100010000000ec3610000a00000077697468647261775f756e626f6e646564000000fe3010004b0000002843110000000000493110004d00000096311000130000002843110000000000d92e1000550000002843110000000000a93110001b0000002843110000000000d31911000b000000c43110006000000024321000520000007632100033000000a93210005e0000009d2e100032000000fc1911000c00000076616c696461746500000000dd3010000500000000000000e23010001c000000a33010003a0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000006e6f6d696e617465000000007430100007000000000000007b301000280000008b2f1000440000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b000000cf2f10004900000018301000260000003e30100036000000fc1911000c0000006368696c6c000000442f1000320000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000762f1000150000009d2e100032000000fc1911000c0000007365745f7061796565000000000000002e2f10000500000000000000332f100011000000832d10002e0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f636f6e74726f6c6c6572000000000000cf2e10000a000000000000009efd100023000000832d10002e0000002843110000000000b12d1000370000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f76616c696461746f725f636f756e740000000000c5ed10000300000000000000266810000c000000632d100020000000666f7263655f6e65775f657261000000552c10004f000000a42c1000490000002843110000000000d31911000b000000988a100020000000ed2c100045000000322d100031000000fc1911000c0000007365745f6f66666c696e655f736c6173685f677261636500312c1000240000007365745f696e76756c6e657261626c657300000000000000272c10000a00000000000000ea1b110011000000f42b10003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72732053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e202d205472696767657273207468652050687261676d656e20656c656374696f6e2e20457870656e7369766520627574206e6f7420757365722d636f6e74726f6c6c65642e202d20446570656e6473206f6e2073746174653a20604f287c65646765737c202a207c76616c696461746f72737c29602e2054686520696465616c206e756d626572206f662076616c696461746f72732e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e20497420696d706c69657320202060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c20776869636820697320696e6469726563746c79202020757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e203c2f7765696768743e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7220207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686520206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e204e4f54453a20417420746865206d6f6d656e742c20746865726520617265206e6f2066696e616e6369616c207265737472696374696f6e7320746f20626f6e6420287768696368206372656174657320612062756e6368206f662073746f72616765206974656d7320666f7220616e206163636f756e74292e20496e20657373656e63652c206e6f7468696e672070726576656e7473206d616e79206163636f756e74732066726f6d207370616d6d696e6720605374616b696e67602073746f7261676520627920626f6e64696e67203120554e49542e20536565207465737420636173653a2060626f6e645f776974685f6e6f5f7374616b65645f76616c7565602e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b2071656400203b1000480000008d0a00000e0000005374616b696e67204f66666c696e65536c6173685374616b696e67205374616b657273002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000484210000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000584210000100000000000000010000000000000060421000150000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311007842100000000000000000008842100001000000000000000100000000000000904210000d00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100a44210000000000000000000b442100001000000000000000100000000000000642210000c00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100bc4210000000000000000000cc42100001000000000000000100000000000000d4421000110000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000e842100001000000000000000100000000000000f04210000d0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100184510000000000000000000004310000300000000000000010000000000000018431000060000000101000000000000561c11000c00000000000000561c11000c0000000000000000000000000000000000000028431100584310000000000000000000204310000100000000000000000000000000000028431000060000000101000000000000561c11000c000000000000002e431000290000000000000000000000000000000000000028431100584310000000000000000000684310000100000000000000000000000000000070431000050000000101000000000000561c11000c00000000000000332f10001100000000000000000000000000000000000000284311007843100000000000000000008843100001000000000000000100000000000000e01b11000a0000000101010000000000561c11000c00000000000000e23010001c0000000000000000000000000000000000000028431100904310000000000000000000a043100001000000000000000100000000000000a84310000a0000000101010000000000561c11000c00000000000000ea1b1100110000000000000000000000000000000000000028431100184510000000000000000000b443100001000000000000000100000000000000bc431000070000000101000000000000561c11000c00000000000000c3431000240000000000000000000000000000000000000028431100e84310000000000000000000f843100004000000000000000100000000000000184410000e0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002844100001000000000000000100000000000000304410000a00000000000000000000003a441000080000000000000000000000000000000000000000000000000000000000000028431100c0441000000000000000000044441000010000000000000001000000000000004c441000140000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000b44210000100000000000000010000000000000060441000100000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000704410000200000000000000010000000000000080441000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c44100000000000000000009c44100003000000000000000100000000000000b44410000a0000000101000000000000561c11000c00000000000000821c1100030000000000000000000000000000000000000028431100c04410000000000000000000d044100002000000000000000100000000000000e04410000f0000000000000000000000ef4410002800000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002845100002000000000000000100000000000000384510000b00000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311004445100000000000000000005445100001000000000000000100000056616c696461746f72436f756e740000314c10002a0000004d696e696d756d56616c696461746f72436f756e7400000032000000000000000100000039000000e14b10005000000053657373696f6e52657761726450657262696c6c3200000000000000010000003a000000994b1000480000003200000000000000010000003b000000454b1000540000004f66666c696e65536c6173684772616365000000f74a10004e000000496e76756c6e657261626c6573000000234a100056000000794a100053000000cc4a10002b000000426f6e6465640000e3491000400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0032000000000000000100000036000000924910005100000050617965650000003200000000000000010000003600000059491000390000003200000000000000010000003c00000008491000510000004e6f6d696e61746f72730000af481000590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e003200000000000000010000003d000000f247100053000000454810004600000028431100000000008b4810002400000043757272656e74456c65637465640000b34710003f00000043757272656e74457261457261496e64657800009c4710001700000043757272656e7453657373696f6e52657761726443757272656e744572615265776172640f471000560000006547100037000000536c6f745374616b650000003200000000000000010000003e000000934610004c0000002843110000000000df46100030000000536c617368436f756e740000320000000000000001000000340000001f46100057000000764610001d000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e0032000000000000000100000035000000a345100055000000f845100027000000466f7263654e657745726100320000000000000001000000360000005c45100047000000205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e5374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e6720466f7263654e65774572615374616b696e672043757272656e74456c6563746564804e100019000000a04e100048000000bb0100002d0000005374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e672056616c696461746f727368656164206f66205374616b696e67204e6f6d696e61746f727300003f000000280000000400000040000000410000000000000000000000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000004f10004200000060020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72730000004f1000420000006002000001000000636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f74206120636f6e74726f6c6c65726e6f74206120737461736863616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d7074794c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656400a051100048000000b801000023000000a051100048000000b901000023000000795110001c0000005444110018000000ec0300000d0000003051100049000000870200001d000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727330511000490000009d0000003a0000003051100049000000a40000003000000054696d657374616d702055706461746554696d657374616d7020526563656e7448696e74730000004852100031000000795210004b000000790000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e7273dc52100023000000795210004b0000007a0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d626572002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72734765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746154696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e54696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400005754100043000000795210004b000000b2000000040000000053100048000000870a00000a00000054696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564000000000000c85410000a00000000000000d4541000010000000000000000000000ec541000020000000000000066696e616c5f68696e740000000000005972100004000000000000006dfc100017000000fc5410003d000000395510001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e73746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c6964207479706576616c69646174696f6e206572726f7200b05510007c0000002c561000480000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e727300000000245710000b0000000000000028a4100002000000000000000000000030571000010000000000000000000000385710001000000000000000ece6100001000000000000000000000048571000010000000000000000000000505710000c0000000000000064a410000100000000000000000000005c571000010000000000000000000000645710000e0000000000000074571000020000000000000000000000845710000100000000000000566f746572526561706564004058100015000000426164526561706572536c6173686564315810000f00000054616c6c7953746172746564f45710003d00000054616c6c7946696e616c697a65640000e65710000e000000e65710000e0000008c5710005a00000020412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c2072656170657200000000000000dc5810000a00000000000000e8581000020000000000000000000000f8581000010000000000000000000000005910000d00000000000000ece6100001000000000000000000000010591000010000000000000000000000f4a310000800000000000000185910000400000000000000000000003859100001000000000000004e65774163636f756e740000f6081100090000005bf6100007000000835910001b0000005265617065644163636f756e740000006c59100017000000f608110009000000f6081100090000005bf61000070000005bf6100007000000405910002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c726561647920657869737473647572696e6720657865637574696f6e703b110028000000f05910004c0000005f000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e727376657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e42797465466565436f756e63696c205265676973746572496e666f4f6642616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e6365436f756e63696c20416374697665436f756e63696c42616c616e636573204c6f636b73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f776564f05b10004300000055010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e7273004c5c1000330000007f5c10004a000000ad00000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a09090909716564000000000000f46010000d00000000000000046110000300000000000000000000004c6110001800000000000000000000000c6210001300000000000000046110000300000000000000000000002062100006000000000000000000000050621000130000000000000064621000040000000000000000000000c46210000c0000000000000000000000246310000d00000000000000346310000100000000000000000000004c6310000a00000000000000000000009c6310001000000000000000ac631000010000000000000000000000c46310000d00000000000000000000002c6410000e000000000000003c64100003000000000000000000000084641000080000000000000000000000c46410001100000000000000d8641000010000000000000000000000f0641000030000000000000000000000086510000d0000000000000018651000010000000000000000000000306510000400000000000000000000005065100019000000000000006c651000010000000000000000000000846510000200000000000000000000009465100011000000000000006c651000010000000000000000000000a865100002000000000000007365745f617070726f76616c73000000000000004b72100005000000000000005072100009000000000000000b0f110005000000000000003469100012000000000000005972100004000000000000005d72100008000000196e100058000000cd6d1000100000002843110000000000716e100030000000a16e10004a0000002843110000000000eb6e100035000000206f100051000000716f10002c0000009d6f100053000000f06f1000620000005270100060000000b27010001d000000cf70100057000000267110003500000028431100000000005b7110006b000000c67110001d0000002843110000000000d31911000b000000de19110008000000e3711000270000000a72100041000000fc1911000c00000070726f78795f7365745f617070726f76616c7300686d100065000000cd6d1000100000002843110000000000d31911000b000000dd6d10003c000000fc1911000c000000726561705f696e6163746976655f766f74657200000000003f6d10000e00000000000000266810000c000000000000006367100003000000000000009efd100023000000000000004d6d10000900000000000000266810000c00000000000000566d100012000000000000003469100012000000de6b100058000000366c10005c000000926c1000280000002843110000000000ba6c1000450000002843110000000000ff6c1000400000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c000000726574726163745f766f746572000000000000000b0f11000500000000000000266810000c000000db6a10004b0000002843110000000000266b1000420000002843110000000000686b10004f0000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c0000007375626d69745f63616e64696461637900000000d76a10000400000000000000266810000c000000466910001e000000284311000000000064691000440000002843110000000000a869100048000000f069100051000000416a10004c0000008d6a10001e0000002843110000000000d31911000b000000ab6a100018000000c36a100014000000fc1911000c00000070726573656e745f77696e6e65720000000000002669100009000000000000009efd100023000000000000002f69100005000000000000004cfc100015000000000000000b0f11000500000000000000346910001200000032681000590000008b68100068000000f36810001e0000002843110000000000d31911000b000000116910001500000093fb100011000000fc1911000c0000007365745f646573697265645f7365617473000000000000007a6610000500000000000000266810000c0000006667100059000000bf67100052000000116810001500000072656d6f76655f6d656d626572000000000000006367100003000000000000009efd1000230000007f6610004c0000002843110000000000cb6610004800000013671000500000007365745f70726573656e746174696f6e5f6475726174696f6e000000000000007a66100005000000000000006dfc10001700000024661000560000000c661000180000007365745f7465726d5f6475726174696f6e000000b8651000540000000c6610001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d2074686520636f756e63696c2e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e436f6d706163743c7533323e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e28296020607369676e6564602073686f756c642068617665206174206c65617374202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473204c6f636b732074686520746f74616c2062616c616e6365206f662063616c6c657220696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f72206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f20746865206c617374206368756e6b2020207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f20626520637265617465642c20612066656520696e646963617465642062792020205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f727265637420706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e646578436f756e63696c00000000547a10000d0000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100647a10000000000000000000747a1000010000000000000001000000000000007c7a10000a0000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000887a100001000000000000000100000000000000907a1000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000009c7a100001000000000000000100000000000000a47a1000140000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100b87a10000000000000000000c87a100001000000000000000100000000000000d07a10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100dc7a10000000000000000000ec7a100001000000000000000100000000000000f47a1000140000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000087b100001000000000000000100000000000000107b1000130000000000000000000000237b10000900000000000000000000000000000000000000000000000000000000000000284311002c7b100000000000000000003c7b1000020000000000000001000000000000004c7b10000c0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000687b100001000000000000000100000000000000707b10000c0000000000000000000000e30011000e00000000000000000000000000000000000000000000000000000000000000284311007c7b100000000000000000008c7b100001000000000000000100000000000000947b10000c0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a07b100001000000000000000100000000000000a87b10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100b47b10000000000000000000c47b100004000000000000000100000000000000e47b10000d0000000000000000000000f17b10002300000000000000000000000000000000000000000000000000000000000000284311006c7d10000000000000000000147c100004000000000000000100000000000000347c1000090000000000000000000000237b1000090000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000407c100001000000000000000100000000000000487c10000b0000000101000000000000537c100018000000000000006b7c10001100000000000000000000000000000000000000284311006c7d100000000000000000007c7c100005000000000000000100000000000000a47c10000e0000000101000000000000561c11000c00000000000000b27c1000100000000000000000000000000000000000000028431100c09210000000000000000000c47c100002000000000000000000000000000000d47c10000b0000000101000000000000561c11000c00000000000000df7c1000170000000000000000000000000000000000000028431100f87c10000000000000000000087d100001000000000000000000000000000000107d10000600000001010000000000005d7210000800000000000000167d10001900000000000000000000000000000000000000284311006c7d10000000000000000000307d100001000000000000000100000000000000387d10000c00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000447d1000010000000000000001000000000000004c7d10000a00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000587d100001000000000000000100000000000000607d10000a0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311006c7d100000000000000000007c7d100001000000000000000100000000000000847d10000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a47d100001000000000000000100000000000000ac7d10000c0000000000000000000000b87d1000280000000000000000000000000000000000000000000000000000000000000028431100e07d10000000000000000000f07d100001000000000000000000000000000000f87d10000b0000000000000000000000037e1000210000000000000000000000000000000000000000000000000000000000000028431100247e10000000000000000000347e100002000000000000000000000043616e646964616379426f6e6400000032000000000000000100000043000000f586100041000000566f74696e67426f6e640000b386100042000000566f74696e674665650000004c8610006700000050726573656e74536c617368506572566f7465723200000000000000010000004400000009861000430000004361727279436f756e74000032000000000000000100000045000000bc8510004d00000050726573656e746174696f6e4475726174696f6e6d8510004f000000496e6163746976654772616365506572696f64566f7465496e64657832000000000000000100000046000000f1841000680000005985100014000000566f74696e67506572696f6432000000000000000100000047000000c38410002e0000005465726d4475726174696f6e320000000000000001000000480000009d84100026000000446573697265645365617473638410003a0000004465636179526174696f000032000000000000000100000049000000388310004d000000858310003b000000c08310005b0000001b84100048000000416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0b8210005b000000668210005c000000c28210005c0000001e8310001a000000566f7465436f756e74000000c481100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673eaf8010006800000028431100000000001781100059000000284311000000000070811000540000005265676973746572496e666f4f6628566f7465496e6465782c207533322900003a8010005f0000009980100016000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e0000320000000000000001000000360000001980100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00d67f1000430000004e657874566f746572536574977f10003f000000566f746572436f756e7400007d7f10001a00000043616e64696461746573000032000000000000000100000035000000617f10001c00000043616e646964617465436f756e740000320000000000000001000000340000003d7f1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000f57e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e32000000000000000100000033000000447e100067000000ab7e10004a0000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722e2054686520766f746573206172652073746f726564206173206e756d657269632076616c75657320616e642070617273656420696e2061206269742d77697365206d616e6e65722e20496e206f7264657220746f2067657420612068756d616e2d7265616461626c6520726570726573656e746174696f6e2028605665633c626f6f6c3e60292c20757365205b60616c6c5f617070726f76616c735f6f66605d2e20467572746865726d6f72652c206561636820766563746f72206f66207363616c617273206973206368756e6b656420776974682074686520636170206f662060415050524f56414c5f5345545f53495a45602e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f2060636f756e63696c5f73697a65202d316020746f206b6565702074686520636f756e63696c207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e00000000000090871000080000000000000098871000020000000000000000000000c8871000170000000000000000000000808810000b000000000000008c881000030000000000000000000000d48810000d000000000000007472616e736665720000000025ad100004000000000000009efd100023000000000000008efd10000500000000000000f18a100013000000108b1000360000002843110000000000468b100042000000888b100048000000d08b100045000000158c10002d0000002843110000000000428c1000460000002843110000000000d31911000b000000888c10004c000000d48c100033000000078d10005a0000002843110000000000618d1000130000002843110000000000748d100054000000c88d10004b000000138e100035000000488e1000370000007f8e1000560000002843110000000000fc1911000c0000007365745f62616c616e636500000000006367100003000000000000009efd10002300000000000000e98a10000800000000000000f18a10001300000000000000048b10000c00000000000000f18a1000130000003c8910002500000028431100000000006189100048000000a989100042000000eb89100046000000318a10003a00000028431100000000006b8a10002d0000002843110000000000d31911000b000000988a100020000000b88a100031000000fc1911000c00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f66726565436f6d706163743c543a3a42616c616e63653e6e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e42616c616e6365732056657374696e6742616c616e63657300000000000000609210000d00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000007892100001000000000000000100000000000000809210001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000949210000100000000000000010000000000000018bc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000024bc1000010000000000000001000000000000002cbc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000038bc10000100000000000000010000000000000040bc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000054bc1000010000000000000001000000000000005cbc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000080bc1000010000000000000001000000000000009c921000070000000101000000000000561c11000c00000000000000a39210001b0000000000000000000000000000000000000028431100c09210000000000000000000d092100001000000000000000000000000000000d89210000b0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c9310000000000000000000e49210000b0000000000000001000000000000003c9310000f0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c93100000000000000000005c9310000b000000000000000100000000000000b4931000050000000101000000000000561c11000c00000000000000b99310002c0000000000000000000000000000000000000028431100e89310000000000000000000f8931000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e6365005e991000260000004578697374656e7469616c4465706f7369740000299910003500000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e000032000000000000000100000036000000f3981000360000004672656542616c616e63650079961000270000002843110000000000a096100050000000f09610005d0000004d97100055000000a29710004f000000f197100051000000429810001500000028431100000000005798100057000000ae98100045000000526573657276656442616c616e6365003200000000000000010000003e0000002e9410005d0000008b941000270000002843110000000000b29410005b0000000d951000490000002843110000000000569510005d000000b39510002d0000002843110000000000e09510005300000033961000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000032000000000000000100000035000000009410002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e436f756e63696c20566f74696e67506572696f64f09b100039000000a09b100048000000100200002d000000436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e309b100048000000870a00000a000000809b100019000000a09b100048000000bb0100002d000000436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264000000309b1000480000008d0a00000e000000436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e64436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f7465727300002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f6e6f7420656e6f75676820667265652066756e64730000703b110028000000f05b1000430000005501000001000000703b110028000000709c10004400000098000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f73656174732e7273709c100044000000980000000100000042616c616e636573204372656174696f6e46656542616c616e636573205472616e73666572466565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c75656e6f7420612070726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665436f756e63696c20496e6163746976654772616365506572696f64696e76616c69642074617267657420696e646578626164207265706f7274657220696e6465786261642074617267657420696e646578436f756e63696c20566f74696e67426f6e6472657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c6563746564436f756e63696c204465636179526174696f6475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c2050726573656e74536c617368506572566f746572436f756e63696c20566f746572436f756e746e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e64696461746573696e76616c696420766f74657220696e64657877726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e64436f756e63696c204e657874566f746572536574436f756e63696c20566f74696e67466565000014a210001d000000b831110013000000db03000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e00000050a2100043000000ce0a0000250000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962616c6c6f632f7665632e72730050a2100043000000d40a00002c000000746f6f206d616e7920696e737472756374696f6e73436f6e7472616374204163636f756e74436f756e746572436f6e74726163742053746f7261676553697a654f6666736574000000000000f4a310000800000000000000fca3100003000000000000000000000014a410000100000000000000000000001ca410000c0000000000000028a4100002000000000000000000000038a4100001000000000000000000000040a410000a00000000000000180711000100000000000000000000004ca4100001000000000000000000000054a410000f0000000000000064a410000100000000000000000000006ca4100001000000000000000000000074a410000a0000000000000080a4100002000000000000000000000090a41000020000000000000000000000a0a410000800000000000000a8a41000020000000000000000000000b8a4100001000000000000005472616e73666572f608110009000000f6081100090000005bf6100007000000e3a5100055000000496e7374616e746961746564f608110009000000f608110009000000aca5100037000000436f646553746f72656400007ea510002e0000005363686564756c655570646174656400821c1100030000004ea5100030000000446973706174636865640000f6081100090000002f1c110004000000e3a410004e00000031a510001d000000436f6e7472616374f608110009000000181a110007000000c0a410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e44656164206f7220696e6578697374656e74206163636f756e7420686173206265656e206578656d70742061626f76653b2071656464656661756c743a436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e747261637420436f6e7472616374496e666f4f66436f6e7472616374204761735072696365436f6e74726163742052656e7442797465466565436f6e747261637420546f6d6273746f6e654465706f736974436f6e74726163742052656e744465706f7369744f6666736574436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656500000054a710004300000058010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6c69622e72730000000000a0a810000f00000000000000b0a81000010000000000000000000000c8a81000030000000000000000000000e0a810000800000000000000e8a8100002000000000000000000000018a9100002000000000000000000000027221100040000000000000028a9100004000000000000000000000088a91000070000000000000000000000c0a910000600000000000000c8a9100004000000000000000000000028aa10000a000000000000000000000078aa10000f0000000000000088aa1000020000000000000000000000b8aa1000050000000000000000000000e0aa10000a00000000000000ecaa10000400000000000000000000004cab100006000000000000007570646174655f7363686564756c6500000000006eb31000080000000000000076b3100010000000feb210002d00000028431100000000002bb31000430000007075745f636f646500000000bdb010000900000000000000c6b010000f00000000000000fab210000400000000000000181a1100070000006eb2100057000000c5b21000350000000000000025ad100004000000000000009efd100023000000000000008efd100005000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f00000000000000d5b010000400000000000000181a110007000000d9b010004200000028431100000000001bb110004a00000065b110002c00000091b1100046000000d7b110005200000029b2100045000000637265617465000000000000b4b0100009000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f0000000000000029ad1000090000000000000032ad10000b00000000000000d5b010000400000000000000181a1100070000009dae10006a000000284311000000000007af100021000000284311000000000028af10005000000078af100041000000b9af10005b00000014b01000570000006bb010002a00000095b010001f000000636c61696d5f737572636861726765000000000025ad10000400000000000000561c11000c000000000000007fae10000a0000000000000089ae10001400000065ad10005c000000c1ad100045000000284311000000000006ae10004e00000054ae10002b000000726573746f72655f746f00000000000025ad10000400000000000000561c11000c0000000000000029ad1000090000000000000032ad10000b000000000000003dad10000e00000000000000c30011000c000000000000004bad1000050000000000000050ad1000150000007cab1000400000002843110000000000bcab10006f0000002bac10004e00000079ac100064000000ddac10004800000020416c6c6f7773206120636f6e747261637420746f20726573746f7265206120746f6d6273746f6e6520627920676976696e67206974732073746f726167652e2054686520636f6e747261637420746861742077616e747320746f20726573746f72652028692e652e206f726967696e206f66207468652063616c6c2c206f7220606d73672e73656e6465726020696e20536f6c6964697479207465726d73292077696c6c20636f6d70757465206120746f6d6273746f6e652077697468206974732073746f7261676520616e642074686520676976656e20636f64655f686173682e2049662074686520636f6d707574656420746f6d6273746f6e65206d61746368207468652064657374696e6174696f6e206f6e652c207468652064657374696e6174696f6e20636f6e747261637420697320726573746f7265642077697468207468652072656e745f616c6c6f77616e636560207370656369666965642c207768696c6520746865206f726967696e2073656e647320616c6c206974732066756e647320746f207468652064657374696e6174696f6e20616e642069732072656d6f7665642e64657374636f64655f68617368436f6465486173683c543e72656e745f616c6c6f77616e636564656c74615665633c657865633a3a53746f726167654b65793e20416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e6175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c543a3a4761733e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e00000000000018bb1000130000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110000be100000000000000000002cbb1000040000000000000001000000000000004cbb1000100000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc100000000000000000005cbb10000100000000000000010000000000000064bb1000110000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110078bb1000000000000000000088bb10000200000000000000010000000000000098bb10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000a4bb100001000000000000000100000000000000acbb1000110000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000c0bb100007000000000000000100000000000000f8bb10000f0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000008bc10000200000000000000010000000000000018bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000024bc1000010000000000000001000000000000002cbc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000038bc10000100000000000000010000000000000040bc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000054bc1000010000000000000001000000000000005cbc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000080bc10000100000000000000010000000000000088bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110094bc10000000000000000000a4bc100001000000000000000100000000000000acbc10000b0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100c0bc10000000000000000000d0bc100001000000000000000100000000000000d8bc10000d0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100e8bc10000000000000000000f8bc10000100000000000000010000000000000000bd1000080000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110008bd1000000000000000000018bd10000100000000000000010000000000000020bd1000080000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110028bd1000000000000000000038bd10000100000000000000010000000000000040bd10000d0000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110050bd1000000000000000000060bd10000100000000000000010000000000000068bd1000080000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000070bd10000100000000000000010000000000000078bd10000f000000000000000000000076b3100010000000000000000000000000000000000000000000000000000000000000002843110088bd1000000000000000000098bd100001000000000000000100000000000000a0bd10000c000000010100000000000032ad10000b00000000000000181a1100070000000000000000000000000000000000000028431100d8bd10000000000000000000acbd100001000000000000000000000000000000b4bd10000b000000010100000000000032ad10000b00000000000000bfbd1000160000000000000000000000000000000000000028431100d8bd10000000000000000000e8bd100001000000000000000000000000000000f0bd10000e000000000000000000000095d1100003000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000010be10000100000000000000010000000000000018be10000e0000000101000000000000561c11000c0000000000000026be10000f000000000000000000000000000000000000002843110038be1000000000000000000048be10000100000000000000000000005369676e6564436c61696d48616e6469636170002ec4100038000000284311000000000066c4100042000000a8c410001a000000546f6d6273746f6e654465706f736974f9c310003500000053746f7261676553697a654f66667365740000003200000000000000010000003400000080c310004b000000cbc310002e00000052656e74427974654665650033c310004d00000052656e744465706f7369744f6666736574000000bbc1100041000000fcc1100016000000284311000000000012c210005a0000006cc2100056000000c2c210005300000015c310001e0000005375726368617267655265776172640068c1100039000000a1c110001a0000005472616e736665724665650043c11000250000004372656174696f6e466565001cc11000270000005472616e73616374696f6e426173654665650000e5c01000370000005472616e73616374696f6e4279746546656500003200000000000000010000003e000000a2c0100043000000436f6e7472616374466565003200000000000000010000004a00000072c010003000000043616c6c42617365466565543a3a4761730000003200000000000000010000004b00000040c0100032000000437265617465426173654665650000003200000000000000010000004c00000012c010002e000000476173507269636532000000000000000100000044000000f4bf10001e0000004d617844657074683200000000000000010000004d000000c2bf100032000000426c6f636b4761734c696d69740000003200000000000000010000004e00000086bf10003c0000004761735370656e7466bf10002000000043757272656e745363686564756c65003200000000000000010000004f00000041bf1000250000005072697374696e65436f6465e8be100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c65000000320000000000000001000000360000008fbe1000590000004163636f756e74436f756e7465720000320000000000000001000000500000007abe100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000003200000000000000010000003300000050be10002a0000002054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d2073757263686167652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c6179436f6e747261637420436f646553746f72616765636f6465206973206e6f7420666f756e64436f6e7472616374205072697374696e65436f64657072697374696e6520636f6465206973206e6f7420666f756e64000067c710001e00000085c710001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400004dc710001a00000028c710000a00000032c710001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d00000080c610001100000060c610002000000040c610002000000018c61000280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f727420000000acc610001c000000c8c610005a0000004d0000002800000048617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72730000ffffffff46756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320703b11002800000054a71000430000005801000001000000436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e747468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f6465436f6e7472616374205369676e6564436c61696d48616e6469636170436f6e747261637420537572636861726765526577617264496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e7443616e6e6f7420726573746f72652066726f6d20696e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163744f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b546f6d6273746f6e657320646f6e2774206d6174636843616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e7472616374436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e7472616374204372656174654261736546656552657475726e207479706573206c656e6774682073686f756c642062652030206f722031626164206f726967696e3a20657870656374656420746f206265206e6f206f726967696e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e64657854696d657374616d702044696455706461746553797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687400f0ca10002b0000001bcb100044000000f70000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727353797374656d2045787472696e73696344617461008ccb1000300000001bcb100044000000e10000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636bd4cb10004e0000001bcb100044000000e20000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7753797374656d204e756d62657253797374656d2045787472696e73696373526f6f7454696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f6453797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365000000d0cc100019000000f0cc100048000000bb0100002d0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b11002800000050cd100041000000c3000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e727300000050cd100041000000c30000000100000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746173657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564000000703b110028000000983b110050000000370100000900000053797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0000f0ce1000480000008d0a00000e00000053797374656d204576656e747353797374656d204576656e74436f756e7453797374656d204576656e74546f706963730000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000014d0100006000000000000001cd0100001000000000000000000000034d010000100000000000000000000003cd010000e000000000000004cd0100001000000000000000000000064d010000100000000000000000000006cd01000080000000000000074d010000100000000000000000000008cd0100001000000000000000000000094d010000b00000000000000a0d01000010000000000000000000000b8d01000010000000000000000000000c0d010000c00000000000000ccd01000010000000000000000000000e4d01000010000000000000072656d61726b000000000000b3d110000700000000000000181a11000700000098d110001b0000007365745f686561705f706167657300000000000090d11000050000000000000095d110000300000051d110003f0000007365745f636f646500000000c5ed10000300000000000000181a1100070000003fd11000120000007365745f73746f7261676500000000002dd11000050000000000000032d110000d00000012d110001b0000006b696c6c5f73746f7261676500000000081a110004000000000000000ad1100008000000ecd010001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e5665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b53797374656d0000000038d610000c0000000101000000000000561c11000c0000000000000044d6100008000000000000000000000000000000000000002843110084e1100000000000000000004cd610000100000000000000010000000000000054d610000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000064d61000010000000000000000000000000000006cd61000130000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000080d610000100000000000000000000000000000088d61000090000000101000000000000e30011000e00000000000000040f110007000000000000000000000000000000000000002843110038d71000000000000000000094d61000010000000000000001000000000000009cd610000d0000000101000000000000821c11000300000000000000181a1100070000000000000000000000000000000000000028431100acd610000000000000000000bcd6100001000000000000000100000000000000c4d610000e0000000000000000000000d2d61000120000000000000000000000000000000000000000000000000000000000000028431100e4d610000000000000000000f4d610000200000000000000010000000000000004d71000060000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110084e1100000000000000000000cd710000100000000000000010000000000000014d710000a0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000020d710000100000000000000010000000000000028d710000e0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000048d710000100000000000000010000000000000050d7100006000000000000000000000056d710000b000000000000000000000000000000000000000000000000000000000000002843110064d71000000000000000000074d71000010000000000000001000000000000007cd7100006000000000000000000000082d71000230000000000000000000000000000000000000000000000000000000000000028431100a8d710000000000000000000b8d7100001000000000000000100000000000000c0d710000a0000000000000000000000cad710000a0000000000000000000000000000000000000000000000000000000000000028431100d4d710000000000000000000e4d7100001000000000000000100000000000000ecd710000b0000000201010000000000f7d710000200000000000000040f11000700000000000000f9d710002100000000000000284311001cd8100000000000000000002cd810000d00000000000000010000004163636f756e744e6f6e6365543a3a496e64657815de10001f00000045787472696e736963436f756e740000e7dd10002e000000416c6c45787472696e7369637357656967687400a2dd100045000000426c6f636b486173680000007cdd10002600000045787472696e73696344617461000000320000000000000001000000350000002ddd10004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e293200000000000000010000005100000070dc100069000000d9dc1000540000004e756d62657200002edc100042000000506172656e7448617368000012dc10001c00000045787472696e73696373526f6f74000032000000000000000100000052000000cddb1000450000004469676573744469676573744f663c543e0000003200000000000000010000003500000091db10003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000003200000000000000010000003500000069db1000280000004576656e74436f756e744576656e74496e646578320000000000000001000000340000003bdb10002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e00003200000000000000010000003500000094d8100049000000ddd8100025000000284311000000000002d910004b0000004dd910002a000000284311000000000077d9100054000000cbd91000510000001cda100039000000284311000000000055da100053000000a8da100053000000fbda100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e0000000060de1000030000000000000064de10000100000000000000000000007cde100008000000000000007365740000000000f7df10000300000000000000fadf100012000000bcde1000160000002843110000000000d2de10005d0000002fdf10002f00000028431100000000005edf1000630000002843110000000000c1df10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d700000000000000078e110000300000000000000000000007be1100009000000000000000000000000000000000000000000000000000000000000002843110084e11000000000000000000094e11000010000000000000001000000000000009ce110000b00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100a8e110000000000000000000b8e1100001000000000000000000000000000000c0e110000d00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100d0e110000000000000000000e0e110000400000000000000010000000000000000e210000900000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311000ce2100000000000000000001ce210000100000000000000010000004e6f77543a3a4d6f6d656e7432000000000000000100000050000000cbe3100024000000426c6f636b506572696f6400320000000000000001000000360000007ae31000510000004d696e696d756d506572696f640000003200000000000000010000005300000051e210005a000000abe210005a00000005e31000590000005ee310001c0000004469645570646174650000003200000000000000010000003600000024e210002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e3a6865617070616765733a636f646566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e644772616e64706146696e616c697479205374616c6c6564000000703b11002800000060e410003f00000069000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300c0e4100019000000e0e4100042000000520000001f0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e7273576974686472617720686173206265656e20636865636b65642061626f76653b0a09090909676f5f62656c6f775f73756273697374656e63652069732066616c736520616e642073756273697374656e6365203e206578697374656e6369616c5f6465706f7369743b0a0909090971656443616e20776974686472617720616e6420646f6e277420676f2062656c6f772073756273697374656e63654772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c69747920417574686f7269746965734772616e64706146696e616c697479204e657874466f7263656473797374656d696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f6d6f74696f6e736772616e6470617472656173757279636f6e74726163747375646f00000000000000c8e610000500000000000000d0e61000010000000000000000000000d8e61000010000000000000000000000e0e610000a00000000000000ece61000010000000000000000000000f4e61000010000000000000053756469640000002f1c11000400000038e71000180000004b65794368616e6765640000f608110009000000fce610003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e60e410003f00000069000000010000005375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b65796f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f000000000010e610000600000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000f4eb10000400000000000000580000000000000002000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000f8eb100009000000000000005900000000000000000000005a0000000000000000000000000000005b0000000000000000000000020000000000000000000000000000000000000016e6100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f0000000000000000000000000000001de61000080000000000000060000000000000000000000061000000000000000000000000000000620000000000000000000000000000006300000000000000000000000000000025e6100007000000000000006400000000000000000000006500000000000000000000000000000066000000000000000000000000000000670000000000000000000000000000002ce610000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b00000000000000000000000000000033e6100009000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f0000000000000000000000000000003ce61000070000000000000070000000000000000000000071000000000000000000000000000000720000000000000000000000000000007300000000000000000000000000000043e610000f0000000000000074000000000000000000000075000000000000000000000000000000760000000000000000000000000000007700000000000000000000000000000001ec1000100000000000000058000000000000000200000000000000000000000000000000000000780000000000000000000000020000000000000000000000000000000000000052e6100007000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c00000000000000000000000000000059e6100008000000000000007d00000000000000000000007e0000000000000000000000000000007f0000000000000000000000000000008000000000000000000000000000000061e61000080000000000000081000000000000000000000082000000000000000000000000000000830000000000000000000000000000008400000000000000000000000000000069e61000040000000000000085000000000000000000000086000000000000000000000000000000870000000000000000000000000000008800000000000000000000006175726174696d657374616d7066696e616c6974795f747261636b65720000000000000069e6100004000000000000006cec100001000000000000000000000084ec1000090000000000000000000000ccec10000700000000000000d4ec1000010000000000000000000000ecec1000090000000000000000000000fc0e1100080000000000000026ee100010000000c8ed10004e000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000016ee100010000000fc1911000c0000007365745f6b65790000000000c5ed100003000000000000009efd10002300000034ed10005d000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c0000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e202d204e6f204442207772697465732e426f783c543a3a50726f706f73616c3e00000000000090ee1000030000000000000000000000561c11000c000000000000000000000000000000000000000000000000000000000000002843110094ee10000000000000000000a4ee10000100000000000000010000004b65790032000000000000000100000089000000acee1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e5375646f0000000000000000ef1000120000000000000014ef10000100000000000000000000002cef100001000000000000007265706f72745f6d69736265686176696f720000000000004def10000700000000000000181a11000700000034ef100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f727400000000b4f010000b0000000000000000000000bff01000230000000000000000000000000000000000000000000000000000000000000028431100e4f010000000000000000000f4f0100001000000000000000100000000000000fcf010000d000000000000000000000009f1100023000000000000000000000000000000000000000000000000000000000000002843110070f1100000000000000000002cf110000100000000000000000000000000000034f110000a0000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000040f110000100000000000000000000000000000048f110000700000000000000000000004ff1100020000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000080f11000010000000000000000000000417574686f7269746965735665633c28417574686f7269747949642c20417574686f72697479576569676874293e0000320000000000000001000000350000000cf210001b00000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723edbf11000310000004e657874466f726365640000acf110002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229003200000000000000010000003600000088f110002400000020607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205468652063757272656e7420617574686f72697479207365742e4772616e64706146696e616c6974794e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165647375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d40100000046524e4b99f310000d0000007ef310001b0000003cf31000420000001e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b0000b0f3100010000000696e697469616c697a655f626c6f636bc8f310000f0000006170706c795f65787472696e73696300e0f3100013000000696e686572656e745f65787472696e7369637300fcf310000f000000636865636b5f696e686572656e74730014f410001400000076616c69646174655f7472616e73616374696f6e30f410000f0000006f6666636861696e5f776f726b65720048f41000160000006772616e6470615f70656e64696e675f6368616e6765000068f41000150000006772616e6470615f666f726365645f6368616e6765000000000000009806110008000000000000005cf5100001000000000000000000000064f510000100000000000000000000006cf51000080000000000000074f510000100000000000000000000007cf5100001000000000000000000000084f5100007000000000000008cf51000030000000000000000000000a4f51000010000000000000000000000acf51000050000000000000074f51000010000000000000000000000b4f51000010000000000000000000000bcf51000080000000000000074f51000010000000000000000000000c4f5100001000000000000006d0911000d0000009cf610000e0000005370656e64696e675bf610000700000062f610003a00000041776172646564006d0911000d0000005bf6100007000000f6081100090000003bf61000200000004275726e7400000018f6100023000000526f6c6c6f766572ccf510004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e42616c616e6365205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e547265617375727920506f7454726561737572792050726f706f73616c73703b110028000000e0f61000430000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e727300e0f61000430000006b000000010000004469676573744974656d206e6f7420657175616c00f81000480000008d0a00000e00000090f7100019000000b0f7100047000000e20000000a00000090f7100019000000b0f7100047000000df0000000a0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e72730000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000024f910000d0000000000000034f9100002000000000000000000000064f91000090000000000000000000000acf910000700000000000000b4f91000010000000000000000000000ccf91000010000000000000000000000d4f910000900000000000000e0f9100004000000000000000000000040fa100001000000000000000000000048fa10000f0000000000000058fa100001000000000000000000000070fa1000070000000000000000000000a8fa1000100000000000000058fa1000010000000000000000000000b8fa1000080000000000000070726f706f73655f7370656e64000000000000008efd100005000000000000004cfc1000150000000000000093fd10000b000000000000009efd100023000000bcfc10004b00000007fd10004d00000054fd1000150000002843110000000000d31911000b000000de191100080000007afb10001900000069fd100025000000fc1911000c0000007365745f706f740000000000b5fc100007000000000000004cfc10001500000088fc10002d000000636f6e666967757265000000000000001afc10000d0000000000000027fc1000100000000000000037fc100015000000000000004cfc1000150000000000000061fc10000c000000000000006dfc1000170000000000000084fc1000040000000000000027fc100010000000fefb10001c00000072656a6563745f70726f706f73616c0000000000f3fb10000b00000000000000100f110016000000a4fb10003f0000002843110000000000d31911000b000000de191100080000007afb100019000000e3fb100010000000fc1911000c000000617070726f76655f70726f706f73616cf8fa1000570000004ffb10002b0000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e202d204c696d697465642073746f726167652072656164732e202d204f6e65204442206368616e67652e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e202d204f6e6520444220636c6561722e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d436f6d706163743c42616c616e63654f663c543e3e7370656e645f706572696f64436f6d706163743c543a3a426c6f636b4e756d6265723e6275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e76616c756562656e65666963696172793c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263655472656173757279000000000000008c0011000c000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000a000110002000000000000000100000000000000b0001100130000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c0111000000000000000000d000110001000000000000000100000000000000d80011000b0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100f4001100000000000000000004011100010000000000000001000000000000000c01110004000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000100111000100000000000000010000000000000018011100030000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c01110000000000000000002c01110001000000000000000100000000000000041211000d00000000000000000000006d0911000d00000000000000000000000000000000000000000000000000000000000000284311003401110000000000000000004401110001000000000000000100000000000000881111000900000001010000000000006d0911000d000000000000004c01110024000000000000000000000000000000000000002843110070011100000000000000000080011100010000000000000000000000000000008801110009000000000000000000000091011100120000000000000000000000000000000000000000000000000000000000000028431100a40111000000000000000000b401110001000000000000000100000050726f706f73616c426f6e645065726d696c6c002d03110055000000820311004400000050726f706f73616c426f6e644d696e696d756d42616c616e63654f663c543e00db021100520000005370656e64506572696f64543a3a426c6f636b4e756d6265720000003200000000000000010000008a000000b9021100220000004275726e7502110044000000506f74003200000000000000010000003e000000420211003300000032000000000000000100000034000000190211002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e32000000000000000100000036000000fa0111001f000000417070726f76616c735665633c50726f706f73616c496e6465783e0032000000000000000100000035000000bc0111003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e5472656173757279205370656e64506572696f64000020041100390000006004110048000000100200002d000000547265617375727920417070726f76616c735472656173757279204275726e00000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727300f8100048000000870a00000a00000050726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465782f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e352e312f7372632f636f6465632e727300000000000000980611000800000000000000a0061100040000000000000000000000c0061100020000000000000000000000d00611000500000000000000d8061100050000000000000000000000000711000200000000000000000000001007110008000000000000001807110001000000000000000000000020071100010000000000000000000000280711000b0000000000000018071100010000000000000000000000340711000100000000000000000000003c071100080000000000000044071100020000000000000000000000540711000100000000000000000000005c0711000e00000000000000440711000200000000000000000000006c071100010000000000000050726f706f736564f6081100090000006d0911000d0000000408110004000000ff0811000b0000000a091100530000005d09110010000000566f746564000000f60811000900000004081100040000002f1c110004000000ff0811000b000000ff0811000b0000006e08110042000000b008110046000000417070726f76656404081100040000003d08110031000000446973617070726f766564000808110035000000457865637574656404081100040000002f1c110004000000c3071100410000004d656d62657245786563757465640000740711004f00000020412073696e676c6520636f756e63696c6c6f722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e486173682041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4163636f756e7449644d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578000000000000a80911000f00000000000000b8091100020000000000000000000000c809110004000000000000004e65774163636f756e74496e64657800f608110009000000630a11000c000000e80911002200000028431100000000000a0a1100410000004b0a1100180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578496e76616c6964206f726967696e496e646963657320456e756d536574b00a110019000000d00a110048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000300b1100420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e72730000703b1100280000008c0b1100460000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e72730000dc0b11002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a200000100c1100230000005f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e00300b1100420000004a000000010000008c0b1100460000006b00000001000000cd0c110036000000320511005b000000bc01000005000000000000000000000000000000900c11003d000000320511005b000000c301000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b207165640000000000880d11000700000000000000900d1100010000000000000000000000a80d1100030000000000000000000000c00d11000700000000000000c80d1100020000000000000000000000f80d1100040000000000000000000000180e110004000000000000001c0e1100030000000000000000000000640e11000400000000000000657865637574650000000000fc0e110008000000000000009c0f11001b000000b70f1100400000002843110000000000f70f11002100000070726f706f736500000000007f0f11000900000000000000880f11001400000000000000fc0e110008000000000000009c0f11001b000000d31911000b0000002d0f110024000000510f11002e000000fc1911000c000000766f746500000000fc0e11000800000000000000040f110007000000000000000b0f11000500000000000000100f11001600000000000000260f110007000000000000002f1c110004000000d31911000b000000840e110023000000a70e110055000000fc1911000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e70726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e7468726573686f6c64436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d206120636f756e63696c6f72207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d757374206265206120636f756e63696c206d656d6265722e436f756e63696c4d6f74696f6e7300000000000088111100090000000000000000000000911111000c0000000000000000000000000000000000000000000000000000000000000028431100a81311000000000000000000a011110001000000000000000100000000000000a81111000a0000000101000000000000040f11000700000000000000b2111100160000000000000000000000000000000000000028431100ec1111000000000000000000c811110001000000000000000000000000000000d0111100060000000101000000000000040f11000700000000000000d6111100130000000000000000000000000000000000000028431100ec1111000000000000000000fc11110001000000000000000000000000000000041211000d0000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000001412110001000000000000000100000050726f706f73616c735665633c543a3a486173683e0000008e1211002400000050726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c5b12110033000000566f74696e67566f7465733c543a3a4163636f756e7449643e000000320000000000000001000000360000002e1211002d00000050726f706f73616c436f756e740000001c121100120000002050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e6469636573000000000000006c1311000b0000000000000000000000771311000f00000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000009813110001000000000000000100000000000000a0131100070000000101000000000000771311000f00000000000000ea1b1100110000000000000000000000000000000000000028431100a81311000000000000000000b81311000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e646578000032000000000000000100000034000000d61311001f000000456e756d5365740032000000000000000100000035000000c0131100160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d536574436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67000000cd0c110036000000320511005b000000f00100000500000000000000000000000000000000000000320511005b000000f70100000500000070726f706f736572206e6f74206f6e20636f756e63696c6475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564436f756e63696c4d6f74696f6e732050726f706f73616c4f66436f756e63696c4d6f74696f6e732050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f74206f6e20636f756e63696c6d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f72656440151100480000008d0a00000e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d69742062792070726963650000e4151100340000001816110044000000a50000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f657865632e72733200000000000000010000008b0000008c0000008d0000008e0000008f0000009000000041757261204c61737454696d657374616d704175726120417574686f72697469657353657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f720000e0161100190000000017110048000000bb0100002d000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c0000009417110022000000b61711003f000000f8000000030000004175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e72730000001018110028000000b61711003f000000fe000000030000004f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e000000006418110008000000000000006c1811000200000000000000000000009c1811000a000000000000007365745f6b65797300000000081a110004000000000000000c1a11000700000000000000131a11000500000000000000181a110007000000ec1811003900000025191100480000006d1911003100000028431100000000009e191100350000002843110000000000d31911000b000000de19110008000000e619110016000000fc1911000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e2023203c7765696768743e202d204f2831292e202d204f6e6520657874726120444220656e7472792e2023203c2f7765696768743e6b657973543a3a4b65797370726f6f665665633c75383e53657373696f6e000000000000e01b11000a0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100941c11000000000000000000fc1b110001000000000000000100000000000000041c11000c00000000000000000000000f3e11000c0000000000000000000000000000000000000000000000000000000000000028431100101c11000000000000000000201c110001000000000000000100000000000000281c11000700000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100341c11000000000000000000441c1100010000000000000001000000000000004c1c11000a0000000101000000000000561c11000c000000000000000c1a1100070000000000000000000000000000000000000028431100641c11000000000000000000741c1100010000000000000000000000000000007c1c1100060000000101000000000000821c11000300000000000000851c11000e0000000000000000000000000000000000000028431100941c11000000000000000000a41c110001000000000000000100000056616c696461746f72735665633c543a3a4163636f756e7449643e00401d11001f00000043757272656e74496e64657832000000000000000100000034000000221d11001e0000004368616e676564626f6f6c0032000000000000000100000036000000f41c11002e0000004e6578744b6579466f72543a3a4163636f756e744964000032000000000000000100000036000000d01c1100240000004163746976657533325665633c4f70617175654b65793e0032000000000000000100000035000000ac1c11002400000020546865206b6579732074686174206172652063757272656e746c79206163746976652e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e205472756520696620616e797468696e6720686173206368616e67656420696e20746869732073657373696f6e2e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e53657373696f6e204368616e67656472656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656500009100000018000000040000009200000093000000940000009500000096000000970000006e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665654d6f64756c65206973206e6f742076616c696443616e2774206465636f6465207761736d20636f6465756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e73657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e656452657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c63616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646465706c6f796578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e742074797065000000292511001c000000b423110044000000b4000000030000000525110024000000b423110044000000bd00000003000000cd24110038000000b423110044000000fb0000002a000000a524110028000000b423110044000000fc000000320000007d24110028000000b423110044000000fe0000002c000000512411002c000000b423110044000000fd0000004c0000001f24110032000000b4231100440000003701000003000000f823110027000000b4231100440000003f010000040000008c23110028000000b423110044000000450100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e53657373696f6e2043757272656e74496e646578696e76616c6964206163636f756e7420696e646578626164207369676e617475726520696e2065787472696e7369634e6f6e2d656d7074792066756e6374696f6e20626f6479206578706563746564662611000f00000075261100020000007726110003000000d825110030000000082611005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2070726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646475706c6963617465206b65792070726f766964656453657373696f6e204163746976654552524f523a2061637469766520646f65736e277420636f6e7461696e206f7574676f696e67206b65796578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000fc29110047000000432a110005000000c029110037000000f7291100050000008d291100170000008429110009000000d62b1100140000006c291100180000008429110009000000d62b1100140000003c2911001d0000005929110013000000a458110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e79537065636966696300980000000400000004000000990000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065582a110018000000702a11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000b82a110017000000cf2a11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000f02a110007000000537461636b3a2000000001007a2b110024000000502b110006000000562b11000e000000642b1100160000002c2b110024000000502b1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000b02b110026000000d62b110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e6774682032812c110007000000aa2c11000b000000812c110007000000882c1100220000004e6f6e20636f6e7374616e74206f70636f646520696e20696e6974206578707245787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c2020646f65736e277420657869737473206f72206e6f742079657420646566696e6564206973206d757461626c65000000c82c110010000000d82c11000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300f82c11000f000000d82c11000f0000005461626c6520617420696e64657820002931110012000000d82c11000f000000282d11000e000000d82c11000f0000005479706520617420696e646578200000962d110010000000d82c11000f000000682d110010000000882d11000e000000682d110010000000782d110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b2065787065637465640000d02d110020000000f02d110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f766500282e110015000000657863656564656420737461636b206c696d6974200000009800000004000000040000009a0000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765882e110022000000aa2e110015000000bf2e110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c7366756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473d02f1100650000002301000017000000a02f11002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a2000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a0909090971656429311100120000003b3111000f000000fc3011000a00000006311100140000001a3111000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173603111005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300e43111001c000000b831110013000000c604000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e183211001e000000b831110013000000b303000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e0000fd321100120000000f3311000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e640000103411006c000000c8000000110000000000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e64730000000035110048000000870a00000a0000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273556e726561636861626c654e6f70426c6f636b009800000004000000040000009b0000004c6f6f704966456c7365456e64427200980000000400000004000000040000004272496642725461626c65009800000004000000040000009c00000052657475726e43616c6c43616c6c496e64697265637400009800000004000000040000009d00000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e7374009800000004000000040000009e000000493634436f6e73749800000004000000040000009f000000463332436f6e7374463634436f6e73749800000004000000040000002200000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324636345265696e74657270726574493634547261696c696e6744617461556e6578706563746564456f66496e76616c69644461746100243b11000b000000492f4f204572726f723a2049333249363446333246363456616c7565980000000400000004000000990000004e6f526573756c74703b110028000000983b1100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273703b110028000000983b110050000000900000000900000061757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e6474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e000000000000010000000200000004000000080000001000000000000000ec3c11000e00000000000000fc3c1100010000000000000000000000043d110001000000000000004e6577417574686f7269746965730000303d1100170000000c3d110024000000204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20753634293e0000000000743d11000a00000000000000803d1100010000000000000000000000883d110002000000000000004e657753657373696f6e00000f3e11000c000000983d110055000000ed3d110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e6465780000000000743e1100100000000000000028431100000000000000000000000000843e11000100000000000000000000008c3e11000f00000000000000284311000000000000000000000000009c3e1100010000000000000045787472696e73696353756363657373b93e11002500000045787472696e7369634661696c656400a43e11001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c00000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e7273f03e110019000000103f1100500000005800000022000000903f110019000000b03f110048000000570100002a000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e72736578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6700006c4011002d000000994011000c000000a540110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20b04011003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e6774687354441100180000004b080000090000000c411100110000001d41110017000000ec020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273d0411100460000006301000013000000980000000400000004000000a0000000a1000000a20000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f720028431100000000008058110002000000b041110015000000e7030000050000007372632f6c6962636f72652f726573756c742e727300000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f666d742f6d6f642e727301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020202020202020202020202020202020202020202020303030303030303030303030303030304040404040000000000000000000000000038431100200000005843110012000000320000000000000001000000a3000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900006c4411000600000072441100220000005444110018000000090a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820b444110016000000ca4411000d00000054441100180000000f0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d009e4511000b0000001a58110016000000d7441100010000008845110016000000e107000009000000f85711000e00000006581100040000000a58110010000000d7441100010000008845110016000000e507000005000000b85711002b000000e3571100150000005b010000150000009e4511000b000000a945110026000000cf45110008000000d745110006000000d7441100010000008845110016000000f2070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f6620600000002646110002000000104611001600000054040000110000001046110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20b05111004a0000000054110000020000005611003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e8592905111002000000027000000190000009051110020000000280000002000000090511100200000002a0000001900000090511100200000002b0000001800000090511100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f720000002843110000000000e3571100150000000c0400000500000020202020a40000000c00000004000000a5000000a6000000a70000003a202c0a2c200000980000000400000004000000a8000000a9000000aa000000280a282c290a5d5b4572726f72008ae202046e616d650181e2029c04000c6578745f74776f785f31323801146578745f6765745f73746f726167655f696e746f020e6578745f626c616b65325f32353603116578745f636c6561725f73746f72616765040f6578745f7365745f73746f7261676505166578745f73616e64626f785f6d656d6f72795f6e6577061b6578745f73616e64626f785f6d656d6f72795f74656172646f776e07176578745f73616e64626f785f696e7374616e746961746508126578745f73616e64626f785f696e766f6b65091d6578745f73616e64626f785f696e7374616e63655f74656172646f776e0a1f6578745f6765745f616c6c6f63617465645f6368696c645f73746f726167650b156578745f7365745f6368696c645f73746f726167650c176578745f636c6561725f6368696c645f73746f726167650d166578745f6b696c6c5f6368696c645f73746f726167650e166578745f73616e64626f785f6d656d6f72795f6765740f0e6578745f7072696e745f7574663810166578745f73616e64626f785f6d656d6f72795f73657411126578745f737232353531395f76657269667912126578745f656432353531395f76657269667913166578745f6368696c645f73746f726167655f726f6f7414196578745f6765745f616c6c6f63617465645f73746f7261676515106578745f73746f726167655f726f6f7416186578745f73746f726167655f6368616e6765735f726f6f74170d6578745f7072696e745f68657818106578745f636c6561725f70726566697819236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f741a0d6578745f7072696e745f6e756d1b0a6578745f6d616c6c6f631c086578745f667265651d48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303066616135336238376530653661621e34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68363534333630666363653539333038361f3b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6866623261623538306438366130353931204e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864336433333837396635363662373062212e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a6866343337386339613663343034313036223873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6862366265373730623536363037303262230e5f5f727573745f6465616c6c6f632430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832373532316332623635333961663462253d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835323730333337313965616561396439260c5f5f727573745f616c6c6f63270e5f5f727573745f7265616c6c6f63284e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68333162333430633638356463353561372936636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68346631303163306137313663303262662a08727573745f6f6f6d2b8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a68653338646664303539333431636136652c4073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a68633431353362653330353734666463382d3f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a68333833386466623938633032323536302e3d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a68353766336365383464336137636238302f796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a683433396135666231626132393631376230a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864316238313536383831333534326562313573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6834643363623566353064323239656164323d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68653062633364306533383933643731643380023c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68353930353032663038313161616131613486013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a6862633164313832343832613636613633353e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a686261613031663936316563346463613036ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6834666234646432626135653563343161374e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866366335393132386261393533653036383d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6863333463353730393734326433353766397c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68353336663137633665353765313237373a3c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68316663386164393065613531346234343b4173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68343934616563663265376262353363663c4673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68666161383338663661316237343063323d6f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68666437363537366638326239333736663e6e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68396439323936363335643430313436363f8c0173726d6c5f64656d6f63726163793a3a5f494d504c5f454e434f44455f464f525f436f6e76696374696f6e3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e3e3a3a656e636f64655f746f3a3a683864643663653333376432343436653140703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683038376634656163303033396364303241633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683433303838336563313633396132396142b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a683030373732303864306663333335623343800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a683431656466376434313732336531313744796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6866326464383363666439383038363036455d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832646431383630646366363235346630465d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833326631626466383562373532623062475e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323565303232396230663361386137394836636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a683736396238303062623465336330323349800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a68366330363165343466643531633534324a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383033383965346537373737383439334b5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68316462643964653166316533363161384c5e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68326335326466333664353632656536374d493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68623939383539636362323533323036384e443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68656366343530313532633963373339394f29636f72653a3a70616e69636b696e673a3a70616e69633a3a683930306462653831356663633632336250443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686563663435303135326339633733393951463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837326239303930303932623764316664524e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683137393532326533376265306633366453503c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683036643461313538626363343934393054483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683339326361316463623530653934313655473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683636626363613030646664346261373056473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643631356565623361626262396137575e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a686664343433636362383337633437373358ef013c73726d6c5f64656d6f63726163793a3a426c61636b6c6973743c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c20616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e293e3e3a3a6765743a3a6836613764356235663139653863376665596f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a68636361343332336438616136626264385a3573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a68366438303866636531366531616539345b8a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a68373264633635373838616237653435385c3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68316334623366356537353961306662325db50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a68653734386162343266306433366464315e483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a68396637356363353361663162363438375f3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686135626464656330353832393464663960323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832346231323866373631326130323533612d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68393563313864623831313666633930666289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6866643364363035613962363562326163638c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6835653463336266613636376433333061646f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866633134656636336262303965356532653d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683766313063393363376136383765333366643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6839646533666434666432303039313861673d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862343132623566326132333534663734683d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862623562313130626465623239363433693a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633739326333373764643635653436336a3f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68376139663564323161663138626333316bc9023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68356134613565333938653162353335646c9e0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a68386535616136323961383538396464666d3373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a68393535643464306633666437383264336eb4013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a68356435656265333066373637333939646f4473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a686165656266636464346532626634303570683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838383633396439623963363830333564716b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835373232343437623438373336343566726d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866386232316161323838326335376533736e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683735336538386436396637306631383574763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353639323166626330353134366232397586013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a686535313633306636363638636361363176673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6866326439313535326334303637623864776a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a68626635393135363135343133393639667844636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a683932653839393334616233333963393779f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68333733366566623434363166356632627a3773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a68633337363639633262643933303135317b483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a68336239653437613061613366663166667c6d3c6e6f64655f72756e74696d653a3a43757272656e6379546f566f746548616e646c65722061732073725f7072696d6974697665733a3a7472616974733a3a436f6e766572743c753132382c7536343e3e3a3a636f6e766572743a3a68353637666237386237323465313434367d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68363831316136353639356566373033667e8e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a68396435343430393131383236656437317f3973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6834393035336663653939393664353862800130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683237386236313539333331396136636281013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68323662636361343964663735316562388201d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683436633539386334323439626161393383015c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838366432623236333166646333346264840185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a68646562353262626431313032366638658501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a68373662376631353363626165383533328601483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a683837316531646162333963366664653287013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a683863616333643766656561643836333088016f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a683866636637393031303130323364383589012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68636430313236643637393166366466338a0134636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68373930316437393431343736333863338b013c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a68613236643732366361313234646137358c0134636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68396133653135623333653732623336358d012e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a68396134613139636665393430326233398e012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68643032636466333230343961613863358f016f3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683239313630343165646363333739323690014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686334393265383265343832393137646491018f013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a683432363237643732313730333731653092013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a683038393461396331626164353230643093014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683737366564343637623834353637323794012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a683631343137393464626265336134666495014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68323631646237643031626138343532379601303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835333964383965373864336432386636970135636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68626232333962346333656230313863619801303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663966343739623738313364643766329901313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653961663431646462346636653666319a016b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68356462343963643635646562396561369b01713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343432336537396237666136333364639c01713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68373535376161643232383364663738389d01683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68653333393636303464383766313162329e016b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68336533366161393132333730623438649f0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6838623865663864653663643565663130a0016f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6839656432363761666263376163303338a101443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864643538643239613837336539366430a20125616c6c6f633a3a666d743a3a666f726d61743a3a6836363238323931366635643839636166a301743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835333337616335653133303232393336a401457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6863343039653861623936343865363938a50127636f72653a3a7374723a3a66726f6d5f757466383a3a6861303162383536303462626661643632a6017c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6832396434356534336335396636373566a7016c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835656534336634343261306436306335a801793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835636361393566393536386433663966a90186017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863373130393263326433353730393230aa016f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6838363932336464383833646464333432ab01693c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830373635356166323066616638633434ac01135f5f727573745f616c6c6f635f7a65726f6564ad014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6832386631653666366637316263366436ae01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861313534656437353133373565343033af01723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6834326161333662363739326430643866b001723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864323035306537666665386430383164b1013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834373937653534376136323663326430b201323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838316135313335323361343266643731b3012c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6862323466623938633663613936336537b4014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6833633137313734326664343464363431b501613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6866396465623032633130313431363831b60148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6836613231616631656164313134353561b7015a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a6866613236356165323336393333666263b8017b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a6861393434356539656631666338613634b90187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a6862336666633035383733356436363334ba0187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a6831653439303531353836633433633137bb0180013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a6831396333313936396362613630646262bc0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a6862613566353261373763386565613862bd0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a6832333831646137343636336138303363be0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a6835656233323666313336306535663566bf0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a6838306163646635383464356163343739c00185013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a6837313736326661336363396635383131c10184013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a6838666138346134313862303336643766c20183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a6836343433386230306632303431663766c3018d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a6834383165313066303230396462623061c40182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a6830646231363535363634323230353335c5017f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6839393863386639323461343030373766c60189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6835653930636536356562616661666239c70186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a6836393432666133373539633532363561c80186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a6865613864363566623932646262663032c90188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6862333638653731633732333932623934ca0188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a6861356238363437613064633065323037cb0189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6835663639653663613338666431653232cc018e013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6863306261363734316164623665343462cd018a013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a6832366637353133323438386361626366ce0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6831303139323034333536653238623532cf013273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a6863333265616162336663633834663734d001a7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6830333332613261323966396434666363d1014473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a6865393064306631643436366138613330d201673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6836613662316266663034383730643065d301613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831636561376633356531383534376639d401613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6834643765343630363733636637623463d501773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6864613538363437373364393161633062d601773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6863633237633664653363643436303964d701793c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6830616538343035383365663932653431d801b7013c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f3c543e3e3e3a3a6765743a3a6834656437633633653831363131623530d9017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6835303333313332653233393234313938da017e3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6836383237393262643365346631376362db01723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831656665633264656436313436383737dc018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6865353131643163343631323236326636dd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6831383934623633353565653739633265de01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6839323033653539333130616162373435df013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6833396665333063616239643263336134e0017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6834306266313536333830363533643562e1013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6831396138616331613331343433303262e2014c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832386330326662363135343738393533e3013173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6836653661373533396336333832346535e4012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6835323963333139393332366435346334e5017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6833636431376332336265613732616238e6012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6832323538333565333135383964613337e7014573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6831643433663038326464303036646130e8017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6861303534656163333938613038326137e9017d3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6836356334643665616263623034616561ea017f3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6864393232353437646465646135656565eb0182013c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6862363037336636626665396661363266ec01763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831633439366566636164346364626663ed013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830333363396462666564626136316537ee014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862626532316466343639636135663839ef014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6836663332383366323231386434633839f0014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838633363643830353162373562323835f1014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6862396631373532643866633062313738f201713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383334386332323031333439346662f301723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744465636179526174696f3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861326133313034363234303765303530f401743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831353665656134653234393865343464f501743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f74696e67506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838346662313465646262326639386134f6017b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383635353034333836316635346530f701723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865653634366138333735353061656132f8017c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833613531376362613564626131653435f9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830303932656436636465313735316632fa01753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833636562636665643539663638636338fb013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864396430353365663436653261316535fc013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6831323531373431656231613331333261fd014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6863393235393565363038306138336533fe014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6866356237356638623531313835323531ff014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683561323363366238356235373263666280023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a683066646566366166633961653262366381024e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6836356234396161336263356434393136820289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a686265643565656631393135333063633383028c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a683733343431616137643561616338363184027e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6866313031323732386365373032323764850281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6830316333386330613937386565316132860288013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68363139313938343438626364636535398702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835643061373731396530373135343637880291013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a686263653862373630336434383762613089024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363162653461373530356262373662658a023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68306433363162653734663931396633618b024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68656566623665313461326533326666328c023d73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a68353262343038613865363763376630358d023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a68613261336630666435656465303333358e02b5023c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f3c3c3c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68346365623639653138663131333339338f023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839393964396238646138633331613839900291013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e2061732073726d6c5f636f756e63696c3a3a4f6e4d656d626572734368616e6765643c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6d656d626572735f6368616e6765643a3a68626165626438616330656462313561629102c1013c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3e3a3a6765743a3a686636306262343236303735353134643892024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831343736336633383532313236366166930291013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a68343732376664363632623638383933619402b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646130316166643635373932373538329502723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383862356433623533356662643738379602c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683036653564313134313734396336623097023573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a68636461343636313732363935303962329802633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a686431646632373534313466366664326599025f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68346362313634363335393462393532389a02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396631643662393862653761643263339b024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a68363937366237623035303866623533349c023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a68613562363662306433323539366664649d02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68343632616537383636383366626532669e023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68346430633965333565643661663364329f02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6833313735373132313132333835633233a002693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830316338343363633632306238666165a102693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6831333461663738653338346137626365a202693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6862343163666461376564303937303036a3026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866623838366462613837613133666162a4026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866666636363639376566353239376636a5024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835363536323866646432306635316437a6024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363833346364613430356432633764a7024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838316166663434383562396538663962a8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838336238616335356434653661346232a9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861623830383237656337626438656130aa024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862656565623131663538616539396239ab02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6835353465656535616338353764643066ac02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835363839613464326237393731653532ad02553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838373631313638303936383131366166ae026b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6865323933633735663634643061626636af027d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831666330386437643034626634383931b0026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6836326264653134663536643062353962b1026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6864616238623536303035613534306666b2028b0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a656e636f64655f746f3a3a6861383261333733366437633236323266b3023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862626464383561363032643039373134b402bc0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6830303736613438386139383963656165b5023b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863393730616532633038646531383034b6024073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836623664333738393861383966646630b7024573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356530653963346437396161323135b802703c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839333866393561376661383066386139b902703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833323031343334336266306266323434ba02713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835623437343165616434316365623934bb026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837653532336438306337633333343732bc026a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864666161616234353338353461353233bd026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836636530396362373239356265656564be026d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861653663643564663437623563663936bf026d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830383538386639643632306338306166c0027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6830643962346233303935336164666131c102880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6837623265656434386238383563613031c202723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837643536313431386431386263333665c3027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6837393835653335613037616339616431c4023873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6830613834363432353534326634363832c5024173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6861656436383936333733373961393039c602416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6831656136316166333338653832306261c7023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6831373535373533376236336263656262c802483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831333831393434366437653064303262c9022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6833393364613938653639323439383564ca02453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838363734326534666666666630303164cb0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a6831666562313135616361656230666432cc022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a6836333234636430343836666166656636cd02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6833333437623132303630363137626532ce025d3c73726d6c5f636f6e74726163743a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6830353135393834636235663036343465cf022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6836363661333430633161383932303333d0023473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6834316164653736613335306633316235d1024173726d6c5f636f6e74726163743a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6834323138616332613764663135623736d202593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862626638633431636165653434313765d302aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6861663162323439316632316436306638d4023573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6835366637353766356337656262646466d5023673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6833343638386266303463643066363137d6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831653535316635373736306166383030d7023873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6835616137393765343961623139373366d80230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864383935313939363031376332386466d902643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6837326364353931616639636132323162da028d0173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6838323837396666306663333164326230db02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863333464643934323638613031353930dc02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830393762623431386138383864633836dd027e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6831306637373263333663646337343331de023973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838666439616539396365306433653365df023e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6833376561333837666563663834386238e0024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6831376563653461336162623566643336e1024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836393735623434353263653664613731e202693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866363537326462303239613532303539e3026e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865396561333661373034663364333732e4023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6832333262613534633836316662643139e50288013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6865613363376233363363383231313966e6023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865633138323463353265366161373461e7024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6861376537396265333130613633373935e8024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863316561623737313962613238396561e902703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832643835666531326337646634366261ea025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864626661323637383662393436396336eb0234636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6836396461666637393039373061313131ec02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862386336353535306336313834396538ed0286013c73726d6c5f6772616e6470613a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6861333436363963343964393361643239ee023773726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6863656665626663343965636232336532ef023b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6830646337636465646430343838646565f0023e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6830353763643235373336633566323161f102406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6833303966626664316235383230343331f202416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6835313638376461316431373635363336f302426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6830313034353861633265346163316633f402416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6837306531373138353463393136636462f502416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6831616430376264623933343831383832f602436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6835336535366433356462663934383238f702416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a6864663564313939396433366136323231f802496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a6864613933353738393165313134333763f902416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6833353338356331323036326335363830fa02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6864346339636463356334633366393333fb02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a6839613734613861663361393964663838fc025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6831363430633263376565613064643238fd02653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862363465326662356639636662646265fe02453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6831306235373565303766633764306438ff02573c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a776569676874733a3a576569676861626c653e3a3a7765696768743a3a6861393836303337636335303561333732800339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a686237636163326533636430336665653681033f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683333633630393633646361383235656482034473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683563633437316233666233343232366283033a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686361353835346539613437333536373684033c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a686333633031393532613965623234653485034173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683966373733386635663264626264616386033773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68643361353435376133303436313365348703613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683862633436363235383930393364366188030c436f72655f76657273696f6e890312436f72655f657865637574655f626c6f636b8a037973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a68376233366163313939613337393135378b034173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68613533393833653538653062636430648c036c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68363130383336343662393432383739388d03810173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68303635373131643530343264336366398e0387013c73726d6c5f74726561737572793a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68643434613665343736396233643037348f036c3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6834366464366662356238333562393731900315436f72655f696e697469616c697a655f626c6f636b9103114d657461646174615f6d657461646174619203603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68613366393836333937346566363933659303433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68356261663237376630323439353930399403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68633139393633623465353564366132629503623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68636130653235643436326465303339619603623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683434666466653133623032306564633697031c426c6f636b4275696c6465725f6170706c795f65787472696e73696398031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b990320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963739a033873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68633264616634656231393762336433329b031c426c6f636b4275696c6465725f636865636b5f696e686572656e74739c0318426c6f636b4275696c6465725f72616e646f6d5f736565649d032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e9e03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65729f03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765a0034e73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3a3a636f6e766572745f66697273743a3a6836366333363234366332653461666564a103204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765a2031e4772616e6470614170695f6772616e6470615f617574686f726974696573a30315417572614170695f736c6f745f6475726174696f6ea40313417572614170695f617574686f726974696573a5037a3c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a7b7b636c6f737572657d7d3a3a6830633830656137323332346530373965a6033b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832366562646163613532656363613561a7034073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835393339323736626561306163656166a8034573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839663139653639643062656237313738a9036d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836306239646532646139656632343639aa033673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6865666535383230393831636338313263ab03960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6861396236356662323336616562633266ac03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835373062333834306365353164316338ad033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861646235326434323663363837373737ae034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833366464326631646134636339643265af034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838383137333832346434613662363731b0034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861646238366366633866623461333036b103703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862366262393764653065346336306438b2033a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837616532366131643234643932326237b3033f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6831306132303733303438396137353732b4034473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6866363865306666626566326438646465b503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6832363635303738306162303339663662b603d6013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f74696e673c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864363432643232336231656163383566b703443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865636634353031353263396337333939b8034273726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6832383539316166633763383138613038b9033a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835613734376161303337613130323730ba033f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6865663337623938613262616336636165bb034473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6833646333393663383139373062623730bc033073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6836623662363532303861393239356436bd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6866656635303035393964613961653264be03467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6834633238383839393133366536353162bf034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6835313966313864636237326261336539c003397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6865366631393266326664613039643832c103347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6861656163356431346336623830396639c203553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863326134356666353061376161396539c303473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6866353933393766323137613636373964c4034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6832666537613565366332363331356661c503457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6837623865636664383363666165356131c60348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6830656462363861303163356265306337c7033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6834323534626164656230616363376166c803537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6863663565633265313765663537323035c903a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6830353536356238326665343262306538ca033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a6830316332396565616463663335313062cb032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6830393332363436363438313361366335cc03507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6838643061356230363637363139613838cd033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6831636436386663336433373839336439ce03347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6863626562643038326466356364303865cf03547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6862643739363133313339343332383965d003347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6833313763366332356339306365653430d103537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6834393035633532663833363531346161d203547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6837353761346463393739376562316230d303557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6864346366646335333561663030633362d403547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6838633331313330663565623336316632d503407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6831386566303365653833303566666561d603537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6838353331303135666166633861336431d703547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6833613733343330326264616561376664d803553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839346532626165616538343162313330d9034e3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835613733643831626162386430626264da03543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862373235313739336638363630383535db0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836613038356231346265396435633734dc033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6836303961663164643666613232333735dd032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865363865663431386238643863316331de0339636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a6835313334393661303431643563636232df034c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832666536663963363630326265346663e003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837326234353830626637326537303332e103453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863663738346335653363613266373731e20323636f72653a3a666d743a3a77726974653a3a6836646264346536386638373035323231e30341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6864366233373132356536666366663333e403323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835653966383665363861346464343266e5033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6835396131346330396137303930383238e603613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6865316438363535626666663531343030e703533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839626638343738306239303233323334e80333636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a6861333566626630386639653461636131e90346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6865663534363634346336306434623135ea034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865646435396332323933383537653261eb03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831643539383166653938316462313737ec03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834626661363434626431393266666236ed03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837613536343663303430373264333733ee03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837646638663737353332306532373734ef03463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861363537336135373632656161343632f003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633037393736363432656561653630f103303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864323138616636666239353832313839f2039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6836653731323166623136653532633661f303423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836323336336636653364383535303264f403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830613634326534663332376539616135f50311727573745f626567696e5f756e77696e64f6034e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6832333837396334613931313463373565f7030a5f5f72675f616c6c6f63f8030c5f5f72675f6465616c6c6f63f9030c5f5f72675f7265616c6c6f63fa03115f5f72675f616c6c6f635f7a65726f6564fb032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6864653239343433393239313531623639fc033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835313235643164306563633239393130fd033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839353965666131623335626366643438fe033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6835343638363039306564663265396539ff033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6833636663653965373133323661336239800430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303031396461623065383937633336378104313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834613532623136633830303234616261820443636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a683432386265353039346339343164336383042e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a683164313363613733343265626666353384044a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68316436363734336535623538343039638504323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686431393739333162373737643337336386043d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a683531623662343337336438653836356287044e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68316665623131356163616562306664322e31393039880434636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a686364353964306437623539306436323289042e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a68363461663862323537393838646230348a048001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68656163303763393531626335663764648b04533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68366538633033663965636631646139308c0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68333430303565383966626464336335388d042f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a68313532633662643433626438333336308e042e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68623730623339363562646162393237308f0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683031343735323165623962333830323190043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a686366366133663535383139656366646491043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a683138313637396666343166303265313792043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68623438316365373666653862323234389304066d656d7365749404066d656d6370799504076d656d6d6f76659604066d656d636d709704095f5f756469767469339804085f5f6d756c7469339904095f5f6173686c7469339a04095f5f6c7368727469339b040c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33372e302d6e696768746c79202834303062343039656620323031392d30362d303929", - "0x5286264f4d2ddb5a0d2950bf3bcfb9f6": "0x10000000000000000000000000000000", - "0x6d5b60e78cadb1cc37887b7ee4a5ab10": "0x00000000", - "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", - "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", - "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", - "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", - "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", - "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0xd546f8df064d356bc9db11de6d1207a8": "0x00", + "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b65797394f72a73893fbd00b11fcce65a014cc5b9ff5066ec15aa6be068b4cabfe67fdb": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378", + "0x3a636f6465": "0x0061736d0100000001c6022b60027f7f0060017f0060037f7f7f0060047f7f7f7f0060027f7f017f60037f7f7f017f60057f7f7f7f7f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60077f7f7f7f7f7f7f017f60027e7f017f60017f017f60047e7f7f7f017f60017e0060000060077f7e7e7e7e7e7e0060087f7f7f7f7f7f7f7f0060047f7f7f7f017e60047f7f7e7e0060037f7e7e0060057f7f7e7e7f0060057f7f7f7e7e0060077f7e7e7f7f7f7f0060047f7f7e7f0060037f7f7e0060067f7f7e7e7e7f0060037e7f7f017f60087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060047f7e7e7e0060027f7e0060027f7f017e60087f7f7f7f7f7e7e7f0060017e017f60057f7e7f7f7e0060037f7e7f0060017f017e60047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002cd072503656e760e6578745f626c616b65325f323536000203656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76176578745f636c6561725f6368696c645f73746f72616765000303656e760f6578745f7365745f73746f72616765000303656e760c6578745f74776f785f313238000203656e76196578745f6765745f616c6c6f63617465645f73746f72616765000503656e76166578745f73616e64626f785f6d656d6f72795f6e6577000403656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000103656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000103656e76146578745f6765745f73746f726167655f696e746f000703656e76116578745f636c6561725f73746f72616765000003656e76166578745f6b696c6c5f6368696c645f73746f72616765000003656e76106578745f636c6561725f707265666978000003656e76166578745f6368696c645f73746f726167655f726f6f74000503656e760e6578745f7072696e745f75746638000003656e76156578745f7365745f6368696c645f73746f72616765000a03656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e760d6578745f7072696e745f686578000003656e76156578745f6c6f63616c5f73746f726167655f676574000b03656e76216578745f6c6f63616c5f73746f726167655f636f6d706172655f616e645f736574000c03656e760a6578745f7075626b6579000d03656e76116578745f6e6574776f726b5f7374617465000e03656e76086578745f7369676e000f03656e76166578745f7375626d69745f7472616e73616374696f6e000403656e76156578745f6c6f63616c5f73746f726167655f736574000603656e76106578745f73746f726167655f726f6f74000103656e76186578745f73746f726167655f6368616e6765735f726f6f74000503656e760b6578745f74776f785f3634000203656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000303656e760d6578745f7072696e745f6e756d001003656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000103b404b20400000e0501001100000000000000000000000200110100000100000000000000000000000000000000000000000000000404000100040000001202020013110303030303030303030303030303030303030303030314020e00020004040515021502010216000100000200171800000200190101010100160101151a00030101011b001c041d08151601010000020010020001000003020001010001000000000000000002040600000002060204020000010000011e0202060403031f02020402000001010020010101000000000015022001000002000200000101010002020300210002040000000000000000000000001111000000000000010101010101010101010101010002110311020202020201010001001003222200020210012222000200000000222222002222220222222222222222000000010101000000010000000000000000000000000000000101010e120500000001000300000004000e02000102020101000100010102000002000100010101000001001111230100242400000006012100000001000100002500010100000001000000000000000b0000000001010101000000000000000100150000010200000402020602260000040000020502060002000400020000040003040204040001000203030202040606020202020304050104040405040404070204020402020000040204010404010404040400010100020000000e01050e050404270b0304040e0404040404030105010404050404040505050528282929292a0407017001cf01cf0105030100120611027f01418080c0000b7f0041c882c6000b07ab0414066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010c436f72655f76657273696f6e00bd0212436f72655f657865637574655f626c6f636b00be0215436f72655f696e697469616c697a655f626c6f636b00c402114d657461646174615f6d6574616461746100c5021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300cc021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00cd0220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300ce021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300d00218426c6f636b4275696c6465725f72616e646f6d5f7365656400d1022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00d202214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200d402214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500d502204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500d6021e4772616e6470614170695f6772616e6470615f617574686f72697469657300d70214426162654170695f737461727475705f6461746100d8020d426162654170695f65706f636800d90218436f6e73656e7375734170695f617574686f72697469657300da02098903010041010bce01f403ca0155565a6465666768696a6b6c6d6e6f707172737475767778797a8001c204e503f703f903fa03ef039e0483048b049004bf0497049904bb04bc04f7018101e0029b01bb03c601e902ea02ce038d03c401a104a901b001e802e202c701c501c301c201bf01c101ee02c104c004ea01f101f001ef01f801f901fa0182029b039a03a0029e03b003b2038c038b038e0391039003fd02a1029a019901a2029d01cc03cb03a302d4038002ff01a4028102b803b703a502bc03f502f402a602f602be01bd01a702c001ae01af01e901e801a802ed01ec01a902ee01df02de02aa02e402b602b7029f02a401a301ab02a501b802e302e102f002ef02ed02ec02eb02e702e602e5028f03d001d101d301d201cf01d4019d039c03a303dd01e301e501e401e201e601b103b403b303ba03b903c003bf03be03bd03d203d103d003cf03cd03d503d903ae03d703da038d0492048e048f04a0049404a204a304a504a604a704a804a904aa04b504b604b704cc04b804c604c504c704c804c904ca04cb040a84f838b2049a1002187f017e230041f0006b2202240002400240024020012802042203200128020022046b41e100490d0003402001200441206a3602002001280208220341306a280200210520032802282106200241d0006a41186a22034200370300200241d0006a41106a22074200370300200241d0006a41086a220842003703002002420037035020044120200241d0006a1000200241106a41186a22092003290300370300200241106a41106a220a2007290300370300200241106a41086a220b2008290300370300200220022903503703102002410036025020062005200241106a4120200241d0006a100121060240024020022802502205417f470d002002200c36020c2002200d3602082002200e3602040c010b2001280208220f2802302110200f280228210f2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200f2010200241306a412010022002200536020c20022005360208200220063602042006210e2005210d2005210c2004450d00200241046a21010c030b20012001280200220441206a3602002001280208220541306a2802002106200528022821052003420037030020074200370300200842003703002002420037035020044120200241d0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903503703102002410036025020052006200241106a4120200241d0006a100121060240024020022802502205417f470d002002201136020c20022012360208200220133602040c010b2001280208220f2802302110200f280228210f2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200f2010200241306a412010022002200536020c20022005360208200220063602042006211320052112200521112004450d00200241046a21010c030b20012001280200220441206a3602002001280208220541306a2802002106200528022821052003420037030020074200370300200842003703002002420037035020044120200241d0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903503703102002410036025020052006200241106a4120200241d0006a100121060240024020022802502205417f470d002002201436020c20022015360208200220163602040c010b2001280208220f2802302110200f280228210f2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200f2010200241306a412010022002200536020c20022005360208200220063602042006211620052115200521142004450d00200241046a21010c030b20012001280200220441206a3602002001280208220541306a2802002106200528022821052003420037030020074200370300200842003703002002420037035020044120200241d0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903503703102002410036025020052006200241106a4120200241d0006a1001210a0240024020022802502209417f470d002002201736020c20022018360208200220193602040c010b2001280208220b2802302105200b280228210b2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200b2005200241306a412010022002200936020c200220093602082002200a360204200a211920092118200921172004450d00200241046a21010c030b20012802042203200128020022046b41e0004b0d000b0b024020042003460d0003402001200441206a3602002001280208220341306a280200210a20032802282103200241d0006a41186a22074200370300200241d0006a41106a22084200370300200241d0006a41086a220942003703002002420037035020044120200241d0006a1000200241106a41186a2007290300370300200241106a41106a2008290300370300200241106a41086a200929030037030020022002290350370310200241003602502003200a200241106a4120200241d0006a1001210a0240024020022802502203417f470d002002200b36020c20022005360208200220063602040c010b2001280208220b2802302105200b280228210b2007420037030020084200370300200942003703002002420037035020044120200241d0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a200929030037030020022002290350370330200b2005200241306a412010022002200336020c200220033602082002200a360204200a2106200321052003210b2004450d00200241046a21010c030b200128020022042001280204470d000b0b200041003602000c010b200241d0006a41086a200141086a280200220336020020022001290200221a370350200020043602002000201a3702042000410c6a20033602000b200241f0006a24000b910202077f017e0240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641a8016d2207490d00200028020021020c010b200320076a22082003490d0220024101742203200820082003491b2203ad42a8017e2209422088a70d022009a722084100480d020240024020020d002008102721020c010b2000280200200241a8016c2008102821020b2002450d0120002002360200200041046a2003360200200041086a28020021030b2002200341a8016c6a2005200610ce041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010290b0f0b20084108102a000b102b000b0700200010b1040b0b0020002001200210b3040b0700200010b2040b0e0041e8cfc500412210ac0400000b0a0041b0d2c5001058000b910202077f017e0240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641e8006d2207490d00200028020021020c010b200320076a22082003490d0220024101742203200820082003491b2203ad42e8007e2209422088a70d022009a722084100480d020240024020020d002008102721020c010b2000280200200241e8006c2008102821020b2002450d0120002002360200200041046a2003360200200041086a28020021030b2002200341e8006c6a2005200610ce041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010290b0f0b20084108102a000b102b000b9904010f7f230041d0006b22022400200241086a2001102e02400240024020022802080d00200041003602000c010b02400240200228020c22034180012003418001491b22040d00410121050c010b2004410574220610272205450d020b02402003450d00200241306a41186a2107200241306a41106a2108200241306a41086a21094100210a4100210b4100210c034020074200370300200842003703002009420037030020024200370330200241306a2001280200220d20012802042206412020064120491b220e10ce041a20012006200e6b3602042001200d200e6a36020002402006411f4b0d00200041003602002004450d03200510290c030b200c41016a2106200241106a41186a220e2007290300370300200241106a41106a220d2008290300370300200241106a41086a220f2009290300370300200220022903303703100240200c2004470d000240200a20062006200a491b220441ffffff3f712004470d00200441057422104100480d0002400240200c0d002010102721050c010b2005200b2010102821050b20050d0120104101102a000b102b000b2005200b6a220c2002290310370000200c41186a200e290300370000200c41106a200d290300370000200c41086a200f290300370000200a41026a210a200b41206a210b2006210c20032006470d000b0b2000200436020420002005360200200041086a20033602000b200241d0006a24000f0b20064101102a000bbd0301077f230041106b22022400200241003a0003200241036a2001280200220320012802042204410047220510ce041a0240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d02024020022d0003220341037122044103460d0002400240024020040e03000102000b20034102762101410121040c070b200241003a000b2002410b6a20052006410047220410ce041a20062004490d032001200620046b3602042001200520046a3602002006450d0420022d000b4108742003724102762101410121040c060b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b220810ce041a2001200620086b3602042001200520086a36020020070d0520022f010c20022d000e411074724108742003724102762101410121040c050b200341034b0d024100210420024100360204200241046a200520064104200641044922081b220310ce041a2001200620036b3602042001200520036a36020020080d0320022802042101410121040c040b20052004103e000b20042006103e000b410021040b0b2000200136020420002004360200200241106a24000b860402077f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210300240024002400240024020000d002002280208210020022802042104200228020021050c010b2003200041286c6a21062002280204210420022802082100034002400240200420006b4120490d00200041206a2107200228020021050c010b200041206a22072000490d0520044101742205200720072005491b22084100480d050240024020040d002008102721050c010b200228020020042008102821050b2005450d032002200836020420022005360200200821040b200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a2900003700002002200736020820002003290000370000200341206a290300210902400240200420076b4108490d00200741086a21000c010b200741086a22002007490d0520044101742208200020002008491b22084100480d050240024020040d002008102721050c010b200520042008102821050b2005450d042002200836020420022005360200200821040b20022000360208200520076a20093700002006200341286a2203470d000b0b2001280200200128020420052000100302402004450d00200510290b200241106a24000f0b20084101102a000b20084101102a000b102b000b9e0701037f02400240024002400240024020002802002202413f4b0d0002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0620004101742204200320032004491b22044100480d060240024020000d002004102721030c010b200128020020002004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000f0b200241808001490d032002418080808004490d020c010b20044101102a000b0240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0520024101742204200320032004491b22044100480d050240024020020d002004102721030c010b200128020020022004102821030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280200210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0520024101742200200420042000491b22004100480d050240024020020d002000102721020c010b200128020020022000102821020b2002450d0220012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20044101102a000b20004101102a000b024002400240200141046a2802002203200141086a28020022006b4104490d00200128020021030c010b200041046a22042000490d0320034101742200200420042000491b22004100480d030240024020030d002000102721030c010b200128020020032000102821030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b20004101102a000b024002400240200141046a2802002203200141086a28020022006b4102490d00200128020021030c010b200041026a22042000490d0220034101742200200420042000491b22004100480d020240024020030d002000102721030c010b200128020020032000102821030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20004101102a000b102b000b800501067f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021030024002400240024002402000450d0020004190016c2104034020022802042105200228020821000240024020032802004112470d000240024020052000460d00200228020021050c010b200041016a22052000490d0820004101742206200520052006491b22064100480d080240024020000d002006102721050c010b200228020020002006102821050b2005450d052002200636020420022005360200200228020821000b2002200041016a360208200520006a41003a00000c010b0240024020052000460d00200228020021050c010b200041016a22052000490d0720004101742206200520052006491b22064100480d070240024020000d002006102721050c010b200228020020002006102821050b2005450d052002200636020420022005360200200228020821000b2002200041016a360208200520006a41013a000020032002103220034188016a28020021060240024020022802042205200228020822006b4104490d00200228020021050c010b200041046a22072000490d0720054101742200200720072000491b22004100480d070240024020050d002000102721050c010b200228020020052000102821050b2005450d062002200036020420022005360200200228020821000b2002200041046a360208200520006a20063600000b20034190016a2103200441f07e6a22040d000b0b2002280204210020012802002001280204200228020022032002280208100302402000450d00200310290b200241106a24000f0b20064101102a000b20064101102a000b20004101102a000b102b000be3d00104057f017e067f017e230041206b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200220341114b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e12000102030405060708090a0b0c0d0e0f1011000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e0240024020030d002005102721040c010b200128020020032005102821040b2004450d1320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208417f6a220341054b0d1102400240024002400240024020030e06000102030405000b200241003a001c02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d6320004101742204200320032004491b22044100480d630240024020000d002004102721030c010b200128020020002004102821030b2003450d1920012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c160b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6220034101742205200420042005491b22054100480d620240024020030d002005102721040c010b200128020020032005102821040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200028020c21062002200041146a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d6220044101742203200520052003491b22034100480d620240024020040d002003102721040c010b200128020020042003102821040b2004450d1a20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c150b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6120034101742205200420042005491b22054100480d610240024020030d002005102721040c010b200128020020032005102821040b2004450d1a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000290310210702400240200141046a2802002203200528020022006b4108490d00200128020021030c010b200041086a22042000490d6120034101742200200420042000491b22004100480d610240024020030d002000102721030c010b200128020020032000102821030b2003450d1b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a20073700000c140b200241033a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6020034101742205200420042005491b22054100480d600240024020030d002005102721040c010b200128020020032005102821040b2004450d1b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c21062002200041146a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d6020044101742203200520052003491b22034100480d600240024020040d002003102721040c010b200128020020042003102821040b2004450d1c20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c130b200141086a2802002103200241043a001c024002402003200141046a280200460d00200128020021050c010b200341016a22042003490d5f20034101742205200420042005491b22044100480d5f0240024020030d002004102721050c010b200128020020032004102821050b2005450d1c20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41043a0000200028020c21032002200041146a2802002200360208200241086a200110302000450d122003200041186c6a2108200141046a21060340200328020021092002200341086a2802002200360208200241086a20011030024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d60200a4101742205200b200b2005491b22054100480d6002400240200a0d0020051027210a0c010b2001280200200a20051028210a0b200a450d1e2001200a36020020062005360200200428020021050b2004200520006a360200200a20056a2009200010ce041a2003410c6a28020021092002200341146a2802002200360208200241086a20011030024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d60200a4101742205200b200b2005491b22054100480d6002400240200a0d0020051027210a0c010b2001280200200a20051028210a0b200a450d1f2001200a36020020062005360200200428020021050b2004200520006a360200200a20056a2009200010ce041a200341186a22032008470d000c130b0b200241053a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e0240024020030d002005102721040c010b200128020020032005102821040b2004450d1e20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41053a0000200028020c21042002200041146a2802002200360208200241086a200110302000450d1120042000410c6c6a2108200141046a210903402004280200210a2002200441086a2802002203360208200241086a200110300240024020092802002205200628020022006b2003490d00200128020021050c010b200020036a220b2000490d5f20054101742200200b200b2000491b22004100480d5f0240024020050d002000102721050c010b200128020020052000102821050b2005450d202001200536020020092000360200200628020021000b2006200020036a360200200520006a200a200310ce041a2004410c6a22042008470d000c120b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d5d20004101742204200320032004491b22044100480d5d0240024020000d002004102721030c010b200128020020002004102821030b2003450d1f20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c100b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d1f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d2020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110540c0f0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d2020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d2120012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a00002000280204210c20022000410c6a2802002200360208200241086a200110302000450d0e200c200041f8006c6a210d200141046a210b034002400240200b2802002203200628020022006b4120490d00200128020021030c010b200041206a22042000490d5c20034101742200200420042000491b22004100480d5c0240024020030d002000102721030c010b200128020020032000102821030b2003450d2320012003360200200b2000360200200628020021000b2006200041206a360200200320006a220041186a200c412c6a290000370000200041106a200c41246a290000370000200041086a200c411c6a2900003700002000200c290014370000200c2001105402400240200b2802002203200628020022006b4120490d00200128020021030c010b200041206a22042000490d5c20034101742200200420042000491b22004100480d5c0240024020030d002000102721030c010b200128020020032000102821030b2003450d2420012003360200200b2000360200200628020021000b2006200041206a360200200320006a220041186a200c41cc006a290000370000200041106a200c41c4006a290000370000200041086a200c413c6a2900003700002000200c29003437000002400240200b2802002203200628020022006b4120490d00200128020021030c010b200041206a22042000490d5c20034101742200200420042000491b22004100480d5c0240024020030d002000102721030c010b200128020020032000102821030b2003450d2520012003360200200b2000360200200628020021000b2006200041206a360200200320006a220041186a200c41ec006a290000370000200041106a200c41e4006a290000370000200041086a200c41dc006a2900003700002000200c290054370000200c28020821042002200c2802102200360208200241086a2001103002402000450d00200041246c21090340200241086a2004104f2002280208210a02400240200b2802002205200628020022006b20022802102203490d00200128020021050c010b200020036a22082000490d5e20054101742200200820082000491b22004100480d5e0240024020050d002000102721050c010b200128020020052000102821050b2005450d2820012005360200200b2000360200200628020021000b2006200020036a360200200520006a200a200310ce041a0240200228020c450d00200a10290b200441246a21042009415c6a22090d000b0b200c41f8006a220c200d470d000c0f0b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d5a20004101742204200320032004491b22044100480d5a0240024020000d002004102721030c010b200128020020002004102821030b2003450d2520012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41043a00000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d2520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000280208417f6a220341014b0d0c02400240024020030e020001000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d5b20034101742205200420042005491b22044100480d5b0240024020030d002004102721050c010b200128020020032004102821050b2005450d2820012005360200200141046a2004360200200141086a28020021030b200041306a2104200141086a200341016a360200200520036a41003a00002000410c6a20011051200241186a21000c010b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d5a20034101742205200420042005491b22044100480d5a0240024020030d002004102721050c010b200128020020032004102821050b2005450d2820012005360200200141046a2004360200200141086a28020021030b200041c0006a2104200141086a200341016a360200200520036a41013a00002000410c6a200110512002200041306a36021c2002411c6a20011059200241086a21000b200020043602002000200110590c0c0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d582003410174220a20052005200a491b220a4100480d580240024020030d00200a102721050c010b20012802002003200a102821050b2005450d2720012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41063a000020002d0008417f6a2203410c4b0d0b024002400240024002400240024002400240024002400240024020030e0d000102030405060708090a0b0c000b200241003a001c02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d642003410174220a20052005200a491b220a4100480d640240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3420012005360200200141046a200a360200200141086a28020021030b200141086a200341016a360200200520036a41003a00002000410c6a200110512002200041306a360208200241086a2001105920002d0009220041024b0d1702400240024020000e03000102000b200241003a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6620004101742205200320032005491b22054100480d660240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c190b200241013a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6520004101742205200320032005491b22054100480d650240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c180b200241023a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6420004101742205200320032005491b22054100480d640240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c170b200241013a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6320034101742205200420042005491b22054100480d630240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a360208200241086a200110590c160b200241023a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6220034101742205200420042005491b22054100480d620240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a360208200241086a200110590c150b200241033a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6120004101742205200320032005491b22054100480d610240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a00000c140b200241043a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6020034101742205200420042005491b22054100480d600240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110302002200041106a360208200241086a200110590c130b200241053a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f0240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a0000200028020c21032002200041146a2802002200360208200241086a200110302000450d12200041246c21000340200320011051200341246a21032000415c6a22000d000c130b0b200241063a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5e20004101742205200320032005491b22054100480d5e0240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a00000c110b200241073a001c02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5d2003410174220a20052005200a491b220a4100480d5d0240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3720012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41073a000020002d0009220041024b0d1002400240024020000e03000102000b200241003a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5f20004101742205200320032005491b22054100480d5f0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c120b200241013a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5e20004101742205200320032005491b22054100480d5e0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c110b200241023a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5d20004101742205200320032005491b22054100480d5d0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c100b200241083a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d3a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110510c0f0b200241093a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d3a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a200110300c0e0b2002410a3a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5a20004101742205200320032005491b22054100480d5a0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410a3a00000c0d0b2002410b3a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d3a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a200110300c0c0b2002410c3a001c02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d582003410174220a20052005200a491b220a4100480d580240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3a20012005360200200141046a200a360200200141086a28020021030b200141086a220b200341016a360200200520036a410c3a0000200028020c21032002200041146a2802002200360208200241086a200110302000450d0b2000410574210a200141046a210803400240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22092000490d5920054101742200200920092000491b22004100480d590240024020050d002000102721050c010b200128020020052000102821050b2005450d3c2001200536020020082000360200200b28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200a41606a220a0d000c0c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d3b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d3c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d3d20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041106a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d3e20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041306a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000280204210620022000410c6a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d3f20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c0a0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d562003410174220a20052005200a491b220a4100480d560240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3f20012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41083a0000200041086a22032d0000417f6a220541104b0d090240024002400240024002400240024002400240024002400240024002400240024020050e11000102030405060708090a0b0c0d0e0f10000b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6620034101742205200420042005491b22054100480d660240024020030d002005102721040c010b200128020020032005102821040b2004450d5020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200028020c200110322002200041106a360208200241086a200110590c190b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6520034101742205200420042005491b22054100480d650240024020030d002005102721040c010b200128020020032005102821040b2004450d5020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110300c180b02400240200628020020042802002205460d00200128020021060c010b200541016a22062005490d642005410174220a20062006200a491b220a4100480d640240024020050d00200a102721060c010b20012802002005200a102821060b2006450d5020012006360200200141046a200a360200200141086a28020021050b200141086a220a200541016a360200200620056a41023a00002000410c6a2001103020032d00012105200341026a2d0000210602400240200141046a280200200a2802002200460d00200128020021030c010b200041016a22032000490d642000410174220a20032003200a491b220a4100480d640240024020000d00200a102721030c010b20012802002000200a102821030b2003450d5120012003360200200141046a200a360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a00000c170b02400240200628020020042802002205460d00200128020021060c010b200541016a22062005490d632005410174220a20062006200a491b220a4100480d630240024020050d00200a102721060c010b20012802002005200a102821060b2006450d5120012006360200200141046a200a360200200141086a28020021050b200141086a220a200541016a360200200620056a41033a00002000410c6a2001103020032d00012105200341026a2d0000210602400240200141046a280200200a2802002200460d00200128020021030c010b200041016a22032000490d632000410174220a20032003200a491b220a4100480d630240024020000d00200a102721030c010b20012802002000200a102821030b2003450d5220012003360200200141046a200a360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a00000c160b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d622003410174220a20052005200a491b220a4100480d620240024020030d00200a102721050c010b20012802002003200a102821050b2005450d5220012005360200200141046a200a360200200141086a28020021030b200141086a220a200341016a360200200520036a41043a0000200028020c2001103220002d0009210902400240200141046a280200200a2802002203460d00200128020021050c010b200341016a22052003490d622003410174220a20052005200a491b220a4100480d620240024020030d00200a102721050c010b20012802002003200a102821050b2005450d5320012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a20093a0000200029031021070240024020062802002205200428020022036b4108490d00200128020021050c010b200341086a220a2003490d6220054101742203200a200a2003491b22034100480d620240024020050d002003102721050c010b200128020020052003102821050b2005450d5420012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a2007370000200029031821070240024020062802002203200428020022006b4108490d00200128020021030c010b200041086a22052000490d6220034101742200200520052000491b22004100480d620240024020030d002000102721030c010b200128020020032000102821030b2003450d5520012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a20073700000c150b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d612003410174220a20052005200a491b220a4100480d610240024020030d00200a102721050c010b20012802002003200a102821050b2005450d5520012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41053a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d6120034101742200200620062000491b22004100480d610240024020030d002000102721030c010b200128020020032000102821030b2003450d5620012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c140b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6020034101742205200420042005491b22054100480d600240024020030d002005102721040c010b200128020020032005102821040b2004450d5620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200028020c200110320c130b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f0240024020030d002005102721040c010b200128020020032005102821040b2004450d5620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200028020c200110320c120b02400240200628020020042802002205460d002001280200210a0c010b200541016a220a2005490d5e20054101742209200a200a2009491b22094100480d5e0240024020050d0020091027210a0c010b2001280200200520091028210a0b200a450d562001200a360200200141046a2009360200200141086a28020021050b2004200541016a360200200a20056a41083a0000024002402006280200220a200428020022056b4120490d002001280200210a0c010b200541206a22092005490d5e200a4101742205200920092005491b22054100480d5e02400240200a0d0020051027210a0c010b2001280200200a20051028210a0b200a450d572001200a360200200141046a2005360200200141086a28020021050b2004200541206a360200200a20056a220541186a200341196a290000370000200541106a200341116a290000370000200541086a200341096a29000037000020052003290001370000200029033021070240024020062802002205200428020022036b4108490d00200128020021050c010b200341086a220a2003490d5e20054101742203200a200a2003491b22034100480d5e0240024020050d002003102721050c010b200128020020052003102821050b2005450d5820012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a2007370000200029033821070240024020062802002203200428020022006b4108490d00200128020021030c010b200041086a22052000490d5e20034101742200200520052000491b22004100480d5e0240024020030d002000102721030c010b200128020020032000102821030b2003450d5920012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a20073700000c110b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d5d2000410174220a20052005200a491b220a4100480d5d0240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5920012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a41093a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22062000490d5d20054101742200200620062000491b22004100480d5d0240024020050d002000102721050c010b200128020020052000102821050b2005450d5a20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a290000370000200020032900013700000c100b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d5a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a00002000410c6a200110300c0f0b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d5a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041186a200110542000410c6a20011030200041106a200110300c0e0b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d9a012000410174220a20052005200a491b220a4100480d9a010240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5b20012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a410c3a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22062000490d9a0120054101742200200620062000491b22004100480d9a010240024020050d002000102721050c010b200128020020052000102821050b2005450d5c20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a290000370000200020032900013700000c0d0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d990120004101742205200320032005491b22054100480d99010240024020000d002005102721030c010b200128020020002005102821030b2003450d5c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410d3a00000c0c0b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d98012000410174220a20052005200a491b220a4100480d98010240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5c20012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a410e3a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22062000490d980120054101742200200620062000491b22004100480d98010240024020050d002000102721050c010b200128020020052000102821050b2005450d5d20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a290000370000200020032900013700000c0b0b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d97012000410174220a20052005200a491b220a4100480d97010240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5d20012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a410f3a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a220a2000490d970120054101742200200a200a2000491b22004100480d97010240024020050d002000102721050c010b200128020020052000102821050b2005450d5e20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000020032d0021220041054b0d0a024002400240024002400240024020000e06000102030405000b410021030c050b410121030c040b410221030c030b410321030c020b410421030c010b410521030b200220033a001c02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d970120004101742206200520052006491b22064100480d97010240024020000d002006102721050c010b200128020020002006102821050b2005450d5f20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a20033a00000c0a0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d960120004101742205200320032005491b22054100480d96010240024020000d002005102721030c010b200128020020002005102821030b2003450d5f20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41103a00000c090b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d950120034101742205200420042005491b22054100480d95010240024020030d002005102721040c010b200128020020032005102821040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041046a20011092020c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d940120034101742205200420042005491b22054100480d94010240024020030d002005102721040c010b200128020020032005102821040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041046a20011092020c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d930120034101742205200420042005491b22054100480d93010240024020030d002005102721040c010b200128020020032005102821040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000280208417f6a220341094b0d06024002400240024002400240024002400240024020030e0a00010203040506070809000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9c0120034101742205200420042005491b22054100480d9c010240024020030d002005102721040c010b200128020020032005102821040b2004450d6920012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a0000200028020c21042002200041146a280200220a360208200241086a200110300240200a450d00200141046a2109034002400240200928020020062802002203460d00200128020021050c010b200341016a22052003490d9e012003410174220b20052005200b491b220b4100480d9e010240024020030d00200b102721050c010b20012802002003200b102821050b2005450d6c200120053602002009200b360200200628020021030b2006200341016a360200200520036a20042d00003a0000200441016a2104200a417f6a220a0d000b0b200041186a20011030200028021c210402400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22052000490d9c0120034101742200200520052000491b22004100480d9c010240024020030d002000102721030c010b200128020020032000102821030b2003450d6b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0f0b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9b0120034101742205200420042005491b22054100480d9b010240024020030d002005102721040c010b200128020020032005102821040b2004450d6b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41013a0000200028020c21042002200041146a280200220a360208200241086a200110300240200a450d00200141046a2109034002400240200928020020062802002203460d00200128020021050c010b200341016a22052003490d9d012003410174220b20052005200b491b220b4100480d9d010240024020030d00200b102721050c010b20012802002003200b102821050b2005450d6e200120053602002009200b360200200628020021030b2006200341016a360200200520036a20042d00003a0000200441016a2104200a417f6a220a0d000b0b200041186a20011030200028021c210402400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22052000490d9b0120034101742200200520052000491b22004100480d9b010240024020030d002000102721030c010b200128020020032000102821030b2003450d6d20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0e0b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9a0120034101742205200420042005491b22054100480d9a010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011030200041106a20011051200041346a20011030200041386a200110300c0d0b200241033a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d990120034101742205200420042005491b22054100480d99010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a200110300c0c0b200141086a2802002103200241043a001c024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d980120034101742205200420042005491b22054100480d98010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a200110300c0b0b200241053a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d970120034101742205200420042005491b22054100480d97010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110512002200041386a360208200241086a20011059200041306a200110300c0a0b200241063a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d960120034101742205200420042005491b22054100480d96010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a200110300c090b200241073a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d950120034101742205200420042005491b22054100480d95010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110510c080b200141046a2802002104200241083a001c024002402004200141086a2802002203460d00200128020021040c010b200341016a22042003490d940120034101742205200420042005491b22054100480d94010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a200110540c070b200241093a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d930120034101742205200420042005491b22054100480d93010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110540c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d6e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110540c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d910120034101742205200420042005491b22054100480d91010240024020030d002005102721040c010b200128020020032005102821040b2004450d6e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d910120034101742205200420042005491b22054100480d91010240024020030d002005102721040c010b200128020020032005102821040b2004450d6f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210620022000410c6a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d910120044101742203200520052003491b22034100480d91010240024020040d002003102721040c010b200128020020042003102821040b2004450d7020012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d900120034101742205200420042005491b22054100480d90010240024020030d002005102721040c010b200128020020032005102821040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410e3a00002000280208417f6a220341024b0d0302400240024020030e03000102000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a360208200241086a200110592000410c6a200110510c050b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d910120034101742205200420042005491b22054100480d91010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110300c040b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d900120034101742205200420042005491b22054100480d90010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110300c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8f0120034101742205200420042005491b22054100480d8f010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410f3a0000200041086a22032d0000417f6a220441054b0d0202400240024002400240024020040e06000102030405000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d940120034101742205200420042005491b22054100480d94010240024020030d002005102721040c010b200128020020032005102821040b2004450d7920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a20011093020c070b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d930120034101742205200420042005491b22054100480d93010240024020030d002005102721040c010b200128020020032005102821040b2004450d7920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011054200028020c21062002200041146a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d930120044101742203200520052003491b22034100480d93010240024020040d002003102721040c010b200128020020042003102821040b2004450d7a20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c060b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d7a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110512002200041c0006a360208200241086a20011059200041d0006a20011054200028023021062002200041386a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d920120044101742203200520052003491b22034100480d92010240024020040d002003102721040c010b200128020020042003102821040b2004450d7b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c050b200241033a001c02400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22052004490d910120044101742206200520052006491b22064100480d91010240024020040d002006102721050c010b200128020020042006102821050b2005450d7b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a360208200241086a20011059200041c8006a2001105402400240200141046a2802002205200628020022046b4120490d00200128020021050c010b200441206a22062004490d910120054101742204200620062004491b22044100480d91010240024020050d002004102721050c010b200128020020052004102821050b2005450d7c20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200028022c21052002200041346a2802002200360208200241086a2001103002400240200141046a2802002204200628020022036b2000490d00200128020021040c010b200320006a22062003490d910120044101742203200620062003491b22034100480d91010240024020040d002003102721040c010b200128020020042003102821040b2004450d7d20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2005200010ce041a0c040b200141086a2802002100200241043a001c024002402000200141046a280200460d00200128020021040c010b200041016a22042000490d900120004101742205200420042005491b22054100480d90010240024020000d002005102721040c010b200128020020002005102821040b2004450d7d20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240200141046a2802002204200528020022006b4120490d00200128020021040c010b200041206a22052000490d900120044101742200200520052000491b22004100480d90010240024020040d002000102721040c010b200128020020042000102821040b2004450d7e20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a29000037000020002003290001370000024020032d00214101460d00200241003a001c02400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d910120004101742204200320032004491b22044100480d91010240024020000d002004102721030c010b200128020020002004102821030b2003450d800120012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c040b200241013a001c02400240200141046a28020020052802002200460d00200128020021040c010b200041016a22042000490d900120004101742205200420042005491b22054100480d90010240024020000d002005102721040c010b200128020020002005102821040b2004450d800120012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a000002400240200141046a2802002204200528020022006b4120490d00200128020021040c010b200041206a22052000490d900120044101742200200520052000491b22004100480d90010240024020040d002000102721040c010b200128020020042000102821040b2004450d810120012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220041186a200341226a220341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200020032900003700000c030b200241053a001c02400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22052004490d8f0120044101742206200520052006491b22064100480d8f010240024020040d002006102721050c010b200128020020042006102821050b2005450d810120012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41053a000002400240200141046a2802002205200628020022046b4120490d00200128020021050c010b200441206a22062004490d8f0120054101742204200620062004491b22044100480d8f010240024020050d002004102721050c010b200128020020052004102821050b2005450d820120012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240200141046a2802002205200628020022046b4120490d00200128020021050c010b200441206a22062004490d8f0120054101742204200620062004491b22044100480d8f010240024020050d002004102721050c010b200128020020052004102821050b2005450d830120012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341216a220341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200041e0006a29030021072000290358210e02400240200141046a2802002204200628020022036b4110490d00200128020021040c010b200341106a22052003490d8f0120044101742203200520052003491b22034100480d8f010240024020040d002003102721040c010b200128020020042003102821040b2004450d840120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320073700082003200e370000200028024c21032002200041d4006a2802002200360208200241086a200110302000450d0220004105742106200141046a210a034002400240200a2802002204200528020022006b4120490d00200128020021040c010b200041206a22092000490d900120044101742200200920092000491b22004100480d90010240024020040d002000102721040c010b200128020020042000102821040b2004450d860120012004360200200a2000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000c030b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8e0120034101742205200420042005491b22054100480d8e010240024020030d002005102721040c010b200128020020032005102821040b2004450d850120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41103a00002000280204417f6a220341014b0d010240024020030e020001000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8f0120034101742205200420042005491b22054100480d8f010240024020030d002005102721040c010b200128020020032005102821040b2004450d870120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208200110320c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8e0120034101742205200420042005491b22054100480d8e010240024020030d002005102721040c010b200128020020032005102821040b2004450d870120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110510c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8d0120034101742205200420042005491b22054100480d8d010240024020030d002005102721040c010b200128020020032005102821040b2004450d870120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41113a0000200241003a001c02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d8d0120034101742205200420042005491b22054100480d8d010240024020030d002005102721040c010b200128020020032005102821040b2004450d880120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000290308210702400240200141046a2802002204200528020022036b4108490d00200128020021040c010b200341086a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d890120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341086a360200200420036a2007370000200041106a20011061200041286a280200210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d8a0120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d8b0120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a2000412c6a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200028025021062002200041d8006a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d8c0120012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0b200241206a24000f0b20054101102a000b20044101102a000b20054101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20044101102a000b20054101102a000b20054101102a000b20054101102a000b20004101102a000b20044101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20004101102a000b20004101102a000b20004101102a000b20004101102a000b20044101102a000b20054101102a000b20044101102a000b20044101102a000b200a4101102a000b200a4101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200a4101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200a4101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b200a4101102a000b20054101102a000b20054101102a000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000b20034101102a000b20004101102a000b200a4101102a000b20004101102a000b20054101102a000b20054101102a000b20094101102a000b20054101102a000b20034101102a000b20004101102a000b200a4101102a000b20004101102a000b20054101102a000b20054101102a000b102b000b200a4101102a000b20004101102a000b20054101102a000b200a4101102a000b20004101102a000b200a4101102a000b20004101102a000b20064101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200b4101102a000b20004101102a000b20054101102a000b200b4101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20054101102a000b20034101102a000b20064101102a000b20044101102a000b20034101102a000b20054101102a000b20004101102a000b20044101102a000b20054101102a000b20004101102a000b20064101102a000b20044101102a000b20044101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b20034101102a000b102b000bae0401067f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210300240024002400240024020000d002002280208210020022802042104200228020021050c010b200041b0016c21062002280204210420022802082100034020034188016a280200210702400240200420006b4104490d00200228020021040c010b200041046a22052000490d0520044101742200200520052000491b22004100480d050240024020040d002000102721040c010b200228020020042000102821040b2004450d032002200036020420022004360200200228020821000b2002200041046a360208200420006a20073600002003200210320240024020022802042204200228020822006b4120490d00200228020021050c010b200041206a22072000490d0520044101742200200720072000491b22074100480d050240024020040d002007102721050c010b200228020020042007102821050b2005450d04200220073602042002200536020020022802082100200721040b200520006a220741086a20034194016a290000370000200741106a2003419c016a290000370000200741186a200341a4016a2900003700002002200041206a220036020820072003418c016a290000370000200341b0016a2103200641d07e6a22060d000b0b2001280200200128020420052000100302402004450d00200510290b200241106a24000f0b20004101102a000b20074101102a000b102b000b840403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210300240024020000d002002280208210420022802042100200228020021050c010b2003200041306c6a21062002280200210520022802042100200228020821040340200341086a29030021072003290300210802400240024002400240200020046b4110490d00200441106a21090c010b200441106a22092004490d012000410174220a20092009200a491b220a4100480d010240024020000d00200a102721050c010b20052000200a102821050b2005450d02200a21000b200520046a22042007370008200420083700000240200020096b4120490d00200941206a21040c030b200941206a22042009490d002000410174220a20042004200a491b220a4100480d000240024020000d00200a102721050c010b20052000200a102821050b02402005450d00200a21000c030b200a4101102a000b102b000b200a4101102a000b200520096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032006470d000b2002200036020420022004360208200220053602000b2001280200200128020420052004100302402000450d00200510290b200241106a24000b990501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103002400240024002400240024020000d002002280208210420022802042105200228020021000c010b200041216c210603400240024020032d00004101460d00024002402002280204220520022802082207460d00200228020021000c010b200741016a22002007490d0820074101742205200020002005491b22054100480d080240024020070d002005102721000c010b200228020020072005102821000b2000450d0520022005360204200220003602000b2002200741016a2204360208200020076a41003a00000c010b024002402002280204220520022802082207460d00200228020021000c010b200741016a22002007490d0720074101742205200020002005491b22054100480d070240024020070d002005102721000c010b200228020020072005102821000b2000450d0520022005360204200220003602000b2002200741016a2208360208200020076a41013a000002400240200520086b4120490d00200741216a21040c010b200841206a22042008490d0720054101742207200420042007491b22074100480d070240024020050d002007102721000c010b200020052007102821000b2000450d062002200736020420022000360200200721050b200020086a220741086a200341016a220841086a290000370000200741106a200841106a290000370000200741186a200841186a29000037000020022004360208200720082900003700000b200341216a21032006415f6a22060d000b0b2001280200200128020420002004100302402005450d00200010290b200241106a24000f0b20054101102a000b20054101102a000b20074101102a000b102b000b9203010a7f200041086a220228020021034100210420024100360200024002402003450d004100210541002106410021044100210702400340024002402004450d00200741057421080340200720034f0d062001200028020022096b2008460d02200920086a220a2001412010d004450d020240200620076a220b20034f0d00200920056a20086a2209200a290000370000200941186a200a41186a290000370000200941106a200a41106a290000370000200941086a200a41086a290000370000200841206a2108200741016a22072003490d010c050b0b419481c000200b20031037000b200028020020074105746a21080340200720034f0d0520012008460d0120082001412010d004450d01200841206a2108200741016a22072003490d000b410021040c030b200541606a21052006417f6a2106200441016a2104200741016a22072003490d000b0b2004450d00200320074d0d00200028020020074105746a220820044105746b2008200320076b41057410cf041a0b2002200320046b3602000f0b41b880c000200720031037000b6c01017f230041306b2203240020032002360204200320013602002003411c6a41023602002003412c6a41013602002003420237020c200341a8d6c500360208200341013602242003200341206a360218200320033602282003200341046a360220200341086a20001057000bae0a03027f017e1a7f230041f0006b22022400024002400240024002400240024020012802082203ad42f8007e2204422088a70d002004a72205417f4c0d00200128020021060240024020050d00410821070c010b200510272207450d020b0240024020030d00410021080c010b2006200341f8006c6a2109410021082007210a0340200241c0006a41086a220b2006411c6a290000370300200241c0006a41106a220c200641246a290000370300200241c0006a41186a220d2006412c6a290000370300200241206a41086a220e2006413c6a29000037030020062900142104200241206a41106a220f200641c4006a290000370300200241206a41186a2210200641cc006a290000370300200241106a2211200641e4006a290000370300200241086a2212200641dc006a290000370300200241186a2213200641ec006a29000037030020022004370340200220062900343703202002200629005437030020062802102214ad42247e2204422088a70d022004a72201417f4c0d0220062903002104200628020821150240024020010d00410421160c010b200110272216450d050b0240024020140d00410021170c010b201441246c211841002119410021170340024002400240024002400240201520196a22012d00000e050001020304000b2002200141146a2900003703602002200141196a290000370065200141056a2f0000200141076a2d000041107472211a200141106a280000211b2001410c6a2800002105200141086a280000211c200141016a280000211d4100211e0c040b200141106a2802002205417f4c0d08200141086a280200211b200141016a280000211d4101211e4101211c02402005450d0020051027221c450d0c0b201c201b200510ce041a2005211b0c030b200141106a2802002205417f4c0d07200141086a280200211e200141016a280000211d0240024020050d004101211c0c010b20051027221c450d0c0b201c201e200510ce041a4102211e2005211b0c020b200141106a2802002205417f4c0d06200141086a280200211e200141016a280000211d0240024020050d004101211c0c010b20051027221c450d0c0b201c201e200510ce041a4103211e2005211b0c010b2001410c6a280200221c417f4c0d05200141046a280200210102400240201c0d00410121050c010b201c10272205450d0c0b20052001201c10ce042201410876211a2001411874211d4104211e201c21050b201620196a2201201e3a0000200141076a201a4110763a0000200141056a201a3b0000200141106a201b3600002001410c6a2005360000200141086a201c360000200141016a201d360000200141146a20022903603702002001411c6a200241e0006a41086a290300370200201741016a21172018201941246a2219470d000b0b200a2016360208200a410c6a2014360200200a41106a2017360200200a2002290340370214200a411c6a200b290300370200200a2004370300200a2002290320370234200a41246a200c290300370200200a412c6a200d290300370200200a413c6a200e290300370200200a41c4006a200f290300370200200a41cc006a2010290300370200200a41ec006a2013290300370200200a41e4006a2011290300370200200a41dc006a2012290300370200200a2002290300370254200841016a2108200a41f8006a210a200641f8006a22062009470d000b0b200020083602082000200336020420002007360200200241f0006a24000f0b1039000b20054108102a000b20014104102a000b20054101102a000b20054101102a000b20054101102a000b201c4101102a000b0500102b000b900201077f024020002802082201200028020c460d0003402000200141306a36020820012d00284102460d01200141246a2802002102200141206a2802002103200141146a2802002104200128021c2105200128021021060240200141186a2802002201450d002001410c6c21072006210103400240200141046a280200450d00200128020010290b2001410c6a2101200741746a22070d000b0b02402004450d00200610290b02402002450d002002410c6c21072005210103400240200141046a280200450d00200128020010290b2001410c6a2101200741746a22070d000b0b02402003450d00200510290b20002802082201200028020c470d000b0b02402000280204450d00200028020010290b0bbb06020c7f017e230041b0056b2202240020022001102e02400240024002400240024020022802000d00200041003602000c010b0240024020022802042203411c2003411c491b22040d00410821050c010b20044190016c220610272205450d020b02402003450d0020024198036a41047221074100210841002106410021090340200241003a00a004200241a0046a2001280200220a2001280204220b410047220c10ce041a200b200c490d042001200b200c6b3602042001200a200c6a36020002400240024002400240200b450d0020022d00a004220b41014b0d000240200b0e020400040b200241a0046a2001103c0240024020022802a0044112460d0020024198036a200241a0046a41880110ce041a200241003602ac05200241ac056a2001280200220a2001280204220b4104200b4104491b220c10ce041a2001200b200c6b3602042001200a200c6a360200200b41034b0d0120024198036a103d0b200241a0046a20024194026a41840110ce041a0c010b20022802ac05210d200228029803210c20024194026a200741840110ce041a200241a0046a20024194026a41840110ce041a200c4112470d010b200241a0046a20024190016a41840110ce041a0c010b20024190016a200241a0046a41840110ce041a200241a0046a20024190016a41840110ce041a200c4113470d020b2000410036020002402009450d00200521010340024020012802004112460d002001103d0b20014190016a2101200641f07e6a22060d000b0b2004450d04200510290c040b200241a0046a20024190016a41840110ce041a4112210c0b200941016a210b2002410c6a200241a0046a41840110ce041a024020092004470d002008200b200b2008491b2204ad4290017e220e422088a70d07200ea7220a4100480d070240024020090d00200a102721050c010b20052006200a102821050b2005450d060b200520066a2209200c360200200941046a2002410c6a41840110ce041a20094188016a200d360200200841026a210820064190016a2106200b21092003200b470d000b0b2000200436020420002005360200200041086a20033602000b200241b0056a24000f0b20064108102a000b200c200b103e000b200a4108102a000b102b000bfe5e07067f017e047f037e017f037e047f23004190096b22022400200241003a00e803200241e8036a2001280200220320012802042204410047220510ce041a0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041123602000c290b0240024002400240024002400240024002400240024020022d00e803220441114b0d0002400240024002400240024002400240024002400240024002400240024002400240024020040e12000102030405060708090a0b0c0d0e0f1011000b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d1d2001200620046b22033602042001200520046a22053602002006450d4220022d00f008220641054b0d42410121070240024002400240024020060e06480001020304480b200241f8056a2001104420022802f8052204450d4620022902fc052108410221070c470b200242003703f805200241f8056a20052003410820034108491b220410ce041a2001200320046b3602042001200520046a360200200341074d0d4520022903f8052108410321070c460b200241f8056a2001104420022802f8052204450d4420022902fc052108410421070c450b20022001102e2002280200450d43024002402002280204220941aa01200941aa01491b220a0d00410421040c010b200a41186c220510272204450d200b02402009450d0020024180066a210b4100210741002105410021030340200241e8036a200110440240024020022802e803220c450d0020022902ec032108200241f8056a2001104420022802f8050d012008a7450d00200c10290b02402003450d002004210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141186a2101200541686a22050d000b0b200a0d450c460b200341016a2106200b350200210d20022903f805210e02402003200a470d002007200620062007491b220aad42187e220f422088a70d3c200fa722104100480d3c0240024020030d002010102721040c010b200420052010102821040b2004450d230b200420056a2203200c360200200341146a200d3e02002003410c6a200e370200200341046a2008370200200741026a2107200541186a21052006210320092006470d000b0b2004450d432009ad422086200aad842108410521070c440b200241086a2001102e2002280208450d4202400240200228020c220941d502200941d502491b220a0d00410421040c010b200a410c6c220510272204450d210b02402009450d004100210741002105410021030340200241f8056a20011044024020022802f805220c0d0002402003450d002004210103400240200141046a280200450d00200128020010290b2001410c6a2101200541746a22050d000b0b200a450d450c440b200341016a210620022902fc05210802402003200a470d002007200620062007491b220aad420c7e220d422088a70d3b200da7220b4100480d3b0240024020030d00200b102721040c010b20042005200b102821040b2004450d240b200420056a2203200c360200200341046a2008370200200741026a21072005410c6a21052006210320092006470d000b0b2004450d422009ad422086200aad842108410621070c430b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d212001200620046b3602042001200520046a360200200041123602000c430b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d212001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241106a200110522002290310a7450d002002290318210820004102360200200041086a2008370300200041106a200241f0046a41f80010ce041a0c430b200041123602000c420b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d212001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241206a2001102e2002280220450d000240024020022802242209412220094122491b220a0d004108210c0c010b200a41f8006c22041027220c450d240b02402009450d00200241f0046a410c6a210b4100210741002106410021050340200241f0046a2001108e0220022903f004210820022802f8042103200241e8036a200b41ec0010ce041a024020030d0002402005450d00200c20066a2103200c210603400240200641106a2802002204450d0020062802082101200441246c210403400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012004415c6a22040d000b0b200641f8006a210102402006410c6a280200450d00200628020810290b2001210620032001470d000b0b200a450d03200c10290c030b200541016a210420024180086a200241e8036a41ec0010ce041a02402005200a470d002007200420042007491b220aad42f8007e220d422088a70d39200da722104100480d390240024020050d0020101027210c0c010b200c200620101028210c0b200c450d270b200c20066a22052008370300200541086a20033602002005410c6a20024180086a41ec0010ce041a200741026a2107200641f8006a21062004210520092004470d000b0b200c0d120b200041123602000c410b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d232001200620046b3602042001200520046a360200200041123602000c400b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d232001200620046b3602042001200520046a36020002402006450d0020022d00f008220441014b0d0002400240024020040e020001000b200241f8056a2001105020022d00f80522044102460d0220022d00fb05210320022f00f905210720024184066a290200210820024198066a280200210520024190066a290300210d2002418c066a280200210620022902fc05210e200241286a200110532002280228450d0220072003411074722101200241286a41106a290300210f41012103200229033021110c010b200241f8056a2001105020022d00f80522044102460d0120022d00fb05210320022f00f905210720024184066a290200210820024198066a280200210520024190066a290300210d2002418c066a280200210620022902fc05210e200241d8006a200110532002290358a7450d01200241d8006a41106a290300210f20022903602111200241c0006a200110532002290340a7450d0120072003411074722101200241d0006a290300211220022903482113410221030b200020013b000d200041053602002000410f6a20014110763a0000200041c8006a2012370200200041c0006a2013370200200041386a200f370200200041306a2011370200200041186a2008370000200041106a200e3700002000412c6a2005360000200041246a200d370000200041206a20063600002000410c6a20043a0000200041086a2003360200200041d0006a20022903f004370300200041d8006a200241f0046a41086a290300370300200041e0006a200241f0046a41106a290300370300200041e8006a200241f0046a41186a290300370300200041f0006a200241f0046a41206a290300370300200041f8006a20024198056a29030037030020004180016a200241f0046a41306a2903003703000c400b200041123602000c3f0b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d232001200620046b22093602042001200520046a220b3602002006450d3a20022d00f008220a410c4b0d3a41042107024002400240024002400240024002400240024002400240200a0e0d00010245030405060708090a0b000b200241f8056a2001105020022d00f80522044102460d4520022d00fb05210a20022f00f905210920024184066a290200210d20024198066a280200210320024190066a29030021082002418c066a280200210520022902fc05210e200241f0006a200110532002290370a7450d45200241f0006a41106a29030021112002290378210f200241003a00f008200241f0086a2001280200220c20012802042206410047220710ce041a20062007490d2f2001200620076b3602042001200c20076a3602002006450d4520022d00f008220641024b0d452009200a41107472210c410121070c440b20024188016a20011053200229038801a7450d4420024198016a290300210d200229039001210e200220022f01f8053b018008410221074100210c0c430b200241a0016a2001105320022903a001a7450d43200241b0016a290300210d20022903a801210e200220022f01f8053b018008410321074100210c0c420b200241d0016a2001102e20022802d001450d4220022802d4012105200241b8016a2001105320022903b801a7450d42200241c8016a290300210d20022903c001210e200220022f01f8053b018008410521074100210c0c410b200241d8016a2001102e20022802d801450d410240024020022802dc01221441f100201441f100491b22150d00410421040c010b201541246c220510272204450d2d0b02402014450d004120210320024184066a211641002107410021050340200241f8056a20011050024020022d00f805220c4102470d002015450d44200410290c440b200541016a210620022d00fb05210a20022f00f90521092016290200210820022902fc05210d200228029806210b200229039006210e200228028c062110024020052015470d002007200620062007491b2215ad42247e220f422088a70d3c200fa722174100480d3c0240024020050d002017102721040c010b2004200341606a2017102821040b2004450d300b200420036a2205200b360000200541616a220b2009200a41107472220a3b0000200541646a220920083700082009200d370000200541786a200e370000200541746a2010360000200541606a200c3a0000200b41026a200a4110763a0000200741026a2107200341246a21032006210520142006470d000b0b2004450d412014ad4220862015ad84210e200220022f01e8033b0180082004410876210c410621070c400b410721070c3f0b200241003a00f008200241f0086a200b2009410047220410ce041a20092004490d2c2001200920046b3602042001200b20046a3602002009450d3f20022d00f008220641034f0d3f200220022f01f8053b018008410821074200210d4100210c0c3e0b200241f8056a2001105020022d00f80522044102460d3e20024184066a290200210d20022902fc05210e200220022f01e8033b01800820022f00f90520022d00fb0541107472210c2002418c066a280200210520024190066a290300210820024198066a2802002103410921070c3d0b200241e0016a2001102e20022802e001450d3d20022802e4012104200220022f01f8053b0180082004410876210c410a21074200210d0c3c0b410b21070c3b0b200241e8016a2001102e20022802e801450d3b20022802ec012104200220022f01f8053b0180082004410876210c410c21074200210d0c3a0b200241f8056a2001102d20022802f8052204450d3a200220022f01e8033b0180082004410876210c20022902fc05210e410d21070c390b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d272001200620046b22033602042001200520046a220436020002402006450d0020022d00f0080d00200241e0076a2003412020034120491b22056a41004100412020056b2005411f4b1b10cd041a200241e0076a2004200510ce041a2001200320056b22063602042001200420056a22053602002003411f4d0d00200241f0086a41086a2203200241e0076a41086a2207290300370300200241f0086a41106a220c200241e0076a41106a220a290300370300200241f0086a41186a2209200241e0076a41186a220b290300370300200220022903e00722083703a007200220083703f008200241e0076a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241e0076a2005200410ce041a2001200620046b3602042001200520046a3602002006411f4d0d0020024180076a41086a2204200729030037030020024180076a41106a2205200a29030037030020024180076a41186a2206200b290300370300200241f0046a41186a22072009290300370300200241f0046a41106a220a200c290300370300200241f0046a41086a220c2003290300370300200220022903e00722083703a0072002200837038007200220022903f0083703f004200241f0046a41386a22032006290300370300200241f0046a41306a22062005290300370300200241f0046a41286a22052004290300370300200220022903800737039005200241f8056a41386a22042003290300370300200241f8056a41306a22032006290300370300200241f8056a41286a22062005290300370300200241f8056a41206a2205200229039005370300200241f8056a41186a2007290300370300200241f8056a41106a200a290300370300200241f8056a41086a200c290300370300200220022903f0043703f805200241f0046a2001104420022802f00422010d0f0b200041123602000c3d0b200241f8056a2001108f02200220022f01fa053b01e80320022d00f80522014112470d0e200041123602000c3c0b200241f8056a2001109002200241e8036a41086a2201200241f8056a41096a290000370300200241e8036a41106a220420024189066a290000370300200241e8036a41186a220520024191066a290000370300200241e8036a411f6a220620024198066a290000370000200220022900f9053703e80320022d00f80522034105470d0e200041123602000c3b0b200241f8056a2001109002200241e8036a41086a220120024181066a290000370300200241e8036a41106a220420024189066a290000370300200241e8036a41186a220520024191066a290000370300200241e8036a411f6a220620024198066a290000370000200220022900f9053703e80320022d00f80522034105470d0e200041123602000c3a0b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a3602002006450d3320022d00f008220441094b0d33024002400240024002400240024002400240024020040e0a00010203040506070809000b200241f8056a2001104220022802f8052204450d3c20022902fc052108200241f0016a2001102e2008a72105024020022802f0010d002005450d3d0c3c0b20022802f4012106200241003602f805200241f8056a2001280200220c20012802042203410420034104491b220710ce041a2001200320076b3602042001200c20076a3602000240200341034b0d0020050d3c0c3d0b2008422088210820024180086a41086a200241e8036a41086a280200360200200220022902e80337038008200541087621092004410876210b20022802f80521014101210a0c3a0b200241f8056a2001104220022802f8052204450d3b20022902fc052108200241f8016a2001102e2008a72105024020022802f8010d0020050d3b0c3c0b20022802fc012106200241003602f805200241f8056a2001280200220c20012802042203410420034104491b220710ce041a2001200320076b3602042001200c20076a3602000240200341034b0d0020050d3b0c3c0b2008422088210820024180086a41086a200241e8036a41086a280200360200200220022902e80337038008200541087621092004410876210b20022802f80521014102210a0c390b20024190026a2001102e200228029002450d3a2002280294022104200241f8056a2001105020022d00f80522054102460d3a20022d00fb05210620022f00f905210320024184066a290200210e20024198066a280200210720024190066a290300210d2002418c066a280200210a20022902fc05210820024188026a2001102e200228028802450d3a200228028c02210c20024180026a2001102e200228028002450d3a2003200641107472210920022802840221012002200d370284082002200a360280082004410876210b2008422088a72106200e422088a721032001ad210d200ea721014200210e4103210a0c380b20024198026a2001102e200228029802450d39200228029c02210420024180086a41086a200241f8056a41086a280200360200200220022902f805370380082004410876210b4104210a0c360b200241a0026a2001102e20022802a002450d3820022802a402210420024180086a41086a200241f8056a41086a280200360200200220022902f805370380082004410876210b4105210a0c350b200241f8056a2001105020022d00f80522044102460d3720022d00fb05210520022f00f905210620024184066a290200210f20024198066a280200210c20024190066a29030021082002418c066a280200210320022902fc052111200241b0026a2001105320022903b002a7450d37200241b0026a41106a290300210e20022903b802210d200241a8026a2001102e20022802a802450d372006200541107472210b20022802ac0221072002200c360288082002200837038008201142208821082011a722054108762109200f422088a72101200fa721064106210a0c350b200241c8026a2001102e20022802c802450d3620022802cc02210420024180086a41086a200241f8056a41086a280200360200200220022902f805370380082004410876210b4107210a0c330b200241f8056a2001105020022d00f80522044102460d3520024184066a290200210d20022902fc05210e200220024198066a28020036028808200220024190066a29030037038008200e42208821084108210a200ea72205410876210920022f00f90520022d00fb0541107472210b200d422088a721012002418c066a2802002103200da721060c330b200241d0026a2001105220022903d002a7450d3420022903d802220d4220882108200da7220541087621094109210a0c320b200241e0026a2001105220022903e002a7450d3320022903e802220d4220882108200da722054108762109410a210a0c310b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241f0026a2001105220022903f002a7450d0020022903f80221082000410c360200200041086a2008370300200041106a200241f0046a41f80010ce041a0c390b200041123602000c380b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241f8056a2001104420022802f80522010d0d0b200041123602000c370b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a36020002402006450d0020022d00f008220441024b0d0002400240024020040e03000102000b20024180036a20011053200229038003a7450d0220024190036a2903002108200229038803210d200241f8056a2001105020022d00f80522014102460d0220022f00f90520022d00fb0541107472210420024184066a290200210e2002418c066a280200210520024190066a290300210f20024198066a280200210620022902fc052111410121030c2f0b20024198036a2001102e200228029803450d01200228029c032201410876210442002111410221030c2d0b200241a0036a2001102e20022802a003450d0020022802a4032201410876210442002111410321030c2c0b200041123602000c360b200241f0046a200110910220022d00f0042101200241f8056a200241f0046a41017241ff0010ce041a20014107470d0b200041123602000c350b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d232001200620046b3602042001200520046a36020002402006450d0020022d00e803220441014b0d0002400240024020040e020001000b200241f0046a2001103c20022802f0042104200241f8056a200241f0046a41047241840110ce041a20044112460d02200241e8036a200241f8056a41840110ce041a41880110272201450d2720012004360200200141046a200241e8036a41840110ce041a200241f0086a41086a200241b0036a41086a290200370300200241f0086a41106a200241b0036a41106a290200370300200241f0086a41186a200241b0036a41186a290200370300200220022902b0033703f008410121040c010b200241f0046a20011050200241f8056a41086a2201200241fc046a290200370300200241f8056a41106a220520024184056a290200370300200241f8056a41186a22062002418c056a290200370300200220022902f4043703f8054102210420022d00f00422034102460d0120022d00f304210720022f00f104210c200241f0086a41186a2006290300370300200241f0086a41106a2005290300370300200241f0086a41086a2001290300370300200220022903f8053703f008200c20074110747241087420037221010b200241e0076a41086a200241f0086a41086a2903002208370300200241e0076a41106a200241f0086a41106a290300220d370300200241e0076a41186a200241f0086a41186a290300220e370300200220022903f008220f3703e007200041086a200136020020002004360204200041103602002000410c6a200f370200200041146a20083702002000411c6a200d370200200041246a200e3702002000412c6a20024180086a41dc0010ce041a0c350b200041123602000c340b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d242001200620046b22033602042001200520046a220436020002402006450d0020022d00f0080d00200242003703f805200241f8056a20042003410820034108491b220510ce041a2001200320056b3602042001200420056a360200200341074d0d0020022903f805210f200241f8056a2001104420022802f8052210450d0020022902fc05210e200241a8036a2001102e200ea721150240024020022802a803450d000240024020022802ac03220941d502200941d502491b220a0d00410421070c010b200a410c6c220410272207450d290b02402009450d004100210341002104410021060340200241f8056a20011044024020022802f805220c0d0002402006450d002007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200a450d03200710290c030b200641016a210520022902fc05210802402006200a470d002003200520052003491b220aad420c7e220d422088a70d2d200da7220b4100480d2d0240024020060d00200b102721070c010b20072004200b102821070b2007450d2c0b200720046a2206200c360200200641046a2008370200200341026a21032004410c6a21042005210620092005470d000b0b20070d010b2015450d01201010290c010b200241003602f805200241f8056a2001280200220320012802042204410420044104491b220610ce041a2001200420066b22053602042001200320066a22033602002009ad422086200aad842208422088a721062008a7210c02400240200441034b0d0002402015450d00201010290b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200c0d010c020b20022802f805210a200241e0076a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd041a200241e0076a2003200410ce041a2001200520046b3602042001200320046a36020002402005411f4b0d0002402015450d00201010290b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200c0d010c020b200241a0076a41086a2204200241e0076a41086a290300370300200241a0076a41106a2205200241e0076a41106a290300370300200241a0076a41186a2203200241e0076a41186a290300370300200220022903e0073703a007200241f8056a2001104420022802f80522010d0302402015450d00201010290b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200c450d010b200710290b200241f8056a41186a200241e8036a41186a290300370300200241f8056a41106a200241e8036a41106a290300370300200241f8056a41086a200241e8036a41086a290300370300200220022903e8033703f8050c020b200041123602000c320b200241e8036a41086a20042903002208370300200241e8036a41106a2005290300220d370300200241e8036a41186a20032903002211370300200220022903a00722133703e80320022902fc052112200241f8056a41186a2011370300200241f8056a41106a200d370300200241f8056a41086a2008370300200220133703f80520100d080b200041123602000c300b2000200c36020420004103360200200041086a2009ad422086200aad84370200200041106a200241f8056a41f80010ce041a0c2f0b200241e8036a41086a2207200241f8056a41086a290300370300200241e8036a41106a220c200241f8056a41106a290300370300200241e8036a41186a220a200241f8056a41186a290300370300200241e8036a41206a22092005290300370300200241e8036a41286a22052006290300370300200241e8036a41306a22062003290300370300200241e8036a41386a22032004290300370300200220022903f8053703e80320022902f404210820024180086a41386a2204200329030037030020024180086a41306a2203200629030037030020024180086a41286a2206200529030037030020024180086a41206a2205200929030037030020024180086a41186a2209200a29030037030020024180086a41106a220a200c29030037030020024180086a41086a220c2007290300370300200220022903e80337038008200041086a20083702002000200136020420004107360200200041106a200229038008370200200041186a200c290300370200200041206a200a290300370200200041286a2009290300370200200041306a2005290300370200200041386a2006290300370200200041c0006a2003290300370200200041c8006a200429030037020020004180016a200241b0036a41306a290300370300200041f8006a200241b0036a41286a290300370300200041f0006a200241b0036a41206a290300370300200041e8006a200241b0036a41186a290300370300200041e0006a200241b0036a41106a290300370300200041d8006a200241b0036a41086a290300370300200041d0006a20022903b0033703000c2e0b20022d00f9052104200220022f01e80322053b018008200241f8056a41186a280200210620024194066a2902002108200241f8056a41246a2802002103200241f8056a41086a290300210d200241f8056a41106a290300210e200241a0066a290300210f20022802fc052107200041386a200241f8056a41306a290300370200200041306a200f370200200041186a200e370200200041106a200d370200200020043a0009200041086a20013a0000200041083602002000412c6a2003360200200041246a2008370200200041206a20063602002000410c6a2007360200200020053b000a200041c0006a200241f0046a41c80010ce041a0c2d0b20024180086a411f6a2207200629000037000020024180086a41186a2206200529030037030020024180086a41106a2004290300220837030020024180086a41086a2001290300220d370300200220022903e803220e37038008200020033a0004200041093602002000200e3700052000410d6a200d370000200041156a20083700002000411d6a2006290300370000200041246a20072900003700002000412c6a200241f0046a41dc0010ce041a0c2c0b20024180086a411f6a2207200629000037000020024180086a41186a2206200529030037030020024180086a41106a2004290300220837030020024180086a41086a2001290300220d370300200220022903e803220e37038008200020033a00042000410a3602002000200e3700052000410d6a200d370000200041156a20083700002000411d6a2006290300370000200041246a20072900003700002000412c6a200241f0046a41dc0010ce041a0c2b0b200041086a20022902fc05370200200020013602042000410d360200200041106a200241f0046a41f80010ce041a0c2a0b200241e8036a200241f8056a41ff0010ce041a200041086a20013a00002000410f360200200041096a200241e8036a41ff0010ce041a0c290b20024180086a41186a2204200241f8056a41186a29030037030020024180086a41106a2205200241f8056a41106a29030037030020024180086a41086a2203200241f8056a41086a290300370300200220022903f80537038008200041286a200a360200200041246a2006360200200041206a200c3602002000411c6a2007360200200041186a200e422088a7360200200041146a2015360200200041106a2010360200200041086a200f37020020004111360200200041d4006a2012370200200041d0006a20013602002000412c6a200229038008370200200041346a20032903003702002000413c6a2005290300370200200041c4006a200429030037020020004180016a200241f0046a41206a290300370300200041f8006a200241f0046a41186a290300370300200041f0006a200241f0046a41106a290300370300200041e8006a200241f0046a41086a290300370300200041e0006a20022903f0043703000c280b20052004103e000b20042006103e000b20054104102a000b20104104102a000b20054104102a000b200b4104102a000b20042006103e000b20042006103e000b20042006103e000b20044108102a000b20104108102a000b20042006103e000b20042006103e000b20042006103e000b20072006103e000b20054104102a000b20174104102a000b20042009103e000b20042006103e000b20042006103e000b20042006103e000b20042006103e000b20042006103e000b20042006103e000b4188014108102a000b20042006103e000b20044104102a000b200b4104102a000b102b000b4200210e4200210f0b2000410e360200200041386a2008370200200041306a200d370200200041186a200e370200200041106a20113702002000412c6a2006360200200041246a200f370200200041206a2005360200200041086a20033602002000410c6a2004410874200141ff017172360200200041c0006a200241f0046a41c80010ce041a0c090b42002108410021090b200241b0036a41086a20024180086a41086a28020022103602002002200229038008220f3703b003200041206a20033602002000411c6a2001360200200041186a2006360200200041106a20084220862009ad42ffffff07834208862005ad42ff018384843702002000410c6a200b410874200441ff017172360200200041086a200a3602002000410b360200200041c0006a200e370200200041386a200d370200200041246a200f3702002000412c6a2010360200200041346a200c360200200041306a2007360200200041c8006a20022903f004370300200041d0006a200241f0046a41086a290300370300200041d8006a200241f0046a41106a290300370300200041e0006a200241f0046a41186a290300370300200041e8006a200241f0046a41206a290300370300200041f0006a20024198056a290300370300200041f8006a200241f0046a41306a29030037030020004180016a200241f0046a41386a2903003703000c070b200410290b200041123602000c050b200220022f01800822013b01b003200041386a2011370200200041306a200f370200200041186a200d370200200041106a200e370200200020063a0009200041086a20073a0000200041063602002000412c6a2003360200200041246a2008370200200041206a20053602002000410c6a200c410874200441ff017172360200200020013b000a200041c0006a200241f0046a41c80010ce041a0c040b200041123602000c030b200410290b200041123602000c010b20004100360200200041106a20083702002000410c6a2004360200200041086a2007360200200041186a200241f0046a41f00010ce041a0b20024190096a24000b960b01057f024002402000280200220141104b0d000240024002400240024002400240024002400240024020010e11000c0c010c0c0203040506070c080c090a000b0240200041086a280200220141054b0d0002400240024020010e060f0f000f01020f0b200041106a280200450d0e2000410c6a28020010290f0b200041106a280200450d0d2000410c6a28020010290f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141186a2101200241686a22020d000b0b200041106a280200450d0c200028020c10290f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010290b2001410c6a2101200241746a22020d000b0b200041106a280200450d0b200028020c10290f0b02402000410c6a2802002201450d0020002802042203200141f8006c6a210403400240200341106a2802002202450d0020032802082101200241246c210203400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012002415c6a22020d000b0b200341f8006a210102402003410c6a280200450d00200328020810290b2001210320012004470d000b0b200041086a280200450d0a200028020410290f0b0240200041086a2d00002201410c4b0d0020014106470d0a200041106a280200450d0a2000410c6a28020010290f0b200041106a280200450d092000410c6a28020010290f0b200041086a280200450d08200028020410290f0b200041086a2d0000417f6a220141074b0d07024002400240024020010e08000b0b0b010b0203000b2000410c6a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b20002d0004417f6a220141024b0d0602400240024020010e03000102000b2000410c6a280200450d08200041086a28020010290f0b200041086a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b20002d0004417f6a220141024b0d0502400240024020010e03000102000b2000410c6a280200450d07200041086a28020010290f0b200041086a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b200041086a280200417f6a220141014b0d040240024020010e020001000b200041106a280200450d052000410c6a28020010290f0b200041106a280200450d042000410c6a28020010290f0b200041086a280200450d03200028020410290f0b0240200041086a2d0000220141054b0d0002400240024020010e06060600010206060b200041106a280200450d052000410c6a28020010290f0b200041346a280200450d04200041306a28020010290f0b200041306a280200450d032000412c6a28020010290c030b200041d0006a280200450d02200041cc006a28020010290f0b20002802044101470d01200041086a2201280200103d200128020010290f0b0240200041146a280200450d00200041106a28020010290b0240200041246a2802002202450d002000411c6a28020021012002410c6c210203400240200141046a280200450d00200128020010290b2001410c6a2101200241746a22020d000b0b0240200041206a280200450d00200028021c10290b200041d4006a280200450d00200041d0006a28020010290f0b0b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c200241a4d9c500360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41b4d9c5001057000bfa0702137f017e23004190056b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b02400240200228020c2203411720034117491b22040d00410821050c010b200441b0016c220610272205450d020b02402003450d00200241e0026a4104722107200241f0046a41186a2108200241f0046a41106a2109200241f0046a41086a210a4100210b4100210c4100210d0340200241003602e803200241e8036a2001280200220e20012802042206410420064104491b220f10ce041a20012006200f6b3602042001200e200f6a36020002400240200641034b0d004112210e0c010b20022802e8032110200241e8036a2001103c024020022802e8034112470d004112210e0c010b200241e0026a200241e8036a41880110ce041a2008420037030020094200370300200a4200370300200242003703f004200241f0046a2001280200220e20012802042206412020064120491b220f10ce041a20012006200f6b3602042001200e200f6a36020002402006411f4b0d00200241e0026a103d4112210e0c010b200241b8016a41186a2008290300370300200241b8016a41106a2009290300370300200241b8016a41086a200a290300370300200220022903f0043703b80120022802e002210e200241dc016a200741840110ce041a201021110b200241e8036a200241dc016a41840110ce041a200241e0026a41186a2206200241b8016a41186a290300370300200241e0026a41106a2210200241b8016a41106a290300370300200241e0026a41086a2212200241b8016a41086a290300370300200220022903b8013703e0020240200e4112470d00200041003602000240200d450d002005210603402006103d200641b0016a2106200c41d07e6a220c0d000b0b2004450d03200510290c030b200d41016a210f200241346a200241e8036a41840110ce041a200241106a41186a22132006290300370300200241106a41106a22142010290300370300200241106a41086a22102012290300370300200220022903e0023703100240200d2004470d00200b200f200f200b491b2204ad42b0017e2215422088a70d062015a722064100480d0602400240200d0d002006102721050c010b2005200c2006102821050b2005450d050b2005200c6a2206200e360200200641046a200241346a41840110ce041a20064188016a20113602002006418c016a200229031037020020064194016a20102903003702002006419c016a2014290300370200200641a4016a2013290300370200200b41026a210b200c41b0016a210c200f210d2003200f470d000b0b2000200436020420002005360200200041086a20033602000b20024190056a24000f0b20064108102a000b20064108102a000b102b000b8303020a7f017e230041106b2202240020022001102e0240024002400240024020022802000d00200041003602000c010b02400240200228020422034180042003418004491b22040d00410821050c010b2004410374220610272205450d020b02402003450d00410021074100210841002109034020024200370308200241086a2001280200220a20012802042206410820064108491b220b10ce041a20012006200b6b3602042001200a200b6a3602000240200641074b0d00200041003602002004450d03200510290c030b200941016a21062002290308210c024020092004470d002007200620062007491b220441ffffffff01712004470d062004410374220b4100480d060240024020090d00200b102721050c010b20052008200b102821050b2005450d050b200520086a200c370300200741026a2107200841086a21082006210920032006470d000b0b2000200436020420002005360200200041086a20033602000b200241106a24000f0b20064108102a000b200b4108102a000b102b000bb40502107f027e230041f0006b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b02400240200228020c220341e600200341e600491b22040d00410821050c010b200441286c220610272205450d020b02402003450d00200241d0006a41186a2107200241d0006a41106a2108200241d0006a41086a21094100210a4100210b4100210c034020074200370300200842003703002009420037030020024200370350200241d0006a2001280200220d2001280204220e4120200e4120491b220f10ce041a2001200e200f6b22063602042001200d200f6a220f36020002400240200e411f4d0d00200241306a41186a220d2007290300370300200241306a41106a22102008290300370300200241306a41086a221120092903003703002002200229035037033020024200370350200241d0006a200f2006410820064108491b220e10ce041a20012006200e6b3602042001200f200e6a360200200641074b0d010b200041003602002004450d03200510290c030b200c41016a210e200241106a41086a220f2011290300370300200241106a41106a22112010290300370300200241106a41186a2210200d29030037030020022002290330370310200229035021120240200c2004470d00200a200e200e200a491b2204ad42287e2213422088a70d062013a722064100480d0602400240200c0d002006102721050c010b2005200b2006102821050b2005450d050b2005200b6a22062002290310370300200641186a2010290300370300200641106a2011290300370300200641086a200f290300370300200641206a2012370300200a41026a210a200b41286a210b200e210c2003200e470d000b0b2000200436020420002005360200200041086a20033602000b200241f0006a24000f0b20064108102a000b20064108102a000b102b000be30201097f230041106b2202240020022001102e024002400240024020022802000d00200041003602000c010b02400240200228020422034180202003418020491b22040d00410121050c010b200410272205450d020b02402003450d0041002106410021070340200241003a000f2002410f6a2001280200220820012802042209410047220a10ce041a2009200a490d0420012009200a6b36020420012008200a6a360200024020090d00200041003602002004450d03200510290c030b200741016a210920022d000f210a024020072004470d0002402006200920092006491b22044100480d000240024020070d002004102721050c010b200520072004102821050b20050d0120044101102a000b102b000b200520076a200a3a0000200641026a21062009210720032009470d000b0b2000200436020420002005360200200041086a20033602000b200241106a24000f0b20044101102a000b200a2009103e000bf10b030e7f017e067f230041e0006b22022400200241086a2001102e0240024020022802080d00200041003602000c010b0240024002400240024002400240200228020c220341f100200341f100491b22040d00410421050c010b200441246c220610272205450d010b024020030d00410021070c050b2002412d6a2108200241d3006a220941056a210a4100210b410021070340200241003a0040200241c0006a2001280200220c20012802042206410047220d10ce041a2006200d490d0220012006200d6b220e3602042001200c200d6a220c3602000240024020060d004105210d0c010b4105210d20022d0040220641064b0d000240024002400240024020060e0704050005020301040b200241c0006a200e4120200e4120491b22066a41004100412020066b2006411f4b1b10cd041a200241c0006a200c200610ce041a2001200e20066b3602042001200c20066a360200200e411f4d0d04200220092900003703202002200a2900003700252002280047210f200229004b211020022f0140210620022d0042210d20022800432111200841026a200241306a41026a2d00003a0000200820022f00303b0000201141087621122006200d4110747221132010422088a721142010a721154100210d0c040b20024100360240200241c0006a200c200e4104200e4104491b220610ce041a2001200e20066b3602042001200c20066a360200200e41034d0d0320022d0043210620022f0140210e20022d0042210c200241c0006a2001104420022802402216450d03200e200c41107472211320022902442210422088a721142010a721154101210d200621112016210f0c030b20024100360240200241c0006a200c200e4104200e4104491b220610ce041a2001200e20066b3602042001200c20066a360200200e41034d0d0220022d0043210620022f0140210e20022d0042210c200241c0006a2001104420022802402216450d02200e200c41107472211320022902442210422088a721142010a721154102210d200621112016210f0c020b20024100360240200241c0006a200c200e4104200e4104491b220610ce041a2001200e20066b3602042001200c20066a360200200e41034d0d0120022d0043210620022f0140210e20022d0042210c200241c0006a2001104420022802402216450d01200e200c41107472211320022902442210422088a721142010a721154103210d200621112016210f0c010b200241306a2001104420022802302206450d00200241206a41086a200241c0006a41086a2902003703002002200229024037032020064108762112200228023821152002280234210f4104210d200621110b200241c0006a41086a2206200241206a41086a290300370300200220022903203703400240200d4105470d002000410036020002402007450d002005210603400240024020062d0000220141034b0d0002400240024020010e0404000102040b2006410c6a280200450d03200641086a28020010290c030b2006410c6a280200450d02200641086a28020010290c020b2006410c6a280200450d01200641086a28020010290c010b200641086a280200450d00200641046a28020010290b200641246a2106200b415c6a220b0d000b0b2004450d07200510290c070b200241106a41086a220e200629030037030020022002290340370310024020072004470d00200441016a22062004490d052004410174220c20062006200c491b2206ad42247e2210422088a70d052010a7220c4100480d050240024020040d00200c102721050c010b2005200441246c200c102821050b2005450d04200621040b2005200b6a2206200d3a0000200641106a20143602002006410c6a2015360200200641086a200f360200200641046a2012410874201141ff017172360200200641036a20134110763a0000200641016a20133b0000200641146a20022903103702002006411c6a200e290300370200200b41246a210b2003200741016a2207460d050c000b0b20064104102a000b200d2006103e000b200c4104102a000b102b000b2000200436020420002005360200200041086a20073602000b200241e0006a24000bbd04010a7f230041106b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b0240200228020c2203418020490d00418020107c2204450d044101210541002106410021070340200420012802002001280204220820034180202003418020491b220920082009491b220810ce04210a024002400240200128020422092008490d002001200920086b3602042001200128020020086a36020002402008450d0020084181204f0d020240200620076b2008490d00200820076a21090c040b0240200720086a22092007490d002006410174220b20092009200b491b220b4100480d000240024020060d00200b102721050c010b20052006200b102821050b02402005450d00200b21060c050b200b4101102a000b102b000b20004100360200200a10292006450d05200510290c050b20082009103e000b2008418020107f000b200520076a200a200810ce041a20092107200320086b22030d000b2000200636020420002005360200200041086a2009360200200a10290c010b0240024020030d0041012107410021080c010b2003107c2207450d032007200128020020012802042208200320082003491b220810ce041a200128020422092008490d022001200920086b3602042001200128020020086a3602000b024020082003470d002000200336020420002007360200200041086a20033602000c010b200041003602002003450d00200710290b200241106a24000f0b20082009103e000b20034101102a000b4180204101102a000b8103010a7f230041106b2202240020022001102e0240024002400240024020022802000d00200041003602000c010b02400240200228020422034180082003418008491b22040d00410421050c010b2004410274220610272205450d020b02402003450d0041002107410021084100210903402002410036020c2002410c6a2001280200220a20012802042206410420064104491b220b10ce041a20012006200b6b3602042001200a200b6a3602000240200641034b0d00200041003602002004450d03200510290c030b200941016a2106200228020c210b024020092004470d002007200620062007491b220441ffffffff03712004470d062004410274220a4100480d060240024020090d00200a102721050c010b20052008200a102821050b2005450d050b200520086a200b360200200741026a2107200841046a21082006210920032006470d000b0b2000200436020420002005360200200041086a20033602000b200241106a24000f0b20064104102a000b200a4104102a000b102b000bda0f040d7f017e077f017e23004180026b2202240020022001102e02400240024002400240024020022802000d00200041003602000c010b0240024020022802042203413820034138491b22040d00410821050c010b200441c8006c220610272205450d020b02402003450d00200241ef016a210741c2002108200241b8016a41036a21094100210a4100210b0340200241003a00e001200241e0016a2001280200220c2001280204220d410047220e10ce041a200d200e490d042001200d200e6b22063602042001200c200e6a220e360200024002400240200d450d0020022d00e001220d41014b0d00024002400240200d0e020001000b200242003703a001200241a0016a200e2006410820064108491b220d10ce041a20012006200d6b3602042001200e200d6a360200200641074d0d02200241f8006a41086a200241c0016a41086a290300370300200241f8006a41106a200241c0016a41106a2d00003a0000200241d8006a41086a200241e0016a41086a290100370300200241d8006a41106a200241e0016a41106a290100370300200241d8006a41186a200241e0016a41186a290100370300200220022800b80136029001200220022903c001370378200220022901e001370358200220092800003600930120022903a001210f200241d0006a41046a2002419a016a41046a2f01003b01002002200228019a013602504100210e0c010b200241e0016a2006412020064120491b220d6a410041004120200d6b200d411f4b1b10cd041a200241e0016a200e200d10ce041a20012006200d6b220c3602042001200e200d6a220d3602002006411f4d0d01200241a0016a41086a2210200741086a290000370300200241a0016a41106a2211200741106a2d00003a0000200220022800e0013602b801200220072900003703a0012002200241e0016a41036a2800003600bb0120022900e701210f200241003a00e001200241e0016a200d200c410047220610ce041a200c2006490d092001200c20066b220e3602042001200d20066a220d360200200c450d0120022d00e001220641014b0d014100210c0240024020060e020100010b200241e0016a200e4120200e4120491b22066a41004100412020066b2006411f4b1b10cd041a200241e0016a200d200610ce041a2001200e20066b3602042001200d20066a360200200e411f4d0d02200241c0016a41186a200241e0016a41186a290000370300200241c0016a41106a200241e0016a41106a290000370300200241c0016a41086a200241e0016a41086a290000370300200220022900e0013703c0014101210c0b200241d8006a41186a200241c0016a41186a290300370300200241d8006a41106a200241c0016a41106a290300370300200241d8006a41086a200241c0016a41086a290300370300200241f8006a41086a2010290300370300200241f8006a41106a20112d00003a0000200220022903c001370358200220022802b80136029001200220022800bb0136009301200220022903a001370378200241d0006a41046a2002419a016a41046a2f01003b01002002200228019a013602504101210e0b200b41016a210d200241c0016a41086a2206200241f8006a41086a290300370300200241c0016a41106a2210200241f8006a41106a2d00003a0000200241e0016a41086a2211200241d8006a41086a290300370300200241e0016a41106a2212200241d8006a41106a290300370300200241e0016a41186a2213200241d8006a41186a29030037030020022002280290013602a00120022002280093013600a301200220022903783703c001200220022903583703e001200241b8016a41046a2214200241d0006a41046a2f01003b0100200241306a41086a22152006290300370300200241306a41106a221620102d00003a0000200241106a41086a22102011290300370300200241106a41106a22112012290300370300200241106a41186a22122013290300370300200220022802503602b801200220022800a30136004b200220022802a001360248200220022903c001370330200220022903e001370310200241086a41046a221320142f01003b0100200220022802b801360208200b2004470d020240200a200d200d200a491b2204ad42c8007e2217422088a70d002017a7220641004e0d020b102b000b200241c0016a41086a200241f8006a41086a290300370300200241e0016a41086a200241d8006a41086a290300370300200241e0016a41106a200241d8006a41106a290300370300200220022903783703c001200220022903583703e001200041003602002004450d04200510290c040b02400240200b0d002006102721050c010b2005200841be7f6a2006102821050b2005450d070b200520086a220641be7f6a200e3a0000200641466a200f370000200641bf7f6a220e2002280248360000200e41036a200228004b3600002006414e6a220e2002290330370000200e41086a2015290300370000200e41106a20162d00003a00002006415f6a200c3a0000200641606a220e2002290310370000200e41086a2010290300370000200e41106a2011290300370000200e41186a201229030037000020062002280208360000200641046a20132f01003b0000200a41026a210a200841c8006a2108200d210b2003200d470d000b0b2000200436020420002005360200200041086a20033602000b20024180026a24000f0b20064108102a000b200e200d103e000b2006200c103e000b20064108102a000bff04040c7f027e017f017e230041d0006b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b02400240200228020c220341d500200341d500491b22040d00410821050c010b200441306c220610272205450d020b02402003450d00200241306a41086a210741002108410021094100210a03402002420037033820024200370330200241306a2001280200220b20012802042206411020064110491b220c10ce041a20012006200c6b220d3602042001200b200c6a220c360200024002402006410f4d0d002007290300210e2002290330210f200241306a200d4120200d4120491b22066a41004100412020066b2006411f4b1b10cd041a200241306a200c200610ce041a2001200d20066b3602042001200c20066a360200200d411f4b0d010b200041003602002004450d03200510290c030b200a41016a210d200241106a41186a220c200241306a41186a290000370300200241106a41106a220b200241306a41106a290000370300200241106a41086a22102007290000370300200220022900303703100240200a2004470d002008200d200d2008491b2204ad42307e2211422088a70d062011a722064100480d0602400240200a0d002006102721050c010b200520092006102821050b2005450d050b200520096a2206200e3703082006200f370300200641106a2002290310370300200641186a2010290300370300200641206a200b290300370300200641286a200c290300370300200841026a2108200941306a2109200d210a2003200d470d000b0b2000200436020420002005360200200041086a20033602000b200241d0006a24000f0b20064108102a000b20064108102a000b102b000bff0305087f017e017f017e017f230041e0066b22022400200241086a2001102e024002400240024020022802080d00200041003602000c010b02400240200228020c2203410e2003410e491b22040d00410821050c010b200441a0026c220610272205450d020b02402003450d00200241a8026a41f0006a21074100210841002106410021090340200241a8026a20011049200241f8056a200241a8026a41e80010ce041a200229039003210a200241c8046a200741b00110ce041a024002400240200a4203510d00200941016a210b200241c0016a200241f8056a41e80010ce041a200241106a200241c8046a41b00110ce041a20092004470d0202402008200b200b2008491b2204ad42a0027e220c422088a70d00200ca7220d41004e0d020b102b000b2000410036020002402009450d0020054198016a210b0340200b103d200b41a0026a210b200641e07d6a22060d000b0b2004450d04200510290c040b0240024020090d00200d102721050c010b20052006200d102821050b2005450d050b200520066a200241c0016a41e80010ce04220941e8006a200a370300200941f0006a200241106a41b00110ce041a200841026a2108200641a0026a2106200b21092003200b470d000b0b2000200436020420002005360200200041086a20033602000b200241e0066a24000f0b20064108102a000b200d4108102a000bae0b04047f017e087f057e230041c0056b22022400200241286a2001102e0240024020022802280d00200042033703680c010b200241003a00a002200241a0026a2001280200220320012802042204410047220510ce041a0240024020042005490d002001200420056b3602042001200320056a36020020040d01200042033703680c020b20052004103e000b02400240024020022d00a002220441ff00714102470d0020044118744118754100480d01420221060c020b200042033703680c020b200241d8046a200110500240024020022d00d8044102460d00200241b0046a41206a200241d8046a41206a280200360200200241b0046a41186a200241d8046a41186a290300370300200241b0046a41106a200241d8046a41106a290300370300200241b0046a41086a200241d8046a41086a290300370300200220022903d8043703b00420024198016a41386a2207420037030020024198016a41306a2208420037030020024198016a41286a2209420037030020024198016a41206a220a420037030020024198016a41186a220b420037030020024198016a41106a220c420037030020024198016a41086a220d4200370300200242003703980120024198016a2001280200220e2001280204220441c000200441c000491b220510ce041a2001200420056b22033602042001200e20056a22053602002004413f4d0d0020024180056a41386a200729030037030020024180056a41306a200829030037030020024180056a41286a200929030037030020024180056a41206a200a29030037030020024180056a41186a200b29030037030020024180056a41106a200c29030037030020024180056a41086a200d290300370300200220022903980137038005200241003a00980120024198016a20052003410047220410ce041a0240024020032004490d002001200320046b220e3602042001200520046a22043602002003450d0202400240200231009801220f50450d00420021060c010b200241003a00980120024198016a2004200e410047220510ce041a200e2005490d022001200e20056b3602042001200420056a360200200e450d034202200f420f838622104204540d0342012106200231009801420886200f844204882010420c88220f4201200f4201561b7e220f20105a0d030b200241186a200110522002290318a7450d02200229032021112002200110532002290300a7450d02200241106a290300211220022903082113200241a0026a41206a200241b0046a41206a280200360200200241a0026a41186a200241b0046a41186a290300370300200241a0026a41106a200241b0046a41106a290300370300200241a0026a41086a200241b0046a41086a290300370300200241cc026a20024180056a41086a290300370200200241d4026a20024180056a41106a290300370200200241dc026a20024180056a41186a290300370200200241e4026a20024180056a41206a290300370200200241ec026a200241a8056a290300370200200241f4026a200241b0056a290300370200200241fc026a200241b8056a290300370200200220022903b0043703a00220022002290380053702c402200241a8036a200241a0026a41e80010ce041a0c030b20042003103e000b2005200e103e000b420221060b200241a0026a200241a8036a41e80010ce041a024020064202520d00200042033703680c020b200241306a200241a0026a41e80010ce041a0b200241a0026a2001103c20022802a0022104200241a8036a200241a0026a41047241840110ce041a024020044112470d00200042033703680c010b20024198016a200241a8036a41840110ce041a2000200241306a41e80010ce0422014190016a201237030020014188016a201337030020014198016a200436020020014180016a2011370300200141f8006a200f37030020012010370370200120063703682001419c016a20024198016a41840110ce041a0b200241c0056a24000be20805077f047e087f017e017f230041a0016b22022400024002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f8006a41186a2107034020032004220841286a2204360200200841086a2903002109200841106a290300210a200841186a290300210b2008290300210c200241f8006a41206a200841206a2903003703002007200b370300200241f8006a41106a200a370300200241f8006a41086a20093703002002200c3703780240200a2006290300580d002001280214220d2007460d002007290000200d290000520d030b20052004470d000b200521040b2000410036020820004208370200024020042005460d00200141086a200520046b41586a41286e41286c20046a41286a3602000b2001280204450d01200128020010290c010b200241286a41086a200241f8006a41086a290300220a370300200241086a2204200a370300200241106a2207200241f8006a41106a290300370300200241186a2203200241f8006a41186a290300370300200241206a220e200241f8006a41206a29030037030020022002290378220a3703282002200a37030002400240024041281027220f450d00200f2002290300370300200f41206a200e290300370300200f41186a2003290300370300200f41106a2007290300370300200f41086a200429030037030020012802042110200128020021114101210e02400240200541586a2008470d00410121120c010b0240200d200241f8006a41186a2204470d00410121120c010b200841286a2113200541586a21144101210e4101211203402013210802400340200241f8006a41206a2207200841206a2903003703002004200841186a290300370300200241f8006a41106a2203200841106a290300220a370300200241f8006a41086a2201200841086a290300370300200220082903003703780240200a2006290300580d002004290000200d290000520d020b2005200841286a2208470d000c030b0b200241d0006a41206a2007290300220a370300200241286a41086a20012903002209370300200241286a41106a2003290300220b370300200241286a41186a2004290300220c370300200241286a41206a200a3703002002200229037822153703282007200a3703002004200c3703002003200b370300200120093703002002201537037802402012200e470d00200e41016a2212200e490d05200e4101742213201220122013491b2212ad42287e220a422088a70d05200aa722134100480d0502400240200e0d0020131027210f0c010b200f200e41286c20131028210f0b200f450d040b200841286a2113200f200e41286c6a22162002290378370300201641206a2007290300370300201641186a2004290300370300201641106a2003290300370300201641086a2001290300370300200e41016a210e20142008470d000b0b02402010450d00201110290b2000200e360208200020123602042000200f3602000c030b41284108102a000b20134108102a000b102b000b200241a0016a24000bd408040c7f017e057f037e23004180016b22022400024002400240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014b210903402003200441206a220a360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a29000037030020022004290000370360410021040240024020090d0020080e020401040b2008210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a412010d0044101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a412010d0040d02200a2104200a2005470d000b200521040b2000410036020820004201370200024020042005460d00200141086a200520046b41606a41607120046a41206a3602000b2001280204450d01200128020010290c010b200241c0006a41086a2204200241e0006a41086a290300370300200241c0006a41106a220b200241e0006a41106a290300370300200241c0006a41186a220c200241e0006a41186a29030037030020022002290360220e3703002002200e370340024041201027220f450d00200f2002290340370000200f41186a200c290300370000200f41106a200b290300370000200f41086a2004290300370000200128020421102001280200211102400240200a2005470d0041012112410121130c010b41012112410121130340200628020821032006280200210702400340200241e0006a41186a2208200a41186a290000370300200241e0006a41106a2209200a41106a290000370300200241e0006a41086a2201200a41086a2900003703002002200a290000370360200a41206a210a4100210402400240200341014b0d0020030e020301030b2003210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a412010d0044101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a412010d0040d01200a2005470d000c030b0b200241c0006a41086a2001290300220e370300200241c0006a41106a20092903002214370300200241c0006a41186a20082903002215370300200220022903602216370340200241186a220b2015370300200241106a220c2014370300200241086a220d200e37030020022016370300024020132012470d000240201241016a22042012490d0020124101742207200420042007491b221341ffffff3f712013470d00201341057422044100480d000240024020120d0020041027210f0c010b200f201241057420041028210f0b200f0d0120044101102a000b102b000b200f20124105746a22042002290300370000200441186a200b290300370000200441106a200c290300370000200441086a200d290300370000201241016a2112200a2005470d000b0b02402010450d00201110290b20002012360208200020133602042000200f3602000c010b41204101102a000b20024180016a24000b810c05047f037e017f037e0d7f230041e0016b22022400200241e8006a200128020022032001280204220428020c220511000002400240200228026822010d002000410036020820004208370200200320042802001101002004280204450d01200310290c010b200241e0006a20024184016a290200370300200241c8006a41106a200241fc006a290200370300200241c8006a41086a200241f4006a2902003703002002200229026c370348200241a0016a2001104d200241a0016a41086a290300210620022903a001210742002108200241d0016a41086a22014200370300200242003703d00141b18ac0004116200241d0016a100420024190016a41086a2001290300370300200220022903d00137039001200241003602d00120024190016a4110200241d0016a100521090240024020022802d0012201417f460d00200242003703d801200242003703d001200241d0016a20092001411020014110491b10ce041a02402001410f4d0d00200241d0016a41086a290300210a20022903d001210b200910294201210c42002108200b427d56200a420156200a4201511b450d02200241386a200b200a427f420010d404200241386a41086a29030021082002290338210c0c020b418f89c3004133104e000b4201210c0b200241286a20072006200c200810d404200229032821080240200241c4016a280200450d0020022802c00110290b200241a0016a20032004280210220d1100000240024002400240417f20022802a001220141016a220920092001491b220ead42287e220c422088a70d00200ca72201417f4c0d000240024020010d004108210f410821100c010b20011027220f450d02200f21100b200f2002290348370300200f41186a200241c8006a41186a2211290300370300200f41106a200241c8006a41106a2212290300370300200f41086a200241c8006a41086a29030037030020102008370320200241e8006a2003200511000002400240200228026822010d00410121090c010b200241e8006a410472211341022114412821154101210903402011201341186a2902003703002012201341106a290200370300200241c8006a41086a2216201341086a29020037030020022013290200370348200241a0016a2001104d200241a0016a41086a2217290300210a20022903a0012106200241d0016a41086a22184200370300200242003703d00141b18ac0004116200241d0016a100420024190016a41086a2018290300370300200220022903d00137039001200241003602d00120024190016a4110200241d0016a1005210102400240024020022802d0012219417f460d002001450d00200242003703d801200242003703d001200241d0016a20012019411020194110491b10ce041a2019410f4b0d01418f89c3004133104e000b420021084201210c0c010b2018290300210720022903d001210b200110294201210c42002108200b427e5420075020074201511b0d00200241186a200b2007427f420010d404200241186a41086a29030021082002290318210c0b200241086a2006200a200c200810d40420022903082108024020022802c401450d0020022802c00110290b200241a0016a41186a22182011290300370300200241a0016a41106a2219201229030037030020172016290300370300200220022903483703a00102402009200e470d00200241e8006a2003200d1100002009417f2002280268220141016a221620162001491b6a22012009490d062014200120012014491b220ead42287e220c422088a70d06200ca722014100480d060240024020090d0020011027210f0c010b200f201520011028210f0b200f450d05200f21100b201020156a220120022903a001370300200141186a2018290300370300200141106a2019290300370300200141086a2017290300370300200141206a2008370300200241e8006a20032005110000201441026a2114201541286a2115200941016a2109200228026822010d000b0b2003200428020011010002402004280204450d00200310290b200020093602082000200e360204200020103602000c040b1039000b20014108102a000b20014108102a000b102b000b200241e0016a24000ba70906067f047e077f027e027f017e230041e0016b22022400024002400240024002400240410f10272203450d00200341076a4100290091a3443700002003410029008aa3443700002003410f412f10282204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a290000370000200241f8006a41186a22014200370300200241f8006a41106a22034200370300200241f8006a41086a22054200370300200242003703782004412f200241f8006a1000200241d8006a41186a2001290300370300200241d8006a41106a2003290300370300200241d8006a41086a200529030037030020022002290378370358200241003602c001200241d8006a4120200241c0016a100521060240024020022802c0012207417f460d002002200736029c012002200636029801200241c0006a20024198016a10532002290340a7450d07200241c0006a41106a290300210820022903482109200241286a20024198016a10532002290328a7450d07200241386a290300210a2002290330210b200241206a20024198016a102e2002280220450d07024002402002280224220c41d500200c41d500491b220d0d004108210e0c010b200d41306c22011027220e450d050b0240200c450d004100210f410021104100210503402002280298012111200241f8006a200228029c012203412020034120491b22016a41004100412020016b2001411f4b1b10cd041a200241f8006a2011200110ce041a2002200320016b36029c012002201120016a36029801024002402003411f4d0d00200241c0016a41186a2201200241f8006a41186a290300370300200241c0016a41106a2211200241f8006a41106a290300370300200241c0016a41086a2212200241f8006a41086a290300370300200220022903783703c001200241086a20024198016a10532002290308a70d010b200d450d0a200e10290c0a0b200541016a2103200241086a41106a290300211320022903102114200241a0016a41186a22152001290300370300200241a0016a41106a22162011290300370300200241a0016a41086a22112012290300370300200220022903c0013703a00102402005200d470d00200f20032003200f491b220dad42307e2217422088a70d092017a722014100480d090240024020050d0020011027210e0c010b200e201020011028210e0b200e450d080b200e20106a2201201337030820012014370300200141106a20022903a001370300200141186a2011290300370300200141206a2016290300370300200141286a2015290300370300200f41026a210f201041306a211020032105200c2003470d000b0b200e450d07200cad422086200dad84211302402007450d00200610290b2000200b370310200020093703002000200e360220200041186a200a37030020002008370308200041246a20133702000c010b200041186a4200370300200041106a4200370300200041086a420037030020004200370300200041286a4100360200200042083703200b20041029200241e0016a24000f0b410f4101102a000b412f4101102a000b20014108102a000b20014108102a000b102b000b418f89c3004133104e000b5e01017f230041306b220224002002200136020c20022000360208200241246a4101360200200242013702142002419c81c6003602102002410236022c2002200241286a3602202002200241086a360228200241106a41a481c6001057000b950e01057f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e050003010204000b2002410036020820024201370300410110272203450d05200242818080801037020420022003360200200341023a00000240024020022802042204200228020822036b4120490d00200341206a2105200228020021040c010b200341206a22052003490d1320044101742206200520052006491b22064100480d130240024020040d002006102721040c010b200228020020042006102821040b2004450d0720022006360204200220043602000b20022005360208200420036a22032001290001370000200341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a2900003700000c040b2002410036020820024201370300410110272203450d06200242818080801037020420022003360200200341043a00000240024020022802042205200228020822036b4104490d00200228020021050c010b200341046a22042003490d1220054101742206200420042006491b22044100480d120240024020050d002004102721050c010b200228020020052004102821050b2005450d0820022004360204200220053602000b2002200341046a360208200520036a2001280001360000200128020821042002200141106a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d1220054101742203200620062003491b22034100480d120240024020050d002003102721050c010b200228020020052003102821050b2005450d092002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0c030b2002410036020820024201370300410110272203450d08200242818080801037020420022003360200200341053a00000240024020022802042204200228020822036b4104490d00200341046a2105200228020021040c010b200341046a22052003490d1120044101742206200520052006491b22064100480d110240024020040d002006102721040c010b200228020020042006102821040b2004450d0a20022006360204200220043602000b20022005360208200420036a2001280001360000200128020821042002200141106a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d1120054101742203200620062003491b22034100480d110240024020050d002003102721050c010b200228020020052003102821050b2005450d0b2002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0c020b2002410036020820024201370300410110272203450d0a200242818080801037020420022003360200200341063a00000240024020022802042205200228020822036b4104490d00200228020021050c010b200341046a22042003490d1020054101742206200420042006491b22044100480d100240024020050d002004102721050c010b200228020020052004102821050b2005450d0c20022004360204200220053602000b2002200341046a360208200520036a2001280001360000200128020821042002200141106a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d1020054101742203200620062003491b22034100480d100240024020050d002003102721050c010b200228020020052003102821050b2005450d0d2002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0c010b2002410036020820024201370300410110272203450d0c200242818080801037020420022003360200200341003a0000200141046a280200210420022001410c6a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d0f20054101742203200620062003491b22034100480d0f0240024020050d002003102721050c010b200228020020052003102821050b2005450d0e2002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0b200020022201290200370200200041086a200141086a280200360200200241106a24000f0b41014101102a000b20064101102a000b41014101102a000b20044101102a000b20034101102a000b41014101102a000b20064101102a000b20034101102a000b41014101102a000b20044101102a000b20034101102a000b41014101102a000b20034101102a000b102b000bf50601067f230041f0006b22022400200241003a0050200241d0006a2001280200220320012802042204410047220510ce041a02400240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d04024020022d0050220441ef014b0d00410121010c030b200441847e6a220441034b0d040240024020040e0400010503000b200241003b0150200241d0006a20052006410220064102491b220410ce041a2001200620046b3602042001200520046a360200200641014d0d0520022f0150220441f001490d05410121010c030b20024100360250200241d0006a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a360200200641034d0d04410121012002280250220441808004490d040c020b20052004103e000b41002103200241d0006a20064120200641204922071b22046a41004100412020046b2004411f4b1b10cd041a200241d0006a2005200410ce041a2001200620046b3602042001200520046a360200024020070d002002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031041012103200228005321040b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c200220022903103703302003450d022002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010b200020013a0000200020022f010c3b0001200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a2802003602000c020b200120062006410420064104491b22046b3602042001200520046a3602000b200041023a00000b200241f0006a24000b880a01037f02400240024002400240024002400240024020002d00004101460d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0920024101742204200320032004491b22044100480d090240024020020d002004102721030c010b200128020020022004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d0920034101742202200420042002491b22024100480d090240024020030d002002102721030c010b200128020020032002102821030b2003450d0320012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b0240024002400240200041046a280200220241ffff034b0d00200241ef014b0d03200141046a280200200141086a2802002200460d01200128020021030c020b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0b20004101742204200320032004491b22044100480d0b0240024020000d002004102721030c010b200128020020002004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a000002400240200141046a2802002203200428020022006b4104490d00200128020021030c010b200041046a22042000490d0b20034101742200200420042000491b22004100480d0b0240024020030d002000102721030c010b200128020020032000102821030b2003450d0720012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000f0b200041016a22032000490d0920004101742204200320032004491b22044100480d090240024020000d002004102721030c010b200128020020002004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0820004101742204200320032004491b22044100480d080240024020000d002004102721030c010b200128020020002004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a000002400240200141046a2802002203200428020022006b4102490d00200128020021030c010b200041026a22042000490d0820034101742200200420042000491b22004100480d080240024020030d002000102721030c010b200128020020032000102821030b2003450d0720012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b20044101102a000b20024101102a000b20044101102a000b20004101102a000b20044101102a000b20044101102a000b20004101102a000b102b000ba60503057f027e037f230041106b22022400200241003a000020022001280200220320012802042204410047220510ce04210202400240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d03024020022d0000220441037122034103460d002004ad210702400240024020030e03000102000b2004410276ad2107420121080c080b200241003a0000200220052006410047220410ce04210320062004490d032001200620046b3602042001200520046a3602002006450d0520033100004208862007844202882107420121080c070b200241003a000e200241003b010c2002410c6a200520064103200641034922031b220410ce041a2001200620046b3602042001200520046a36020020030d04200233010c200231000e421086844208862007844202882107420121080c060b02402004410276220441044b0d000240024020040e050002020201000b200241003602002002200520064104200641044922031b220410ce0421092001200620046b3602042001200520046a36020020030d0520093502002107420121080c070b42002108200242003703002002200520064108200641084922031b220410ce0421092001200620046b3602042001200520046a36020020030d0520092903002107420121080c060b200441046a220a41084b0d0342002107410021030340200241003a0000200220052006410047220410ce04210920062004490d032001200620046b220b3602042001200520046a22053602002006450d0420093100002003410374413871ad86200784210742012108200b2106200341016a22042103200441ff0171200a4f0d060c000b0b20052004103e000b20042006103e000b20042006103e000b420021080b0b2000200737030820002008370300200241106a24000bc10605057f017e017f027e027f230041306b22022400200241003a0018200241186a2001280200220320012802042204410047220510ce041a024002400240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d04024020022d0018220441037122034103460d0002400240024020030e03000102000b2004410276ad21070c060b200241003a0018200241186a20052006410047220310ce041a20062003490d032001200620036b3602042001200520036a3602002006450d0620022d001841087420047241fcff0371410276ad21070c050b200241003a002e200241003b012c2002412c6a200520064103200641034922081b220310ce041a2001200620036b3602042001200520036a36020020080d0520022f012c20022d002e41107472410874200472410276ad21070c040b024020044102762204410c4b0d0002400240024020040e0d00030303010303030303030302000b20024100360218200241186a200520064104200641044922031b220410ce041a2001200620046b3602042001200520046a36020020030d07200235021821070c060b4200210920024200370318200241186a200520064108200641084922031b220410ce041a2001200620046b3602042001200520046a36020020030d07200229031821070c050b420021092002420037032020024200370318200241186a200520064110200641104922031b220410ce041a2001200620046b3602042001200520046a36020020030d06200241206a290300210a20022903182107420121090c070b200441046a220b41104b0d04200241106a210c420021074200210a410021030340200241003a0018200241186a20052006410047220410ce041a20062004490d032001200620046b22083602042001200520046a22053602002006450d05200241086a20023100184200200341037441f8007110d104200c290300200a84210a200229030820078421074201210920082106200341016a22042103200441ff0171200b4f0d070c000b0b20052004103e000b20032006103e000b20042006103e000b4200210a420121090c020b420021090b0b2000200737030820002009370300200041106a200a370300200241306a24000bbd0903017f017e057f230041e0006b220224000240024002400240024002400240024002400240024020002903002203423f560d0002400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d0b20004101742205200420042005491b22054100480d0b0240024020000d002005102721040c010b200128020020002005102821040b2004450d0220012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a00000c080b200342808001540d062003428080808004540d054108200379a741037622056b4104490d0402400240200141046a280200200141086a2802002204460d00200128020021060c010b200441016a22072004490d0a20044101742206200720072006491b22074100480d0a0240024020040d002007102721060c010b200128020020042007102821060b2006450d0220012006360200200141046a2007360200200141086a28020021040b200141086a2207200441016a360200200620046a411320054102746b3a0000200220002903002203370308200541786a2104200141046a2106034002400240200628020020072802002200460d00200128020021050c010b200041016a22052000490d0b20004101742208200520052008491b22084100480d0b0240024020000d002008102721050c010b200128020020002008102821050b2005450d042001200536020020062008360200200728020021000b2007200041016a360200200520006a2003a73a000020034208882103200441016a22002004492105200021042005450d000b20022003370308200350450d030c070b20054101102a000b20074101102a000b20084101102a000b200241286a41146a4103360200200241346a4104360200200241106a41146a41033602002002200241086a3602402002418883c000360244200241c8006a41146a41003602002002420337021420024190d1c5003602102002410436022c200241b8d6c5003602582002420137024c200241e081c0003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a419083c0001057000b41ec82c0001058000b024002400240200141046a2802002204200141086a28020022006b4104490d00200128020021040c010b200041046a22052000490d0520044101742200200520052000491b22004100480d050240024020040d002000102721040c010b200128020020042000102821040b2004450d0120012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a74102744102723600000c020b20004101102a000b02400240200141046a2802002204200141086a28020022006b4102490d00200128020021040c010b200041026a22052000490d0320044101742200200520052000491b22004100480d030240024020040d002000102721040c010b200128020020042000102821040b2004450d0220012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b00000b200241e0006a24000f0b20004101102a000b102b000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a1091042100200241206a240020000bc20202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120044101200110aa0121000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2003418001103e000b2003418001103e000b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241b8d6c500360204200241b8d6c500360200200210ab04000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a4100360200200141b8d6c50036021020014201370204200120043703182001200141186a36020020012003370328200120023703202001200141206a1057000b910a03017f027e057f230041e0006b2202240002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d0002400240200141046a280200200141086a2802002200460d00200128020021050c010b200041016a22052000490d0b20004101742206200520052006491b22064100480d0b0240024020000d002006102721050c010b200128020020002006102821050b2005450d0220012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a00000c080b20034280800154410020051b0d06200342808080800454410020051b0d05411020047920037942c0007c20044200521ba741037622066b4104490d0402400240200141046a280200200141086a2802002205460d00200128020021070c010b200541016a22082005490d0a20054101742207200820082007491b22084100480d0a0240024020050d002008102721070c010b200128020020052008102821070b2007450d0220012007360200200141046a2008360200200141086a28020021050b200141086a2208200541016a360200200720056a413320064102746b3a0000200029030021032002200041086a290300220437030820022003370300200641706a2105200141046a2107034002400240200728020020082802002200460d00200128020021060c010b200041016a22062000490d0b20004101742209200620062009491b22094100480d0b0240024020000d002009102721060c010b200128020020002009102821060b2006450d042001200636020020072009360200200828020021000b2008200041016a360200200620006a2003a73a00002003420888200442388684210320044208882104200541016a22002005492106200021052006450d000b2002200337030020022004370308200320048450450d030c070b20064101102a000b20084101102a000b20094101102a000b200241286a41146a4103360200200241346a4105360200200241106a41146a410336020020022002360240200241d081c000360244200241c8006a41146a41003602002002420337021420024190d1c5003602102002410536022c200241b8d6c5003602582002420137024c200241e081c0003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41e881c0001057000b41b881c0001058000b024002400240200141046a2802002205200141086a28020022006b4104490d00200128020021050c010b200041046a22062000490d0520054101742200200620062000491b22004100480d050240024020050d002000102721050c010b200128020020052000102821050b2005450d0120012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a74102744102723600000c020b20004101102a000b02400240200141046a2802002205200141086a28020022006b4102490d00200128020021050c010b200041026a22062000490d0320054101742200200620062000491b22004100480d030240024020050d002000102721050c010b200128020020052000102821050b2005450d0220012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b00000b200241e0006a24000f0b20004101102a000b102b000b840605027f027e017f027e027f230041a0016b220224002000280200210002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0220054290ce005441002004501b450d012005a72103412721000c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d022001410141e8d9c5004102200241206a20006a41800120006b10ab0121000c060b41272100200241186a21060340200241106a200520044290ce00420010d4042002200229031022072006290300220842f0b17f427f10d304200241206a20006a2203417c6a200520022903007ca7220941ffff037141e4006e220a41017441fad6c5006a2f00003b00002003417e6a200a419c7f6c20096a41ffff037141017441fad6c5006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000c040b0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d012001410141e8d9c5004102200241206a20006a41800120006b10ab0121000c040b2000418001103e000b2000418001103e000b2007a721030b02400240200341e3004a0d00200321090c010b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441fad6c5006a2f00003b00000b024002402009410a480d00200241206a2000417e6a22006a200941017441fad6c5006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141b8d6c5004100200241206a20006a412720006b10ab0121000b200241a0016a240020000ba80301067f230041106b220224002002410036020820024201370300200020021030200041046a20021030200041086a2002103020002d0018210302400240024002400240200228020420022802082204460d00200228020021050c010b200441016a22052004490d0320044101742206200520052006491b22064100480d030240024020040d002006102721050c010b200228020020042006102821050b2005450d0120022006360204200220053602000b2002200441016a360208200520046a20033a0000200028020c21062002200041146a280200220436020c2002410c6a200210300240024020022802042203200228020822056b2004490d00200228020021000c010b200520046a22002005490d0320034101742207200020002007491b22074100480d030240024020030d002007102721000c010b200228020020032007102821000b2000450d022002200736020420022000360200200721030b200020056a2006200410ce041a200128020020012802042000200520046a100302402003450d00200010290b200241106a24000f0b20064101102a000b20074101102a000b102b000be80201097f230041206b22022400200241003602082002420137030020002802002103200220002802082200360210200241106a20021030024002400240024020000d002002280208210420022802042105200228020021060c010b200041246c210720022802042105200228020821000340200241106a2003104f2002280210210802400240200520006b20022802182209490d00200020096a2104200228020021060c010b200020096a22042000490d0420054101742206200420042006491b220a4100480d040240024020050d00200a102721060c010b20022802002005200a102821060b2006450d032002200a36020420022006360200200a21050b20022004360208200620006a2008200910ce041a02402002280214450d00200810290b200341246a2103200421002007415c6a22070d000b0b2001280200200128020420062004100302402005450d00200610290b200241206a24000f0b200a4101102a000b102b000bcd0c02077f017e230041206b22022400200241003602102002420137030802400240024002400240024002400240024002400240024002402001280200220341044b0d0002400240024002400240024020030e050001020304000b410110272203450d06200242818080801037020c20022003360208200341013a0000200141106a28020021032002200141186a2802002204360218200241186a200241086a103002402004450d002003200441286c6a2105034002400240200228020c2206200228021022076b4120490d00200228020821040c010b200741206a22042007490d1420064101742207200420042007491b22084100480d140240024020060d002008102721040c010b200228020820062008102821040b2004450d0a2002200836020c2002200436020820022802102107200821060b200420076a220841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a2900003700002002200741206a220736021020082003290000370000200341206a29030021090240200620076b41074b0d00200741086a22082007490d1420064101742207200820082007491b22074100480d140240024020060d002007102721040c010b200420062007102821040b2004450d0b2002200736020c20022004360208200228021021070b2002200741086a360210200420076a20093700002005200341286a2203470d000b0b200220012903082209370318200241186a21070c040b410110272203450d08200242818080801037020c20022003360208200341023a00002001290308210902400240200228020c2207200228021022036b4108490d00200341086a2104200228020821070c010b200341086a22042003490d1120074101742206200420042006491b22064100480d110240024020070d002006102721070c010b200228020820072006102821070b2007450d0a2002200636020c200220073602080b20022004360210200720036a2009370000200141186a28020021032002200141206a2802002204360218200241186a200241086a103002402004450d002003200441286c6a2105034002400240200228020c2206200228021022076b4120490d00200228020821040c010b200741206a22042007490d1320064101742207200420042007491b22084100480d130240024020060d002008102721040c010b200228020820062008102821040b2004450d0d2002200836020c2002200436020820022802102107200821060b200420076a220841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a2900003700002002200741206a220736021020082003290000370000200341206a29030021090240200620076b41074b0d00200741086a22082007490d1320064101742207200820082007491b22074100480d130240024020060d002007102721040c010b200420062007102821040b2004450d0e2002200736020c20022004360208200228021021070b2002200741086a360210200420076a20093700002005200341286a2203470d000b0b200220012903102209370318200241186a21070c030b410110272203450d0b200242818080801037020c20022003360208200341033a0000200220012903082209370318200241186a21070c020b410110272203450d0b200242818080801037020c20022003360208200341043a0000200220012903082209370318200241186a21070c010b410110272203450d0b200242818080801037020c20022003360208200341053a0000200220012903082209370318200241186a21070b02400240200228020c2204200228021022036b4108490d00200228020821040c010b200341086a22062003490d0d20044101742203200620062003491b22034100480d0d0240024020040d002003102721040c010b200228020820042003102821040b2004450d0c2002200336020c2002200436020820072903002109200228021021030b2002200341086a360210200420036a20093700000b20002002290308370200200041086a200241086a41086a280200360200200241206a24000f0b41014101102a000b20084101102a000b20074101102a000b41014101102a000b20064101102a000b20084101102a000b20074101102a000b41014101102a000b41014101102a000b41014101102a000b20034101102a000b102b000bcd0a04037f037e027f017e230041c0006b220724002004a7210802400240024002400240024002400240024020014201510d0041012109024020084101460d00427f200320067c200220057c220a2002542208ad7c220b2008200b200354200b2003511b22081b210b427f200a20081b210a4200210c4100210d0c040b2002200556200320065620032006511b450d01200320067d2002200554ad7d210b200220057d210a4200210c0c020b4101210d024020084101470d00427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210b427f200120081b210a410021094201210c0c040b200741086a200420052006420120022003105e200741186a290300210b2007290310210a2007290308210c0c070b200620037d2005200254ad7d210b200520027d210a4201210c0b410021094101210d0b2001500d0042002101200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074100360230200741206a4110200741306a1005210e0240024020072802302208417f470d004200210f0c010b2007420037033820074200370330200741306a200e2008411020084110491b10ce041a2008410f4d0d02200741386a290300210f20072903302101200e10290b200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074200200f20037d2001200254ad7d2203200120027d22022001562003200f562003200f511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d020c010b418f89c3004133104e000b2009450d0142002103200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074100360230200741206a4110200741306a1005210902400240024020072802302208417f470d00420021020c010b2007420037033820074200370330200741306a20092008411020084110491b10ce041a2008410f4d0d01200741386a290300210220072903302103200910290b200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074200200220067d2003200554ad7d2204200320057d2205200356200420025620042002511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b418f89c3004133104e000b200d450d0042002102200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074100360230200741206a4110200741306a1005210902400240024020072802302208417f470d00420021030c010b2007420037033820074200370330200741306a20092008411020084110491b10ce041a2008410f4d0d01200741386a290300210320072903302102200910290b200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030c010b418f89c3004133104e000b2000200a3703082000200c370300200041106a200b370300200741c0006a24000b890604077f017e017f047e230041e0006b220324002003200236021020032001280200220236020820032002200128020841246c22016a220436020c2003200341086a41086a360214024002400240200141ed00490d00200341386a41086a210103402003200241246a360208200341386a200341146a20021060200341186a41086a2202200141086a2204290300370300200341186a41106a2205200141106a2206290300370300200341186a41186a2207200141186a220829030037030020032001290300370318200341186a21092003290338220a4205520d0220032003280208220b41246a360208200341386a200341146a200b1060200220042903003703002005200629030037030020072008290300370300200320012903003703182003290338220a4205520d0220032003280208220b41246a360208200341386a200341146a200b1060200220042903003703002005200629030037030020072008290300370300200320012903003703182003290338220a4205520d0220032003280208220b41246a360208200341386a200341146a200b1060200220042903003703002005200629030037030020072008290300370300200320012903003703182003290338220a4205520d02200328020c2204200328020822026b41ec004b0d000b0b024020022004460d00200341386a41086a210103402003200241246a360208200341386a200341146a20021060200341186a41086a200141086a290300370300200341186a41106a200141106a290300370300200341186a41186a200141186a2903003703002003200129030037031802402003290338220a4205510d00200341186a21090c030b20032802082202200328020c470d000b0b200042053703000c010b200341386a41186a200941186a290300220c370300200341386a41106a200941106a290300220d370300200341386a41086a200941086a290300220e37030020032009290300220f3703382000200a3703002000200f370308200041106a200e370300200041186a200d370300200041206a200c3703000b200341e0006a24000be00802047f037e230041206b220324002001280200280200220128020421042001280200210102400240024002400240024002400240024002400240024020022d00000e050001020304000b200241016a21024100210520010e0406040507060b200241086a210641012105200241016a210220010e0405030406050b200241086a2106200241016a21024102210520010e0404020305040b200241086a2106200241016a21024103210520010e0403010204030b41042105200241046a210220010e0402000103020b20054102470d04024020022004470d00200621020c040b200228000021012006210220012004280000470d040c030b20054103470d03024020022004470d00200621020c030b200228000021012006210220012004280000460d020c030b20054101470d02024020022004470d00200621020c020b200228000021012006210220012004280000470d020c010b20054104470d010b2002280200210120032002280208220236020c20032001360208200341003a0010200341106a20012002410047220510ce041a024020022005490d002003200220056b220436020c2003200120056a22013602082002450d0120032d0010417f6a220241044b0d010240024002400240024002400240024020020e050001020304000b200341106a200341086a104120032802102202450d08200329021421074200210820034200370310200341106a20032802082204200328020c2205410820054108491b220110ce041a2003200520016b36020c2003200420016a3602082007a72101200541074b0d052001450d08200210290c080b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0720032903102107200341106a200341086a104120032802102205450d072003290214210820034200370310200341106a20032802082204200328020c2202410820024108491b220110ce041a2003200220016b36020c2003200420016a3602082008a72104200241074b0d032004450d07200510290c070b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0620032903102107420221080c040b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0520032903102107420321080c030b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0420032903102107420421080c020b2008422088210920032903102208422088a721012008a72102420121080c010b2007422088a72105200329031021070b2000200436021c200020013602142000200737030820002008370300200041206a2009370200200041186a2005360200200041106a20023602000c020b20052002103e000b200042053703000b200341206a24000bec0301097f230041106b2202240020002802002103200220002802082204360204200241046a2001103002400240024002400240200141046a2802002205200141086a28020022066b2004490d00200128020021050c010b200620046a22072006490d0320054101742206200720072006491b22064100480d030240024020050d002006102721050c010b200128020020052006102821050b2005450d0120012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a2003200410ce041a200028020c21062002200041146a2802002200360208200241086a2001103002402000450d0020062000410c6c6a2108200141046a21090340200628020021032002200641086a280200220036020c2002410c6a200110300240024020092802002205200728020022046b2000490d00200128020021050c010b200420006a220a2004490d0520054101742204200a200a2004491b22044100480d050240024020050d002004102721050c010b200128020020052004102821050b2005450d042001200536020020092004360200200728020021040b2007200420006a360200200520046a2003200010ce041a2006410c6a22062008470d000b0b200241106a24000f0b20064101102a000b20044101102a000b102b000be23101077f23004180016b22082400024002402002410c6a280200200241106a28020010062209417f460d00410c1027220a0d01410c4104102a000b1063000b200a2009360208200a4281808080103702000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041027220b450d01200b200a360200200a280208210c41031027220d450d02200d41026a41002d009cb0453a0000200d41002f009ab0453b000041061027220e450d03200e41046a41002f00a0f4423b0000200e410028009cf442360000412010272209450d042009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a2802081007200a200a280204417f6a220d360204200d0d00200a10290b41031027220d450d05200d41026a41002d009cb0453a0000200d41002f009ab0453b000041031027220e450d06200e41026a41002d009fb0453a0000200e41002f009db0453b00002009412041c00010282209450d072009410636023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031027220d450d08200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410f1027220e450d09200e41076a41002900af8845370000200e41002900a88845370000200941c00041800110282209450d0a2009410736025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031027220d450d0b200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410f1027220e450d0c200e41076a41002900be8845370000200e41002900b788453700002009410836027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031027220d450d0d200d41026a41002d009cb0453a0000200d41002f009ab0453b000041081027220e450d0e200e42e5f0d1fbb5ac98b6ec00370000200941800141800210282209450d0f2009410936029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031027220d450d10200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d11200e41086a41002f00d688453b0000200e41002900ce88453700002009410a3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031027220d450d12200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d13200e41086a41002f00e088453b0000200e41002900d888453700002009410b3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031027220d450d14200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d15200e41086a41002f00ea88453b0000200e41002900e288453700002009410c3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031027220d450d16200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410b1027220e450d17200e41076a41002800f38845360000200e41002900ec8845370000200941800241800410282209450d182009410d36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031027220d450d19200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410d1027220e450d1a200e41056a41002900fc8845370000200e41002900f788453700002009410e3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031027220d450d1b200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410c1027220e450d1c200e41086a410028008c8945360000200e410029008489453700002009410f3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031027220d450d1d200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410b1027220e450d1e200e41076a41002800978945360000200e41002900908945370000200941103602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031027220e450d1f200e41026a41002d009cb0453a0000200e41002f009ab0453b000041151027220d450d20200d410d6a41002900a88945370000200d41086a41002900a38945370000200d410029009b89453700002009411136029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031027220d450d21200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d22200e41086a41002f00b889453b0000200e41002900b08945370000200941123602bc03200941003602b8032009428a808080a0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031027220d450d23200d41026a41002d009cb0453a0000200d41002f009ab0453b000041071027220e450d24200e41036a41002800bd8945360000200e41002800ba8945360000200941133602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031027220e450d25200e41026a41002d009cb0453a0000200e41002f009ab0453b000041111027220d450d26200d41106a41002d00d189453a0000200d41086a41002900c98945370000200d41002900c18945370000200941143602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031027220d450d27200d41026a41002d009cb0453a0000200d41002f009ab0453b000041101027220e450d28200e41086a41002900da8945370000200e41002900d2894537000020094180044180081028220c450d29200c411536029c04200c410036029804200c4290808080800237029004200c200e36028c04200c42838080803037028404200c200d36028004410310272209450d2a200941026a41002d009cb0453a0000200941002f009ab0453b000041101027220d450d2b200d41086a41002900ea8945370000200d41002900e28945370000200c41163602bc04200c41003602b804200c429080808080023702b004200c200d3602ac04200c4283808080303702a404200c20093602a00441031027220d450d2c200d41026a41002d009cb0453a0000200d41002f009ab0453b0000411110272209450d2d200941106a41002d00828a453a0000200941086a41002900fa8945370000200941002900f28945370000200c41173602dc04200c41003602d804200c429180808090023702d004200c20093602cc04200c4283808080303702c404200c200d3602c00441031027220d450d2e200d41026a41002d009cb0453a0000200d41002f009ab0453b0000411610272209450d2f2009410e6a41002900918a45370000200941086a410029008b8a45370000200941002900838a45370000200c41183602fc04200c41003602f804200c4296808080e0023702f004200c20093602ec04200c4283808080303702e404200c200d3602e00441031027220d450d30200d41026a41002d009cb0453a0000200d41002f009ab0453b0000411210272209450d31200941106a41002f00a98a453b0000200941086a41002900a18a45370000200941002900998a45370000200c411936029c05200c410036029805200c4292808080a00237029005200c200936028c05200c42838080803037028405200c200d36028005410310272209450d32200941026a41002d009cb0453a0000200941002f009ab0453b0000410b1027220d450d33200d41076a41002800b28a45360000200d41002900ab8a45370000200c411a3602bc05200c41003602b805200c428b808080b0013702b005200c200d3602ac05200c4283808080303702a405200c20093602a005410310272209450d34200941026a41002d009cb0453a0000200941002f009ab0453b000041101027220d450d35200d41086a41002900be8a45370000200d41002900b68a45370000200c411b3602dc05200c41003602d805200c429080808080023702d005200c200d3602cc05200c4283808080303702c405200c20093602c0052005417f4c0d364101210902402005450d00200510272209450d380b20092004200510ce042109200841086a41186a2005360200200841086a41146a2005360200200841086a410c6a200641086a28020036020020082003360208200841003602302008200736022c2008200a360228200820093602182008200629020037020c20082001280200360224200241146a28020021042002411c6a2802002107200841003602482008420137034020084117360278200841f8006a200841c0006a1030410021010340200c20016a2205280200210e2008200541086a2802002209360278200841f8006a200841c0006a1030024002402008280244220d2008280248220a6b2009490d002008280240210d0c010b200a20096a2206200a490d3f200d4101742203200620062003491b22064100480d3f02400240200d0d0020061027210d0c010b2008280240200d20061028210d0b200d450d3a200820063602442008200d3602400b2008200a20096a360248200d200a6a200e200910ce041a2005410c6a28020021032008200541146a280200220d360278200841f8006a200841c0006a1030024002402008280244220a2008280248220e6b200d490d00200828024021090c010b200e200d6a2209200e490d3f200a4101742206200920092006491b22064100480d3f02400240200a0d002006102721090c010b2008280240200a2006102821090b2009450d3b20082006360244200820093602402006210a0b2008200e200d6a22063602482009200e6a2003200d10ce041a02400240200541186a2802004101460d0002400240200a2006460d00200a210d0c010b200a41016a220d200a490d41200a410174220e200d200d200e491b220d4100480d4102400240200a0d00200d102721090c010b2009200a200d102821090b2009450d3e2008200d360244200820093602400b2008200641016a220a360248200920066a41013a000020082005411c6a2802002205360278200841f8006a210e0c010b02400240200a2006460d00200a210d0c010b200a41016a220d200a490d40200a410174220e200d200d200e491b220d4100480d4002400240200a0d00200d102721090c010b2009200a200d102821090b2009450d3e2008200d360244200820093602400b2008200641016a220a360248200920066a41023a000020082005411c6a2802002205360278200841f8006a210e0b0240200d200a6b41034b0d00200a41046a2205200a490d3f200d4101742206200520052006491b22054100480d3f02400240200d0d002005102721090c010b2009200d2005102821090b2009450d3e2008200536024420082009360240200e28020021050b2008200a41046a3602482009200a6a2005360000200141206a220141e005470d000b2008280244210a4102210902400240411c200420072008280240220e2008280248200841086a1008220541036a220d41024b0d0002400240200d0e03010200010b410021090b0240200a450d00200e10290b2009450d01200841c0006a41306a200841086a41306a280200360200200841c0006a41286a200841086a41286a290300370300200841c0006a41206a200841086a41206a290300370300200841c0006a41186a200841086a41186a290300370300200841c0006a41106a200841086a41106a290300370300200841c0006a41086a200841086a41086a290300370300200820082903083703402000200841c0006a2009107b4100210e410121060c420b41041027220d450d3f200b280200220928020041016a220641014d0d0120092006360200200d20093602000240200a450d00200e10290b2002280204210e20022802002106200841003602482008420137034020084100360278200841f8006a200841c0006a10302008280240210a2008280244210120082802482103410a107c2209450d4002400240024002400240024020052006200e200a20032009410a200841086a100941036a220e41034b0d0041012106200e0e0402000001020b41c0cdc1001058000b2008410936027c2008200941016a36027820092d0000220e41014b0d0102400240200e0e020100010b200841c0006a200841f8006a107d2008280240417e714104460d020b410021060b2009102902402001450d00200a10290b4103210920060d010c020b200910292001450d00200a10290b410221090b200841c0006a41306a200841086a41306a280200360200200841c0006a41286a200841086a41286a290300370300200841c0006a41206a200841086a41206a290300370300200841c0006a41186a200841086a41186a290300370300200841c0006a41106a200841086a41106a290300370300200841c0006a41086a200841086a41086a290300370300200820082903083703402000200841c0006a2009107b2005100a200d28020022092009280200417f6a3602000240200d28020022092802000d0020092802081007200d28020022092009280204417f6a360204200d28020022092802040d00200910290b200d10294101210e410021060c410b200041a083c00036020420004102360200200041086a41103602000240200828020c2209450d00200841086a41086a280200450d00200910290b0240200828021c450d00200828021810290b200828022822092009280200417f6a3602000240200828022822092802000d0020092802081007200828022822092009280204417f6a360204200828022822092802040d00200910290b024020082802302209450d00200841346a280200450d00200910290b4100210a03400240200c200a6a220941046a280200450d00200928020010290b0240200941106a280200450d002009410c6a28020010290b200a41206a220a41e005470d000b200c1029200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081007200b28020022092009280204417f6a360204200b28020022092802040d00200910290b200b10290c410b00000b41044104102a000b41034101102a000b41064101102a000b41204104102a000b41034101102a000b41034101102a000b41c0004104102a000b41034101102a000b410f4101102a000b4180014104102a000b41034101102a000b410f4101102a000b41034101102a000b41084101102a000b4180024104102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410b4101102a000b4180044104102a000b41034101102a000b410d4101102a000b41034101102a000b410c4101102a000b41034101102a000b410b4101102a000b41034101102a000b41154101102a000b41034101102a000b410a4101102a000b41034101102a000b41074101102a000b41034101102a000b41114101102a000b41034101102a000b41104101102a000b4180084104102a000b41034101102a000b41104101102a000b41034101102a000b41114101102a000b41034101102a000b41164101102a000b41034101102a000b41124101102a000b41034101102a000b410b4101102a000b41034101102a000b41104101102a000b1039000b20054101102a000b20064101102a000b20064101102a000b200d4101102a000b200d4101102a000b20054101102a000b102b000b41044104102a000b410a4101102a000b4100210a03400240200c200a6a220941046a280200450d00200928020010290b0240200941106a280200450d002009410c6a28020010290b200a41206a220a41e005470d000b200c1029200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081007200b28020022092009280204417f6a360204200b28020022092802040d00200910290b200b1029410021092006410047200e720d002005100a0340200d20096a220a28020022052005280200417f6a3602000240200a28020022052802000d0020052802081007200a28020022052005280204417f6a360204200a280200220a2802040d00200a10290b200941046a22094104470d000b200d10290b20084180016a24000b0a0041b083c0001058000b5101027e024002402003450d002002280200450d010b4182abc10041f403104e000b2001280224220342002003290308220420023502047d2205200520045622021b37030820004105410420021b3602000b9d0f05047f027e027f017e027f230041d00c6b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241246a2802002106200241346a28020021030240200241146a2802002207450d004105210220012802002802202802502802bc012003490d070b200441306a4200370300200441286a4200370300200441206a420037030020012802242202420020022903082208427f200128021c2903482209420586200942ffffffffffffffff07832009521b7d22092009200856220a1b3703082004420037031841052102200a0d060240024020012802202802082005200441186a4120101241026a220a41024b0d00200a0e03080001080b4194c0c5001058000b024002400240024020070d004100210b0c010b200441086a200128021c29034842002003ad220c420010d3042001280224220a4200200a2903082209427f200429030820042903104200521b7d22082008200956220a1b370308200a0d090240024020030d00410021034101210b4200210c0c010b0240024020034100480d0020031027220b0d0120034101102a000b102b000b200b21054100210a024020034102490d00200b41002003417f6a220a10cd04200a6a21050b200541003a0000200a41016a21030b02400240024020012802202802082006200b2003101241026a220a41024b0d00200a0e03010002010b4194c0c5001058000b200c50450d020c0a0b200b450d09200c2003ad4220868421090b20012802002103200441386a41186a2201200441186a41186a290300370300200441386a41106a220a200441186a41106a290300370300200441386a41086a2205200441186a41086a2903003703002004200429031837033820032802202107200b450d0120072802502802bc012009422088a74f0d012009a7450d080b200b10290c070b200441d8006a41186a2001290300370300200441d8006a41106a200a290300370300200441d8006a41086a200529030037030020042004290338370358200728021c0d042007417f36021c200441b0016a200741f4006a290000370300200441a8016a200741ec006a290000370300200441a0016a200741e4006a2900003703002004200729005c3703980102400240200741206a220d280200220a418883c000460d00200741246a28020021060c010b41002106200441f0096a410041e00210cd041a200441d0016a410041a00810cd041a41880b1027220a450d06200a41003b0106200a4100360200200a41086a200441f0096a41e00210ce041a200a41e8026a200441d0016a41a00810ce041a200741246a41003602002007200a3602200b024002400340200a2f0106220e4105742105410021024100210302400240034020052002460d0120044198016a200a20026a41086a412010d0042201450d02200241206a2102200341016a21032001417f4a0d000b2003417f6a210e0b2006450d022006417f6a2106200a200e4102746a41880b6a280200210a0c010b0b200741286a2101410121020c010b200441f8006a41186a20044198016a41186a290300370300200441f8006a41106a20044198016a41106a290300370300200441f8006a41086a20044198016a41086a2903003703002004200429039801370378200741286a210141002106200e2103410021020b0240024020020d002004418c0a6a200441f8006a41086a290300370200200441940a6a200441f8006a41106a2903003702002004419c0a6a200441f8006a41186a290300370200200420013602800a200420033602fc092004200d3602f8092004200a3602f409200420063602f009200420042903783702840a200441f0016a20042903c001370300200441f8016a200441c0016a41086a29030037030020044184026a4200370200200442003703e801200442003703d0012004418883c00036028002200441003a008c022004418d026a20042900980137000020044195026a20044198016a41086a2900003700002004419d026a20044198016a41106a290000370000200441a5026a20044198016a41186a290000370000200441ac026a200441b7016a280000360000200441f0096a200441d0016a10de0121020c010b200441e8016a4200370300200441e4016a418883c000360200200441003602f001200441003602e001200442003703d8012004418883c0003602d401200441003602d001200a200341e0006c6a41e8026a2102200441d0016a10d6010b200441d0016a41186a200441d8006a41186a290300370300200441d0016a41106a200441d8006a41106a290300370300200441d0016a41086a200441d8006a41086a290300370300200420042903583703d0012004200937029c012004200b36029801200441f0096a200241306a200441d0016a20044198016a10df01024020042802f009450d0020042802f4092202450d00200441f8096a280200450d00200210290b2007200728021c41016a36021c410421020c060b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b41c8a8c1004110200441d0016a41f0a8c10010a201000b41880b4108102a000b20002002360200200441d00c6a24000b900302017f027e230041c0006b22042400024002402003450d0020022802000d0020022802042103200441186a4200370300200441106a4200370300200441086a420037030020012802242202420020022903082205427f200128021c2903482206420586200642ffffffffffffffff07832006521b7d2206200620055622021b3703082004420037030002400240024020020d00024002402001280220280208200320044120101241026a220241024b0d0020020e03020001020b4194c0c5001058000b200441206a20012802002802202202411c6a200241dc006a200241106a410020022802101b200410dd012004280220450d01200441306a41086a2203200441206a41086a28020036020020042004290320370330200141106a21020240200141146a280200450d00200228020010290b20022004290330370200200241086a2003280200360200410021010c020b200041053602000c030b200141186a4100360200410121010b20004100360200200020013602040c010b4182abc10041f403104e000b200441c0006a24000bb40d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a200128021c2903484200200241146a2802002202ad420010d3042001280224220342002003290308220b427f200429032020042903284200521b7d220c200c200b5622031b37030820030d0d0240024020020d0041002102410121034100210d0c010b20024100480d0b200210272203450d082003210e4100210d024020024102490d00200341002002417f6a220d10cd04200d6a210e0b200e41003a0000200d41016a210d0b024002400240200128022028020820052003200d101241026a220541024b0d0020050e03010002010b4194c0c5001058000b2002450d0e200310290c0e0b2003450d0d20044180016a200d4120200d412049220e1b22056a41004100412020056b2005411f4b1b10cd041a20044180016a2003200510ce041a02400240200e0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310290b200441106a200128021c29034842002008ad420010d3042001280224220242002002290308220b427f200429031020042903184200521b7d220c200c200b5622021b37030820020d0f0240024020080d004100210841012102410021030c010b20084100480d0d200810272202450d0b2002210541002103024020084102490d00200241002008417f6a220310cd0420036a21050b200541003a0000200341016a21030b024002402001280220280208200720022003101241026a220541024b0d0020050e03010003010b4194c0c5001058000b2008450d0f200210290c0f0b2002450d0e200310290c0e0b20020d090c0d0b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b20024101102a000b20084101102a000b2004420037038801200442003703800120044180016a20022003411020034110491b10ce041a02402003410f4b0d002008450d04200210290c040b20044188016a290300210f200429038001211002402008450d00200210290b2004200128021c2903484200200aad420010d3042001280224220242002002290308220b427f200429030020042903084200521b7d220c200c200b5622021b37030820020d030240200a0d004100210a41012102410021030c030b200a4100480d00200a102722020d01200a4101102a000b102b000b41012103200221050240200a4102490d0020024100200a417f6a220310cd0420036a2105200a21030b200541003a00000b0240024002402001280220280208200920022003101241026a220541024b0d0020050e03010002010b4194c0c5001058000b200a450d01200210290c010b2002450d00200141186a4100360200200141146a280200210d200128021021082001420137021020012802242205290308220c210b0240024002402006500d002006210b200c2006540d010b2005200c200b7d3703082005290310210c200441d0006a41186a200541186a2903003703002004200b3703582004200b3703502004200c3703602001280200280220210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200d3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a10e101200441f0006a41086a290300210b2004280274210d200428027021082005200429035820052903087c3703084101210320084101460d01200d450d010240200141146a2203280200450d00200128021010290b2001200d3602102003200b370200410021030c010b41012103200d450d00200810290b0240200a450d00200210290b20004100360200200020033602040c010b200041053602000b200441b0016a24000bfe0f06027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a200128021c2903484200200241146a2802002202ad420010d3042001280224220342002003290308220b427f200429032820042903304200521b7d220c200c200b5622031b37030820030d0a0240024020020d0041002102410121034100210d0c010b20024100480d0f200210272203450d082003210e4100210d024020024102490d00200341002002417f6a220d10cd04200d6a210e0b200e41003a0000200d41016a210d0b024002400240200128022028020820052003200d101241026a220541024b0d0020050e03010002010b4194c0c5001058000b2002450d0b200310290c0b0b2003450d0a200441f8006a200d4120200d412049220e1b22056a41004100412020056b2005411f4b1b10cd041a200441f8006a2003200510ce041a02400240200e0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310290b200441186a200128021c29034842002008ad420010d3042001280224220242002002290308220b427f200429031820042903204200521b7d220c200c200b5622021b37030820020d0c0240024020080d004100210841012102410021030c010b20084100480d11200810272202450d0b2002210541002103024020084102490d00200241002008417f6a220310cd0420036a21050b200541003a0000200341016a21030b024002402001280220280208200720022003101241026a220541024b0d0020050e03010003010b4194c0c5001058000b2008450d0c200210290c0c0b2002450d0b200310290c0b0b20020d090c0a0b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b20024101102a000b20084101102a000b200442003703c001200442003703b801200441b8016a20022003411020034110491b10ce041a02402003410f4b0d002008450d01200210290c010b200441c0016a290300210f20042903b801211002402008450d00200210290b200441086a200128021c2903484200200aad420010d3042001280224220242002002290308220b427f200429030820042903104200521b7d220c200c200b5622021b37030820020d0002400240200a0d004100210a41012102410021030c010b200a4100480d05200a10272202450d0641012103200221050240200a4102490d0020024100200a417f6a220310cd0420036a2105200a21030b200541003a00000b0240024002402001280220280208200920022003101241026a220541024b0d0020050e03010002010b4194c0c5001058000b200a450d01200210290c010b2002450d00200141186a410036020020012802242205290308220c210b02402006500d004101210d2006210b200c2006540d030b2005200c200b7d3703082005290310210c20044198016a41186a200541186a2903003703002004200b3703a0012004200b370398012004200c3703a801200441b8016a20012802002802202010200f20044198016a200441386a2002200310da014101210d20042d00b8014101460d01200441f8006a41186a200441d1016a290000220b370300200441f8006a41106a200441c9016a290000220c370300200441f8006a41086a200441c1016a2900002206370300200441d8006a41086a22032006370300200441d8006a41106a220d200c370300200441d8006a41186a2208200b370300200420042900b901220b370378200520042903a00120052903087c3703082004200b370358200441b8016a41186a2008290300370300200441b8016a41106a200d290300370300200441b8016a41086a2003290300370300200420042903583703b80102400240200141146a2802002205200141186a28020022036b4120490d00200128021021050c010b200341206a220d2003490d0520054101742203200d200d2003491b22034100480d050240024020050d002003102721050c010b200128021020052003102821050b2005450d0420012005360210200141146a2003360200200141186a28020021030b200141186a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210d0c020b200041053602000c050b200520042903a00120052903087c370308200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200420042903783703580b0240200a450d00200210290b200041003602002000200d3602040c030b20034101102a000b102b000b200a4101102a000b200441e0016a24000bc70403027f027e057f230041106b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d01200228020421052004200128021c2903184200200241146a2802002203ad420010d30420012802242202420020022903082206427f200429030020042903084200521b7d2207200720065622021b370308024020020d0020012802042102200141003602042002450d0302400240200141086a290200220642ffffffff0f560d000240024020032006422088a722084b0d002003200820032008491b21030c010b024002402006a7220920086b200320086b220a490d00200821090c010b2008200a6a220b2008490d092009410174220c200b200b200c491b220b4100480d090240024020090d00200b102721020c010b20022009200b102821020b2002450d082006422088a72109200bad21060b200220096a210b0240200a4102490d00200b410020032008417f7322086a10cd041a2002200920036a20086a22096a210b0b200b41003a0000200941016a21030b024002402001280220280208200520022003101241026a220841024b0d0020080e03010003010b4194c0c5001058000b2006a7450d02200210290c020b41d08bc3001058000b2006a72108024020012802282205450d002001412c6a280200450d00200510290b20012002360228200141306a20033602002001412c6a20083602000b20004105360200200441106a24000f0b4182abc10041f403104e000b4182abc10041f403104e000b41f6aec10041fd00104e000b200b4101102a000b102b000bf00101037f41002104200141186a4100360200200128020021050240024002400240200141146a28020022064120490d00200128021021060c010b200641017422044120200441204b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441206a360200200620046a220141186a2005413c6a290000370000200141106a200541346a290000370000200141086a2005412c6a29000037000020012005290024370000200041043602000f0b20044101102a000b102b000bf60101037f41002104200141186a4100360200200128020028022021050240024002400240200141146a28020022064120490d00200128021021060c010b200641017422044120200441204b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441206a360200200620046a220141186a200541f4006a290000370000200141106a200541ec006a290000370000200141086a200541e4006a2900003700002001200529005c370000200041043602000f0b20044101102a000b102b000bd50102027f027e41002104200141186a41003602002001280224220541186a2903002106200529031021070240024002400240200141146a28020022054110490d00200128021021050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102721050c010b200128021020052004102821050b2005450d0120012005360210200141146a2004360200200141186a28020021040b200141186a200441106a360200200520046a2201200637000820012007370000200041043602000f0b20044101102a000b102b000bc20103017f017e017f41002104200141186a4100360200200128022429030821050240024002400240200141146a28020022064108490d00200128021021060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441086a360200200620046a2005370000200041043602000f0b20044101102a000b102b000b9d04020b7f027e230041206b22042400200141186a41003602000240024002402001280200280220220528021c41016a220641004c0d00200541dc006a21072005200636021c200541206a2108200541246a28020021090240024003402008280200220a41086a210b200a2f0106220c41057421084100210d0240024003402008450d012007200b412010d004220e450d02200841606a2108200d41016a210d200b41206a210b200e417f4a0d000b200d417f6a210c0b2009450d022009417f6a2109200a200c4102746a41880b6a21080c010b0b200a200d41e0006c6a220841e8026a280200450d00200841f8026a290300210f200841f0026a29030021100c010b200441086a2005412c6a2802002007200541306a28020028021c110200200441106a290300210f200528021c2106200429030821100b20052006417f6a36021c02400240200141146a280200220b200141186a28020022086b4110490d002001280210210b0c010b200841106a220d2008490d03200b4101742208200d200d2008491b22084100480d0302400240200b0d0020081027210b0c010b2001280210200b20081028210b0b200b450d022001200b360210200141146a2008360200200141186a28020021080b200141186a200841106a360200200b20086a2208200f3700082008201037000020004104360200200441206a24000f0b41d8a8c1004118200441186a4180a9c10010a201000b20084101102a000b102b000bd50102027f027e41002104200141186a41003602002001280200220541086a2903002106200529030021070240024002400240200141146a28020022054110490d00200128021021050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102721050c010b200128021020052004102821050b2005450d0120012005360210200141146a2004360200200141186a28020021040b200141186a200441106a360200200520046a2201200637000820012007370000200041043602000f0b20044101102a000b102b000bf30403047f027e017f230041306b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0141052105200241146a2802002203200128021c220628026c4b0d06200228020421072004200629034842002003ad420010d30420012802242202420020022903082208427f200429030020042903084200521b7d2209200920085622021b37030820020d060240024020030d004100210341012102410021060c010b20034100480d04200310272202450d05410121062002210a024020034102490d00200241002003417f6a220610cd0420066a210a200321060b200a41003a00000b0240024002402001280220280208200720022006101241026a220741024b0d0020070e03010002010b4194c0c5001058000b2003450d070c060b2002450d06200141186a22054100360200200441106a2002200610db0102400240200141146a2802002206200528020022056b4120490d00200128021021060c010b200541206a22072005490d0420064101742205200720072005491b22054100480d040240024020060d002005102721060c010b200128021020062005102821060b2006450d0320012006360210200141146a2005360200200141186a28020021050b200141186a200541206a360200200620056a220141186a200441106a41186a290300370000200141106a200441106a41106a290300370000200141086a200441106a41086a290300370000200120042903103700004104210520030d050c060b4182abc10041f403104e000b4182abc10041f403104e000b20054101102a000b102b000b20034101102a000b200210290b20002005360200200441306a24000bc20103017f017e017f41002104200141186a4100360200200128020029031021050240024002400240200141146a28020022064108490d00200128021021060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441086a360200200620046a2005370000200041043602000f0b20044101102a000b102b000bee0704027f027e037f027e230041f0036b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441206a200128021c2903484200200241146a2802002202ad420010d30420012802242203420020032903082206427f200429032020042903284200521b7d2207200720065622031b3703084105210820030d060240024020020d004100210241012103410021090c010b20024100480d05200210272203450d06410121092003210a024020024102490d00200341002002417f6a220910cd0420096a210a200221090b200a41003a00000b024002400240024002402001280220280208200520032009101241026a220541024b0d0020050e03010002010b4194c0c5001058000b20020d010c090b2003450d08200420093602bc01200420033602b801200441c8026a200441b8016a103c024020042802c80222054112460d00200441c0016a200441c8026a41047241840110ce041a20042005360230200441306a410472200441c0016a41840110ce041a02402002450d00200310290b200441003602d002200442013703c802200441306a200441c8026a103220042802d0022103024020042802cc02450d0020042802c80210290b200128022422022903102206200241186a2903002207844200510d05200441106a2003ad42004280c8afa025420010d30420042004290310220b4280a094a58d1d7c220c200441106a41086a290300200c200b54ad7c2006200710d40420024200200229030822062004290300427f200441086a290300501b7d220720072006561b37030820072006580d02200441306a103d0c090b2002450d080b200310290c070b20012802002102200441c0016a200441306a41880110ce041a200441e0026a2002280220220241f4006a290000370300200441d8026a200241ec006a290000370300200441c8026a41086a200241e4006a2900003703002004200229005c3703c802200441e8026a200441c0016a41880110ce041a0240200241cc006a2802002201200241c8006a280200470d00200141016a22032001490d0520014101742208200320032008491b2203ad42a8017e2206422088a70d052006a722084100480d050240024020010d002008102721010c010b2002280244200141a8016c2008102821010b2001450d0420022001360244200241c8006a2003360200200228024c21010b2002280244200141a8016c6a200441c8026a41a80110ce041a2002200228024c41016a36024c410421080c060b4182abc10041f403104e000b4182abc10041f403104e000b41fcecc2001058000b20084108102a000b102b000b20024101102a000b20002008360200200441f0036a24000b1600200041003602002000200141186a2802003602040bab0202057f027e230041106b220424000240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141186a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021021082004200128021c29035042002005ad420010d30420012802242202420020022903082209427f200429030020042903084200521b7d220a200a20095622021b37030820020d000240024020012802202802082007200820066a2005101341026a220241024b0d0020020e03020001020b41fcc0c5001058000b410421030b20002003360200200441106a24000f0b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000bd30b05047f027e037f017e047f23004190016b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a280200210602400240024002400240200241146a2802002203450d0020022802042107200441306a200128021c29034842002003ad420010d30420012802242202420020022903082208427f200429033020042903384200521b7d22092009200856220a1b37030841052102200a0d0e20034100480d0a20031027220a450d0b200a210b4100210c024020034102490d00200a41002003417f6a220c10cd04200c6a210b0b200b41003a0000024020012802202802082007200a200c41016a220c101241026a220341024b0d0020030e03040002040b4194c0c5001058000b4101210c410021074100210b0c010b2004200c3602742004200a360270200441c0006a200441f0006a102d2004280240220c450d01200441c8006a28020021072004280244210b200a10292007200128021c28025c4b0d0b0b200c2007410041202007676b10e001024020074102490d00200c21022007210303402002200241206a220a412010d004450d0c200a21022003417f6a220341024f0d000b0b200441206a200128021c29034842002006ad220d420010d30420012802242202420020022903082208427f200429032020042903284200521b7d2209200920085622021b37030820020d0a0240024020060d0041002106410121024100210a0c010b20064100480d08200610272202450d0a4101210a20022103024020064102490d00200241002006417f6a220310cd0420036a21032006210a0b200341003a00000b024002400240200128022028020820052002200a101241026a220341024b0d0020030e03010002010b4194c0c5001058000b2006450d0b200210290c0b0b2002450d0a2004200128021c220529032842002007ad420010d304200441106a20052903204200200d420010d30420012802242103427f2109024020042903184200520d0020042903084200520d002004290310220820042903007c220d2008540d00427f200d20052903307c22082008200d541b21090b200342002003290308220820097d220920092008561b37030820092008580d012006450d0a200210290c0a0b200a10290c0a0b200441f0006a41086a22052001280200280220220141e4006a290000370300200441f0006a41106a220e200141ec006a290000370300200441f0006a41186a220f200141f4006a2900003703002004200129005c3703700240200141c0006a28020022032001413c6a280200470d00200341016a22102003490d0620034101742211201020102011491b2210ad42e8007e2208422088a70d062008a722114100480d060240024020030d002011102721030c010b2001280238200341e8006c2011102821030b2003450d05200120033602382001413c6a2010360200200128024021030b2001280238200341e8006c6a220341053a000020032004290370370001200341096a2005290300370000200341116a200e290300370000200341196a200f290300370000200341216a20042f006d3b0000200341236a200441ef006a2d00003a00002003412c6a200a360000200341286a2006360000200341246a2002360000200341306a2004290340370300200341386a200441c0006a41086a290300370300200341c0006a200441c0006a41106a290300370300200341c8006a200441c0006a41186a290300370300200341d0006a200441e0006a290300370300200341e0006a2007360200200341dc006a200b3602002003200c3602582001200128024041016a360240410421020c090b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b20114108102a000b102b000b20034101102a000b20064101102a000b41052102200b450d00200c10290b2000200236020020044190016a24000bef0a03027f027e057f230041f00b6b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441086a200128021c2903484200200241146a2802002202ad420010d30420012802242203420020032903082206427f200429030820042903104200521b7d2207200720065622031b3703084105210820030d040240024020020d004100210241012103410021090c010b0240024020024100480d002002102722030d0120024101102a000b102b000b410121092003210a024020024102490d00200341002002417f6a220910cd0420096a210a200221090b200a41003a00000b024002400240024002402001280220280208200520032009101241026a220541024b0d0020050e03010002010b4194c0c5001058000b20020d010c070b2003450d062004420037037820044200370370200441f0006a20032009411020094110491b10ce041a2009410f4b0d012002450d060b200310290c050b200441f8006a29030021062004290370210702402002450d00200310290b2001280200280220220528021c0d022005417f36021c200441d0006a200541f4006a290000370300200441c8006a200541ec006a290000370300200441c0006a200541e4006a2900003703002004200529005c37033802400240200541206a220b2802002208418883c000460d00200541246a280200210a0c010b4100210a20044190096a410041e00210cd041a200441f0006a410041a00810cd041a41880b10272208450d04200841003b010620084100360200200841086a20044190096a41e00210ce041a200841e8026a200441f0006a41a00810ce041a200541246a4100360200200520083602200b02400240034020082f0106220c4105742109410021024100210102400240034020092002460d01200441386a200820026a41086a412010d0042203450d02200241206a2102200141016a21012003417f4a0d000b2001417f6a210c0b200a450d02200a417f6a210a2008200c4102746a41880b6a28020021080c010b0b200541286a2103410121020c010b200441186a41186a200441386a41186a290300370300200441186a41106a200441386a41106a290300370300200441186a41086a200441386a41086a29030037030020042004290338370318200541286a21034100210a200c2101410021020b0240024020020d00200441ac096a200441186a41086a290300370200200441b4096a200441186a41106a290300370200200441bc096a200441186a41186a290300370200200420033602a0092004200136029c092004200b3602980920042008360294092004200a36029009200420042903183702a40920044190016a200429036037030020044198016a200441e0006a41086a290300370300200441a4016a42003702002004420037038801200442003703702004418883c0003602a001200441003a00ac01200441ad016a2004290038370000200441b5016a200441386a41086a290000370000200441bd016a200441386a41106a290000370000200441c5016a200441386a41186a290000370000200441cc016a200441d7006a28000036000020044190096a200441f0006a10de0121020c010b20044188016a420037030020044184016a418883c00036020020044100360290012004410036028001200442003703782004418883c000360274200441003602702008200141e0006c6a41e8026a2102200441f0006a10d6010b200241286a2006370300200241206a2007370300200242013703182005200528021c41016a36021c410421080c040b4182abc10041f403104e000b4182abc10041f403104e000b41c8a8c1004110200441f0006a41f0a8c10010a201000b41880b4108102a000b20002008360200200441f00b6a24000bad04020b7f027e230041206b22042400200141186a41003602000240024002402001280200280220220528021c41016a220641004c0d00200541dc006a21072005200636021c200541206a2108200541246a28020021090240024003402008280200220a41086a210b200a2f0106220c41057421084100210d0240024003402008450d012007200b412010d004220e450d02200841606a2108200d41016a210d200b41206a210b200e417f4a0d000b200d417f6a210c0b2009450d022009417f6a2109200a200c4102746a41880b6a21080c010b0b200a200d41e0006c6a22084180036a280200220b450d0020084190036a290300210f20084188036a29030021100c010b20042005412c6a2802002007200541306a280200280214110200200441106a290300210f200528021c2106200429030821102004280200210b0b20052006417f6a36021c02400240200141146a280200220d200141186a28020022086b4110490d002001280210210d0c010b200841106a220e2008490d03200d4101742208200e200e2008491b22084100480d0302400240200d0d0020081027210d0c010b2001280210200d20081028210d0b200d450d022001200d360210200141146a2008360200200141186a28020021080b200141186a200841106a360200200d20086a2208200f427f200b1b37000820082010427f200b1b37000020004104360200200441206a24000f0b41d8a8c1004118200441186a4180a9c10010a201000b20084101102a000b102b000b8d0303027f027e037f230041206b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d01200228020421052004200128021c2903484200200241146a2802002202ad420010d30420012802242203420020032903082206427f200429030020042903084200521b7d2207200720065622081b3703084105210320080d030240024020020d004100210241012108410021090c010b0240024020024100480d002002102722080d0120024101102a000b102b000b410121092008210a024020024102490d00200841002002417f6a220910cd0420096a210a200221090b200a41003a00000b0240024002402001280220280208200520082009101241026a220141024b0d0020010e03010002010b4194c0c5001058000b2002450d040c030b2008450d03200441106a2008200910dc01024020042802100d002004280214200441186a28020010100b4104210320020d020c030b4182abc10041f403104e000b4182abc10041f403104e000b200810290b20002003360200200441206a24000bc20103017f017e017f41002104200141186a4100360200200128020029031821050240024002400240200141146a28020022064108490d00200128021021060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441086a360200200620046a2005370000200041043602000f0b20044101102a000b102b000bdf05020a7f017e230041c0006b220424002004200136020c2004200041b8d6c50020011b3602082004200441086a102e02402004280200450d00024002400240024002400240024002400240200428020422054180022005418002491b22060d00410821070c010b2006410474220110272207450d010b02402005450d00200441206a4104722108410021094100210a410021000340200441206a200441086a107d200441306a41086a220b200841086a2802003602002004200829020037033002402004280220220c4104470d002006450d0a200710290c0a0b200041016a2101200441106a41086a220d200b28020036020020042004290330370310024020002006470d002009200120012009491b220641ffffffff00712006470d052006410474220b4100480d050240024020000d00200b102721070c010b2007200a200b102821070b2007450d040b2007200a6a2200200c360200200041046a20042903103702002000410c6a200d280200360200200941026a2109200a41106a210a2001210020052001470d000b0b2007450d07200441206a20022007200520031103002004410036023820044201370330200428022021004101102721010240024020004105460d002001450d05200141003a000020044281808080103702342004200136023020014101410210282101024020004104470d002001450d07200141003a00012004428280808020370234200420013602304202210e0c020b2001450d07200141013a0001200442828080802037023420042001360230200441206a200441306a10fe012004350238210e200428023021010c010b2001450d07200141013a00002004428180808010370234200420013602304201210e0b2001ad422086200e84210e02402006450d00200710290b200441c0006a2400200e0f0b20014108102a000b200b4108102a000b102b000b41014101102a000b41024101102a000b41024101102a000b41014101102a000b41cdccc10041f000104e000b920201027f20012802282103024002400240200241ff017122024103470d0020030d01200041003602000c020b2001412c6a2802002104024020024102470d002003450d00200141306a280200210220002003360204200041013602002000410c6a2002360200200041086a20043602000c020b200041a1a6c10036020420004102360200200041086a41103602002003450d012004450d01200310290c010b41b4a6c1001058000b024020012802042200450d00200141086a280200450d00200010290b0240200141146a280200450d00200128021010290b200128022022012001280200417f6a2200360200024020000d002001280208100720012001280204417f6a220036020420000d00200110290b0b0700200010b4040b890401057f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce041a0240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041043602000c020b024020022d0008417f6a220441034b0d00024002400240024020040e0400010203000b20024100360208200241086a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a3602000240200641034b0d00200041043602000c060b20002002280208360204200041003602000c050b20024200370308200241086a20052006410820064108491b220410ce041a2001200620046b3602042001200520046a3602000240200641074b0d00200041043602000c050b200041086a2002290308370300200041013602000c040b20024100360208200241086a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a3602000240200641034b0d00200041043602000c040b20002002280208360204200041023602000c030b20024200370308200241086a20052006410820064108491b220410ce041a2001200620046b3602042001200520046a3602000240200641074b0d00200041043602000c030b200041086a2002290308370300200041033602000c020b200041043602000c010b20052004103e000b200241106a24000be40301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02400240200041808001490d0020004180808080044f0d01200341033a0005200320004106763a000120032000410e763a0002200320004116763a0003200320004102744102723a0000410421040c020b200320004106763a000141022104200341013a0005200320004102744101723a00000c010b200341043a0005200341033a0000200320003a0001200320004108763a0002200320004110763a0003200320004118763a0004410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d0120002003200210ce041a200341e0006a24000f0b20022001107f000b200341286a41146a4103360200200341346a411d360200200341106a41146a41033602002003200341086a36024020032003410c6a360244200341c8006a41146a41003602002003420337021420034190d1c5003602102003411d36022c200341b8d6c5003602582003420137024c200341e4d1c5003602482003200341286a3602202003200341c8006a3602382003200341c4006a3602302003200341c0006a360228200341106a41a0d2c5001057000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c200241c4d8c500360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41d4d8c5001057000bb90201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110aa0121000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2004418001103e000b2004418001103e000b11002000280200200028020420011082010bbe0f020d7f017e230041206b220324004101210402400240200228021841222002411c6a2802002802101104000d000240024020010d00410021050c010b200020016a21062000210741002105410021080240034020072109200741016a210a02400240024020072c0000220b417f4a0d0002400240200a2006470d004100210c200621070c010b20072d0001413f71210c200741026a220a21070b200b411f7121040240200b41ff0171220b41df014b0d00200c200441067472210b0c020b0240024020072006470d004100210d2006210e0c010b20072d0000413f71210d200741016a220a210e0b200d200c41067472210c0240200b41f0014f0d00200c2004410c7472210b0c020b02400240200e2006470d004100210b200a21070c010b200e41016a2107200e2d0000413f71210b0b200c4106742004411274418080f0007172200b72220b418080c400470d020c040b200b41ff0171210b0b200a21070b4102210a024002400240024002400240200b41776a220c411e4d0d00200b41dc00470d010c020b41f400210e02400240200c0e1f05010202000202020202020202020202020202020202020202030202020203050b41f200210e0c040b41ee00210e0c030b02400240200b10bd040d0002400240200b41808004490d00024002400240200b418080084f0d00200b4180fe0371410876210f41e1edc500210c410021040340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d06200e2104200d210c200d41a7eec500470d010c060b200e2004490d02200e41a6014b0d03200441a7eec5006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c080b0b200e2104200d210c200d41a7eec500470d000c050b0b200b41ef83384b0d04200b41e28b746a41e28d2c490d04200b419fa8746a419f18490d04200b41dee2746a410e490d04200b41feffff0071419ef00a460d04200b41a9b2756a4129490d04200b41cb91756a410a4b0d090c040b2004200e103e000b200e41a601107f000b200b4180fe0371410876210f41b0e8c500210c41002104024002400340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d03200e2104200d210c200d4182e9c500470d010c030b0240200e2004490d00200e41a5024b0d0220044182e9c5006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c070b0b200e2104200d210c200d4182e9c500470d010c030b0b2004200e103e000b200e41a502107f000b200b41ffff0371210441a7ebc500210a4101210e02400340200a41016a210d02400240200a2d0000220c411874411875220f4100480d00200d210a0c010b200d41e1edc500460d02200f41ff0071410874200a2d000172210c200a41026a210a0b02402004200c6b22044100480d00200e410173210e200a41e1edc500470d010b0b200e410171450d020c070b41c8dac5001058000b200b41ffff0371210441cdefc500210a4101210e0340200a41016a210d02400240200a2d0000220c411874411875220f4100480d00200d210a0c010b200d41e5f2c500460d03200f41ff0071410874200a2d000172210c200a41026a210a0b02402004200c6b22044100480d00200e410173210e200a41e5f2c500470d010b0b200e4101710d050b200b41017267410276410773ad4280808080d0008421104103210a0c020b41c8dac5001058000b0b200b210e0b2003200136020420032000360200200320053602082003200836020c0240024020082005490d0002402005450d0020052001460d00200520014f0d01200020056a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020056a200820056b200228021c28020c110500450d01410121040c060b20032003410c6a3602182003200341086a36021420032003360210200341106a10c404000b0340200a210c4101210441dc0021054101210a024002400240024002400240200c0e0402010500020b02400240024002402010422088a741ff01710e06050302010006050b201042ffffffff8f60834280808080308421104103210a41f50021050c070b201042ffffffff8f60834280808080208421104103210a41fb0021050c060b200e2010a7220c410274411c7176410f71220a413072200a41d7006a200a410a491b21050240200c450d002010427f7c42ffffffff0f832010428080808070838421100c050b201042ffffffff8f60834280808080108421100c040b201042ffffffff8f608321104103210a41fd0021050c040b4100210a200e21050c030b4101210a0240200b418001490d004102210a200b418010490d0041034104200b41808004491b210a0b200a20086a21050c040b201042ffffffff8f60834280808080c0008421100b4103210a0b20022802182005200228021c2802101104000d050c000b0b200820096b20076a210820062007470d000b0b2005450d0020052001460d00200520014f0d02200020056a2c000041bf7f4c0d020b410121042002280218200020056a200120056b200228021c28020c1105000d0020022802184122200228021c28021011040021040b200341206a240020040f0b200020012005200110ba04000bfb0304027f027e017f017e230041e0006b22042400024002400240411410272205450d00200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441186a20054134108401200441186a41106a290300210620042903202107200428021821082005102942002109200441306a20012007420020081b220720027c22022006420020081b20037c2002200754ad7c108501200441306a41106a290300210220042903382103024020042903304200520d00200321090c030b200441b18ac0004116108601200441106a29030021062004290308210720042802002105200441306a41086a220142003703002004420037033041b18ac0004116200441306a1004200441d0006a41086a200129030037030020042004290330370350200442002006420020051b220620027d2007420020051b2202200354ad7d2207200220037d2203200256200720065620072006511b22051b37033820044200200320051b370330200441d0006a4110200441306a41101003420021020c020b41144101102a000b41344101102a000b2000200937030020002002370308200441e0006a24000ba10204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1000200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703002003410036022020034120200341206a1005210202400240024020032802202201417f470d000c010b2003420037032820034200370320200341206a20022001411020014110491b10ce041a2001410f4d0d01200341286a29030021082003290320210920021029420121040b2000200937030820002004370300200041106a2008370300200341c0006a24000f0b418f89c3004133104e000bdb0605027f027e017f017e047f230041b0016b220424000240024002400240411410272205450d00200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a20054134108401200441086a41106a29030021062004290310210720042802082108200510292006420020081b21092007420020081b2106024002400240200242ffffe883b1de1656200342005220035022051b0d002006200984500d010b4101210802402002428080e983b1de1654410020051b0d00411410272205450d0541002108200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d06200520012900003700142005412c6a200141186a220a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a220b4200370300200441206a41106a220c4200370300200441206a41086a220d42003703002004420037032020054134200441206a100020044190016a41186a200b29030037030020044190016a41106a200c29030037030020044190016a41086a200d290300370300200420042903203703900120044190016a412041b8d6c50041004100100b210b20051029200b417f470d002001108701200441d8006a2003370300200441d0006a200237030041002108200441206a41086a41003a0000200441296a2001290000370000200441316a200141086a290000370000200441396a200141106a290000370000200441c1006a200a290000370000200441023a002041b8d6c5004100200441206a1088010b200120022003108901200041106a200920037d2006200254ad7d200320097d2002200654ad7d2006200256200920035620092003511b22051b3703002000200620027d200220067d20051b370308200020083a001820002005ad3703000c010b20004200370300200041013a0018200041106a4200370300200041086a42003703000b200441b0016a24000f0b41144101102a000b41344101102a000b41144101102a000b41344101102a000be70104017f017e017f027e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1004200341086a2005290300370300200320032903103703002003410036021020034110200341106a1005210202400240024020032802102201417f470d000c010b2003420037031820034200370310200341106a20022001411020014110491b10ce041a2001410f4d0d01200341186a29030021062003290310210720021029420121040b2000200737030820002004370300200041106a2006370300200341206a24000f0b418f89c3004133104e000ba10703047f017e067f230041a0016b22012400200141186a41f8f3c200411310b50120012802182102200128021c210302400240412010272204450d00200420002900002205370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a29000037000020042d000121062004102920014190016a20064108742005a7220441c0017172410676220610cc0102402004413f7122042001280298014f0d00200141086a20012802900120044105746a22041095012001290308200141086a41086a290300844200520d0020042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a290000370000200141206a41086a20014190016a41086a28020036020020012001290390013703202006200141206a10fe020c020b2003410020021b21040240200128029401450d0020012802900110290b200141206a200410cc01024020012802282206413f4d0d000340200441016a210402402001280224450d00200128022010290b200141206a200410cc0120012802282206413f4b0d000b0b2001280220210220012802242107200141206a41186a2208200041186a290000370300200141206a41106a2209200041106a290000370300200141206a41086a220a200041086a29000037030020012000290000370320200641016a2103024020072006470d00024020064101742207200320032007491b2207410574220b4100480d000240024020060d00200b102721020c010b20022006410574200b102821020b20020d01200b4101102a000b102b000b200620044106746a210b200220064105746a22062001290320370000200641186a2008290300370000200641106a2009290300370000200641086a200a2903003700000240200341c000470d00200141206a41086a220642003703002001420037032041f8f3c2004113200141206a100420014190016a41086a200629030037030020012001290320370390012001200441016a36022020014190016a4110200141206a410410030b2001200336022820012007360224200120023602202004200141206a10fe02200141206a41086a2000290000370300200141206a41106a200041086a290000370300200141206a41186a200041106a290000370300200141c0006a200041186a2900003703002001200b360224200141013a002041b8d6c5004100200141206a1088010c010b41204101102a000b200141a0016a24000b942603087f047e037f230041c0036b22032400200341003602b80141ff88c3004110200341b8016a100521040240024020032802b8012205417f460d002004450d0041002106200341003602b801200341b8016a20042005410420054104491b10ce041a0240200541034d0d0020032802b8012107200410290c020b418f89c3004133104e000b410121060b4101210841002104410021050240024002400240024002400240024002400240024002400240024002402001450d00200141057422044100480d09200410272208450d012001410574220941606a410576210a410021040340200341b8016a41186a200020046a220541186a290000220b370300200341b8016a41106a200541106a290000220c370300200341b8016a41086a200541086a290000220d37030020032005290000220e3703b801200820046a220541186a200b370000200541106a200c370000200541086a200d3700002005200e3700002009200441206a2204470d000b200a41016a2105200121040b200341a4016a2007360200200320063602a001200341306a200241f00010ce041a200341b0016a2005360200200341ac016a2004360200200320083602a801200341286a4187cec500411110b501024002400240024002400240200328022c410020032802281b220f41016a2205200f490d00200341d0026a41086a22044200370300200342003703d0024187cec5004111200341d0026a100420034188036a41086a22082004290300370300200320032903d00237038803200320053602b80120034188036a4110200341b8016a41041003200341b8016a200341306a41880110ce041a20044200370300200342003703d002418890c300410d200341d0026a100420082004290300370300200320032903d00237038803200341003602d00220034188036a4110200341d0026a100521050240024020032802d0022204417f460d0020050d010b200341003602c802200342013703c0020c090b200320043602c802200320043602c402200320053602c0022004450d08200320043602d402200320053602d002200341206a200341d0026a102e2003280220450d07410121052003280224220841016a22092008490d070240200841c000490d0041022105200841808001490d00410441052008418080808004491b21050b410121080240200941c000490d0041022108200941808001490d00410441052009418080808004491b21080b024020082005460d002004200820056b6a2204417f4c0d100240024020040d00410121020c010b200410272202450d030b200320043602a803200320043602a403200320023602a0032003200341a0036a3602d0022009200341d0026a2008107e20042008490d0320032802a80322092004490d0420032802c80222092005490d0520032802a003210220032802c00221062003200420086b22043602b0032003200920056b22093602b40320042009470d06200220086a200620056a200410ce041a200341b8016a200341a0036a10980320032802a803210820032802a403210520032802a003210420032802c402450d0b20032802c00210290c0b0b2003200341c0026a3602d0022009200341d0026a2005107e200341b8016a200341c0026a10980320032802c802210820032802c402210520032802c00221040c0a0b200341306a1099030c0a0b20044101102a000b20082004103e000b20042009107f000b20052009103e000b20034188036a41146a410336020020034194036a411d360200200341f0026a41146a41033602002003200341b0036a3602b8032003200341b4036a3602bc03200341d0026a41146a4100360200200342033702f40220034190d1c5003602f0022003411d36028c03200341b8d6c5003602e002200342013702d402200341e4d1c5003602d002200320034188036a360280032003200341d0026a360298032003200341bc036a360290032003200341b8036a36028803200341f0026a41a0d2c5001057000b20044101102a000b410021040c010b200341003602d802200342013703d002200341013602880320034188036a200341d0026a10300240024020032802a8024101460d000240024020032802d40220032802d8022204460d0020032802d00221050c010b200441016a22052004490d0820044101742208200520052008491b22084100480d080240024020040d002008102721050c010b20032802d00220042008102821050b2005450d0d200320083602d402200320053602d00220032802d80221040b2003200441016a3602d802200520046a41003a000020032802ac0221080240024020032802d402220520032802d80222046b4104490d0020032802d00221050c010b200441046a22092004490d0820054101742204200920092004491b22044100480d080240024020050d002004102721050c010b20032802d00220052004102821050b2005450d0c200320043602d402200320053602d00220032802d80221040b2003200441046a3602d802200520046a20083600000c010b0240024020032802d40220032802d8022204460d0020032802d00221050c010b200441016a22052004490d0720044101742208200520052008491b22084100480d070240024020040d002008102721050c010b20032802d00220042008102821050b2005450d0a200320083602d402200320053602d00220032802d80221040b2003200441016a3602d802200520046a41013a00000b200341b8016a200341d0026a109d0220032802b0022104200320032802b80222053602880320034188036a200341d0026a103002402005450d002005410574210220032802d402210920032802d8022105034002400240200920056b4120490d0020032802d00221080c010b200541206a22082005490d0820094101742205200820082005491b22064100480d080240024020090d002006102721080c010b20032802d00220092006102821080b2008450d0a200320063602d402200320083602d00220032802d8022105200621090b200820056a220841086a200441086a290000370000200841106a200441106a290000370000200841186a200441186a2900003700002003200541206a22053602d80220082004290000370000200441206a2104200241606a22020d000b0b20032802d802210820032802d402210520032802d002210420032802c402450d010b20032802c00210290b024020040d00200341b8016a1099030c010b200341d0026a41086a22094200370300200342003703d002418890c300410d200341d0026a100420034188036a41086a2009290300370300200320032903d0023703880320034188036a411020042008100302402005450d00200410290b200341b8016a109903200341106a41888dc300410d1094012001450d002003290318420020032802101b210c2001410574211003402003200f3602f8022003200c3703f002024002400240024002400240024002400240024002400240024002400240411210272204450d00200441106a41002f00a590433b0000200441086a410029009d9043370000200441002900959043370000200341b8016a41186a22084200370300200341b8016a41106a22094200370300200341b8016a41086a22024200370300200342003703b80120044112200341b8016a1000200341d0026a41186a22062008290300370300200341d0026a41106a22012009290300370300200341d0026a41086a22072002290300370300200320032903b8013703d002412010272205450d01200520032903d002370000200541186a2006290300370000200541106a2001290300370000200541086a200729030037000020041029200842003703002009420037030020024200370300200342003703b80120004120200341b8016a1000200620082903003703002001200929030037030020072002290300370300200320032903b8013703d0022005412041c00010282204450d02200420032903d002370020200441386a2006290300370000200441306a2001290300370000200441286a2007290300370000200341003602b801200441c000200341b8016a10052105024020032802b8012208417f470d00200341003602c802200342013703c0020c0d0b200320083602c802200320083602c402200320053602c0022008450d0c200320083602bc01200320053602b801200341086a200341b8016a102e024020032802080d00410021050c0e0b41002105200328020c220941016a22062009490d0d41012105410121020240200941c000490d0041022102200941808001490d00410441052009418080808004491b21020b0240200641c000490d0041022105200641808001490d00410441052006418080808004491b21050b024020052002460d002008200520026b6a2208417f4c0d150240024020080d00410121090c010b200810272209450d050b200320083602a803200320083602a403200320093602a0032003200341a0036a3602b8012006200341b8016a2005107e20082005490d0520032802a80322092008490d0620032802c80222092002490d0720032802a003210620032802c00221012003200820056b22083602b0032003200920026b22093602b40320082009470d08200620056a200120026a200810ce041a20032903f002210b0240024020032802a403220820032802a80322056b4108490d0020032802a00321080c010b200541086a22092005490d1520084101742205200920092005491b22054100480d150240024020080d002005102721080c010b20032802a00320082005102821080b2008450d0a200320053602a403200320083602a00320032802a80321050b2003200541086a3602a803200820056a200b37000020032802f80221090240024020032802a403220820032802a80322056b4104490d0020032802a00321080c010b200541046a22022005490d1520084101742205200220022005491b22054100480d150240024020080d002005102721080c010b20032802a00320082005102821080b2008450d0b200320053602a403200320083602a00320032802a80321050b2003200541046a3602a803200820056a200936000020032802a803211120032802a403210a20032802a003210520032802c402450d0f20032802c00210290c0f0b2003200341c0026a3602b8012006200341b8016a2002107e20032903f002210b0240024020032802c402220820032802c80222056b4108490d0020032802c00221080c010b200541086a22092005490d1420084101742205200920092005491b22054100480d140240024020080d002005102721080c010b20032802c00220082005102821080b2008450d0b200320053602c402200320083602c00220032802c80221050b2003200541086a3602c802200820056a200b37000020032802f80221090240024020032802c402220820032802c80222056b4104490d0020032802c00221080c010b200541046a22022005490d1420084101742205200220022005491b22054100480d140240024020080d002005102721080c010b20032802c00220082005102821080b2008450d0c200320053602c402200320083602c00220032802c80221050b2003200541046a3602c802200820056a200936000020032802c802211120032802c402210a20032802c00221050c0e0b41124101102a000b41204101102a000b41c0004101102a000b20084101102a000b20052008103e000b20082009107f000b20022009103e000b20034188036a41146a410336020020034194036a411d360200200341d0026a41146a41033602002003200341b0036a3602b8032003200341b4036a3602bc03200341b8016a41146a4100360200200342033702d40220034190d1c5003602d0022003411d36028c03200341b8d6c5003602c801200342013702bc01200341e4d1c5003602b801200320034188036a3602e0022003200341b8016a360298032003200341bc036a360290032003200341b8036a36028803200341d0026a41a0d2c5001057000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200341003602c001200342013703b801200341013602d002200341d0026a200341b8016a103020032903f002210b0240024020032802bc01220820032802c00122096b4108490d0020032802b80121050c010b200941086a22052009490d0720084101742202200520052002491b22024100480d070240024020080d002002102721050c010b20032802b80120082002102821050b2005450d05200320023602bc01200320053602b801200221080b2003200941086a22023602c001200520096a200b37000020032802f802210602400240200820026b41034d0d002008210a0c010b200241046a22012002490d0720084101742207200120012007491b220a4100480d070240024020080d00200a102721050c010b20052008200a102821050b2005450d062003200a3602bc01200320053602b8010b20032009410c6a22113602c001200520026a20063600000b20032802c402450d0020032802c00210290b024020050d00200410290c020b200441c0002005201110030240200a450d00200510290b200041206a210020041029201041606a22100d000b0b200341c0036a24000f0b20024101102a000b200a4101102a000b102b000b1039000b20064101102a000b20084101102a000b20044101102a000b20084101102a000bfb1603067f027e037f230041a0026b22032400024002400240024002400240024002400240024002400240411410272204450d00200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d01200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c80120044134200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200320013703c801200320023703d001200341c8006a4120200341c8016a4110100320041029200142ffffe883b1de165620024200522002501b0d07411410272204450d02200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d03200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c80120044134200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200341306a200341c8006a108a01200341306a41106a2903002101200329033821022003280230210820041029410e10272204450d04200441066a41002900dd8c40370000200441002900d78c403700002004410e412e10282204450d052004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c8012004412e200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200341c8006a4120100c2004102902402002200184500d002008450d00200341186a41b18ac0004116108601200341186a41106a29030021092003290320210a20032802182104200341b8016a41086a22054200370300200342003703b80141b18ac0004116200341b8016a1004200341c8016a41086a2005290300370300200320032903b8013703c801200342002009420020041b220920017d200a420020041b2201200254ad7d220a200120027d2202200156200a200956200a2009511b22041b37035020034200200220041b370348200341c8016a4110200341c8006a411010030b2000108b01200341c8006a2000108c0102400240024020032d004822044103714103460d0020040e03020001020b20040d08200341fc006a280200450d08200341f8006a28020010290c080b20040d07200341fc006a280200450d07200341f8006a28020010290c070b200341fc006a2802002104200341f8006a280200220520034180016a280200100d2004450d06200510290c060b41144101102a000b41344101102a000b41144101102a000b41344101102a000b410e4101102a000b412e4101102a000b02400240024002400240411710272204450d002004410f6a41002900af9342370000200441086a41002900a89342370000200441002900a0934237000020044117413710282204450d01200420002900003700172004412f6a200041186a290000370000200441276a200041106a2900003700002004411f6a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c80120044137200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200341c8006a4120100c2004102920034190026a2000108d01200341c8006a20032802900222042003280298022207108e0120032d00484101470d0320042007100c200341c8016a41386a220720034181016a290000370300200341c8016a41306a2208200341f9006a290000370300200341c8016a41286a220b200341f1006a290000370300200341c8016a41206a200341e9006a2900003703002005200341e1006a2900003703002006200341d9006a290000370300200341c8016a41086a2205200341d1006a290000370300200320032900493703c8010240200328029402450d00200410290b200341c8006a41386a2007290300370300200341c8006a41306a2008290300370300200341c8006a41286a200b290300370300200341c8006a41206a220c200341c8016a41206a290300370300200341c8006a41186a200341c8016a41186a290300370300200341c8006a41106a200341c8016a41106a290300370300200341c8006a41086a2005290300370300200320032903c801370348200341c8006a210b4120417f4a210d41042105410a2106034002400240200641766a2204410a4b0d00200b21070240024020040e0b0102020202020202020200010b200c21070b200d450d05024041200d0041012108410021040c020b0240412010272208450d00412021040c020b41204101102a000b410121084100210441b8d6c50021070b20082007200410ce0421072003200436029c02200320043602980220032007360294022003200636029002200341b8016a20034190026a108f0120032802b801220620032802c001100c024020032802bc01450d00200610290b02402004450d00200710290b024020054108460d00200541d0e3c1006a2802002106200541046a21050c010b0b200341013a008f02200341b8016a41086a22044200370300200342003703b80141a7c8c500410f200341b8016a100420034190026a41086a2004290300370300200320032903b8013703900220034190026a41102003418f026a410110030c040b41174101102a000b41374101102a000b1039000b200328029402450d00200410290b411810272204450d01200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0220042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200320044138108401200341106a290300210220032802002105200329030821012004102902402001200284500d0020050d010b411310272204450d032004410f6a41002800d68d43360000200441086a41002900cf8d43370000200441002900c78d4337000020044113413310282204450d04200420002900003700132004412b6a200041186a2206290000370000200441236a200041106a22072900003700002004411b6a200041086a2208290000370000200341c8006a41186a220b4200370300200341c8006a41106a220d4200370300200341c8006a41086a220542003703002003420037034820044133200341c8006a1000200341c8016a41186a200b290300370300200341c8016a41106a200d290300370300200341c8016a41086a2005290300370300200320032903483703c801200341c8016a4120100c20041029200541013a0000200341d1006a2000290000370000200341d9006a2008290000370000200341e1006a2007290000370000200341e9006a2006290000370000200341023a004841b8d6c5004100200341c8006a1088010b200341a0026a24000f0b41184101102a000b41384101102a000b41134101102a000b41334101102a000bb00104037f017e017f027e230041106b22022400200241003602002001412020021005210302400240024020022802002204417f470d00420021050c010b2002420037030820024200370300200220032004411020044110491b10ce0421062004410f4d0d01200641086a2903002107200629030021082003102920014120100c420121050b2000200537030020002008370308200041106a2007370300200241106a24000f0b418f89c3004133104e000b930b01087f23004180016b22012400024002400240024002400240024002400240410e10272202450d00200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d012002200029000037000e200241266a200041186a2900003700002002411e6a200041106a290000370000200241166a200041086a290000370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002412e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a20052903003703002001200129034037032020014100360260200141206a4120200141e0006a100521050240024020012802602203417f460d00200141c0006a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a200141c0006a2005200410ce041a2003411f4d0d04200141e0006a41186a2203200141c0006a41186a290300370300200141e0006a41106a2204200141c0006a41106a290300370300200141e0006a41086a2206200141c0006a41086a2903003703002001200129034037036020051029200141186a22052003290300370300200141106a22072004290300370300200141086a2208200629030037030020012001290360370300200141206a4120100c2002102920032005290300370300200420072903003703002006200829030037030020012001290300370360410e10272202450d05200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d062002200129036037000e200241266a200141e0006a41186a2903003700002002411e6a200141e0006a41106a290300370000200241166a200141e0006a41086a290300370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002412e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c200210290c010b200210290b410d10272202450d05200241056a41002900aca344370000200241002900a7a3443700002002410d412d10282202450d062002200029000037000d200241256a200041186a2900003700002002411d6a200041106a290000370000200241156a200041086a290000370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002412d200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c20021029411210272202450d07200241106a41002f00c4a3443b0000200241086a41002900bca344370000200241002900b4a34437000020024112413210282202450d08200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a220542003703002001420037034020024132200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c20021029200010c903200010ca0320014180016a24000f0b410e4101102a000b412e4101102a000b418f89c3004133104e000b410e4101102a000b412e4101102a000b410d4101102a000b412d4101102a000b41124101102a000b41324101102a000bce0d04067f017e037f087e230041f0006b22022400024002400240024002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034137200241286a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903283703002002410036022820024120200241286a100521010240024020022802282204417f460d002001450d002002200136022020022004360224200241003a0028200241286a20012004410047220510ce041a20042005490d042002200420056b22063602242002200120056a22053602202004450d0720022d0028220441014b0d0702400240024020040e020001000b200241286a200241206a104420022802282207450d09200229022c210820024100360228200241286a2002280220220920022802242204410420044104491b220610ce041a2002200420066b22053602242002200920066a220a3602200240200441034b0d002008a7450d0a0c090b20022802282109200241286a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd041a200241286a200a200410ce041a2002200520046b22063602242002200a20046a220b360220024002402005411f4b0d00410021040c010b2002200228002b36006b20022002280228360268200220022802683602602002200228006b360063200241376a290000210c200229002f210d200229003f210e20022d0047210a410121040b2002200228006336002b20022002280260360228024020040d002008a70d090c0a0b2002200228002b36005b200220022802283602582002420037033020024200370328200241286a200b2006411020064110491b220510ce041a2002200620056b22043602242002200b20056a220b36022002402006410f4b0d002008a70d090c0a0b200241286a41086a290300210f2002290328211020024200370328200241286a200b2004410820044108491b220610ce041a2002200420066b22053602242002200b20066a22063602200240200441074d0d0020022903282111200241003a0028200241286a20062005410047220410ce041a20052004490d082002200520046b220b3602242002200620046a220436022002402005450d0020022d0028220541014b0d00420021120240024020050e020100010b20024200370328200241286a2004200b4108200b41084922061b220510ce041a2002200b20056b3602242002200420056a36022020060d0120022903282113420121120b2002200228005b36005320022002280258360250200220022802503602282002200228005336002b200220022800493602682002200241cc006a28000036006b410021040c030b2008a70d090c0a0b2008a70d080c090b41002107200241286a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241286a2005200410ce041a2002200620046b3602242002200520046a360220024002402006411f4b0d00420021120c010b2002200228002b36006b20022002280228360268200220022802683602602002200228006b360063200241376a290000210f200229002f2110200229003f211120023100472112410121070b2002200228006336002b200220022802603602282007450d082002200228002b36005b200220022802283602582002200228005b36005320022002280258360250200220022802503602682002200228005336006b2002200241cc006a28000036002b20022002280049360228410121040b2002200228006b36006320022002280268360260200220022802283602582002200228002b36005b20011029200041106a200f370000200041086a2010370000200041cf006a200c370000200041c7006a200d370000200020043a000020002002280260360001200041046a20022800633600002000413c6a2009360000200041346a2008370000200041306a2007360000200041286a2013370000200041206a2012370000200041186a2011370000200041c0006a2002280258360000200041c3006a200228005b360000200041df006a200a3a0000200041d7006a200e3700000c010b200041023a00000b20031029200241f0006a24000f0b41174101102a000b41374101102a000b20052004103e000b20042005103e000b200710290b418f89c3004133104e000be80501067f230041c0006b2202240002400240024002400240411010272203450d00200341086a41002900c5cc41370000200341002900bdcc41370000200242908080808002370204200220033602002002410d360220200241206a20021030024002400240024020022802042204200228020822056b410d490d002005410d6a2103200228020021060c010b2005410d6a22032005490d0120044101742206200320032006491b22074100480d010240024020040d002007102721060c010b200228020020042007102821060b2006450d042002200736020420022006360200200721040b20022003360208200620056a2205410029009ecc41370000200541056a41002900a3cc41370000200241206a2006200310830220022802282203417f4c0d04200228022021050240024020030d00410121070c010b200310272207450d0620072005200310ce041a0b02402004450d00200610290b02402002280224450d00200510290b412010272206450d0620062001290000370000200641186a200141186a290000370000200641106a200141106a290000370000200641086a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020064120200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020034101742201200341206a220420042001491b22054100480d000240024020030d002005102721010c010b200720032005102821010b20010d0120054101102a000b102b000b200120036a22032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a29030037000020061029200020043602082000200536020420002001360200200241c0006a24000f0b41104101102a000b20074101102a000b1039000b20034101102a000b41204101102a000bd60503097f017e027f23004180026b220324002003410036024020012002200341c0006a10052102024002400240024020032802402204417f460d0020020d010b200041003a00000c010b20032004412020044120491b22056a41004100412020056b2005411f4b1b10cd041a20032002200510ce0421012004411f4d0d0120014180016a41086a2206200141086a220729000037030020014180016a41106a2208200141106a220929000037030020014180016a41186a220a200141186a220b29000037030020012001290000220c3703c0012001200c370380012001200420056b220d4120200d4120491b22046a41004100412020046b2004411f4b1b10cd041a2001200220056a200410ce042101200d411f4d0d01200141a0016a41086a22042007290000370300200141a0016a41106a22052009290000370300200141a0016a41186a220d200b290000370300200141c0006a41186a220e200a290300370300200141c0006a41106a220a2008290300370300200141c0006a41086a2208200629030037030020012001290000220c3703c0012001200c3703a0012001200129038001370340200141c0006a41386a2206200d290300370300200141c0006a41306a220d2005290300370300200141c0006a41286a22052004290300370300200120012903a001370360200141386a22042006290300370300200141306a2206200d290300370300200141286a220d2005290300370300200141206a22052001290360370300200b200e2903003703002009200a290300370300200720082903003703002001200129034037030020021029200041013a0000200041396a2004290300370000200041316a2006290300370000200041296a200d290300370000200041216a2005290300370000200041196a200b290300370000200041116a2009290300370000200041096a2007290300370000200020012903003700010b20034180026a24000f0b418f89c3004133104e000ba00701097f230041c0006b22022400024002400240024002400240411010272203450d00200341086a4100290081e241370000200341002900f9e141370000200242908080808002370204200220033602002002410d360220200241206a20021030024002400240024020022802042204200228020822056b410d490d002005410d6a2103200228020021060c010b2005410d6a22032005490d0120044101742206200320032006491b22074100480d010240024020040d002007102721060c010b200228020020042007102821060b2006450d042002200736020420022006360200200721040b20022003360208200620056a2205410029009ecc41370000200541056a41002900a3cc41370000200241206a2006200310830220022802282203417f4c0d04200228022021050240024020030d00410121080c010b200310272208450d0620082005200310ce041a0b02402004450d00200610290b02402002280224450d00200510290b200241003602282002420137032020012802002104410410272206450d062006200436000020024284808080c000370224200220063602202001280204210720022001410c6a28020022013602002002200241206a10300240024020022802242205200228022822046b2001490d00200228022021060c010b200420016a22062004490d0120054101742209200620062009491b22094100480d010240024020050d002009102721060c010b200228022020052009102821060b2006450d082002200936022420022006360220200921050b200620046a2007200110ce041a200241206a41186a22074200370300200241206a41106a22094200370300200241206a41086a220a4200370300200242003703202006200420016a200241206a1000200241186a2007290300370300200241106a2009290300370300200241086a200a29030037030020022002290320370300200341206a22012003490d0020034101742204200120012004491b22074100480d000240024020030d002007102721040c010b200820032007102821040b20040d0120074101102a000b102b000b200420036a22032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a29030037000002402005450d00200610290b200020013602082000200736020420002004360200200241c0006a24000f0b41104101102a000b20074101102a000b1039000b20034101102a000b41044101102a000b20094101102a000bb80304027f027e017f017e230041206b22052400024002400240411410272206450d00200641106a41002800bb8c40360000200641086a41002900b38c40370000200641002900ab8c4037000020064114413410282206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a290000370000200541086a20064134108401200541086a41106a29030021072005290310210820052802082109200610294101210602402008420020091b220820027d220a2008562007420020091b220720037d2008200254ad7d220820075620082007511b4101470d00200041bf88c000360204200041086a411d3602000c030b024002400240200a428080e983b1de165441002008501b0d00200520012004200a200810910120052802002206450d022005280204210120002006360204200041086a20013602000c010b200041dc88c000360204200041086a411a3602000b410121060c030b2001200a2008108901200041106a2003370300200041086a2002370300410021060c020b41144101102a000b41344101102a000b20002006360200200541206a24000b8d0304027f017e027f017e230041c0006b22052400024002400240200241ff0171417e6a220641024b0d000240024020060e03000201000b200541106a20011092012005290310200358200541186a290300220720045820072004511b0d010c020b200541206a20011092012005290320200356200541286a290300220720045620072004511b0d010b200541306a20011093010240200528023822010d0002402005280234450d00200528023010290b410021010c020b200541888dc300410d1094012005290308420020052802001b2107200141286c210620052802342108200528023022092101024002400240034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d020b200141286a2101200641586a22060d000b4100210120080d010c020b41ec87c00021012008450d010b200910290b413121060c010b41c687c0002101412621060b2000200636020420002001360200200541c0006a24000b820804067f027e017f077e230041a0016b220224000240024002400240411010272203450d00200341086a41002900ab8d40370000200341002900a38d4037000020034110413010282203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000020024180016a41186a2204420037030020024180016a41106a2205420037030020024180016a41086a2206420037030020024200370380012003413020024180016a1000200241e0006a41186a2004290300370300200241e0006a41106a2005290300370300200241e0006a41086a200629030037030020022002290380013703602002410036028001200241e0006a412020024180016a100521040240024002402002280280012205417f460d002004450d002002420037038801200242003703800120024180016a20042005411020054110491b220610ce041a02402005410f4d0d0020024180016a41086a2207290300210820022903800121092002420037038801200242003703800120024180016a200420066a220a200520066b2205411020054110491b220610ce041a2005410f4d0d002007290300210b200229038001210c200242003703800120024180016a200a20066a200520066b2205410820054108491b10ce041a200541074b0d020b418f89c3004133104e000b200310294200210c4200210b0c010b200229038001210d2004102920031029411410272203450d03200341106a41002800bb8c40360000200341086a41002900b38c40370000200341002900ab8c4037000020034114413410282203450d04200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a290000370000200241c8006a20034134108401200241c8006a41106a290300210e2002290350210f2002280248210120031029200241386a41888dc300410d10940142002110200241186a200b420042002002290340420020022802381b2211200d7d220d200d2011561b220d420010d304200241286a200d4200200c420010d304200241086a42004200200c420010d304200e420020011b210b200f420020011b210d4200210c02402002290310200229032084420052200241286a41086a290300220f200229030820022903187c7c220e200f54720d002008200e20022903282210200954200e200854200e2008511b22031b200e7d2009201020031b220e201054ad7d210c200e20107d21100b200c200b200d201056200b200c56200b200c511b22031b210b2010200d20031b210c0b2000200c3703002000200b370308200241a0016a24000f0b41104101102a000b41304101102a000b41144101102a000b41344101102a000bd408040e7f047e017f017e230041f0006b220224000240024002400240024002400240410e10272203450d00200341066a41002900dd8c40370000200341002900d78c403700002003410e412e10282204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1000200241106a41186a2001290300370300200241106a41106a2003290300370300200241106a41086a20052903003703002002200229033837031020024100360238200241106a4120200241386a100521060240024020022802382207417f460d002002200736023420022006360230200241086a200241306a102e2002280208450d0802400240200228020c220841e600200841e600491b22090d004108210a0c010b200941286c22011027220a450d050b02402008450d002002280230210b20022802342103200241ec006a210c4100210d4100210e4100210f034020024200370338200241386a200b2003410820034108491b220510ce041a2002200320056b22013602342002200b20056a220536023002400240200341074d0d00200229033821102002420037034020024200370338200241386a20052001411020014110491b220b10ce041a20022001200b6b220336023420022005200b6a22053602302001410f4d0d00200241386a41086a29030021112002290338211220024200370338200241386a20052003410820034108491b220b10ce041a20022003200b6b220136023420022005200b6a220b360230200341074d0d0020022903382113200241003a0038200241386a200b2001410047220510ce041a20012005490d092002200120056b22033602342002200b20056a220b36023020010d010b2009450d0b200a10290c0b0b200f41016a2105200220022800693602602002200c28000036006320022d003821142002200228006336003b20022002280260360238200220022802383602582002200228003b36005b0240200f2009470d00200d20052005200d491b2209ad42287e2215422088a70d0a2015a722014100480d0a02400240200f0d0020011027210a0c010b200a200e20011028210a0b200a450d090b200a200e6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141216a2002280258360000200141246a200228005b360000200d41026a210d200e41286a210e2005210f20082005470d000b0b200a450d082008ad4220862009ad84211002402007450d00200610290b200020103702042000200a3602000c010b20004100360208200042083702000b20041029200241f0006a24000f0b410e4101102a000b412e4101102a000b20014108102a000b20052001103e000b20014108102a000b102b000b418f89c3004133104e000bcc0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1004200341086a2005290300370300200320032903103703002003410036021020034110200341106a1005210202400240024020032802102201417f470d000c010b20034200370310200341106a20022001410820014108491b10ce041a200141074d0d012003290310210620021029420121040b2000200637030820002004370300200341206a24000f0b418f89c3004133104e000bba0304027f027e017f027e230041306b220224000240024002400240411410272203450d00200341106a41002800bb8c40360000200341086a41002900b38c40370000200341002900ab8c4037000020034114413410282203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a290000370000200241186a20034134108401200241186a41106a2903002104200229032021052002280218210620031029411810272203450d02200341106a41002900cf8c40370000200341086a41002900c78c40370000200341002900bf8c4037000020034118413810282203450d0320032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a290000370000200220034138108401200241106a290300210720022903082108200228020021012003102920002008420020011b22082005420020061b7c220537030020002007420020011b2004420020061b7c2005200854ad7c370308200241306a24000f0b41144101102a000b41344101102a000b41184101102a000b41384101102a000bef0e06017f037e017f017e017f067e230041e0016b220724004200210842002109024020050d0020074190016a2006ad42004280c8afa025420010d30420074198016a290300200729039001220a4280a094a58d1d7c2208200a54ad7c21090b200741c0016a41086a22054200370300200742003703c00141d8cdc500411b200741c0016a1004200741a0016a41086a2005290300370300200720072903c0013703a00141002106200741003602d001200741a0016a4110200741d0016a1005210b024002400240024020072802d0012205417f470d004200210a0c010b200742003703d001200741d0016a200b2005410820054108491b10ce041a200541074d0d0120072903d001210c200b1029200c200c423f87220a7c200a85210a200c42005521060b2007418094ebdc033602a4012007200a200a428094ebdc037f220c4280ec94a37c7e7ca722053602a00120074180016a417f2004418094ebdc032004418094ebdc03491b2204417f417f2004ad200ca7417f200c428080808010541bad7e220aa7200a422088a71b220b200741a0016a2005418094ebdc034b4102746a28020022052004418094ebdc036e220d6c2005ad2004200d4180ec94a37c6c6aad7e428094ebdc0380a76a6a22052005200b491b22056a220b200b2004491b4100200420056b2205200520044b1b20061bad420042e807420010d30441012104200741a0016a2003427f20082007290380017c220a20017c220c200c200a542205200920074180016a41086a2903007c200a200854ad7c220820027c2005ad7c220a200854200a2008511b22051b220e427f200a20051b220f4101109001024020072802a0014101470d00200041003a00010c020b200741a0016a41106a290300210a200741386a200741a0016a41086a290300220242004204420010d304200741286a420042002002420010d304200741c8006a2007290338200741386a41086a2903002208200a42028620072903287c7c220c4205420010d40420072903302109200741c8006a41086a290300210120072903482110200741a0016a109701200741f0006a200741a0016a42b3e6cc99b3e6cc99332010200a200a42ffffffffffffffff3f8352200942005272200c2008547222041b22082002200820025442b3e6cc99b3e6cc9933200120041b220c200a54200c200a511b22041b2208200c200a20041b220c108301200741f0006a41086a290300211020072903702109200741d8006a41b18ac0004116108601200820097d200920087d20092008582010200c582010200c5122041b22051b2111200c20107d2008200954ad7d2010200c7d2009200854ad7d20051b2112200a200c7d2002200854ad7d2101200220087d210a200741d8006a41106a2903004200200728025822051b21022007290360420020051b21130240024020092008562010200c5620041b0d00200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c00120074200200220127d2013201154ad7d2208201320117d220c201356200820025620082002511b22041b3703d80120074200200c20041b3703d001200741d0016a21040c010b200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c0012007427f200220127c201320117c220c2013542204ad7c22082004200820025420082002511b22041b3703d8012007427f200c20041b3703d001200741d0016a21040b200741c0016a4110200441101003200741a0016a109801200741186a200741a0016a200a2001108301200741186a41086a290300210c20072903182108200741b18ac0004116108601200a20087d2008200a7d2008200a58200c200158200c20015122041b22051b21102001200c7d200a200854ad7d200c20017d2008200a54ad7d20051b2113200741106a2903004200200728020022051b21092007290308420020051b2102024002402008200a56200c20015620041b0d00200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c00120074200200920137d2002201054ad7d2208200220107d220a200256200820095620082009511b22041b3703d80120074200200a20041b3703d001200741d0016a21040c010b200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c0012007427f200920137c200220107c220a2002542204ad7c22082004200820095420082009511b22041b3703d8012007427f200a20041b3703d001200741d0016a21040b200741c0016a4110200441101003200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a200e427f200f501b370300410021040c010b418f89c3004133104e000b200020043a0000200741e0016a24000b840201067f230041c0006b2201240002400240410410272202450d00200241edde91e30636000020024104410c10282202450d01200242f0f2bda1a7ee9cb9f900370004200141346a42003702002001413c6a4100360200200141206a41086a2203200241086a2800003602002001420037022c200141106a2204200141206a41106a290300370300200141186a2205200141206a41186a290300370300200141086a220620032903003703002001200229000037030020021029200041186a2005290300370000200041106a2004290300370000200041086a200629030037000020002001290300370000200141c0006a24000f0b41044101102a000b410c4101102a000bc60502057f017e230041d0006b22012400200141306a41086a220242003703002001420037033041dbecc2004111200141306a1004200141086a22032002290300370300200120012903303703002001410036023020014110200141306a10052104024002400240024020012802302205417f460d00200141306a2005412020054120491b22026a41004100412020026b2002411f4b1b10cd041a200141306a2004200210ce041a2005411f4d0d01200141106a41186a2205200141306a41186a290000370300200141106a41106a2202200141306a41106a290000370300200141106a41086a2203200141306a41086a2900003703002001200129003037031020041029200041186a2005290300370000200041106a2002290300370000200041086a2003290300370000200020012903103700000c030b200242003703002001420037033041aa8dc300410d200141306a100420032002290300370300200120012903303703002001410036023020014110200141306a100521020240024020012802302205417f460d002001200536021420012002360210200141306a200141106a104320012802302204450d03200129023421062005450d01200210290c010b41042104420021060b20004200370000200041186a4200370000200041106a4200370000200041086a420037000002402006422088a72200450d00200041246c21052004210003400240024020002d0000220241034b0d0002400240024020020e0404000102040b2000410c6a280200450d03200041086a28020010290c030b2000410c6a280200450d02200041086a28020010290c020b2000410c6a280200450d01200041086a28020010290c010b200041086a280200450d00200041046a28020010290b200041246a21002005415c6a22050d000b0b2006a7450d02200410290c020b418f89c3004133104e000b418f89c3004133104e000b200141d0006a24000b130020004102360204200041b48dc0003602000b3400200041f8f3c10036020420004100360200200041146a4105360200200041106a41b49cc000360200200041086a42083702000b3701017f02404110102722020d0041104101102a000b2002420037000820024200370000200042908080808002370204200020023602000bbd0b03057f027e037f230041e0016b2203240002400240024002400240024002400240411810272204450d00200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200341c0016a41186a22054200370300200341c0016a41106a22064200370300200341c0016a41086a22074200370300200342003703c00120044138200341c0016a1000200341d0006a41186a2005290300370300200341d0006a41106a2006290300370300200341d0006a41086a2007290300370300200320032903c001370350200320013703c001200320023703c801200341d0006a4120200341c0016a41101003200410290240200142ffffe883b1de165620024200522002501b0d00411810272204450d03200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0420042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200341c0016a41186a22054200370300200341c0016a41106a22064200370300200341c0016a41086a22074200370300200342003703c00120044138200341c0016a1000200341d0006a41186a2005290300370300200341d0006a41106a2006290300370300200341d0006a41086a2007290300370300200320032903c001370350200341386a200341d0006a108a01200341386a41106a290300210120032802382105200329034021022004102902402002200184500d002005450d00200341206a41b18ac0004116108601200341206a41106a29030021082003290328210920032802202104200341d0006a41086a220542003703002003420037035041b18ac0004116200341d0006a1004200341c0016a41086a2005290300370300200320032903503703c001200342002008420020041b220820017d2009420020041b2201200254ad7d2209200120027d2202200156200920085620092008511b22041b37035820034200200220041b370350200341c0016a4110200341d0006a411010030b411410272204450d05200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d06200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200341086a20044134108401200341086a41106a290300210220032802082105200329031021012004102902402001200284500d0020050d010b411310272204450d072004410f6a41002800d68d43360000200441086a41002900cf8d43370000200441002900c78d4337000020044113413310282204450d08200420002900003700132004412b6a200041186a2206290000370000200441236a200041106a22072900003700002004411b6a200041086a220a290000370000200341d0006a41186a220b4200370300200341d0006a41106a220c4200370300200341d0006a41086a220542003703002003420037035020044133200341d0006a1000200341c0016a41186a200b290300370300200341c0016a41106a200c290300370300200341c0016a41086a2005290300370300200320032903503703c001200341c0016a4120100c20041029200541013a0000200341d9006a2000290000370000200341e1006a200a290000370000200341e9006a2007290000370000200341f1006a2006290000370000200341023a005041b8d6c5004100200341d0006a1088010b200341e0016a24000f0b41184101102a000b41384101102a000b41184101102a000b41384101102a000b41144101102a000b41344101102a000b41134101102a000b41334101102a000b130020004105360204200041c0adc0003602000bcb0201057f230041c0006b22012400024002400240411b10272202450d00200241176a4100280081b140360000200241106a41002900fab040370000200241086a41002900f2b040370000200241002900eab0403700002002411b413610282203450d012003200036001b200141206a41186a22024200370300200141206a41106a22004200370300200141206a41086a22044200370300200142003703202003411f200141206a1000200141186a22052002290300370300200141106a2000290300370300200141086a200429030037030020012001290320370300412010272202450d0220022001290300370000200241186a2005290300370000200241106a200141106a290300370000200241086a200141086a2903003700002003102920024120100e20021029200141c0006a24000f0b411b4101102a000b41364101102a000b41204101102a000bd50204037f027e017f017e230041306b22042400200441206a200110950102400240024002402004290320200441206a41086a29030084500d00411410272205450d0241002106200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a20054134108401200441086a41106a290300210720042903102108200428020821092005102920012008420020091b220820027c220a2007420020091b20037c200a200854ad7c108901200041106a2003370300200041086a20023703000c010b2000419d88c000360204200041086a4122360200410121060b20002006360200200441306a24000f0b41144101102a000b41344101102a000be61805057f027e047f0a7e027f23004190036b22042400200441f0006a2001108c010240024020042d00702205417f6a41ff017141024f0d00200041003a0000200041086a200441f0006a41e00010ce041a0c010b200441d0016a41086a2206200441f0006a41c8006a290300370300200441d0016a41106a2207200441f0006a41d0006a290300370300200441d0016a41186a2208200441f0006a41d8006a2903003703002004200441f0006a41c0006a2903003703d001200441f0006a41106a2903002109200441f0006a41086a290300210a200441f0006a413c6a280200210b200441f0006a41386a280200210c200441a4016a280200210d200441f0006a41306a280200210e200441f0006a41286a290300210f200441f0006a41206a2903002110200441f0006a41186a2903002111200441e0006a41888dc300410d1094010240024002400240024002400240024002400240024002400240420042002004290368420020042802601b221220027d220220022012561b220220117d221320132002561b2214500d00411410272206450d02200641106a41002800bb8c40360000200641086a41002900b38c40370000200641002900ab8c4037000020064114413410282206450d03200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a290000370000200441c8006a20064134108401200441386a20042903504200200428024822071b2202200441c8006a41106a290300420020071b221542e807420010d404200610294200200bad2213200429033822167d221720172013564200200441386a41086a2903002013201654ad7c7d22134200522013501b22061b22164200201320061b221384500d0402400240024002402002429080e983b1de165441002015501b0d00200441206a201642028620134202862016423e8884201442ffffffff0f8342ffffffff0f2014428080808010541b420010d304200441306a2001410842002002200242f0ff96fccea1697c2213200a200a201356200920152013200254ad7c427f7c22135620092013511b22061b22142004290320221620142016542013200920061b2214200441206a41086a29030022135420142013511b22061b22177d2218201820025620152014201320061b22147d2002201754ad7d220220155620022015511b22071b4200200220071b10910120042802300d010240024020060d002003450d010b20044190026a20012017201441081090012004280290024101460d0c20044190026a41106a290300211420044190026a41086a22072903002102200441086a41b18ac0004116108601200441086a41106a2903002115200429031021172004280208210820074200370300200442003703900241b18ac000411620044190026a1004200441f0026a41086a200729030037030020042004290390023703f002200442002015420020081b221520147d2017420020081b2214200254ad7d2217201420027d2202201456201720155620172015511b22071b3703980220044200200220071b37039002200441f0026a411020044190026a411010030b20060d0120030d03200041003a0008200041023a0000200041186a2009370000200041106a200a370000200041c4006a200b360000200041c0006a200c3600002000413c6a200d360000200041386a200e360000200041306a200f370000200041286a2010370000200041206a2011370000200041c8006a20042903d001370000200041d0006a200441d8016a290300370000200041d8006a200441d0016a41106a290300370000200041e0006a200441d0016a41186a290300370000200541037122004103460d0520000e03110505110b411710272206450d082006410f6a41002900af9342370000200641086a41002900a89342370000200641002900a0934237000020064117413710282206450d09200620012900003700172006412f6a200141186a290000370000200641276a200141106a2900003700002006411f6a200141086a29000037000020044190026a41186a2201420037030020044190026a41106a220b420037030020044190026a41086a2203420037030020044200370390022006413720044190026a1000200441f0026a41186a2001290300370300200441f0026a41106a200b290300370300200441f0026a41086a200329030037030020042004290390023703f002200441f0026a4120100c20061029200e200c100d200041023a0008200041013a00000c010b2004410036029002200e200c20044190026a100f2108200428029002220b417f460d0a200441f0026a41186a200441d0016a41186a290300370300200441f0026a41106a200441d0016a41106a290300370300200441f0026a41086a200441d0016a41086a290300370300200420042903d0013703f002200441003602980220044201370390022004200b3602f001200441f0016a20044190026a10300240024002400240200428029402220720042802980222066b200b490d0020042802900221030c010b2006200b6a22032006490d0120074101742219200320032019491b22194100480d010240024020070d002019102721030c010b20042802900220072019102821030b2003450d0e20042019360294022004200336029002201921070b200320066a2008200b10ce041a024002402006200b6a22060d00410121190c010b20064100480d01200610272219450d0f20192003200610ce041a0b02402007450d00200310290b20064101742203200641206a220720072003491b221a4100480d000240024020060d00201a102721030c010b20192006201a102821030b20030d01201a4101102a000b102b000b200320066a220620042903f002370000200641186a200441f0026a41186a290300370000200641106a200441f0026a41106a290300370000200641086a200441f0026a41086a29030037000020044190026a41186a2206420037030020044190026a41106a2219420037030020044190026a41086a221a420037030020044200370390022003200720044190026a1000200441f0016a41186a22072006290300370300200441f0016a41106a22062019290300370300200441f0016a41086a2219201a29030037030020042004290390023703f00120031029200441a9026a2007290300370000200441a1026a200629030037000020044199026a2019290300370000200420042903f00137009102200441013a009002200120044190026a10a101200e200c100d200041013a0000200041086a20044190026a41e00010ce041a200b450d00200810290b200d450d0c200e10290c0c0b200441cc026a200b360200200441c8026a200c360200200441c4026a200d360200200441c0026a200e360200200441b8026a200f370300200441b0026a201037030020044190026a41186a2012370300200441d0026a20042903d001370300200441d8026a200441d0016a41086a290300370300200441e0026a200441d0016a41106a290300370300200441e8026a200441d0016a41186a29030037030020044190026a41106a200920137d200a201654ad7d370300200441003a0090022004200a20167d37039802200120044190026a10a101200041023a0000200041086a20044190026a41e00010ce041a0c0b0b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041c4006a200b360000200041c0006a200c3600002000413c6a200d360000200041386a200e360000200041306a200f370000200041286a2010370000200041206a2011370000200041c8006a20042903d001370000200041d0006a2006290300370000200041d8006a2007290300370000200041e0006a20082903003700000c0a0b200d450d0b0c0a0b41144101102a000b41344101102a000b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041c4006a200b360000200041c0006a200c3600002000413c6a200d360000200041386a200e360000200041306a200f370000200041286a2010370000200041206a2011370000200041c8006a20042903d001370000200041d0006a200441d8016a290300370000200041d8006a200441d0016a41106a290300370000200041e0006a200441d0016a41186a2903003700000c060b41174101102a000b41374101102a000b20042004290294023703f00241a1b1c00041fe00200441f0026a41e88cc00010a201000b41b0cfc5004138104e000b20194101102a000b20064101102a000b0240200541037122004103460d0020000e03020000020b200d450d010b200e10290b20044190036a24000bb10201047f230041c0006b2202240002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10dc0220031029200241c0006a24000f0b41174101102a000b41374101102a000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004412c6a41023602002004413c6a411e3602002004420237021c200441b481c600360218200441023602342004200441306a3602282004200441106a3602382004200441086a360230200441186a41c881c6001057000b130020004101360204200041a0b2c0003602000b3400200041d4f4c10036020420004100360200200041146a4103360200200041106a41bcb3c000360200200041086a42083702000b130020004101360204200041c0b6c0003602000bf51007017f017e047f017e037f067e057f23004190016b22032400200341086a41888dc300410d1094012003290310210420032802082105200341286a427f370300200341186a41286a41023a0000200341186a41186a2002370300200341386a20002900003703002003427f3703204201210220034201370318200341e8006a200110930120032802682106200328026c2107024002400240024002400240024020032802702208450d002004420020051b210902400240200341e8006a41186a220a2000460d0020034189016a210b200841286c210c42012102200621050340200541086a2903002104200541106a290300210d200541186a290300210e2005290300210f200341e8006a41206a200541206a290300370300200341e8006a41186a200e370300200341e8006a41106a200d370300200341e8006a41086a20043703002003200f37036802400240200a2900002000290000510d00200329037822042009580d012003200b2800003602602003200b41036a280000360063200541286a2105200341f0006a290300210d2003290368210e20032d008801210c0c060b20032903182104420021022003420037031820044201520d00200341186a41186a29030021102003290328211120032903202112200541286a21050c030b200541286a2105200c41586a220c0d000c030b0b200841286c210c200341186a41186a29030021102003290328211120032903202112200329031821022006210502400340200541086a2903002104200541106a290300210d200541186a290300210e2005290300210f200341e8006a41206a200541206a290300370300200341e8006a41186a200e370300200341e8006a41106a200d370300200341e8006a41086a2004370300200342003703182003200f37036820024201510d01200541286a210542002102200c41586a220c0d000c030b0b200541286a21050b200341f0006a2903002202201120122003290368220454201120025420112002511b220c1b210d20042012200c1b210e20032903782202201020102002541b210420032d008801410272210c420021020c010b41002108024020070d00410021134108210b410821050c020b200610294108210b41002113410821050c010b200329038001210f2003200328006336005b200320032802603602582003200328005b36005320032003280258360250200320032802503602482003200328005336004b41281027220b450d03200b200e370300200b200c3a0020200b200f370318200b2004370310200b2003280248360021200b200d370308200b41246a200328004b3600000240024020052006200841286c6a220a470d0041012108410121130c010b200341e8006a41186a210c20034189016a221441036a211541012108410121130340024002400240200c2000470d00200341186a41186a290300210d200329032821042003290320210e200329031821020340200341e8006a41206a200541206a290300370300200c200541186a290300370300200341e8006a41106a200541106a290300370300200341e8006a41086a200541086a290300370300200320052903003703682003420037031820024201510d0242002102200a200541286a2205470d000c050b0b02400340200341e8006a41206a200541206a290300370300200c200541186a290300370300200341e8006a41106a200541106a290300370300200341e8006a41086a2216200541086a2903003703002003200529030037036802400240200c2900002000290000510d00200329037822042009580d012003201428000036026020032015280000360063200541286a21052016290300210f2003290368210e20032d00880121170c050b20032903182104420021022003420037031820044201510d020b200a200541286a2205460d050c000b0b200341186a41186a290300210d200329032821042003290320210e0b200541286a2105200341e8006a41086a29030022022004200e2003290368221154200420025420042002511b22161b210f2011200e20161b210e20032903782202200d200d2002541b210420032d0088014102722117420021020b200329038001210d2003200328006336005b20032003280260360258200320032802583602502003200328005b3600532003200328005336006b20032003280250360268024020132008470d00200841016a22162008490d0720084101742213201620162013491b2213ad42287e2211422088a70d072011a722164100480d070240024020080d0020161027210b0c010b200b200841286c20161028210b0b200b450d040b200b200841286c6a221620173a00202016200f3703082016200e3703002016200d3703182016200437031020162003280268360021201641246a200328006b360000200841016a21082005200a470d000b0b02402007450d00200610290b200b21050b024020024201520d00200341e8006a41206a200341206a220041206a290300370300200341e8006a41186a200041186a290300370300200341e8006a41106a200041106a290300370300200341e8006a41086a200041086a29030037030020032000290300370368024020132008470d00200841016a22052008490d0520084101742200200520052000491b2213ad42287e2202422088a70d052002a722004100480d050240024020080d002000102721050c010b200b200841286c2000102821050b2005450d030b2005200841286c6a22002003290368370300200041206a200341e8006a41206a290300370300200041186a200341e8006a41186a290300370300200041106a200341e8006a41106a290300370300200041086a200341e8006a41086a290300370300200841016a21080b200320083602702003201336026c200320053602682001200341e8006a10a70120034190016a24000f0b20164108102a000b20004108102a000b41284108102a000b102b000b9c0802087f027e230041d0006b220224000240024002400240024002400240410e10272203450d00200341066a41002900dd8c40370000200341002900d78c403700002003410e412e10282204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1000200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210520022001280208220036024c200241cc006a200241286a10300240024020000d0020022802302106200228022c2100200228022821070c010b200041286c2108200228022c210020022802302106034002400240200020066b4108490d00200641086a2107200228022821030c010b200641086a22072006490d0920004101742203200720072003491b22094100480d090240024020000d002009102721030c010b200228022820002009102821030b2003450d052002200936022c20022003360228200921000b20022007360230200320066a200541186a290000370000200541086a290300210a2005290300210b02400240200020076b4110490d00200741106a21060c010b200741106a22062007490d0920004101742209200620062009491b22094100480d090240024020000d002009102721030c010b200320002009102821030b2003450d062002200936022c20022003360228200921000b200320076a2207200a3700082007200b37000020022006360230200541106a290300210a0240200020066b41074b0d00200641086a22072006490d0920004101742209200720072009491b22074100480d090240024020000d002007102721030c010b200320002007102821030b2003450d072002200736022c200220033602280b2002200641086a360230200320066a200a37000002400240200228022c220020022802302203460d00200228022821070c010b200341016a22002003490d0920034101742206200020002006491b22004100480d090240024020030d002000102721070c010b200228022820032000102821070b2007450d082002200036022c200220073602280b2002200341016a2206360230200720036a200541206a2d00003a0000200541286a2105200841586a22080d000b0b200241086a412020072006100302402000450d00200710290b200410290240200141046a280200450d00200128020010290b200241d0006a24000f0b410e4101102a000b412e4101102a000b20094101102a000b20094101102a000b20074101102a000b20004101102a000b102b000bc10f07017f017e057f047e017f057e047f230041b0016b22062400200641086a41888dc300410d1094012006290310210720062802082108200641286a2003370300200641186a41286a20053a0000200641186a41186a22052004370300200641386a2209200029000037030020062002370320420121032006420137031820064188016a2001109301200628028801210a200628028c01210b024002400240024002400240024002400240200628029001220c450d002007420020081b210d2005290300210e2006290328210f2006290320211020062903182103024020064188016a41186a22112000470d00200c41286c2108200a41286a21050340200641f8006a41086a200941086a2903003703002006200929030037037820034201510d03200541286a210542002103200841586a22080d000b42002103200642003703180c010b200c41286c21082003210220102112200f2113200e2114200a21050340200541086a2903002104200541106a2903002107200541186a29030021152005290300211620064188016a41206a200541206a29030037030020064188016a41186a201537030020064188016a41106a2217200737030020064188016a41086a2004370300200620163703880102400240024020112900002000290000510d00200629039801200d560d0120022104420021020c020b200641f8006a41086a200941086a2903003703002006200929030037037842002103420021104200210f4200210e420021042012210720132115201421160c010b200641f8006a41086a201141086a29030037030020062011290300370378201729030021162006290390012115200629038801210720022104420121020b20024201510d03200541286a210520042102200841586a22080d000b200641306a200e37030020062003370318200620103703202006200f3703280b410021170240200b0d004100211841082119410821050c040b200a10294108211941002118410821050c030b42002104200642003703180c010b200641306a2014370300200620043703182006201237032020062013370328200541286a2105200721102015210f2016210e0b200641c8006a41086a2208200641f8006a41086a29030037030020062006290378370348412810272219450d0420192006290348370318201920103703002019200f370308201941206a2008290300370300201941106a200e370300024002402005200a200c41286c6a2211470d0041012117410121180c010b20064188016a41186a210820042102410121174101211803400240024020082000460d0020022103034020064188016a41206a200541206a2903003703002008200541186a29030037030020064188016a41106a220c200541106a29030037030020064188016a41086a200541086a290300370300200620052903003703880102400240024020082900002000290000510d00200629039801200d560d0120032102420021030c020b200641f8006a41086a200941086a290300370300420021042006420037031820062009290300370378420021022012210720132115201421160c010b200641f8006a41086a200841086a29030037030020062008290300370378200c29030021162006290390012115200629038801210720032102420121030b024020034201510d00200221032011200541286a2205470d010c050b0b200541286a21050c010b02400340200641f8006a41086a200941086a290300370300200642003703182006200929030037037820024201510d01420021022011200541286a2205470d000b420021040c030b200541286a210542002104420021022012210720132115201421160b200641d8006a41086a200641f8006a41086a290300220337030020062006290378220e37035820064188016a41086a221a20033703002006200e37038801024020182017470d00201741016a220c2017490d0620174101742218200c200c2018491b2218ad42287e2203422088a70d062003a7220c4100480d060240024020170d00200c102721190c010b2019201741286c200c102821190b2019450d040b2019201741286c6a220c2015370308200c2007370300200c200629038801370318200c41106a2016370300200c41206a201a290300370300201741016a211720052011470d000b0b0240200b450d00200a10290b20042103201921050b024020034201520d0020064188016a41206a200641206a220941206a29030037030020064188016a41186a200941186a29030037030020064188016a41106a200941106a29030037030020064188016a41086a200941086a2903003703002006200929030037038801024020182017470d00201741016a22052017490d0420174101742209200520052009491b2218ad42287e2202422088a70d042002a722094100480d040240024020170d002009102721050c010b2019201741286c2009102821050b2005450d030b2005201741286c6a2209200629038801370300200941206a20064188016a41206a290300370300200941186a20064188016a41186a290300370300200941106a20064188016a41106a290300370300200941086a20064188016a41086a290300370300201741016a21170b20062017360290012006201836028c012006200536028801200120064188016a10a701200641b0016a24000f0b200c4108102a000b20094108102a000b102b000b41284108102a000bb20201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110aa0121000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2004418001103e000b2004418001103e000bd50203027f017e037f230041306b22032400412721040240024020004290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a200020004290ce0080220542f0b17f7e7ca7220741ffff037141e4006e220841017441fad6c5006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441fad6c5006a2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b02402005a7220641e3004c0d00200341096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441fad6c5006a2f00003b00000b024002402006410a480d00200341096a2004417e6a22046a200641017441fad6c5006a2f00003b00000c010b200341096a2004417f6a22046a200641306a3a00000b2002200141b8d6c5004100200341096a20046a412720046b10ab012104200341306a240020040be40501057f024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21080c010b200541016a210820002802002106412d21070b0240024020064104710d00410021020c010b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21080b410121010240024020002802084101460d00200020072002200310b9040d012000280218200420052000411c6a28020028020c1105000f0b02402000410c6a280200220920084b0d00200020072002200310b9040d012000280218200420052000411c6a28020028020c1105000f0b0240024020064108710d00200920086b210941002101024002400240410120002d0030220a200a4103461b0e0402000100020b20092101410021090c010b20094101762101200941016a41017621090b200141016a210103402001417f6a2201450d0220002802182000280204200028021c280210110400450d000b41010f0b41012101200041013a003020004130360204200020072002200310b9040d01200920086b210941002101024002400240410120002d0030220a200a4103461b0e0402000100020b20092101410021090c010b20094101762101200941016a41017621090b200141016a2101024003402001417f6a2201450d0120002802182000280204200028021c280210110400450d000b41010f0b2000280204210a41012101200028021820042005200028021c28020c1105000d01200941016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110400450d000c020b0b2000280204210a41012101200020072002200310b9040d00200028021820042005200028021c28020c1105000d00200941016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110400450d000b0b20010bb80405027f027e017f027e017f230041c0006b22042400024002400240024002400240411410272205450d00200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441286a20054134108401200441286a41106a290300210620042903302107200428022821082005102902402007420020081b220720025422052006420020081b220620035420062003511b450d0041cbb9c0002105411521010c060b200441206a20014104200720027d2207200620037d2005ad7d2206109101200428022022050d04411810272208450d0241002105200841106a41002900cf8c40370000200841086a41002900c78c40370000200841002900bf8c4037000020084118413810282208450d0320082001290000370018200841306a200141186a290000370000200841286a200141106a290000370000200841206a200141086a290000370000200441086a20084138108401200441086a41106a29030021092004290310210a2004280208210b200810292001200a4200200b1b220a20027c220220094200200b1b20037c2002200a54ad7c109c012001200720061089010c050b41144101102a000b41344101102a000b41184101102a000b41384101102a000b200428022421010b2000200136020420002005360200200441c0006a24000bf10306027f027e017f027e017f017e230041306b220324000240024002400240411810272204450d00200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200341186a20044138108401200341186a41106a2903002105200329032021062003280218210720041029411410272204450d02200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d03200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200320044134108401200341106a2903002108200329030821092003280200210a20041029200020094200200a1b220920012006420020071b220620062001562005420020071b220520025620052002511b22041b22017c220b20084200200a1b2002200520041b22027c200b200954ad7c1089012000200620017d200520027d2006200154ad7d109c01200341306a24000f0b41184101102a000b41384101102a000b41144101102a000b41344101102a000b130020004101360204200041e0b9c0003602000b13002000410236020420004198bbc0003602000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242e5003700000bfa0405037f017e037f017e067f230041206b2202240002400240024002400240200141106a2802002203417f4c0d0020012802082104200129030021050240024020030d00410121060c010b200310272206450d020b20062004200310ce0421072001411c6a2802002208ad420c7e2209422088a70d002009a72204417f4c0d002001280214210a0240024020040d004104210b0c010b20041027220b450d030b0240024020080d004100210c0c010b200a2008410c6c6a210d4100210c200b21060340200a41086a2802002204417f4c0d02200a280200210e0240024020040d004101210f0c010b20041027220f450d060b200f200e200410ce04210e200641086a2004360200200641046a20043602002006200e3602002006410c6a2106200c41016a210c200a410c6a220a200d470d000b0b200241086a2001412c6a290200370300200241106a200141346a290200370300200241186a2001413c6a29020037030020022001290224370300200141d0006a2802002204417f4c0d00200128024821062001280220210a0240024020040d004101210e0c010b20041027220e450d050b200e2006200410ce0421062000200a3602202000411c6a200c360200200041186a2008360200200041146a200b360200200041106a20033602002000410c6a20033602002000200736020820002005370300200041d0006a2004360200200041cc006a200436020020002006360248200020022903003702242000412c6a200241086a290300370200200041346a200241106a2903003702002000413c6a200241186a290300370200200241206a24000f0b1039000b20034101102a000b20044104102a000b20044101102a000b20044101102a000bdf0401077f230041c0006b2203240002400240024002400240411b10272204450d00200441176a4100280081b140360000200441106a41002900fab040370000200441086a41002900f2b040370000200441002900eab0403700002004411b413610282204450d012004200136001b200341186a22014200370300200341106a22054200370300200341086a22064200370300200342003703002004411f20031000200341206a41186a22072001290300370300200341206a41106a2005290300370300200341206a41086a200629030037030020032003290300370320412010272201450d0220012003290320370000200141186a2007290300370000200141106a200341206a41106a2205290300370000200141086a200341206a41086a220629030037000020041029412010272204450d0320042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200341186a22024200370300200341106a22074200370300200341086a22084200370300200342003703002004412020031000200341206a41186a220920022903003703002005200729030037030020062008290300370300200320032903003703202001412041c00010282201450d0420012003290320370020200141386a2009290300370000200141306a200341306a290300370000200141286a200341286a29030037000020041029200042c0808080800837020420002001360200200341c0006a24000f0b411b4101102a000b41364101102a000b41204101102a000b41204101102a000b41c0004101102a000bd30102027f027e200028022021020240024002400240410410272203450d00200320023600002000280224210220034104410810282203450d0120032002360004200041086a29030021042000290300210520034108411810282203450d0220032005370008200341106a2004370000200041186a29030021042000290310210520034118413010282200450d0320002005370018200041206a200437000020012802002001280204200041281003200010290f0b41044101102a000b41084101102a000b41184101102a000b41304101102a000bb6750b097f027e087f017e047f017e017f027e027f017e127f230041b0036b22012400024002400240024020004280e101824200520d00200141f8006a4194c1c500411410b5012001280278450d00200128027c2202450d0020014180026a41086a22034200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a2003290300370300200120012903800237039003200141003602800220014190036a411020014180026a1005210302400240024002400240024002400240024002402001280280022204417f460d002003450d00200120043602f402200120033602f00220014180026a200141f0026a10412001280280022205450d0220014188026a280200210620012802840221072004450d01200310290c010b4108210541002106410021070b20014180026a41086a22034200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a2003290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052103024002402001280280022204417f460d002003450d00200120033602f002200120043602f402200142003703800220014180026a20032004410820044108491b220810ce041a2001200420086b22093602f4022001200320086a22083602f002200441074d0d03200129038002210a200141003602800220014180026a20082009410420094104491b220410ce041a2001200920046b3602f4022001200820046a3602f002200941034d0d03200128028002210420014180026a200141f0026a102d2001280280022209450d03200129028402210b200310292004200b422088a76b20066a2103200ba7450d01200910290c010b200141e8006a41888dc300410d1094012001290370420020012802681b210a41002104200621030b200320024f0d020c030b418f89c3004133104e000b418f89c3004133104e000b0240200420024f0d00200420026b220220066a220320024f0d022005200341286c6a290320210a0c010b200141d8006a4184c3c00041141094012001290360420020012802581b200a7c210a0b200a42ffe0017c220a200a4280e101827d210a02402007450d00200510290b200a2000520d0420014180026a41086a22024200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a100521020240024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a1041200128028002220c450d0220014188026a280200210d200128028402210e2003450d01200210290c010b4108210c4100210d4100210e0b200141d0006a4194c1c500411410b5012001280254210f20012802502110200141c0006a41888dc300410d1094012001290348420020012802401b210a0240024002400240200d41286c2202450d00200c41206a290300200a580d010b4101211141002108410021120c010b20014180026a41186a2203200c41186a29030037030020014180026a41106a2204200c41106a29030037030020014180026a41086a2206200c41086a2903003703002001200c29030037038002412010272211450d012011200129038002370000201141186a2003290300370000201141106a2004290300370000201141086a20062903003700000240200c20026a200c41286a2202470d0041012108410121120c010b200d41286c41586a210641202104410121034101210803400240200241206a290300200a580d00200321120c020b200141f0026a41186a2207200241186a290300370300200141f0026a41106a2209200241106a290300370300200141f0026a41086a2205200241086a290300370300200120022903003703f0020240024020082003460d00200321120c010b200341016a22122003490d0a20034101742213201220122013491b221241ffffff3f712012470d0a201241057422134100480d0a0240024020030d002013102721110c010b201120034105742013102821110b20110d0020134101102a000b200241286a2102201120046a220320012903f002370000200341186a2007290300370000200341106a2009290300370000200341086a2005290300370000200441206a2104200841016a210820122103200641586a22060d000b0b02400240024002400240200f410020101b220f200d20086b22034d0d00200141306a4198c3c000411c1094012001290338210b2001290330211420014180026a41086a22024200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a200229030037030020012001290380023703900320014100360288022001420137038002410810272202450d012001428880808080013702840220012002360280022002200b42002014a71b200a7c37000020024108411010282202450d0220014290808080c001370284022002200f20036b22103600082001200236028002200120083602f002200141f0026a20014180026a1030024002400240024020080d002001280288022103200128028402210720012802800221090c010b20084105742105410020012802880222036b2106200128028002210920012802840221072011210203400240200720066a411f4b0d00200341206a22042003490d1120074101742213200420042013491b22044100480d110240024020070d002004102721090c010b200920072004102821090b2009450d03200421070b200920036a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200641606a2106200341206a2103200241206a2102200541606a22050d000b2001200736028402200120033602880220012009360280020b20014190036a411020092003100302402007450d00200910290b02402012450d00201110290b200141a8036a4200370300200141a0036a420037030020014198036a42003703002001420037039003201041066a2212ad42307e220a422088a7450d010c100b20044101102a000b200aa72202417f4c0d0e0240024020020d0041082111410821020c010b200210272211450d04201121020b20014180026a41186a220920014190036a41186a29030037030020014180026a41106a220520014190036a41106a29030037030020014180026a41086a20014190036a41086a29030037030020012001290390033703800220124102490d04200f20086a200d6b41056a21030340200141f0026a41186a22042009290300370300200141f0026a41106a22062005290300370300200141f0026a41086a220720014180026a41086a29030037030020012001290380023703f0022002420037030820024200370300200241106a20012903f002370300200241186a2007290300370300200241206a2006290300370300200241286a2004290300370300200241306a21022003417f6a22030d000b201041056a21030c080b2012450d09201110290c090b41084101102a000b41104101102a000b20024108102a000b4100210320120d030c040b41204101102a000b418f89c3004133104e000b41f4c2c000200320061037000b20024200370308200242003703002002200129038002370310200241186a20014188026a290300370300200241206a20014190026a290300370300200241286a20014180026a41186a290300370300200341016a21030b200120033602f802200120123602f402200120113602f00220014180026a41086a22024200370300200142003703800241b4c3c000411320014180026a100420014190036a41086a20022903003703002001200129038002370390032001411036028402200120014190036a36028002200141f0026a20014180026a103402402012450d00201110290b200141083a00800220022010360200200141023a00840241b8d6c500410020014180026a1088010b200e450d00200c10290b20014180026a41086a22024200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a100521022001280280022203417f460d012002450d01200120023602f002200120033602f402200142003703800220014180026a20022003410820034108491b220610ce041a2001200320066b22043602f4022001200220066a22063602f0020240024002400240024002400240200341074d0d002001200420044104200441044922031b22076b3602f4022001200620076a3602f00220030d00200129038002210a20014180026a200141f0026a102d2001280280022215450d00200128028402211620021029200a2000520d0520014180026a41086a22024200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052102024002400240024002400240024002400240024002402001280280022203417f460d002002450d00200120023602d001200120033602d401200142003703800220014180026a20022003410820034108491b220610ce041a2001200320066b22043602d4012001200220066a22063602d00102400240200341074d0d00200141003602800220014180026a20062004410420044104491b220310ce041a2001200420036b3602d4012001200620036a3602d001200441034d0d00200128028002211720014180026a200141d0016a102d20012802800222180d010b418f89c3004133104e000b20012902840221192002102920014190036a4110100c20014180026a41086a22024200370300200142003703800241b4c3c000411320014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052102024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a1047200128028002221a450d03200129028402211b02402003450d00200210290b20014190036a4110100c0c010b4200211b4108211a0b200141206a41888dc300410d1094012001290328211c2001280220211d200141106a4184c3c00041141094012001280210211e2001290318211f201a201b422088a7222041306c6a21030240024020170d004100210941002106410021040c010b2017417f6a2106410021040240201a2003460d000240201a202041306c6a220241506a2203290300200341086a2903008450450d00410121090c020b20014190036a41186a200241606a220241186a29000037030020014190036a41106a200241106a29000037030020014190036a41086a200241086a2900003703002001200229000037039003410121040b410021090b20014189026a20014190036a41086a29030037000020014191026a20014190036a41106a29030037000020014199026a20014190036a41186a290300370000200120043a0080022001200129039003370081024101210f20014180026a41017221020240024020040d00200141f0026a41186a200241186a290000370300200141f0026a41106a200241106a2900003703004100212141012122410021230c010b20024280809aa6eaafe301420010ad01200141f0026a41186a200241186a290000370300200141f0026a41106a200241106a290000370300200141f0026a41086a200241086a290000370300200120022900003703f002412010272222450d03202220012903f002370000202241186a200141f0026a41186a2211290300370000202241106a200141f0026a41106a2213290300370000202241086a200141f0026a41086a220c290300370000410020066b211220014180026a41017221024102210641202104410121234101212102400340201220236a4101460d01200941ff01710d01201a2003460d01200341506a2207290300200741086a29030084500d012011200341606a220341186a29000022003703002013200341106a290000220a370300200c200341086a290000220b3703002001200329000022143703f00220022014370000200241086a2203200b370000200241106a2209200a370000200241186a22052000370000200141013a00800220024280809aa6eaafe301420010ad0120014190036a41186a2005290000220037030020014190036a41106a2009290000220a37030020014190036a41086a2003290000220b3703002001200229000022143703900320014180026a41186a2209200037030020014180026a41106a2205200a37030020014180026a41086a2208200b3703002001201437038002024020232021470d00202341016a22032023490d162006200320032006491b222141ffffff3f712021470d16202141057422034100480d160240024020230d002003102721220c010b202220042003102821220b2022450d100b202220046a2203200129038002370000200341186a2009290300370000200341106a2005290300370000200341086a2008290300370000200641026a2106200441206a2104202341016a212341002109200721030c000b0b202220046a210f2023450d0020014180026a41086a21052022210c034020014190016a200c10b60102402001280290014101470d002001280298012104200141b0016a10b70120012802b0012110024020012802b8012202450d00200241216c2103201041016a21022004410876210841012004411f7174210d20044105764107712212417f73210e034002402002417f6a2d00004101470d0020014180026a41186a200241186a220629000037030020014180026a41106a200241106a22072900003703002005200241086a22092900003703002001200229000037038002200120083602a00220014190036a20014180026a10b8010240201220012802980322044f0d002004200e6a221120044f0d0a200128029003221320114102746a280200200d7121040240200128029403450d00201310290b2004450d0120014180026a200210b90102402001290380024201510d00411310272204450d0c2004410f6a41002800f9c340360000200441086a41002900f2c340370000200441002900eac34037000020044113413310282204450d0d200420022900003700132004412b6a2006290000370000200441236a20072900003700002004411b6a2009290000370000200141f0026a41186a22064200370300200141f0026a41106a22074200370300200141f0026a41086a22094200370300200142003703f00220044133200141f0026a1000200141d0016a41186a2006290300370300200141d0016a41106a2007290300370300200141d0016a41086a2009290300370300200120012903f0023703d001200141d0016a4120100c200410290c020b200141086a41a8c1c500411110b5012001200128020c41016a410120012802081b3602ac02411310272204450d0d2004410f6a41002800f9c340360000200441086a41002900f2c340370000200441002900eac34037000020044113413310282204450d0e200420022900003700132004412b6a2006290000370000200441236a20072900003700002004411b6a2009290000370000200141f0026a41186a22064200370300200141f0026a41106a22074200370300200141f0026a41086a22094200370300200142003703f00220044133200141f0026a1000200141d0016a41186a2006290300370300200141d0016a41106a2007290300370300200141d0016a41086a2009290300370300200120012903f0023703d00120014120360294032001200141d0016a36029003200520014190036a10b301200410290c010b200128029403450d0020012802900310290b200241216a21022003415f6a22030d000b0b20012802b401450d00201010290b200f200c41206a220c470d000b0b20014180026a41086a22024200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052102024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a10412001280280022224450d0a20014188026a280200210920012802840221252003450d01200210290c010b4100212541082124410021090b20014101360280022019422088a72207450d0a4100212641002127024020072024200941286c6a220620246b41286e2202200220074b1b2202450d00200241057422034100480d13200310272204450d0a2001200436028002200221270b20242102200721042001280280022228210303400240200620026b41f8004b0d0020062002460d112024200941286c6a2108410121060240034020032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200420062205460d01200541016a2106200341206a21032008200241286a2202470d000b0b202620056a21260c110b20032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000024020044101470d00202641017221260c110b20032002290028370020200341386a200241c0006a290000370000200341306a200241386a290000370000200341286a200241306a29000037000020044102460d0f20032002290050370040200341d8006a200241e8006a290000370000200341d0006a200241e0006a290000370000200341c8006a200241d8006a29000037000020044103460d0e20032002290078370060200341f8006a20024190016a290000370000200341f0006a20024188016a290000370000200341e8006a20024180016a290000370000202641046a212620034180016a2103200241a0016a21022004417c6a22040d000c100b0b02402016450d00201510290b41fdc3c000410f1010418cc4c000413510100c120b418f89c3004133104e000b41204101102a000b41f4c2c000201120041037000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b418f89c3004133104e000b20034101102a000b410021272001280280022128410021260c040b418f89c3004133104e000b20034101102a000b202641037221260c010b202641027221260b201f4200201e1b201c4200201d1b7c21142024200941286c6a21100240024002400240024002400240024002402007450d0020102024460d01200741016a2103200941286c2104202421020340200141f0026a41186a200241186a290300370300200141f0026a41106a200241106a290300370300200141f0026a41086a200241086a290300370300200120022903003703f0022003417f6a2203450d04200241286a2102200441586a22040d000b201021020c020b20102024470d040b202421020b2022200f460d01202241086a2900002100202241106a290000210a2022290000210b20014190036a41186a202241186a29000037030020014190036a41106a200a37030020014190036a41086a20003703002001200b37039003202241206a210441022106201421000c040b200241206a290300210020014180026a41186a200141f0026a41186a29030037030020014180026a41106a200141f0026a41106a29030037030020014180026a41086a200141f0026a41086a290300370300200120012903f00237038002200241286a21020c020b200141003602880120014208370380012025450d03202410290c030b20014180026a41186a202441186a29030037030020014180026a41106a202441106a29030037030020014180026a41086a202441086a2903003703002001202429030037038002202441286a2102202429032021000b20014190036a41186a20014180026a41186a29030037030020014190036a41106a20014180026a41106a29030037030020014190036a41086a20014180026a41086a29030037030020012001290380023703900341002106202221040b417f417f201020026b41286d2203200f20046b4105766a220720072003491b220341016a220720072003491b220ead42287e220a422088a70d05200aa72203417f4c0d050240024002400240024002400240024020030d00410821124108211e0c010b200310272212450d012012211e0b2012200129039003370300201241186a20014190036a41186a290300370300201241106a20014190036a41106a290300370300201241086a20014190036a41086a290300370300201e200037032002402006450d0002402004200f470d00410121290c050b200441086a2900002100200441106a290000210a2004290000210b20014190036a41186a200441186a29000037030020014190036a41106a200a37030020014190036a41086a20003703002001200b37039003200441206a21040c020b024020022010470d0002402004200f460d00200441086a2900002100200441106a290000210a2004290000210b20014190036a41186a200441186a29000037030020014190036a41106a200a37030020014190036a41086a20003703002001200b37039003200441206a21040c030b410121290c040b20014180026a41186a200241186a220329030037030020014180026a41106a200241106a220629030037030020014180026a41086a200241086a2207290300370300200120022903003703800220014190036a41086a200729030037030020014190036a41106a200629030037030020014190036a41186a200329030037030020012002290300370390032002290320210041002111200241286a21020c020b20034108102a000b41022111201421000b410221074102210341282106034020014180026a41186a220920014190036a41186a221329030037030020014180026a41106a220520014190036a41106a220c29030037030020014180026a41086a220820014190036a41086a220d290300370300200120012903900337038002024020032229417f6a2203200e470d002003417f417f201020026b41286d220e200f20046b4105766a221d201d200e491b220e41016a221d201d200e491b6a220e2003490d082007200e200e2007491b220ead42287e220a422088a70d08200aa722034100480d080240024020294101470d002003102721120c010b201220062003102821120b2012450d032012211e0b201e20066a2203200129038002370300200341186a2009290300370300200341106a2005290300370300200341086a2008290300370300200341206a20003703000240024002400240201141ff01710e03010200010b2004200f460d04200441086a2900002100200441106a290000210a2004290000210b2013200441186a290000370300200c200a370300200d20003703002001200b37039003200441206a21044201210a41022111201421000c020b024020102002470d004102211102402004200f470d004200210a0c030b200441086a2900002100200441106a290000210a2004290000210b2013200441186a290000370300200c200a370300200d20003703002001200b37039003200441206a21044201210a201421000c020b2009200241186a22032903003703002005200241106a22092903003703002008200241086a22052903003703002001200229030037038002200529030021002009290300210a2002290300210b20132003290300370300200c200a370300200d20003703002001200b37039003200229032021004201210a41002111200241286a21020c010b20102002460d022013200241186a290300370300200c200241106a290300370300200d200241086a2903003703002001200229030037039003200229032021004201210a41012111200241286a21020b200741026a2107202941016a2103200641286a2106200a4200520d000b0b02402025450d00202410290b2001200e360284012001201e36028001200120293602880120294115490d012029410176222aad42287e2200422088a70d072000a72202417f4c0d0702400240024020020d004108212b410821050c010b20021027222b450d01202b21050b201e41586a212c201e41a87f6a212d4104210c4100212e410021092029211d0340201d21064100211d4101210702402006417f6a222f450d00024002400240024002400240201e202f41286c6a41206a290300200641286c2202201e6a41506a2903002200540d002006417e6a2107202d20026a21034100211d410021020340024020072002470d00200621070c080b200241016a210220002003290300220a5a2104200341586a2103200a210020040d000b200241016a21072002417f7320066a21040c010b202d200641056c41037422126a2102202f210402400340024020044101470d00410021040c020b2004417f6a210420002002290300220a542103200241586a2102200a210020030d000b0b20062004490d01200620294b0d03200620046b22074101762208450d00202c20126a2102201e200441286c6a2103034020014180026a41206a2212200341206a221129030037030020014180026a41186a2213200341186a220d29030037030020014180026a41106a220e200341106a220f29030037030020014180026a41086a2210200341086a221d2903003703002001200329030037038002200241206a22242903002100200241186a2225290300210a200241106a2230290300210b200241086a2231290300211420032002290300370300201d2014370300200f200b370300200d200a3703002011200037030020242012290300370300202520132903003703002030200e290300370300203120102903003703002002200129038002370300200241586a2102200341286a21032008417f6a22080d000b0b024020040d002004211d0c050b0240200741094d0d002004211d0c050b200620294b0d01201e200441286c6a2112034020062004417f6a221d490d0402402006201d6b22074102490d00201e200441286c6a220241206a2203290300201e201d41286c6a221141206a220829030022005a0d00200141f0026a41186a2213201141186a220d290300370300200141f0026a41106a220e201141106a220f290300370300200141f0026a41086a2210201141086a2224290300370300200120112903003703f002201120022903003703002024200241086a290300370300200f200241106a290300370300200d200241186a29030037030020082003290300370300024020074103490d00202f210320122108201141f0006a29030020005a0d00024003402008220241206a200241c8006a290300370300200241186a200241c0006a290300370300200241106a200241386a290300370300200241086a200241306a2903003703002002200241286a220829030037030020042003417f6a2203460d01200241f0006a2903002000540d000b0b200241286a21020b200220012903f00237030020022000370320200241186a2013290300370300200241106a200e290300370300200241086a20102903003703000b201d450d05201241586a2112201d21042007410a4f0d050c000b0b20042006103e000b20062004417f6a221d490d010b20062029107f000b201d2006103e000b024002400240202e2009470d00202e41016a2202202e490d0a202e4101742203200220022003491b220241ffffffff01712002470d0a200241037422034100480d0a02400240202e0d0020031027210c0c010b200c202e41037420031028210c0b200c450d012002212e0b200c20094103746a220220073602042002201d360200200941016a220d2109200d4102490d0103400240024002400240200c200d2211417f6a220d4103746a2202280200450d002011410374200c6a220741746a2802002206200228020422034d0d0041022109201141024d0d06200c2011417d6a22024103746a2802042204200320066a4d0d0141032109201141034d0d06200741646a280200200420066a4d0d01201121090c060b20114103490d0120022802042103200c2011417d6a22024103746a28020421040b20042003490d010b2011417e6a21020b0240024002400240024002402011200241016a22244d0d00201120024d0d01200c20024103746a220e2802042225200e2802006a2202200c20244103746a220f2802002210490d02200220294b0d03200e41046a2130201e201041286c6a2212200f280204221341286c22036a2107200241286c2104200220106b220920136b220220134f0d04202b2007200241286c220310ce041a200520036a21060240024020134101480d00200241014e0d010b20072102200521030c060b202c20046a21042007210203402004200241586a2209200641586a2208200641786a290300200241786a2903005422071b2203290300370300200441206a200341206a290300370300200441186a200341186a290300370300200441106a200341106a290300370300200441086a200341086a2903003703002006200820071b2106024020122009200220071b2202490d00200521030c070b200441586a21042005210320052006490d000c060b0b41d8e3c100202420111037000b41d8e3c100200220111037000b20102002103e000b20022029107f000b202b2012200310ce041a200520036a21060240024020134101480d00200920134a0d010b20122102200521030c010b201e20046a210820052103201221020340200220072003200741206a290300200341206a2903005422091b2204290300370300200241206a200441206a290300370300200241186a200441186a290300370300200241106a200441106a290300370300200241086a200441086a2903003703002003200341286a20091b2103200241286a2102200741286a200720091b220720084f0d01200620034b0d000b0b20022003200620036b220420044128706b10ce041a2030202520136a360200200e2010360200200f200f41086a2024417f7320116a41037410cf041a200d2109200d41014d0d020c000b0b20034104102a000b201d0d000b0240202e450d00200c10290b202a450d03202b10290c030b20024108102a000b20034108102a000b20294102490d002029417f6a2104201e202941286c6a2107410021090340024002400240202920042202417f6a2204490d00202920046b22034102490d02201e200241286c6a220241206a2206290300201e200441286c6a220541206a220829030022005a0d02200141f0026a41186a2212200541186a2211290300370300200141f0026a41106a2213200541106a220c290300370300200141f0026a41086a220d200541086a220e290300370300200120052903003703f00220052002290300370300200e200241086a290300370300200c200241106a2903003703002011200241186a2903003703002008200629030037030020034103490d012009210620072103200541f0006a29030020005a0d0103402003220241586a22032002290300370300200341206a200241206a290300370300200341186a200241186a290300370300200341106a200241106a290300370300200341086a200241086a2903003703002006417f6a2206450d02200241286a2103200241c8006a29030020005a0d020c000b0b20042029103e000b200220012903f00237030020022000370320200241186a2012290300370300200241106a2013290300370300200241086a200d2903003703000b200941016a2109200741586a210720040d000b0b20014180026a41086a22024200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a20022903003703002001200129038002370390032001411036028402200120014190036a3602800220014180016a20014180026a102f410021042001280284012109200128028001210702400240200128028801220241286c22030d004101210e4100210f0c010b200341286d220f41ffffff3f71200f470d03200f41057422034100480d0320031027220e0d0020034101102a000b02402002450d00200241286c210641002104200e2102200721030340200341086a2900002100200341106a290000210a2003290000210b200241186a200341186a290000370000200241106a200a370000200241086a20003700002002200b370000200441016a2104200241206a2102200341286a2103200641586a22060d000b0b02402009450d00200710290b20282026200e200410ba0120014180026a41086a22024200370300200142003703800241d8c3c000411220014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a1005210202400240024002400240024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a102d200128028002221d450d0220014188026a280200211320012802840221242003450d01200210290c010b410021244101211d410021130b200141e8016a4200370300200141e0016a4200370300200141d8016a4200370300200142003703d001201341ffffff3f712013470d0920134105742202417f4c0d090240024020020d00410121120c010b200210272212450d020b20014180026a41186a2204200141d0016a41186a29030037030020014180026a41106a2206200141d0016a41106a29030037030020014180026a41086a2207200141d0016a41086a290300370300200120012903d0013703800220134102490d022013417f6a21032012210203402002200129038002370000200241186a2004290300370000200241106a2006290300370000200241086a2007290300370000200241206a21022003417f6a22030d000b2013417f6a21110c030b418f89c3004133104e000b20024101102a000b41002111201221022013450d010b2002200129038002370000200241186a20014180026a41186a290300370000200241106a20014180026a41106a290300370000200241086a20014180026a41086a290300370000201141016a21110b201a202041306c6a2102201ba7210d410021100240024002400240024002400240034002402017450d002002201a460d02200241506a2202290300200241086a29030084500d0203402017417f6a2217450d01201a2002460d03200241506a2103200241506a21022003290300200341086a2903008450450d000c030b0b2002201a460d0102400340200241506a22042903002100200441086a290300210a20014190036a41186a2206200241606a220341186a29030037030020014190036a41106a2207200341106a29030037030020014190036a41086a2209200341086a29030037030020012003290300370390032000200a84500d0120014180026a41186a2203200629030037030020014180026a41106a2205200729030037030020014180026a41086a22082009290300370300200120012903900337038002200141f0016a20014180026a10b601200141d0016a41186a220c2006290300370300200141d0016a41106a22062007290300370300200141d0016a41086a2207200929030037030020012001290390033703d001024020012802f0014101460d0020042102201a2004470d010c040b0b20014190016a41086a2209200729030037030020014190016a41106a2207200629030037030020014190016a41186a2206200c290300370300200120012903d00122003703b001200120003703900120012802f8012104200320062903003703002005200729030037030020082009290300370300200120012903900137038002201120044d0d03200241506a2102201220044105746a2204200129038002370000200441186a2003290300370000200441106a2005290300370000200441086a2008290300370000201041016a2110410021170c010b0b200141b0016a41086a200141f0026a41086a290300370300200141b0016a41106a200141f0026a41106a290300370300200141b0016a41186a200141f0026a41186a290300370300200120012903f0023703b0010b0240200d450d00201a10290b02402011201341ffffff3f712202200220114b1b2207450d00201d210220122103410021060340024020022003460d0020022003412010d004450d00411610272204450d042004410e6a41002900c9c240370000200441086a41002900c3c240370000200441002900bbc24037000020044116413610282204450d05200420022900003700162004412e6a200241186a290000370000200441266a200241106a2900003700002004411e6a200241086a290000370000200141f0026a41186a22094200370300200141f0026a41106a22054200370300200141f0026a41086a22084200370300200142003703f00220044136200141f0026a1000200141d0016a41186a2009290300370300200141d0016a41106a2005290300370300200141d0016a41086a2008290300370300200120012903f0023703d001200141d0016a4120100c200410290b200241206a2102200341206a2103200641016a22062007490d000b0b201220114105746a21022011210920114104490d0320014180026a41206a2105200141c0026a210820014180026a41e0006a210c20014180036a210d20014198026a210420014190026a210620014188026a2107200221032011210903402004420037030020064200370300200742003703002001420037038002024020052003460d00200341606a20014180026a412010d004450d002009417f6a21030c060b2004420037030020064200370300200742003703002001420037038002024020082003460d00200341406a20014180026a412010d004450d002009417e6a21030c060b20044200370300200642003703002007420037030020014200370380020240200c2003460d00200341a07f6a20014180026a412010d004450d002009417d6a21030c060b2004420037030020064200370300200742003703002001420037038002200341807f6a210202400240200d2003460d00200220014180026a412010d0040d010b2009417c6a210920022103200220126b41e0004b0d010c050b0b2009417c6a21030c040b41c8c3c000200420111037000b41164101102a000b41364101102a000b20022012460d012009417f6a210320014180026a41206a210420014198026a210620014190026a210720014188026a210903402006420037030020074200370300200942003703002001420037038002024020042002460d00200241606a20014180026a412010d0040d020b2003417f6a21032012200241606a2202470d000c020b0b200341016a22022011201120024b1b21110b2001419c026a202636020020014180026a41186a202736020020014194026a202836020020014180026a41106a20233602002001418c026a2021360200200141083a00800220014180026a41086a22022022360200200141033a00840241b8d6c500410020014180026a10880120024200370300200142003703800241d8c3c000411220014180026a100420014190036a41086a200229030037030020012001290380023703900320014100360288022001420137038002200120113602f002200141f0026a20014180026a10300240024020110d002001280288022103200128028402210720012802800221090c010b20114105742105410020012802880222036b2106200128028002210920012802840221072012210203400240200720066a411f4b0d00200341206a22042003490d0520074101742208200420042008491b22044100480d050240024020070d002004102721090c010b200920072004102821090b2009450d04200421070b200920036a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200641606a2106200341206a2103200241206a2102200541606a22050d000b2001200736028402200120033602880220012009360280020b20014190036a411020092003100302402007450d00200910290b02402013450d00201210290b20014180026a41086a22024200370300200142003703800241dfc1c500411620014180026a100420014190036a41086a22032002290300370300200120012903800237039003200120103602800220014190036a411020014180026a41041003200141a8c1c500411110b501200128020021042001280204210620024200370300200142003703800241a8c1c500411120014180026a1004200320022903003703002001200129038002370390032001200641016a410120041b3602800220014190036a411020014180026a4104100302402024450d00201d10290b0240200f450d00200e10290b2019a7450d00201810290b2016450d02201510290c020b20044101102a000b102b000b200141b0036a24000f0b1039000bc60101027f230041206b22032400200341106a41086a220442003703002003420037031020012002200341106a1004200341086a200429030037030020032003290310370300410021022003410036021020034110200341106a1005210402400240024020032802102201417f470d000c010b20034100360210200341106a20042001410420014104491b10ce041a200141034d0d012003280210210120041029410121020b2000200136020420002002360200200341206a24000f0b418f89c3004133104e000bdb0201047f230041c0006b2202240002400240411610272203450d002003410e6a41002900c9c240370000200341086a41002900c3c240370000200341002900bbc24037000020034116413610282203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300200241206a2002412010bb010240024020022802204101460d00200041003602000c010b20002002290320370200200041086a200241206a41086a2802003602000b20031029200241c0006a24000f0b41164101102a000b41364101102a000bed02030a7f017e017f230041206b220124002001410010bc01200141106a410110bc0102400240024020012802182202450d004102210320012802042104200128020821050340200128021421062001280210210702400240200420056b200241216c220841216d2209490d00200520096a2109200128020021020c010b200520096a22092005490d0420044101742202200920092002491b220aad42217e220b422088a70d04200ba7220c4100480d040240024020040d00200c102721020c010b2001280200200441216c200c102821020b2002450d0320012002360200200a21040b2002200541216c6a2007200810ce041a02402006450d00200710290b200141106a200310bc01200341016a210320092105200128021822020d000b20012004360204200120093602080b02402001280214450d00200128021010290b20002001290300370200200041086a200141086a280200360200200141206a24000f0b200c4101102a000b102b000bd60302047f017e230041d0006b220224000240024002400240411310272203450d002003410f6a41002800d0c440360000200341086a41002900c9c440370000200341002900c1c44037000020034113413310282203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200128022021042003413341e60010282201450d0220012004360033200241306a41186a22034200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020014137200241306a1000200241086a41186a2003290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033037030820024100360230200241086a4120200241306a100521040240024020022802302203417f460d002002200336022c20022004360228200241306a200241286a104520022802302205450d052002290234210602402003450d00200410290b20002006370204200020053602000c010b20004100360208200042043702000b20011029200241d0006a24000f0b41134101102a000b41334101102a000b41e6004101102a000b418f89c3004133104e000b8f0502087f047e230041c0006b2202240002400240411310272203450d002003410f6a41002800f9c340360000200341086a41002900f2c340370000200341002900eac34037000020034113413310282203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034133200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002410036022020024120200241206a1005210102400240024020022802202204417f460d002001450d0020024100360220200241206a20012004410420044104491b220510ce041a0240200441034d0d002002280220210620024100360220200241206a200120056a2207200420056b2204410420044104491b220510ce041a200441034d0d00200228022021082002420037032820024200370320200241206a200720056a2207200420056b2204411020044110491b220510ce041a2004410f4d0d00200241286a2209290300210a2002290320210b2002420037032820024200370320200241206a200720056a200420056b2204411020044110491b10ce041a2004410f4b0d020b418f89c3004133104e000b4200210a0c010b2009290300210c2002290320210d20011029200041206a200c370300200041186a200d370300200041106a200a3703002000200b3703082000412c6a2008360200200041286a20063602004201210a0b2000200a37030020031029200241c0006a24000f0b41134101102a000b41334101102a000b9411030e7f077e017f230022042105200441c0016b4160712204240002400240024002400240024002400240200141ffffff3f712001470d0020014105742206417f4c0d000240024020060d00410121070c010b200610272207450d020b410021084100210602402001450d0020014105742109416020006b210a2007210620002108034020062008290000370000200641186a200841186a290000370000200641106a200841106a290000370000200641086a200841086a290000370000200641206a2106200841206a2108200941606a22090d000b200020014105746a200a6a41057641016a2106200121080b20042006360218200420083602142004200736021020072006410041202006676b10e00120044180016a41086a220642003703002004420037038001419acec200411d20044180016a1004200441a0016a41086a200629030037030020042004290380013703a0012004410036028001200441a0016a411020044180016a10052108024002402004280280012206417f460d00200420063602442004200836024020044180016a200441c0006a102d200428028001220b450d0420044188016a2802002109200428028401210c2006450d01200810290c010b4101210b410021094100210c0b2009410574220a450d07200441a0016a411472210d200441a0016a410872210e200b21080340200441206a41186a220f200841186a290000370300200441206a41106a2210200841106a290000370300200441206a41086a2211200841086a29000037030020042008290000370320200441c0006a200441206a10f202200441003602a80120042903582112200420042903b801221337035820042903502114200420042903b001221537035020042903402116200420042903a00137034020042903482117200420042903a80122183703482015422088a721002018422088a721012013a721072018a7210902402017a72206450d00200420163703a001200420173703a801200420143703b001200420123703b801200420062014a74105746a36028c01200420063602880120042017422088a73602840120042006360280012004200441106a36029001200441f0006a20044180016a104b200e41086a200441f0006a41086a2219280200360200200e200429037037020020042014422088a722062012422088a74105746a36028c01200420063602880120042012a73602840120042006360280012004200441106a36029001200441f0006a20044180016a104b200d41086a2019280200360200200d200429037037020020042903a801211720042903a001211420042903b801211820042903b001211202402009450d0002402001450d00200910290b2007450d00200010290b20042014370340200420173703482017422088a72101200420123703502012422088a72100200420183703582017a721092018a721070b411a102721060240024020090d002006450d06200641186a41002f00cfce423b0000200641106a41002900c7ce42370000200641086a41002900bfce42370000200641002900b7ce423700002006411a413a10282206450d072006200429032037001a200641326a200f2903003700002006412a6a2010290300370000200641226a2011290300370000200441a0016a41186a22094200370300200441a0016a41106a22014200370300200441a0016a41086a22074200370300200442003703a0012006413a200441a0016a100020044180016a41186a200929030037030020044180016a41106a200129030037030020044180016a41086a2007290300370300200420042903a0013703800120044180016a4120100c200610290c010b2006450d07200641186a41002f00cfce423b0000200641106a41002900c7ce42370000200641086a41002900bfce42370000200641002900b7ce423700002006411a413a10282206450d082006200429032037001a200641326a200f2903003700002006412a6a2010290300370000200641226a2011290300370000200441a0016a41186a220f4200370300200441a0016a41106a22104200370300200441a0016a41086a22114200370300200442003703a0012006413a200441a0016a100020044180016a41186a200f29030037030020044180016a41106a201029030037030020044180016a41086a2011290300370300200420042903a00137038001200441203602a401200420044180016a3602a001200441c0006a200441a0016a10db022006102902402001450d00200910290b2007450d00200010290b200841206a2108200a41606a220a0d000c080b0b1039000b20064101102a000b418f89c3004133104e000b411a4101102a000b413a4101102a000b411a4101102a000b413a4101102a000b0240200c450d00200b10290b200441003602a801200442013703a001200420033602800120044180016a200441a0016a1030024002400240024020030d0020042802a801210620042802a401210120042802a00121070c010b20034105742100410020042802a80122066b210920042802a001210720042802a401210103400240200120096a411f4b0d00200641206a22082006490d042001410174220a20082008200a491b22084100480d040240024020010d002008102721070c010b200720012008102821070b2007450d03200821010b200720066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200941606a2109200641206a2106200241206a2102200041606a22000d000b200420013602a401200420063602a801200420073602a0010b20044180016a41086a22024200370300200442003703800141d692c200411b20044180016a1004200441a0016a41086a200229030037030020042004290380013703a001200441a0016a411020072006100302402001450d00200710290b02402004280214450d00200428021010290b200524000f0b20084101102a000b102b000bcb0101037f230041106b22032400410021042003410036020c200120022003410c6a1005210102400240200328020c2202417f460d002001450d0020034100360204200341046a200120024104200241044922051b220410ce041a20050d012003280204210520034100360208200341086a200120046a200220046b2204410420044104491b10ce041a200441034d0d012003280208210420011029200041086a200436020020002005360204410121040b20002004360200200341106a24000f0b418f89c3004133104e000b830802117f017e23004190016b22022400024002400240024002400240410e10272203450d00200341066a41002900dac440370000200341002900d4c4403700002003410e411c10282204450d012004200136000e200241306a41186a22034200370300200241306a41106a22014200370300200241306a41086a220542003703002002420037033020044112200241306a1000200241086a41186a2003290300370300200241086a41106a2001290300370300200241086a41086a20052903003703002002200229033037030820024100360270200241086a4120200241f0006a100521060240024020022802702207417f460d002002200736022c200220063602282002200241286a102e2002280200450d07024002402002280204220841fc00200841fc00491b22090d004101210a0c010b200941216c22031027220a450d050b02402008450d0020022802282105200228022c21034100210b4100210c4100210d0340200241003a0030200241306a20052003410047220110ce041a20032001490d072002200320016b220e36022c2002200520016a22053602280240024002402003450d0020022d0030220141014b0d004100210f200e21030240024020010e020100010b200241306a200e4120200e4120491b22016a41004100412020016b2001411f4b1b10cd041a200241306a2005200110ce041a2002200e20016b220336022c2002200520016a2205360228200e411f4d0d01200241f0006a41186a200241306a41186a290300370300200241f0006a41106a200241306a41106a290300370300200241f0006a41086a200241306a41086a290300370300200220022903303703704101210f0b200d41016a210e200241d0006a41186a2210200241f0006a41186a290300370300200241d0006a41106a2211200241f0006a41106a290300370300200241d0006a41086a2212200241f0006a41086a29030037030020022002290370370350200d2009470d020240200b200e200e200b491b2209ad42217e2213422088a70d002013a7220141004e0d020b102b000b2009450d0b200a10290c0b0b02400240200d0d0020011027210a0c010b200a200c20011028210a0b200a450d090b200a200c6a2201200f3a0000200141016a2002290350370000200141096a2012290300370000200141116a2011290300370000200141196a2010290300370000200b41026a210b200c41216a210c200e210d2008200e470d000b0b200a450d072008ad4220862009ad84211302402007450d00200610290b200020133702042000200a3602000c010b20004100360208200042013702000b2004102920024190016a24000f0b410e4101102a000b411c4101102a000b20034101102a000b20012003103e000b20014101102a000b418f89c3004133104e000b13002000410a360204200041b8c5c0003602000b340020004187f4c10036020420004100360200200041146a4110360200200041106a41d4ebc000360200200041086a42073702000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241003600000b13002000410a360204200041a487c1003602000b3101017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241c0003600000b3201017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280e1013700000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241013600000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241063600000b3d01017f02404110102722020d0041104101102a000b200242003700082002428080d287e2bc2d370000200042908080808002370204200020023602000b3d01017f02404110102722020d0041104101102a000b200242003700082002428080e983b1de16370000200042908080808002370204200020023602000b3e01017f02404110102722020d0041104101102a000b2002420037000820024280809aa6eaafe301370000200042908080808002370204200020023602000bf10901047f230041206b220224000240024002400240024002400240024002400240024002400240024002402001280200417f6a220341094b0d0020030e0a0102030405060708090a010b419498c1001058000b2001410c6a2802002203417f4c0d0a200128020421044101210502402003450d00200310272205450d0c0b20052004200310ce0421052000410c6a2003360200200041086a20033602002000200536020420004101360200200041106a20012902103703000c090b2001410c6a2802002203417f4c0d09200128020421050240024020030d00410121040c010b200310272204450d0c0b20042005200310ce0421052000410c6a2003360200200041086a20033602002000200536020420004102360200200041106a20012902103703000c080b200128020421054101210302400240200141086a22042d00004101460d002002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030c010b2001410c6a28020021040b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000412c6a200129022c3702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a280200360200200041033602000c070b20004104360200200020012802043602040c060b20004105360200200020012802043602040c050b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030c010b200141086a28020021050b200020033a0004200020022f011c3b0005200041306a2001290330370300200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602002001280228210120004106360200200041286a20013602000c040b20004107360200200020012802043602040c030b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030c010b200141086a28020021010b200020033a0004200020022f011c3b000520004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c020b20004109360200200041086a200141086a2903003703000c010b2000410a360200200041086a200141086a2903003703000b200241206a24000f0b1039000b20034101102a000b20034101102a000bd8a60104197f037e0b7f0a7e230041d0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e0b000102030405060708090a000b200341fc026a4101360200200342013702ec02200341ccfdc4003602e802200341023602ac04200341c4fdc4003602a8042003200341a8046a3602f802200341e8026a41f098c1001057000b200141086a2802002104200128020421050240024020022d00000d004101210620022d00014101460d010b41d588c3002107412a210841002109410121062004450d32200510290c320b200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f010021182001410c6a2802002119200141146a280200211a200141106a280200211b20032002411a6a29010037038003200320073a00ff02200320083a00fe02200320093b01fc022003200a3a00fb022003200b3a00fa022003200c3b01f8022003200d3a00f7022003200e3a00f6022003200f3b01f402200320103a00f302200320173a00ea02200320183b01e802200320132012410874201141187472723600ef02200320162015410874722014411874723600eb02200320193602b004200320043602ac04200320053602a804200341086a200341e8026a200341a8046a201b201a10cb01200328020c210820032802082107410021090c310b200141086a28020021042001280204210541d588c3002107412a210820022d00000d2f20022d00014101470d2f2002411a6a290100211c200241196a2d00002107200241186a2d00002108200241166a2f01002106200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210e2002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002111200241096a2d00002112200241086a2d00002113200241066a2f01002114200241056a2d00002115200241046a2d00002116200241026a2f010021172001410c6a2802002118200141146a2802002119200141106a280200211a410d10272202450d08200241056a410029008599413700002002410029008099413700002002410d412d10282202450d092002201c370025200220073a0024200220083a0023200220063b0021200220093a00202002200a3a001f2002200b3b001d2002200c3a001c2002200d3a001b2002200e3b00192002200f3a00182002201141087420104118747220127236001420022014410874201572201341187472360010200220163a000f200220173b000d200341e8026a41186a22074200370300200341e8026a41106a22084200370300200341e8026a41086a22064200370300200342003703e8022002412d200341e8026a1000200341a8046a41186a2007290300370300200341a8046a41106a2008290300370300200341a8046a41086a2006290300370300200320032903e8023703a804200341003602e802200341a8046a4120200341e8026a100521090240024020032802e8022207417f460d0041002106200341e8026a2007412020074120491b22086a41004100412020086b2008411f4b1b10cd041a200341e8026a2009200810ce041a2007411f4b0d01418f89c3004133104e000b2002102941959bc4002107410b21080c300b20032f01e802210720032d00ea02210820032900eb02211c20032d00f302210a20032902f402211d20032802fc02210b200329038003211e20091029200210292003201e370380032003200b3602fc022003201d3702f4022003200a3a00f3022003201c3700eb02200320083a00ea02200320073b01e802200320183602b004200320043602ac04200320053602a804200341106a200341e8026a200341a8046a201a201910cb012003280214210820032802102107410121090c300b200141216a290000211c200141206a2d0000210a2001411d6a2f0000210b2001411c6a2d0000210c200141196a2f0000210d200141186a2d0000210e200141156a2f0000210f200141146a2d00002110200141106a28020021112001410c6a2802002105200141086a2d00002117200141306a280200211f2001412c6a280200212020012d001f211220012d001b211320012d0017211420012d000b211520012f00092116200128020421212002411a6a290100211d200241196a2d00002118200241186a2d00002119200241166a2f0100211a200241156a2d0000211b200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f01002129412a210441d588c30021070240024020022d0000450d004101210641002108410021090c010b41012106410021084100210920022d00014101470d002002410c6a2d000021082002410a6a2f01002109200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021060b200941ffff0371410874200841187472200441ff017172210820060d2d2003201d3703d002200320183a00cf02200320193a00ce022003201a3b01cc022003201b3a00cb02200320223a00ca02200320233b01c802200320243a00c702200320253a00c602200320263b01c402200320273a00c302200320083600bf02200320073600bb02200320283a00ba02200320293b01b8020240201741ff01714101470d00200341e8026a200541067610cc0120032802e80221070240024020032802f0022005413f7122024b0d00410021020c010b200720024105746a2202290018211c20022d0017210a20022d0016211220022f0014210b20022d0013210c20022d0012211320022f0010210d20022d000f210e20022d000e211420022f000c210f20022d000b2110200228000721112002280003210520022d0002211520022f00002116410121020b024020032802ec02450d00200710290b2002450d2d0b2003201c3703f0032003200a3a00ef03200320123a00ee032003200b3b01ec032003200c3a00eb03200320133a00ea032003200d3b01e8032003200e3a00e703200320143a00e6032003200f3b01e403200320103a00e303200320113600df03200320053600db03200320153a00da03200320163b01d803200341e8026a41086a22024200370300200342003703e80241e0c2c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8020240200341d8026a411041b8d6c50041004100100b417f460d00418d99c1002107412621080c2e0b200341e8026a200341b8026a10b901024020032903e8024201510d0041b399c1002107411821080c2e0b200341e8026a200341d8036a10b901024020032903e8024201510d0041969ac1002107412c21080c2e0b20034190036a280200210c20034180016a41a8c1c500411110b50141e199c10021074116210820032802840141002003280280011b201f470d2d0240200c41016a201f490d0041f799c1002107411f21080c2e0b200341e8026a202141067610bc01410021072021413f71220220032802f0024f0d2020032802e802200241216c6a22022d00004101470d2020022f00012106200241196a290000211c200241186a2d00002109200241176a2d00002104200241156a2f00002105200241146a2d0000210a200241136a2d0000210b200241116a2f0000210d200241106a2d0000210e2002410f6a2d0000210f2002410d6a2f000021102002410c6a2d00002111200241086a2800002113200241046a2800002112200241036a2d00002102410121070c210b41d588c3002107412a210820022d00000d2c20022d00014101470d2c20012802042116200241196a2d00002107200241186a2d00002108200241166a2f01002106200241156a2d00002109200241146a2d00002104200241126a2f01002105200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211520032002411a6a29010037039804200320073a009704200320083a009604200320063b019404200320093a009304200320043a009204200320053b0190042003200a3a008f042003200b3a008e042003200c3b018c042003200d3a008b04200320143a008204200320153b01800420032010200f41087472200e41187472360087042003201320124108747220114118747236008304200341e8026a41086a22024200370300200342003703e80241e0c2c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8020240200341d8026a411041b8d6c50041004100100b417f460d0041a99bc1002107411e21080c2d0b411310272202450d082002410f6a41002800f9c340360000200241086a41002900f2c340370000200241002900eac34037000020024113413310282202450d092002200329038004370013411821082002412b6a20034180046a41186a290300370000200241236a20034180046a41106a2903003700002002411b6a20034180046a41086a290300370000200341e8026a41186a22074200370300200341e8026a41106a22064200370300200341e8026a41086a22094200370300200342003703e80220024133200341e8026a1000200341a8046a41186a2007290300370300200341a8046a41106a2006290300370300200341a8046a41086a2009290300370300200320032903e8023703a804200341a8046a412041b8d6c50041004100100b21072002102902402007417f470d0041c79bc10021070c2d0b200341a8046a201641067610bc01410021072016413f71220220032802b0044f0d1d20032802a804200241216c6a22022d00004101470d1d20022f00012106200241196a290000211c200241186a2d00002109200241176a2d00002104200241156a2f00002105200241146a2d0000210a200241136a2d0000210b200241116a2f0000210c200241106a2d0000210d2002410f6a2d0000210e2002410d6a2f0000210f2002410c6a2d00002110200241086a2800002112200241046a2800002111200241036a2d00002102410121070c1e0b200128020421052002411a6a290100211c200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541d588c3002107412a21040240024020022d0000450d004101210641002108410021090c010b41012106410021084100210920022d00014101470d002002410c6a2d000021092002410a6a2f01002108200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021060b200841ffff0371410874200441ff017172200941187472210820060d2b2003201c370398042003200a3a0097042003200b3a0096042003200c3b0194042003200d3a0093042003200e3a0092042003200f3b019004200320103a008f04200320113a008e04200320123b018c04200320133a008b0420032008360087042003200736008304200320143a008204200320153b018004411610272202450d092002410e6a41002900c9c240370000200241086a41002900c3c240370000200241002900bbc24037000020024116413610282202450d0a20022003290380043700162002412e6a20034180046a41186a290300370000200241266a20034180046a41106a290300370000411e21082002411e6a20034180046a41086a290300370000200341e8026a41186a22074200370300200341e8026a41106a22064200370300200341e8026a41086a22094200370300200342003703e80220024136200341e8026a1000200341a8046a41186a2007290300370300200341a8046a41106a2006290300370300200341a8046a41086a2009290300370300200320032903e8023703a804200341a8046a412041b8d6c50041004100100b21062002102941df9bc10021072006417f470d2b200341a8016a41dfc1c500411610b50120032802ac01210820032802a8012106200341e8026a41086a22024200370300200342003703e80241d8c3c0004112200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022209417f460d002007450d00200320093602ac04200320073602a804200341e8026a200341a8046a102d20032802e802220b450d0d200341f0026a280200210220032802ec02210c2009450d01200710290c010b4100210c4101210b410021020b02400240024002402008410020061b220d2005470d0020022005460d010b41fd9bc100210741162108200220054d0d0120034180036a4200370300200341f8026a4200370300200341f0026a4200370300200342003703e802200b20054105746a2206200341e8026a460d002006200341e8026a412010d0040d010b200341a0016a20034180046a4280809aa6eaafe301420010ac0120032802a001450d0141939cc1002107411e21080b200c450d2c200b10290c2c0b20034198016a41a8c1c500411110b501200328029c0121062003280298012109411610272207450d0c2007410e6a41002900c9c240370000200741086a41002900c3c240370000200741002900bbc24037000020074116413610282207450d0d20072003290380043700162007412e6a20034180046a41186a290300370000200741266a20034180046a41106a2903003700002007411e6a20034180046a41086a290300370000200341e8026a41186a22084200370300200341e8026a41106a22044200370300200341e8026a41086a220a4200370300200342003703e80220074136200341e8026a1000200341a8046a41186a2008290300370300200341a8046a41106a2004290300370300200341a8046a41086a200a290300370300200320032903e8023703a804410410272208450d0e20082006410020091b36000020084104410810282208450d0f20082005360004200341a8046a412020084108100320081029200710290240024020022005460d00200341e8026a41186a220820034180046a41186a290300370300200341e8026a41106a220620034180046a41106a290300370300200341e8026a41086a220920034180046a41086a29030037030020032003290380043703e802200220054d0d12200b20054105746a220720032903e802370000200741186a2008290300370000200741106a2006290300370000200741086a20092903003700000c010b200341e8026a41186a220720034180046a41186a290300370300200341e8026a41106a220820034180046a41106a290300370300200341e8026a41086a220620034180046a41086a29030037030020032003290380043703e8020240200c2005470d00200541016a22022005490d2b20054101742209200220022009491b220c41ffffff3f71200c470d2b200c41057422024100480d2b0240024020050d0020021027210b0c010b200b200541057420021028210b0b200b450d180b200b20054105746a220220032903e802370000200241186a2007290300370000200241106a2008290300370000200241086a2006290300370000200541016a21020b200341e8026a41086a22074200370300200342003703e80241d8c3c0004112200341e8026a1004200341d8026a41086a2007290300370300200320032903e8023703d802200341003602f002200342013703e802200320023602a804200341a8046a200341e8026a103002400240024020020d0020032802f002210720032802ec02210920032802e80221040c010b20024105742105410020032802f00222076b210620032802e802210420032802ec022109200b210203400240200920066a411f4b0d00200741206a22082007490d2d2009410174220a20082008200a491b22084100480d2d0240024020090d002008102721040c010b200420092008102821040b2004450d03200821090b200420076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200641606a2106200741206a2107200241206a2102200541606a22050d000b200320093602ec02200320073602f002200320043602e8020b200341d8026a411020042007100302402009450d00200410290b0240200c450d00200b10290b200341e8026a41086a22024200370300200342003703e80241dfc1c5004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802410121062003200d41016a3602e802200341d8026a4110200341e8026a410410030c190b20084101102a000b200141386a290300211c200141306a290300211d2001411d6a290000212a2001411c6a2d00002116200141196a2f00002117200141186a2d00002118200141156a2f00002119200141146a2d0000211a200141116a2f0000211b200141106a2d000021222001410c6a2802002123200141086a2802002105200141286a280200211f20012d001b212420012d0017212520012d0013212620012d0007212720012f0005212820012d000421292002411a6a290100211e200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541d588c3002107412a21040240024020022d0000450d004101210641002108410021090c010b41012106410021084100210920022d00014101470d002002410c6a2d000021092002410a6a2f01002108200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021060b200841ffff0371410874200441ff017172200941187472210820060d2a2003201e3703f0032003200a3a00ef032003200b3a00ee032003200c3b01ec032003200d3a00eb032003200e3a00ea032003200f3b01e803200320103a00e703200320113a00e603200320123b01e403200320133a00e303200320083600df03200320073600db03200320143a00da03200320153b01d8030240201d201c8450450d0041ef9cc100210741d00021080c2b0b0240202941ff01714101470d00200341e8026a200541067610cc0120032802e80221070240024020032802f0022005413f7122024b0d00410021020c010b200720024105746a2202290018212a20022d0017211620022d0016212420022f0014211720022d0013211820022d0012212520022f0010211920022d000f211a20022d000e212620022f000c211b20022d000b2122200228000721232002280003210520022d0002212720022f00002128410121020b024020032802ec02450d00200710290b2002450d2a0b2003202a37039804200320163a009704200320243a009604200320173b019404200320183a009304200320253a009204200320193b0190042003201a3a008f04200320263a008e042003201b3b018c04200320223a008b0420032023360087042003200536008304200320273a008204200320283b0180044111210820034198026a41a8c1c500411110b50141de9cc1002107200328029c0241002003280298021b201f470d2a200341e8026a41086a22024200370300200342003703e80241e0c2c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521020240024020032802e8022207417f460d002002450d002003200720074108200741084922081b22066b22073602ac042003200220066a22063602a804024020080d002003200720074104200741044922081b22096b3602ac042003200620096a3602a80420080d00200341e8026a200341a8046a102d20032802e802220a0d020b418f89c3004133104e000b41b19cc1002107412d21080c2b0b20032902ec02212b2002102920034190026a41cdc1c500411210b50120034180026a20032802940241002003280290021bad42004280a094a58d1d420010d304411410272202450d1020034180026a41086a290300211e200329038002212a200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d11200220032903d8033700142002412c6a200341f0036a290300370000200241246a200341d8036a41106a2903003700002002411c6a200341d8036a41086a290300370000200341e8016a20024134108401200341e8016a41106a290300212c20032903f001212d20032802e801210720021029202d420020071b202a54202c420020071b222c201e54202c201e511b450d1941f09dc1002107412e21080c1a0b4101210620022d000120022d0000720d1720012802042102200341e8026a41086a22074200370300200342003703e8024194c1c5004114200341e8026a1004200341d8026a41086a2007290300370300200320032903e8023703d802200320023602e802200341d8026a4110200341e8026a410410030c160b024020022d000120022d000072450d0041ad88c3002107412821080c290b200141086a28020021070240024020012d00044101460d00200141106a2d00002108200141146a2d00002106200141186a2d000021092001411c6a2d0000210420012f0005210220012d00072105200128020c210a20012f0011210b20012d0013210c20012f0015210d20012d0017210e20012f0019210f20012d001b2110200129001d211c0c010b200341e8026a200741067610cc0120032802e80221110240024020032802f0022007413f7122024b0d00410021120c010b201120024105746a2202290018211c20022d0017210420022d0016211020022f0014210f20022d0013210920022d0012210e20022f0010210d20022d000f210620022d000e210c20022f000c210b20022d000b21082002280007210a2002280003210720022d0002210520022f00002102410121120b024020032802ec02450d00201110290b2012450d280b2003201c3703d002200320043a00cf02200320103a00ce022003200f3b01cc02200320093a00cb022003200e3a00ca022003200d3b01c802200320063a00c7022003200c3a00c6022003200b3b01c402200320083a00c3022003200a3600bf02200320073600bb02200320053a00ba02200320023b01b802200341e8026a41086a22024200370300200342003703e80241d1c2c000410f200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521020240024020032802e8022207417f460d002002450d00200320073602ac04200320023602a804200341e8026a200341a8046a104120032802e8022208450d12200341f0026a280200210920032802ec02210d2007450d01200210290c010b4100210d41082108410021090b024002400240200941286c2206450d00410021070340200341e8026a41206a200820076a220241206a290300370300200341e8026a41186a200241186a290300370300200341e8026a41106a200241106a290300370300200341e8026a41086a200241086a290300370300200320022903003703e802200341e8026a200341b8026a412010d0040d022006200741286a2207470d000b0b4100210a200341003602b004200342083703a8044108210b0240200d0d004100210c0c020b200810294100210c0c010b20034180046a41086a200341e8026a41086a290300221c370300200341d8036a41086a2206201c370300200341d8036a41106a2204200341e8026a41106a290300370300200341d8036a41186a2205200341e8026a41186a290300370300200341d8036a41206a220a200341e8026a41206a290300370300200320032903e802221c370380042003201c3703d80341281027220b450d12200b20032903d803370300200b41206a200a290300370300200b41186a2005290300370300200b41106a2004290300370300200b41086a200629030037030002400240200941286c41586a2007470d004101210a4101210c0c010b200241286a210f2008200941286c6a220541586a21104101210a4101210c0340200f210202400340200341e8026a41206a2207200241206a290300370300200341e8026a41186a2206200241186a290300370300200341e8026a41106a2209200241106a290300370300200341e8026a41086a2204200241086a290300370300200320022903003703e802200341e8026a200341b8026a412010d0040d012005200241286a2202470d000c030b0b200341a8046a41206a2007290300221c37030020034180046a41086a2004290300221d37030020034180046a41106a2009290300221e37030020034180046a41186a2006290300222a37030020034180046a41206a201c370300200320032903e802222b370380042007201c3703002006202a3703002009201e3703002004201d3703002003202b3703e8020240200c200a470d00200a41016a220c200a490d2a200a410174220e200c200c200e491b220cad42287e221c422088a70d2a201ca7220e4100480d2a02400240200a0d00200e1027210b0c010b200b200a41286c200e1028210b0b200b450d160b200241286a210f200b200a41286c6a220e20032903e802370300200e41206a2007290300370300200e41186a2006290300370300200e41106a2009290300370300200e41086a2004290300370300200a41016a210a20102002470d000b0b0240200d450d00200810290b2003200a3602b0042003200c3602ac042003200b3602a8040b200341e8026a41086a22024200370300200342003703e80241d1c2c000410f200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341103602ec022003200341d8026a3602e802200341a8046a200341e8026a102f410021080240200a41286c22020d0041012104410021090c150b200241286d220941ffffff3f712009470d26200941057422024100480d262002102722040d1420024101102a000b4101210620022d000120022d0000720d15200141086a290300211c200341e8026a41086a22024200370300200342003703e8024198c3c000411c200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8022003201c3703e802200341d8026a4110200341e8026a410810030c140b4101210620022d000120022d0000720d14200141086a290300211c200341e8026a41086a22024200370300200342003703e8024184c3c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8022003201c3703e802200341d8026a4110200341e8026a410810030c130b410d4101102a000b412d4101102a000b41134101102a000b41334101102a000b41164101102a000b41364101102a000b418f89c3004133104e000b41164101102a000b41364101102a000b41044101102a000b41084101102a000b41c8c3c000200520021037000b41144101102a000b41344101102a000b418f89c3004133104e000b41284108102a000b200e4108102a000b20024101102a000b0240200a450d00200a41286c21064100210820042102200b21070340200741086a290000211c200741106a290000211d2007290000211e200241186a200741186a290000370000200241106a201d370000200241086a201c3700002002201e370000200841016a2108200241206a2102200741286a2107200641586a22060d000b0b0240200c450d00200b10290b200341e8026a41186a200341b8026a41186a290300370300200341e8026a41106a200341b8026a41106a290300370300200341e8026a41086a200341b8026a41086a290300370300200320032903b8023703e80241012106200341e8026a41012004200810ba012009450d00200410290b410021070c070b41ad88c300210741282108410121090c130b200341e8026a41086a22024200370300200342003703e80241b4c3c0004113200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a1005210202400240024002400240024002400240024020032802e8022207417f460d002002450d00200320073602ac04200320023602a804200341e8026a200341a8046a104720032802e802220c450d03200341f0026a280200210f20032802ec02211102402007450d00200210290b200f450d0541c19ec100210741232108200c290300201d54200c41086a290300222c201c54202c201c511b450d07200341e8026a41086a22024200370300200342003703e80241d1c2c000410f200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a1005210220032802e8022207417f460d012002450d01200320073602ac04200320023602a804200341e8026a200341a8046a104120032802e8022204450d04200341f0026a280200210520032802ec02210b2007450d02200210290c020b41bf9dc1002107413121080c080b4100210b41082104410021050b2004200541286c6a21092004210241002107024003400240200920026b41f8004b0d0020092002460d062004200541286c6a2109034020034180046a2002460d032007200220034180046a412010d00422064100476a21072006450d032009200241286a2202470d000c070b0b200220034180046a460d012007200220034180046a412010d00422064100476a21072006450d01200241286a220620034180046a460d012007200620034180046a412010d00422064100476a21072006450d01200241d0006a220620034180046a460d012007200620034180046a412010d00422064100476a21072006450d01200241f8006a220620034180046a460d01200241a0016a21022007200620034180046a412010d00422064100476a210720060d000b0b2007202b422088a7490d0341e49ec100210741362108200b450d04200410290c040b418f89c3004133104e000b418f89c3004133104e000b41f4c2c000410041001037000b0240200b450d00200410290b200341a8026a10b701200341e8026a20034180046a10b60120032802e8024101460d01024020032802ac02450d0020032802a80210290b419e9ec10021070b2011450d01200c10290c010b20032802a802212602400240024002400240024020032802b00222020d004200212e4200212f0c010b20032802ec022106200241216c2107202641016a2102200341f0026a2802002208410876210941012008411f7174210d20084105764107712204417f73210e20034188036a21054200212e4200212f034002402002417f6a2d00004101470d00200341e8026a200210b90120032903e8024201520d002003280290032006490d0020052903002130200341e8026a41106a2903002131200329038003213220032903f0022133200341e0016a41a8c1c500411110b501200341a8046a41186a200241186a290000370300200341a8046a41106a200241106a290000370300200341a8046a41086a200241086a290000370300200320022900003703a804200320093602c804200341b8026a200341a8046a10b8014200212c4200212d0240200420032802c00222084f0d002008200e6a220b20084f0d04203020317c203220337c222c203254ad7c420020032802b802200b4102746a280200200d7122081b212d202c420020081b212c0b024020032802bc02450d0020032802b80210290b202d202f7c202c202e7c222e202c54ad7c212f0b200241216a21022007415f6a22070d000b0b200c200f41306c6a2106200c210202400240024002400240024002400240024003400240200620026b4190014b0d00024020022006460d00034041012108200241106a220220034180046a460d04200220034180046a412010d004450d04200241206a22022006470d000b0b41002108202e201d85202f201c858450450d0220034180046a41186a290300211e20034190046a290300212a20034188046a290300212c200329038004212d200c201c370308200c201d370300200c202d370310200c41186a202c370300200c41206a202a370300200c41286a201e370300200f4115490d0c200f4101762221ad42307e221c422088a70d1c201ca72202417f4c0d1c20020d03410821254108210b0c040b41012108200241106a220720034180046a460d01200720034180046a412010d004450d01200241c0006a220720034180046a460d01200720034180046a412010d004450d01200241f0006a220720034180046a460d01200720034180046a412010d004450d01200241a0016a220720034180046a460d01200241c0016a2102200720034180046a412010d0040d000b0b411410272202450d07200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d06200220032903d8033700142002412c6a200341d8036a41186a290300370000200241246a200341d8036a41106a2903003700002002411c6a200341d8036a41086a290300370000200341c8016a20024134108401200341c8016a41106a290300211c20032903d001211d20032802c801210720021029200341d8036a201d420020071b221d202a201d201d202a56201c420020071b222c201e56202c201e511b22021b221c7d202c201e202c20021b222d7d201d201c54ad7d1089010240202a201c7d222c201e202d7d202a201c54ad7d221d84500d00411810272202450d06200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d05200220032903d803370018200241306a200341d8036a41186a290300370000200241286a200341d8036a41106a290300370000200241206a200341d8036a41086a290300370000200341b0016a20024138108401200341b0016a41106a290300212a20032903b801211e20032802b001210720021029200341d8036a201e420020071b221e202c201e201e202c56202a420020071b222a201d56202a201d511b22021b222c7d202a201d202a20021b221d7d201e202c54ad7d109c01201d202d7c202c201c7c222a202c54ad7c211e0b200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022202417f470d004200211c4200211d0c010b200342003703f002200342003703e802200341e8026a20072002411020024110491b10ce041a2002410f4d0d04200341f0026a290300211d20032903e802211c200710290b200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d80220034200201d201e7d201c202a54ad7d221e201c202a7d222a201c56201e201d56201e201d511b22021b3703f00220034200202a20021b3703e802200341d8026a4110200341e8026a41101003419a9fc10041b09fc10020081b21074116410f20081b2108410121020c0b0b200210272225450d012025210b0b200c41506a2128200c41306a211f200c41f07e6a2129410421124100212741002105200f2117034020172104410021174101210902402004417f6a2208450d00024002400240024002400240200c200841306c6a2202290300200441306c220e200c6a41a07f6a2207290300221d54200241086a290300221e200741086a290300221c54201e201c511b0d002004417e6a210d2029200e6a2102410021174100210703400240200d2007470d00200421090c080b201d2002290300222a5a2108201c200241086a290300221e512106201c201e5a2109200241506a2102200741016a2107202a211d201e211c2008200920061b0d000b200741016a21092007417f7320046a21080c010b2029200e6a210202400340024020084101470d00410021080c020b201d2002290300222a542107201c200241086a290300221e512106201c201e542109200241506a21022008417f6a2108202a211d201e211c2007200920061b0d000b0b20042008490d012004200f4b0d03200420086b22094101762206450d002028200e6a2102200c200841306c6a21070340200341e8026a41286a220d200741286a220e290300370300200341e8026a41206a2210200741206a2213290300370300200341e8026a41186a2214200741186a2215290300370300200341e8026a41106a2216200741106a2217290300370300200341e8026a41086a2218200741086a2219290300370300200320072903003703e802200241086a221a290300211c200241106a221b290300211d200241186a2222290300211e200241206a2223290300212a200241286a2224290300212c20072002290300370300200e202c3703002013202a3703002015201e3703002017201d3703002019201c3703002024200d2903003703002023201029030037030020222014290300370300201b2016290300370300201a2018290300370300200220032903e802370300200741306a2107200241506a21022006417f6a22060d000b0b024020080d00200821170c050b0240200941094d0d00200821170c050b2004200f4b0d01200420086b2106201f200841306c6a210d034020042008417f6a2217490d040240200420176b22094102490d00200c200841306c6a2202290300200c201741306c6a2208290300221e5a200241086a2207290300221d200841086a220e290300221c5a201d201c511b0d00200341e8026a41186a2213200841286a2210290300370300200341e8026a41106a2214200841206a2215290300370300200341e8026a41086a2216200841186a2218290300370300200320082903103703e80220082002290300370300200e2007290300370300200841106a200241106a2903003703002018200241186a2903003703002015200241206a2903003703002010200241286a29030037030041012107024020094103490d002008290360201e5a200841e8006a290300221d201c5a201d201c511b0d004102210e200d211003402010220241506a22072002290300370300200741286a200241286a290300370300200741206a200241206a290300370300200741186a200241186a290300370300200741106a200241106a290300370300200741086a200241086a2903003703002006200e2207460d01200741016a210e200241306a2210290300201e5a200241386a290300221d201c5a201d201c511b450d000b0b2002201e3703002002201c3703082008200741306c6a220241286a2013290300370300200241206a2014290300370300200241186a2016290300370300200220032903e8023703100b2017450d05200d41506a210d200641016a2106201721082009410a4f0d050c000b0b20082004103e000b20042008417f6a2217490d010b2004200f107f000b20172004103e000b02400240024020272005470d00202741016a22022027490d1c20274101742207200220022007491b220241ffffffff01712002470d1c200241037422074100480d1c0240024020270d002007102721120c010b201220274103742007102821120b2012450d01200221270b201220054103746a2202200936020420022017360200200541016a2213210520134102490d010340024002400240024020122013220e417f6a22134103746a2202280200450d00200e41037420126a220941746a2802002206200228020422074d0d0041022105200e41024d0d062012200e417d6a22024103746a2802042208200720066a4d0d0141032105200e41034d0d06200941646a280200200820066a4d0d01200e21050c060b200e4103490d01200228020421072012200e417d6a22024103746a28020421080b20082007490d010b200e417e6a21020b024002400240024002400240200e200241016a22184d0d00200e20024d0d01201220024103746a2214280204221920142802006a2202201220184103746a22152802002216490d022002200f4b0d03201441046a211a200c201641306c6a220d2015280204221041306c22076a2106200241306c2108200220166b220420106b220220104f0d0420252006200241306c220710ce041a200b20076a21090240024020104101480d00200241014e0d010b20062102200b21070c060b202820086a21082006210203402008200241506a2206200941506a22042004290300200629030054200441086a290300221c200641086a290300221d54201c201d511b22051b2207290300370300200841086a200741086a290300370300200841106a200741106a290300370300200841186a200741186a290300370300200841206a200741206a290300370300200841286a200741286a2903003703002009200420051b21090240200d2006200220051b2202490d00200b21070c070b200841506a2108200b2107200b2009490d000c060b0b41d8e3c1002018200e1037000b41d8e3c1002002200e1037000b20162002103e000b2002200f107f000b2025200d200710ce041a200b20076a21090240024020104101480d00200420104a0d010b200d2102200b21070c010b200c20086a2105200b2107200d210203402002200620072006290300200729030054200641086a290300221c200741086a290300221d54201c201d511b22041b2208290300370300200241086a200841086a290300370300200241106a200841106a290300370300200241186a200841186a290300370300200241206a200841206a290300370300200241286a200841286a2903003703002007200741306a20041b2107200241306a2102200641306a200620041b220620054f0d01200920074b0d000b0b20022007200920076b220820084130706b10ce041a201a201920106a360200201420163602002015201541086a2018417f73200e6a41037410cf041a20132105201341014d0d020c000b0b20074104102a000b20170d000b02402027450d00201210290b2021450d08202510290c080b20024108102a000b418f89c3004133104e000b41384101102a000b41184101102a000b41344101102a000b41144101102a000b41f4c2c000200b20081037000b200f4102490d00200f417f6a2108200c200f41306c6a21044101210603400240024002400240200f20082202417f6a2208490d00200f20086b22074102490d03200c200241306c6a2202290300200c200841306c6a2209290300221e5a200241086a2205290300221d200941086a220b290300221c5a201d201c511b0d03200341e8026a41186a220d200941286a220e290300370300200341e8026a41106a2210200941206a2212290300370300200341e8026a41086a2213200941186a2214290300370300200320092903103703e80220092002290300370300200b2005290300370300200941106a200241106a2903003703002014200241186a2903003703002012200241206a290300370300200e200241286a2903003703004101210520074103490d022009290360201e5a200941e8006a290300221d201c5a201d201c511b0d02410021052004210703402007220241506a22072002290300370300200741286a200241286a290300370300200741206a200241206a290300370300200741186a200241186a290300370300200741106a200241106a290300370300200741086a200241086a29030037030020062005220b460d02200b417f6a2105200241306a2207290300201e5a200241386a290300221d201c5a201d201c511b0d020c000b0b2008200f103e000b4102200b6b21050b2002201e3703002002201c3703082009200541306c6a220241286a200d290300370300200241206a2010290300370300200241186a2013290300370300200220032903e8023703100b200441506a21042006417f6a210620080d000b0b2003200f3602b004200320113602ac042003200c3602a804200341e8026a41086a22024200370300200342003703e80241b4c3c0004113200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341103602ec022003200341d8026a3602e802200341a8046a200341e8026a103402402011450d00200c10290b41002102410021070b024020032802ac02450d00202610290b0240024020020d00202ba7450d120c010b02402011450d00200c10290b202ba7450d110b200a10290c100b202ba7450d0f200a10290c0f0b0b024020032802ac04450d0020032802a80410290b024020070d0041919bc10021070c0e0b2003201c37038003200320093a00ff02200320043a00fe02200320053b01fc022003200a3a00fb022003200b3a00fa022003200c3b01f8022003200d3a00f7022003200e3a00f6022003200f3b01f402200320103a00f302200320123600ef02200320113600eb02200320023a00ea02200320063b01e8020240200341e8026a20034180046a412010d0040d0020034180046a201610cd0120034180046a428080e983b1de16420010ad01200342f0f2bda9c6add9b1f4003703d80220034188016a41888dc300410d109401200320032903900142002003280288011b3703b802200341a8046a20034180046a10930120032802ac04210720032802a804210220032802b0042108200341bc046a200341d8026a36020020032002200841286c6a3602b404200320023602b004200320073602ac04200320023602a8042003200341b8026a3602b804200341d8036a200341a8046a104a200341a8046a41086a200341d8036a41086a280200360200200320032903d8033703a80420034180046a200341a8046a10a701410021070c0e0b41f89ac1002107411921080c0d0b0b024020032802ec02450d0020032802e80210290b024020070d0041cb99c10021070c0c0b2003201c37039804200320093a009704200320043a009604200320053b0194042003200a3a0093042003200b3a0092042003200d3b0190042003200e3a008f042003200f3a008e04200320103b018c04200320113a008b0420032013360087042003201236008304200320023a008204200320063b018004200341e8026a202041067610bc0141002107024002402020413f71220220032802f0024f0d0020032802e802200241216c6a22022d00004101470d0020022f00012108200241196a290000211c200241186a2d00002106200241176a2d00002109200241156a2f00002104200241146a2d00002105200241136a2d0000210a200241116a2f0000210b200241106a2d0000210d2002410f6a2d0000210e2002410d6a2f0000210f2002410c6a2d00002110200241086a2800002112200241046a2800002111200241036a2d00002102410121070c010b0b024020032802ec02450d0020032802e80210290b024020070d0041e49ac1002107411421080c0c0b2003201c3703c004200320063a00bf04200320093a00be04200320043b01bc04200320053a00bb042003200a3a00ba042003200b3b01b8042003200d3a00b7042003200e3a00b6042003200f3b01b404200320103a00b304200320123600af04200320113600ab04200320023a00aa04200320083b01a804024020034180046a200341b8026a412010d004450d0041c29ac1002107411221080c0c0b0240200341a8046a200341d8036a412010d004450d0041d49ac1002107411021080c0c0b200341e8026a41186a2213200341d8036a41186a2214290300370300200341e8026a41106a2215200341d8036a41106a2216290300370300200341e8026a41086a2217200341d8036a41086a2218290300370300200320032903d8033703e802410021022003410036028803200341d8026a200341e8026a10b8010240024020032802e00222050d004101210e4100210f0c010b4100210d4100210f4101210e4100211103402005417f4c0d0a20032802dc02211220032802d80221100240024020051027220a450d00024002400240200541027422020d00410021040c010b201020026a210b410021042010210903402009280200210702404120102722020d0041204101102a000b200941046a210920022007411f763a001f200220074101713a000020022007411e764101713a001e20022007411d764101713a001d20022007411c764101713a001c20022007411b764101713a001b20022007411a764101713a001a200220074119764101713a0019200220074118764101713a0018200220074117764101713a0017200220074116764101713a0016200220074115764101713a0015200220074114764101713a0014200220074113764101713a0013200220074112764101713a0012200220074111764101713a0011200220074110764101713a001020022007410f764101713a000f20022007410e764101713a000e20022007410d764101713a000d20022007410c764101713a000c20022007410b764101713a000b20022007410a764101713a000a200220074109764101713a0009200220074108764101713a00082002200741ff017122074107763a0007200220074106764101713a0006200220074105764101713a0005200220074104764101713a0004200220074103764101713a0003200220074102764101713a0002200220074101764101713a00014100210702400240024002400340200741206a220841034d0d010240200220076a2208411f6a2d0000450d002007411f6a21060c040b02402008411e6a2d0000450d002007411e6a21060c040b02402008411d6a2d00000d002007417c6a21072008411c6a2d00000d030c010b0b2007411d6a21060c020b03402008450d03200220086a21072008417f6a220621082007417f6a2d0000450d000c020b0b200741206a21060b200641016a22082006490d000240200520046b2008412020084120491b22074f0d00200420076a22072004490d1220054101742206200720072006491b22074100480d120240024020050d0020071027210a0c010b200a200520071028210a0b200a450d04200721050b200a20046a2106410021070240034020074120460d01200620076a200220076a2d00004101713a00002008200741016a2207470d000b0b200420076a21040b200210292009200b470d000b0b02402012450d00201010290b0240200f200d6b2004490d00200d20046a21020c030b200d20046a2202200d490d0e200f4101742207200220022007491b22074100480d0e02400240200f0d0020071027210e0c010b200e200f20071028210e0b0240200e450d002007210f0c030b20074101102a000b20074101102a000b20054101102a000b200e200d6a200a200410ce041a02402005450d00200a10290b201320142903003703002015201629030037030020172018290300370300200320032903d8033703e8022003201141016a221136028803200341d8026a200341e8026a10b8012002210d20032802e00222050d000b0b024020032802dc02450d0020032802d80210290b200341e8026a41086a22074200370300200342003703e80241d8c3c0004112200341e8026a1004200341d8026a41086a2007290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022206417f460d002007450d00200320063602ac02200320073602a802200341e8026a200341a8026a102d20032802e802220a450d03200341f0026a280200210820032802ec02210b2006450d01200710290c010b4101210a410021084100210b0b02400240200841ffffff3f7122072002200220074b1b2208450d004100210720034180036a2106200341f8026a2109200341f0026a2104200a210203400240200e20076a2d0000450d00200642003703002009420037030020044200370300200342003703e802200341e8026a2002460d002002200341e8026a412010d004450d00200341e8026a200210b6014101210520032802e8024101470d0020032802ec02200c4d0d030b200241206a2102200741016a22072008490d000b0b410021050b0240200b450d00200a10290b0240200f450d00200e10290b200341b8026a200341d8036a20051b22072021202020051b10cd01200342f0f2bda9c6add9b1f4003703a002200341f0006a41888dc300410d10940120032003290378420020032802701b3703a802200341e8026a200710930120032802ec02210820032802e802210220032802f0022106200341fc026a200341a0026a36020020032002200641286c6a3602f402200320023602f002200320083602ec02200320023602e8022003200341a8026a3602f802200341d8026a200341e8026a104a200341e8026a41086a200341d8026a41086a280200360200200320032903d8023703e8022007200341e8026a10a701024002402005450d00411810272202450d04200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d05200220032903b802370018200241306a200341d0026a290300370000200241286a200341b8026a41106a290300370000200241206a200341b8026a41086a290300370000200341186a20024138108401200341186a41106a290300211e2003290320211d20032802182107200210294200211c200341b8026a201d420020071b221d201d428080e983b1de16201d428080e983b1de16544100201e420020071b222a501b22021b221e7d202a202a420020021b222b7d201d201e54ad7d109c01200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022202417f470d004200211d0c010b200342003703f002200342003703e802200341e8026a20072002411020024110491b10ce041a2002410f4d0d07200341f0026a290300211d20032903e802211c200710290b200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d80220034200201d202b7d201c201e54ad7d222a201c201e7d221e201c56202a201d56202a201d511b22021b3703f00220034200201e20021b3703e802200341d8026a4110200341e8026a41101003200341013a00ec02200341083a00e802200341e8026a4105722102200341e8026a21080c010b200341e0006a200341b8026a109501024002402003290360200341e0006a41086a29030084500d00411810272202450d08200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d09200220032903d803370018200241306a200341f0036a290300370000200241286a200341d8036a41106a290300370000200241206a200341d8036a41086a290300370000200341c8006a20024138108401200341c8006a41106a290300211d2003290350211c2003280248210720021029411410272202450d0a200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c40370000200241144134102822020d0141344101102a000b419d88c0002107412221080c0d0b200220032903b8023700142002412c6a200341b8026a41186a290300370000200241246a200341b8026a41106a2903003700002002411c6a200341b8026a41086a290300370000200341306a20024134108401200341306a41106a290300212a2003290338211e2003280230210820021029200341b8026a201e420020081b222b201c420020071b221c428080e983b1de16201c428080e983b1de16544100201d420020071b221d501b22021b221e7c222c202a420020081b201d420020021b222a7c202c202b54ad7c108901200341d8036a201c201e7d201d202a7d201c201e54ad7d109c01200341f5026a200341d8036a41086a290300370000200341fd026a200341d8036a41106a29030037000020034185036a200341d8036a41186a290300370000200341003a00ec02200341083a00e802200320032903d8033700ed022003418d036a2102200341e8026a21080b200220032903b802370000200241186a200341b8026a41186a290300370000200241106a200341b8026a41106a290300370000200241086a200341b8026a41086a2903003700004100210741b8d6c50041002008108801410121060b410121090c0c0b418f89c3004133104e000b41184101102a000b41384101102a000b418f89c3004133104e000b41184101102a000b41384101102a000b41144101102a000b1039000b102b000b4184efc2002107411521080b41012106410121090c010b41012109410021062004450d00200510290b02402001280200417f6a220241014b0d000240024020020e020001000b2009450d01200141086a280200450d01200128020410290c010b2006450d00200141086a280200450d00200128020410290b2000200836020420002007360200200341d0046a24000b110020012000280200200028020410e9030bae2505077f047e037f027e067f23004180026b22052400200541e0016a41086a22064200370300200542003703e00141d8c3c0004112200541e0016a1004200541f8006a41086a2006290300370300200520052903e00137037820054100360248200541f8006a4110200541c8006a1005210602400240024002400240024002400240024002400240024002400240024002400240024002400240024020052802482207417f460d002006450d00200520073602e401200520063602e001200541c8006a200541e0016a102d20052802482208450d02200541d0006a2802002109200528024c210a2007450d01200610290c010b41012108410021094100210a0b200541e0016a41086a22074200370300200542003703e0014114210641e0c2c0004114200541e0016a1004200541f8006a41086a2007290300370300200520052903e0013703780240200541f8006a411041b8d6c50041004100100b417f460d0041bf9fc1002107412e21060c120b200541c0006a41a8c1c500411110b50141ed9fc10021072005280244410020052802401b2003470d11024020090d004181a0c100210741c10021060c120b02402009200241086a280200220b4f0d0041c2a0c1002107413c21060c120b200541306a2001109501200541306a41086a290300210c2005290330210d200541c8006a200110b9010240024020052903484201510d00411410272207450d03200741106a41002800bb8c40360000200741086a41002900b38c40370000200741002900ab8c403700004134210620074114413410282207450d04200720012900003700142007412c6a200141186a290000370000200741246a200141106a2900003700002007411c6a200141086a290000370000200541186a20074134108401200541186a41106a290300210e200528021821092005290320210f2007102941a2a1c1002107200f428180e983b1de16544100200e501b0d132009450d13200541e0016a2004410676220910bc0141002106024020052802e8012004413f7122074d0d004101410220052802e001200741216c6a2d00001b21060b024020052802e401450d0020052802e00110290b20064102490d01200541f8006a200910bc01200541e0016a41186a2204200141186a290000370300200541e0016a41106a2210200141106a290000370300200541e0016a41086a2211200141086a290000370300200520012900003703e001200528028001220620074d0d0520052802782212200741216c6a220641013a0000200620052903e001370001200641096a2011290300370000200641116a2010290300370000200641196a2004290300370000410e10272206450d06200641066a41002900dac440370000200641002900d4c4403700002006410e411c10282206450d072006200936000e200541e0016a41186a22074200370300200541e0016a41106a22094200370300200541e0016a41086a22044200370300200542003703e00120064112200541e0016a1000200541c0016a41186a2007290300370300200541c0016a41106a2009290300370300200541c0016a41086a2004290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541f8006a200541e0016a103520061029200528027c450d0d201210290c0d0b200541d8006a290300210f2005290350210e200541c0016a200441067610bc01410021092004413f71220620052802c8014f0d0e20052802c001200641216c6a22072d00004101470d0e200541b2016a200741036a2d00003a000020054198016a41086a200741146a290000370300200541a5016a200741196a290000370000200520072f00013b01b00120052007410c6a29000037039801200741086a2800002106200741046a2800002107410121090c0f0b200541106a41b9c1c500411410b50120054198016a2005280214410020052802101b220910bc010240024020052802a00122060d00200541e0016a2001428080d287e2bc2d4200410810900120052802e0014101470d0120052802e801210620052802e4012107200528029c01450d1320052802980110290c130b200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200541c0016a2107200d210e200641c000460d0b0c0a0b200541e0016a41106a290300211320052903e8012114200541e0016a41086a22074200370300200542003703e00141b18ac0004116200541e0016a1004200541f8006a41086a2007290300370300200520052903e001370378200541003602e001200541f8006a4110200541e0016a1005210720052802e0012204417f460d072007450d07200542003703e801200542003703e001200541e0016a20072004411020044110491b10ce041a2004410f4d0d06200541e8016a290300210f20052903e001210e200710290c080b418f89c3004133104e000b41144101102a000b41344101102a000b41c8c3c000200720061037000b410e4101102a000b411c4101102a000b418f89c3004133104e000b4200210e4200210f0b200541e0016a41086a22074200370300200542003703e00141b18ac0004116200541e0016a1004200541f8006a41086a2007290300370300200520052903e00137037820054200200f20137d200e201454ad7d2213200e20147d2214200e562013200f562013200f511b22071b3703e80120054200201420071b3703e001200541f8006a4110200541e0016a41101003200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200c200d428080aef89dc3527c220e200d54ad7c427f7c210c200541c0016a21070b200541e0016a41186a200741186a290000370300200541e0016a41106a200741106a290000370300200541e0016a41086a200741086a290000370300200520072900003703e00102400240200528029c012006460d0020052802980121070c010b200641016a22072006490d0720064101742204200720072004491b2204ad42217e220d422088a70d07200da722104100480d070240024020060d002010102721070c010b200528029801200641216c2010102821070b2007450d032005200436029c0120052007360298010b2007200641216c6a220741013a0000200720052903e001370001200741096a200541e0016a41086a2204290300370000200741116a200541e0016a41106a290300370000200741196a200541f8016a2903003700002005200641016a3602a00102402006413f470d0020044200370300200542003703e00141b9c1c5004114200541e0016a1004200541f8006a41086a2004290300370300200520052903e0013703782005200941016a3602e001200541f8006a4110200541e0016a410410030b200e210d0b200541e0016a41086a20054198016a41086a28020036020020052005290398013703e0012009200541e0016a10ce010b4200210e200541086a2001428080e983b1de16420010ac01024020052802082207450d00200528020c21060c060b200541cdc1c500411210b5012005280200210620052802042107200541e0016a41086a22094200370300200542003703e00141cdc1c5004112200541e0016a1004200541f8006a41086a2009290300370300200520052903e0013703782005200741016a410120061b3602e001200541f8006a4110200541e0016a410410034200210f0c030b20104101102a000b0b024020052802c401450d0020052802c00110290b0240024020090d00410121094113210641fea0c10021070c010b20054194016a41026a200541b0016a41026a2d00003a0000200541c0016a41086a20054198016a41086a290300370300200541c0016a410d6a20054198016a410d6a290000370000200520052f01b0013b01940120052005290398013703c001410021090b20054190016a41026a220420054194016a41026a2d00003a0000200541f8006a41086a2210200541c0016a41086a290300370300200541f8006a41106a200541c0016a41106a290300370300200520052f0194013b019001200520052903c00137037820090d02200541f3016a2010290300370000200541f8016a20054185016a290000370000200520052f0190013b01e001200520063600e701200520073600e301200520052903783700eb01200520042d00003a00e201200541e0016a2001460d00200541e0016a2001412010d004450d004191a1c1002107411121060c020b200542f0f2bda9c6add9b1f4003703b801200541b8016a2001200d200c427f410e10a801200541e0006a200c3703002005200d3703582005200f3703502005200e3703482005200336026c20052003360268024002400240411310272206450d002006410f6a41002800f9c340360000200641086a41002900f2c340370000200641002900eac340370000024020064113413310282206450d00200620012900003700132006412b6a200141186a290000370000200641236a200141106a2900003700002006411b6a200141086a290000370000200541e0016a41186a22074200370300200541e0016a41106a22034200370300200541e0016a41086a22094200370300200542003703e00120064133200541e0016a1000200541c0016a41186a2007290300370300200541c0016a41106a2003290300370300200541c0016a41086a2009290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541c8006a200541e0016a10b301200610292002280204211020022802002103024002400240200b41057622150d0041042116410421170c010b2015410274220610272216450d01201621170b200b450d030240024020150d00410410272216450d0141012115201621170b20174100360200200b417f6a210941012118410021024100210602400340024002400240024002400240024002400240201820024d0d00201720024102746a22072007280200200320066a2d00002006411f71746a360200024020092006460d00200641016a2206411f710d0920152018470d08201541016a22072015490d1220154101742204200720072004491b220741ffffffff03712007470d122007410274220441004e0d070c120b02402010450d00200310290b410021190340200541c8006a41186a2207200141186a290000370300200541c8006a41106a2203200141106a290000370300200541c8006a41086a2209200141086a290000370300200520012900003703482018410820184108491b2202410274221110272206450d0220062017201110ce042112411310272206450d032006410f6a41002800d0c440360000200641086a41002900c9c440370000200641002900c1c44037000020064113413310282206450d04200620052903483700132006412b6a2007290300370000200641236a20032903003700002006411b6a20092903003700002006413341e6001028221a450d05201820026b2118201720116a2117201a2019360033200541e0016a41186a22064200370300200541e0016a41106a22074200370300200541e0016a41086a22034200370300200542003703e001201a4137200541e0016a1000200541c0016a41186a2006290300370300200541c0016a41106a2007290300370300200541c0016a41086a2003290300370300200520052903e0013703c00141002106200541003602e801200542013703e00120052002360278200541f8006a200541e0016a1030410020052802e80122046b210720052802e40121090340200420066a2103201220066a280200210b02400240200920076a4104490d0020052802e00121020c010b200341046a22022003490d1420094101742210200220022010491b22104100480d140240024020090d002010102721020c010b20052802e00120092010102821020b2002450d08200520103602e401200520023602e001201021090b2005200341046a3602e801200220046a20066a200b3600002007417c6a21072011200641046a2206470d000b200541c0016a41202002200420066a100302402009450d00200210290b201a102920121029201941016a211920180d000b2015450d10201610290c100b41c8c3c000200220181037000b20114104102a000b41134101102a000b41334101102a000b41e6004101102a000b20104101102a000b0240024020150d002004102721160c010b201620154102742004102821160b2016450d0320162117200721150b201720184102746a4100360200200241016a2102201841016a21180b200b20064b0d000b41f4c2c0002006200b1037000b20044104102a000b41044104102a000b20064104102a000b41334101102a000b41134101102a000b2010450d00200310290b410021070240200a450d00200810290b0c020b102b000b0240200a450d00200810290b200241046a280200450d00200228020010290b200020063602042000200736020020054180026a24000bed0202047f017e230041d0006b22022400024002400240410f10272203450d00200341076a41002900f3ec42370000200341002900ecec423700002003410f411e10282203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033037030820024100360230200241086a4120200241306a100521040240024020022802302201417f460d002002200136022c20022004360228200241306a200241286a102d20022802302205450d042002290234210602402001450d00200410290b20002006370204200020053602000c010b20004100360208200042013702000b20031029200241d0006a24000f0b410f4101102a000b411e4101102a000b418f89c3004133104e000bee08010c7f23004190016b22022400200241086a2001410676220310bc01024002400240024002400240200228021022042001413f7122014d0d002002280208200141216c6a220141003a000020012002290028370001200141096a200241286a41086a2204290000370000200141116a200241286a41106a2205290000370000200141196a200241286a41186a22062900003700002004200241086a41086a280200360200200220022903083703282003200241286a10ce01200241cdc1c500411210b5012002280200210120022802042103200442003703002002420037032841cdc1c5004112200241286a1004200241f0006a41086a220720042903003703002002200229032837037020022003417f6a417f20011b360228200241f0006a4110200241286a410410032006200041186a22082900003703002005200041106a22092900003703002004200041086a220a2900003703002002410036024820022000290000370328200241186a200241286a10b80102402002280220450d00410021030340200241d0006a41186a220b2008290000370300200241d0006a41106a220c2009290000370300200241d0006a41086a220d200a29000037030020022000290000370350411310272201450d032001410f6a41002800d0c440360000200141086a41002900c9c440370000200141002900c1c44037000020014113413310282201450d04200120022903503700132001412b6a200b290300370000200141236a200c2903003700002001411b6a200d2903003700002001413341e60010282201450d05200120033600332006420037030020054200370300200442003703002002420037032820014137200241286a1000200241f0006a41186a2006290300370300200241f0006a41106a20052903003703002007200429030037030020022002290328370370200241f0006a4120100c20011029200341016a21030240200228021c450d00200228021810290b20062008290000370300200520092900003703002004200a2900003703002002200336024820022000290000370328200241186a200241286a10b80120022802200d000b0b0240200228021c450d00200228021810290b411310272201450d042001410f6a41002800f9c340360000200141086a41002900f2c340370000200141002900eac34037000020014113413310282201450d05200120002900003700132001412b6a200041186a290000370000200141236a200041106a2900003700002001411b6a200041086a290000370000200241286a41186a22034200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820014133200241286a1000200241f0006a41186a2003290300370300200241f0006a41106a2004290300370300200241f0006a41086a200529030037030020022002290328370370200241f0006a4120100c2001102920024190016a24000f0b41c8c3c000200120041037000b41134101102a000b41334101102a000b41e6004101102a000b41134101102a000b41334101102a000b830201047f230041c0006b2202240002400240410e10272203450d00200341066a41002900dac440370000200341002900d4c4403700002003410e411c10282203450d012003200036000e200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034112200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a1035200310290240200141046a280200450d00200128020010290b200241c0006a24000f0b410e4101102a000b411c4101102a000be80102027f027e230041206b2203240002400240411410272204450d00200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d01200420022900003700142004412c6a200241186a290000370000200441246a200241106a2900003700002004411c6a200241086a290000370000200341086a20044134108401200341086a41106a290300210520032903102106200328020821022004102920002005420020021b37030820002006420020021b370300200341206a24000f0b41144101102a000b41344101102a000bef0101057f230041c0006b220524000240024020030d00200041003602000c010b2003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1000200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a10012104024020052802202203417f460d002000200336020420002004360200200041086a20033602000c010b200041003602000b200541c0006a24000bfd0101057f23004190016b22032400200341086a2002108c010240024020032d000822024102470d00200041003a00000c010b200341f0006a200341c8006a290300370300200341f8006a2204200341d0006a29030037030020034180016a2205200341d8006a29030037030020034188016a2206200341e0006a2903003703002003200341c0006a29030037036802402002450d00200041003a00000c010b2003413c6a2802002102200341386a280200210720002003290370370001200041013a0000200041196a2006290300370000200041116a2005290300370000200041096a20042903003700002002450d00200710290b20034190016a24000baf0201047f230041c0006b2202240002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041b8d6c50041004100100b210120031029200241c0006a24002001417f470f0b41174101102a000b41374101102a000b840102017f037e230041e0006b2203240020032002108c010240024020032d000022024102470d00420021040c010b2002410173ad2104200341106a2903002105200341086a290300210620020d00200341346a280200450d00200341306a28020010290b2000200637030820002004370300200041106a2005370300200341e0006a24000be6230a057f047e0c7f067e057f027e047f037e017f037e230041f0046b22022400200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b200241e4006a20042f0106360200200241c8006a41186a4100360200200241dc006a2004360200200220033602682002410036025842002107200242003703502002200136024c20024100360248200241b0016a200241c8006a10d5010240024020022903d00122084202520d00420021094200210a0c010b200241b0016a41c0006a210b200241b0016a41386a210c200241b0016a410472210d2002418d026a210e200241b0016a41086a210320024190036a41386a210f200241e0016a2110200241f8016a211141808bc20041f88ac2006b200241e8036a6b200241e8036a41206a6a410f6a211242002107420021094200210a034020024190016a41186a2205200241b0016a41186a220129030037030020024190016a41106a2206200241b0016a41106a220429030037030020024190016a41086a22132003290300370300200241f0006a41086a2214200e41086a290000370300200241f0006a41106a2215200e41106a290000370300200241f0006a41186a2216200e41186a290000370300200220022903b001370390012002200e290000370370201029030021172011290300211820022903d801211920022903f001211a20022903e801211b200229038002211c200228028802211d20022d008c02211e200241b0026a41186a221f2005290300370300200241b0026a41106a22202006290300370300200241b0026a41086a2206201329030037030020022002290390013703b002200241d0026a41186a22052016290300370300200241d0026a41106a22132015290300370300200241d0026a41086a22152014290300370300200220022903703703d002024002400240024002400240024002400240024020084201520d00200241b0016a200241b0026a2019201710850120022d00c8012114200241306a200a2007200920022903b00120022903b8012004290300105e200241306a41106a2903002109200229033821072002290330210a20140d010b02400240024002400240201d0d00201b4201510d00201e41ff01714101470d010b200241b0016a200241b0026a108c010240024020022d00b0012214417f6a221641014b0d00024020160e020002000b20140d0620022802e401450d0620022802e00110290c060b200241f0026a41086a2214200b41086a290300370300200241f0026a41106a2216200b41106a290300370300200241f0026a41186a2221200b41186a2903003703002002200b2903003703f0022004290300212220022903b801212320022802ec01212420022802e801212520022802e401212620022802e001212720022903d801212820022903c801212920022903d00122174202510d042025417f4c0d020240024020250d00410121060c010b202510272206450d0420062027202510ce041a0b200f20022903f002370300200f41086a2014290300370300200f41106a2016290300370300200f41186a20212903003703002002202337039003200220243602c403200220253602c003200220253602bc03200220063602b803200220283703b003200220293703a003200220223703980320022017420151ad222a3703a8032025212b2025211f2029212c2023212d2022212e202421140c070b024020140d0020022802e401450d0020022802e00110290b420221170c030b201ca7210402400240201c422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b200241003602d001200241003602c801200241003602c001200242003703b801200220013602b401200241003602b001200220043602c401200220042f01063602cc01200241b0016a10d6010c0b0b1039000b20254101102a000b201e41ff01710d010b201ca7210402400240201c422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b2002201d3602d001200241003602c801200241003602c001200242003703b801200220013602b401200241003602b001200220043602c401200220042f01063602cc01200241b0016a10d6010c070b200241206a419188c5004117109401200228022021142002290328210820034200370300200242003703b001419188c5004117200241b0016a1004200241e8036a41086a22162003290300370300200220022903b0013703e8032002200842017c420120141b22083703b001200241e8036a4110200241b0016a41081003412010272214450d03201420022903b002370000201441186a201f290300370000201441106a2020290300370000201441086a20062903003700002014412041c00010282214450d0220142008370020200142003703002004420037030020034200370300200242003703b00120144128200241b0016a1000200241e8036a41186a2001290300370300200241e8036a41106a200429030037030020162003290300370300200220022903b0013703e803413710272206450d01200642bac6a1cbc68dd9aff300370000200642f4dec98bf6ac999de400370008200641e5cc85ab073600102006413a3a0016200641ece8013b0014200620022903e803370017200620022f01f0033b001f200620022801f203360021200620022f01f6033b0025200620022d00f8033a0027200620022d00f9033a0028200620022d00fa033a0029200620022d00fb033a002a200620022d00fc033a002b200620022d00fd033a002c200620022d00fe033a002d200620022d00ff033a002e200620022d0080043a002f200620022d0081043a0030200620022d0082043a0031200620022d0083043a0032200620022d0084043a0033200620022d0085043a0034200620022d0086043a0035200620022d0087043a003620141029200241106a41888dc300410d1094012002290318210820022802102116200f20022903d00237000041082114200f41086a200241d0026a41086a290300370000200f41106a2013290300370000200f41186a2005290300370000427f212d2002427f370398032002427f37039003200241083602c403200220123602c0034137212b200241373602bc03200220063602b8034200212a200242003703a80320022008420020161b222c3703a0032012211f427f212e0b0240201b4201520d002002201a370390032002201837039803201a212d2018212e0b0240201e41ff0171450d00200f20022903d002370000200f41186a2005290300370000200f41106a2013290300370000200f41086a20152903003700000b0240201d450d00200241888dc300410d1094014201212a200242013703a80320022002290308420020022802001b3703b0030b201ca7210502400240201c422088a722150d00200521130c010b2015211620052113034020132802ec0321132016417f6a22160d000b0340200520052f01064102746a41ec036a28020021052015417f6a22150d000b0b20052f010621152002201d3602880420022015360284042002410036028004200220053602fc03200241003602f803200242003703f003200220133602ec03200241003602e803200241b0016a200241e8036a10d70120022802b0014101470d04034020024190046a41186a200d41186a290200221c37030020024190046a41106a200d41106a290200220837030020024190046a41086a200d41086a290200221b3703002002200d29020022193703900420022802d401210520022802d801212020022802dc012113200241b0046a41186a201c370300200241b0046a41106a2008370300200241b0046a41086a201b370300200220193703b004200142003703002004420037030020034200370300200242003703b001200241b0046a4120200241b0016a1000200241d0046a41186a22162001290300370300200241d0046a41106a221d2004290300370300200241d0046a41086a221e2003290300370300200220022903b0013703d004200241003602b0012006201f200241d0046a4120200241b0016a10012121024020022802b0012215417f460d00201420156b21142015450d00202110290b024002402005450d00200142003703002004420037030020034200370300200242003703b001200241b0046a4120200241b0016a100020162001290300370300201d2004290300370300201e2003290300370300200220022903b0013703d0042006201f200241d0046a4120200520131011201420136a21142020450d01200510290c010b200142003703002004420037030020034200370300200242003703b001200241b0046a4120200241b0016a100020162001290300370300201d2004290300370300201e2003290300370300200220022903b0013703d0042006201f200241d0046a412010020b200241b0016a200241e8036a10d70120022802b0014101470d040c000b0b41374101102a000b41c0004101102a000b41204101102a000b200220143602c4030b200241e8036a10d601200241e8036a41186a2204200241f0026a41186a290300370300200241e8036a41106a2201200241f0026a41106a290300370300200241e8036a41086a2205200241f0026a41086a290300370300200220022903f0023703e8030240024020174202510d00200c20022903e803370300200c41086a2005290300370300200c41106a2001290300370300200c41186a2004290300370300200220233703b001200220243602e401200220263602dc01200220273602d801200220283703d001200220173703c801200220293703c001200220223703b801200220253602e0014101210402402025201f470d000240024020272006460d0020272006202510d0040d0220242014470d020c010b20242014470d010b200c200f412010d0040d002023202d852022202e85844200520d002029202c520d002017a72201202aa7470d002001410146202820022903b003527121040b02402026450d00202710290b20044102460d002004450d010b200320024190036a41d80010ce041a200241003a00b001200241b0026a200241b0016a10d8010c010b202b450d00200610290b200241b0016a200241c8006a10d50120022903d00122084202520d000b0b200241c8006a10d90102400240024002400240200a500d004200211c200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b00137039003200241003602b00120024190036a4110200241b0016a100521010240024020022802b0012204417f470d00420021080c010b200242003703b801200242003703b001200241b0016a20012004411020044110491b10ce041a2004410f4d0d02200241b8016a290300210820022903b001211c200110290b200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b0013703900320024200200820097d201c200754ad7d221b201c20077d2219201c56201b200856201b2008511b22041b3703b80120024200201920041b3703b001200241b0016a21040c030b2007200984500d0141eca9c1001058000b418f89c3004133104e000b4200211c200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b00137039003200241003602b00120024190036a4110200241b0016a100521010240024020022802b0012204417f470d00420021080c010b200242003703b801200242003703b001200241b0016a20012004411020044110491b10ce041a2004410f4d0d02200241b8016a290300210820022903b001211c200110290b200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b00137039003200220083703b8012002201c3703b001200241b0016a21040b20024190036a4110200441101003200241f0046a24000f0b418f89c3004133104e000bf90503087f017e017f23004180026b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e00010ce041a2001200341016a36020c200120043602082001200536020420024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e00010ce041a200020024180016a41800110ce041a0c020b200042023703200c010b2001280200210702400240200528020022030d002004ad210a410021030c010b200741016a210720053301044220862004ad84210a0b20051029200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b034002400240200328020022050d002004ad210a410021050c010b200741016a210720033301044220862004ad84210a0b20031029200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e00010ce041a200641027420056a418c0b6a280200210302402007417f6a2205450d00034020032802880b21032005417f6a22050d000b0b2001410036020c20012004360208200120033602042001410036020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e00010ce041a200020024180016a41800110ce041a0b20024180026a24000bb00101037f230041306b220124002001200010d701024020012802004101470d000340024020012802242202450d002001280228450d00200210290b2001200010d70120012802004101460d000b0b024020002802042202418883c000460d0020022802002103200210292003450d0020032802002100200310292000450d00024020002802002202450d000340200010292002210020022802002203210220030d000b0b200010290b200141306a24000bdd0605057f047e017f017e047f23004190016b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241e0006a41186a200520034105746a220641206a2900002207370300200241e0006a41106a200641186a2900002208370300200241e0006a41086a200641106a29000022093703002002200641086a290000220a370360200241306a41086a20052003410c6c6a220641f0026a280200220b360200200641e8026a290200210c2001200341016a36020c20012004360208200120053602042002200c3703302000200a3702042000410c6a2009370200200041146a20083702002000411c6a2007370200200041246a200c3702002000412c6a200b360200200041013602000c020b200041003602000c010b2001280200210602400240200528020022030d002004ad210c410021030c010b200641016a210620053301044220862004ad84210c0b20051029200ca7210402400240200c422088a7220b20032f01064f0d00200321050c010b034002400240200328020022050d002004ad210c410021050c010b200641016a210620033301044220862004ad84210c0b20031029200ca7210420052103200c422088a7220b20052f01064f0d000b0b200241306a41186a220d2005200b4105746a220341206a290000370300200241306a41106a220e200341186a290000370300200241306a41086a220f200341106a2900003703002002200341086a290000370330200241d0006a41086a22102005200b410c6c6a220341f0026a2802003602002002200341e8026a290200370350200b41027420056a41f0036a280200210302402006417f6a2205450d00034020032802ec0321032005417f6a22050d000b0b2001410036020c200120043602082001200336020420014100360200200241e0006a41186a200d290300220c370300200241e0006a41106a200e2903002207370300200241e0006a41086a200f290300220837030020024188016a201028020022033602002000200229033022093702042000410c6a2008370200200041146a20073702002000411c6a200c370200200041246a2002290350220c3702002000412c6a2003360200200220093703602002200c37038001200041013602000b20024190016a24000bd00201047f230041c0006b2202240002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10dc0220031029024020012d00000d00200141346a280200450d00200141306a28020010290b200241c0006a24000f0b41174101102a000b41374101102a000bca0201067f230041b0016b22012400200141086a200010d501024020012903284202510d000340200128026021022001280258210302400240200128025c22040d00200321050c010b2004210620032105034020052802ec0321052006417f6a22060d000b0340200320032f01064102746a41ec036a28020021032004417f6a22040d000b0b200120023602a801200141003602a001200141003602980120014200370390012001200536028c0120014100360288012001200336029c01200120032f01063602a40120014188016a10d601200141086a200010d50120012903284202520d000b0b024020002802042203418883c000460d0020032802002104200310292004450d0020042802002105200410292005450d00024020052802002203450d000340200510292003210520032802002204210320040d000b0b200510290b200141b0016a24000b821e04027f027e097f027e230041c00d6b220824000240024002402001280234200128025022092802b801460d00200442002004290308220a200941c0006a2903007d220b200b200a5622091b3703082009450d01200041013a0000200041086a412a360200200041046a419cb5c3003602000c020b200041013a0000200041086a4124360200200041046a41d3b4c3003602000c010b200841106a41186a200141f4006a290000370300200841106a41106a200141ec006a290000370300200841106a41086a200141e4006a2900003703002008200129005c370310200841c0026a41186a22094200370300200841c0026a41106a220c4200370300200841c0026a41086a220d4200370300200842003703c00220062007200841c0026a1000200841e00a6a41186a2009290300370300200841e00a6a41106a200c290300370300200841e00a6a41086a200d290300370300200820082903c0023703e00a024002400240024002400240024002400240412010272209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010282209450d01200920082903e00a370020200941386a200841e00a6a41186a290300370000200941306a200841e00a6a41106a290300370000200941286a200841e00a6a41086a290300370000200941c00041800110282209450d0220092008290310370040200941d8006a200841106a41186a290300370000200941d0006a200841106a41106a290300370000200941c8006a200841106a41086a290300370000200841c0026a41186a220c4200370300200841c0026a41106a220d4200370300200841c0026a41086a220e4200370300200842003703c002200941e000200841c0026a1000200841306a41186a220f200c290300370300200841306a41106a220c200d290300370300200841306a41086a220d200e290300370300200820082903c00237033020091029200841c4016a200d290300370200200841cc016a200c290300370200200841d4016a200f290300370200200841e0006a41c8006a4200370300200841a0016a42808080808001370300200841e0006a41306a41f8b4c3003602002008418c016a2001411c6a221036020020084184016a420037020020084180016a2211418883c000360200200820082903303702bc0120084208370398012008410036027c20084100360270200820012802583602b801200820012903503703b0012008200128023441016a360294012001290300210a200820012903083703682008200a370360200841e0016a41186a200541186a290000370300200841e0016a41106a200541106a290000370300200841e0016a41086a200541086a2900003703002008410136027c200820052900003703e0012010200841306a10e40121092008200828027c417f6a220c36027c024020090d00200c0d042008417f36027c200841a0026a41186a200841306a41186a290300370300200841a0026a41106a200841306a41106a290300370300200841a0026a41086a200841306a41086a290300370300200820082903303703a00202400240200828028001220f418883c000460d0020082802840121120c010b41002112200841e00a6a410041e00210cd041a200841c0026a410041a00810cd041a41880b1027220f450d06200f41003b0106200f4100360200200f41086a200841e00a6a41e00210ce041a200f41e8026a200841c0026a41a00810ce041a20084100360284012008200f360280010b200841e0006a411c6a2113024002400340200f41086a210c200f2f0106221441057421094100210d024003402009450d01200841a0026a200c412010d004220e450d03200941606a2109200d41016a210d200c41206a210c200e417f4a0d000b200d417f6a21140b02402012450d002012417f6a2112200f20144102746a41880b6a280200210f0c010b0b20084180026a41186a200841a0026a41186a290300220a37030020084180026a41106a200841a0026a41106a290300220b37030020084180026a41086a200841a0026a41086a2903002215370300200820082903a002221637038002200841fc0a6a2015370200200841840b6a200b3702002008418c0b6a200a370200200820084188016a3602f00a200820143602ec0a200820113602e80a2008200f3602e40a200841003602e00a200820163702f40a200841f4026a4200370200200841003a00fc02200842003703c0022008418883c0003602f002200842003703d802200841e00a6a200841c0026a10de0121090c010b200f200d41e0006c6a41e8026a21090b200841f8016a290300210a20094201370318200941013a003c200941286a427f370300200941206a427f3703002009413d6a20082903e001370000200941d5006a200a370000200941cd006a200841f0016a290300370000200941c5006a200841e8016a2903003700002008200828027c41016a36027c200841086a20044101200841106a200841306a20022003200841e0006a10a20302402008280208220f450d00200828020c21010c0a0b200841c0026a200520082802b801280200108402024020082802c0024101470d00200841c8026a280200210120082802c402210f0c0a0b200841a0026a41186a200841c0026a410472220941186a280200220c360200200841e00a6a41106a200941086a290200370300200841e00a6a41186a220d200941106a290200370300200841800b6a200c360200200841063602e40a200841bd8fc5003602e00a200820092902003703e80a20082802b40121092008200841e0006a3602e0022008290360210a2008290368210b200841ec026a200841106a41086a290300370200200841f4026a200841106a41106a290300370200200841fc026a200841106a41186a290300370200200820033703c802200820023703c0022008200b3703d8022008200a3703d002200820082903103702e40220084100360288022008420137038002200841a0026a2009200841e00a6a200841c0026a2006200720084180026a2004106220082802a0020e03070608070b41f7a5c100210f412a21010c080b41204101102a000b41c0004101102a000b4180014101102a000b41c8a8c1004110200841c0026a41f0a8c10010a201000b41880b4108102a000b200841a0026a41086a280200450d0020082802a40210290b200841c0026a41086a200841106a41086a290300370300200841c0026a41106a200841106a41106a290300370300200841c0026a41186a200841106a41186a290300370300200841a0026a41086a200841306a41086a290300370300200841a0026a41106a200841306a41106a290300370300200841a0026a41186a200841306a41186a290300370300200820082903103703c002200820082903303703a0020240024020082802a0012209200828029c01460d00200828029801210c0c010b02400240200941016a220c2009490d002009410174220d200c200c200d491b220dad42e8007e2202422088a70d002002a7220e4100480d000240024020090d00200e1027210c0c010b200828029801200941e8006c200e1028210c0b200c450d012008200d36029c012008200c3602980120082802a00121090c020b102b000b200e4108102a000b200c200941e8006c6a220941013a0000200920082903c002370001200941096a200841c0026a41086a220c290300370000200941116a200841c0026a41106a290300370000200941196a200841c0026a41186a290300370000200941216a20082903a002370000200941296a200841a0026a41086a290300370000200941316a200841a0026a41106a290300370000200941396a200841a0026a41186a290300370000200941d0006a2008418f026a290000370000200941c9006a20084180026a41086a290000370000200941c1006a200829008002370000200941e0006a410036020020094201370358200820082802a00141016a220d3602a0010240200841e00a6a41186a280200450d00200841f40a6a280200102920082802a001210d0b200c201341086a290200370300200841d0006a41086a200841cc026a280200360200200820132902003703c002200820082902c40237035020082802ac01210e20082802a801210520082802a4012109200828029c012104200828029801210c02402008280270220f450d00200841f4006a280200450d00200f10290b200841e00a6a41086a200841d0006a41086a280200220f3602002008200829035022023703e00a200841c0026a41086a200f360200200820023703c0022010200841c0026a10e6012008200c200d41e8006c6a3602cc022008200c3602c802200820043602c4022008200c3602c002200141386a200841c0026a102c20082009200e41a8016c6a3602cc02200820093602c802200820053602c402200820093602c002200141c4006a200841c0026a1026200041196a200841c8006a290300370000200041116a200841c0006a290300370000200041096a200841306a41086a29030037000020002008290330370001200041003a00000c020b200841a0026a41086a280200210120082802a402210f200d280200450d00200841f40a6a28020010290b024020082802702209450d00200841f4006a280200450d00200910290b2008280288012105200828028001210902400240200828028401220d0d002009210c0c010b200d210e2009210c0340200c2802880b210c200e417f6a220e0d000b0340200920092f01064102746a41880b6a2802002109200d417f6a220d0d000b0b200841dc026a20092f0106360200200841d8026a4100360200200841d4026a2009360200200820053602e002200841003602d002200842003703c8022008200c3602c402200841003602c002200841c0026a10d901024020082802a001220c450d002008280298012109200c41e8006c210c03400240200941dc006a280200450d00200941d8006a28020010290b024020092d00004105490d00200941286a280200450d00200941246a28020010290b200941e8006a2109200c41987f6a220c0d000b0b0240200828029c01450d0020082802980110290b024020082802ac012209450d00200941a8016c210c20082802a40141206a210903402009103d200941a8016a2109200c41d87e6a220c0d000b0b024020082802a801450d0020082802a40110290b200041086a2001360200200041046a200f360200200041013a00000b200841c00d6a24000bff18012e7f230041b00d6b220324002003200236020420032001360200200341086a41086a220142003703002003420037030841e28fc3004115200341086a1004200341900d6a41086a2001290300370300200320032903083703900d200341e80c6a200341900d6a10ba02024002400240024020032802ec0c22040d0041012104410021050c010b20032802f00c2105200341e80c6a410c6a28020022020d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20032c00e80c2101200341086a410041e00c10cd041a200441206a21064100210741002108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f41002120410021214100212241002123410021244100212541002126200420024105746a22272128200421294100212a41d100212b02400340202a212c0240024002402001450d00024020042027460d00200141016a212d20282102202921010340202720022001200246222e1b210220272028202e1b212820042001202e1b222e41206a2101202d417f6a222d0d000c030b0b200141016a2101034020282029460d05202941206a21292001417f6a22010d000b202941606a212e202921010c010b024020292028460d00202941206a21012029212e0c020b20042027460d0320272128200621012004212e0b202e450d020b200121292003280204212d2003280200212f200341003602980d200342013703900d02400240024002400240410110272201450d002001202c3a000020034281808080103702940d200320013602900d2003202d36028c0d2003418c0d6a200341900d6a10300240024020032802940d220220032802980d22306b202d490d0020032802900d21010c010b2030202d6a22012030490d042002410174222a20012001202a491b222a4100480d040240024020020d00202a102721010c010b20032802900d2002202a102821010b2001450d022003202a3602940d200320013602900d202a21020b20032030202d6a222a3602980d200120306a202f202d10ce041a024002402002202a6b4120490d00202a41206a21300c010b202a41206a2230202a490d042002410174222d20302030202d491b222d4100480d040240024020020d00202d102721010c010b20012002202d102821010b2001450d032003202d3602940d200320013602900d202d21020b2001202a6a222d202e290000370000202d41186a202e41186a290000370000202d41106a202e41106a290000370000202d41086a202e41086a290000370000200341900d6a41186a222e4200370300200341900d6a41106a222d4200370300200341900d6a41086a222a4200370300200342003703900d20012030200341900d6a1000200341e80c6a41186a2230202e290300370300200341e80c6a41106a222e202d290300370300200341e80c6a41086a222d202a290300370300200320032903900d3703e80c02402002450d00200110290b202b417f6a212b202c41016a212a200341086a202c4103704105746a220120032903e80c370000200141186a2030290300370000200141106a202e290300370000200141086a202d290300370000410021020340202c202c41036e222e417d6c6a4102470d05200341086a20026a220141df006a2d0000222d2001411f6a2d0000220771202d2007722001413f6a2d00007172211e200141de006a2d0000222d2001411e6a2d0000220771202d2007722001413e6a2d00007172211d200141dd006a2d0000222d2001411d6a2d0000220771202d2007722001413d6a2d00007172211c200141dc006a2d0000222d2001411c6a2d0000220771202d2007722001413c6a2d00007172211b200141db006a2d0000222d2001411b6a2d0000220771202d2007722001413b6a2d00007172211a200141da006a2d0000222d2001411a6a2d0000220771202d2007722001413a6a2d000071722119200141d9006a2d0000222d200141196a2d0000220771202d200772200141396a2d000071722118200141d8006a2d0000222d200141186a2d0000220771202d200772200141386a2d000071722117200141d7006a2d0000222d200141176a2d0000220771202d200772200141376a2d000071722116200141d6006a2d0000222d200141166a2d0000220771202d200772200141366a2d000071722115200141d5006a2d0000222d200141156a2d0000220771202d200772200141356a2d000071722114200141d4006a2d0000222d200141146a2d0000220771202d200772200141346a2d000071722113200141d3006a2d0000222d200141136a2d0000220771202d200772200141336a2d000071722112200141d2006a2d0000222d200141126a2d0000220771202d200772200141326a2d000071722111200141d1006a2d0000222d200141116a2d0000220771202d200772200141316a2d000071722110200141d0006a2d0000222d200141106a2d0000220771202d200772200141306a2d00007172210f200141cf006a2d0000222d2001410f6a2d0000220771202d2007722001412f6a2d00007172210e200141ce006a2d0000222d2001410e6a2d0000220771202d2007722001412e6a2d00007172210d200141cd006a2d0000222d2001410d6a2d0000220771202d2007722001412d6a2d00007172210c200141cc006a2d0000222d2001410c6a2d0000220771202d2007722001412c6a2d00007172210b200141cb006a2d0000222d2001410b6a2d0000220771202d2007722001412b6a2d00007172210a200141ca006a2d0000222d2001410a6a2d0000220771202d2007722001412a6a2d000071722109200141c9006a2d0000222d200141096a2d0000220771202d200772200141296a2d000071722108200141c8006a2d0000222d200141086a2d0000220771202d200772200141286a2d000071722107200141c7006a2d0000222d200141076a2d0000221f71202d201f72200141276a2d00007172211f200141c6006a2d0000222d200141066a2d0000222071202d202072200141266a2d000071722120200141c5006a2d0000222d200141056a2d0000222171202d202172200141256a2d000071722121200141c4006a2d0000222d200141046a2d0000222271202d202272200141246a2d000071722122200141c3006a2d0000222d200141036a2d0000222371202d202372200141236a2d000071722123200141c2006a2d0000222d200141026a2d0000222471202d202472200141226a2d000071722124200141c1006a2d0000222d200141016a2d0000222571202d202572200141216a2d000071722125200141c0006a2d0000222d20012d0000222671202d202672200141206a2d000071722126200241800c460d05200341086a2002202e410574202c41096e41e0006c6b6a6a220141ff006a201e3a0000200141fe006a201d3a0000200141fd006a201c3a0000200141fc006a201b3a0000200141fb006a201a3a0000200141fa006a20193a0000200141f9006a20183a0000200141f8006a20173a0000200141f7006a20163a0000200141f6006a20153a0000200141f5006a20143a0000200141f4006a20133a0000200141f3006a20123a0000200141f2006a20113a0000200141f1006a20103a0000200141f0006a200f3a0000200141ef006a200e3a0000200141ee006a200d3a0000200141ed006a200c3a0000200141ec006a200b3a0000200141eb006a200a3a0000200141ea006a20093a0000200141e9006a20083a0000200141e8006a20073a0000200141e7006a201f3a0000200141e6006a20203a0000200141e5006a20213a0000200141e4006a20223a0000200141e3006a20233a0000200141e2006a20243a0000200141e1006a20253a0000200141e0006a20263a0000202e212c200241e0006a220241e00c470d000c050b0b41014101102a000b202a4101102a000b202d4101102a000b102b000b41002101202b0d000b0b2000201e3a001f2000201d3a001e2000201c3a001d2000201b3a001c2000201a3a001b200020193a001a200020183a0019200020173a0018200020163a0017200020153a0016200020143a0015200020133a0014200020123a0013200020113a0012200020103a00112000200f3a00102000200e3a000f2000200d3a000e2000200c3a000d2000200b3a000c2000200a3a000b200020093a000a200020083a0009200020073a00082000201f3a0007200020203a0006200020213a0005200020223a0004200020233a0003200020243a0002200020253a0001200020263a00000b02402005450d00200410290b200341b00d6a24000b850804057f017e017f017e02400240024002402002450d00410020016b410020014103711b2103200241796a4100200241074b1b210441002105034002400240200120056a2d000022064118744118752207417f4a0d0042808080801021080240200641a6d4c5006a2d0000417e6a220941024d0d0042808080808020210a0c070b0240024002400240024020090e03000102000b200541016a22062002490d024200210a0c090b4200210a200541016a220920024f0d08200120096a2d0000210902400240200641a07e6a2206410d4b0d000240024020060e0e0002020202020202020202020201000b200941e0017141a001460d0242808080808020210a0c0c0b02402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141a001490d0142808080808020210a0c0b0b02402007411f6a41ff0171410b4b0d0002402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141c001490d0142808080808020210a0c0b0b0240200941ff017141bf014d0d0042808080808020210a0c0b0b0240200741fe017141ee01460d0042808080808020210a0c0b0b2009411874411875417f4c0d0042808080808020210a0c0a0b42002108200541026a220620024f0d09200120066a2d000041c00171418001460d020c070b4200210a200541016a220920024f0d07200120096a2d0000210902400240200641907e6a220641044b0d000240024020060e050002020201000b200941f0006a41ff01714130490d0242808080808020210a0c0b0b02402009411874411875417f4c0d0042808080808020210a0c0b0b200941ff0171419001490d0142808080808020210a0c0a0b0240200941ff017141bf014d0d0042808080808020210a0c0a0b02402007410f6a41ff017141024d0d0042808080808020210a0c0a0b2009411874411875417f4c0d0042808080808020210a0c090b200541026a220620024f0d07200120066a2d000041c00171418001470d0642002108200541036a220620024f0d08200120066a2d000041c00171418001460d01428080808080e000210a42808080801021080c080b42808080808020210a4280808080102108200120066a2d000041c00171418001470d070b200641016a21050c010b0240200320056b4103710d000240200520044f0d000340200120056a220641046a280200200628020072418081828478710d01200541086a22052004490d000b0b200520024f0d010340200120056a2c00004100480d022002200541016a2205470d000c040b0b200541016a21050b20052002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210a42808080801021080c010b420021080b2000200a2008842005ad84370204200041013602000ba00501097f230041206b22052400024002400240200128020041016a220641004c0d0020012006360200200141086a2802002107200141046a220821060340200628020022092f0106220a410574210b410021064100210c0240024002400340200b2006460d0102402002200920066a41086a412010d004220d0d00410021060c030b200641206a2106200c41016a210c200d417f4a0d000b200c417f6a210a0b20070d014101210641002107200a210c0b200541186a200c360200200541146a2008360200200541086a41086a20093602002005200736020c2005200636020820060d032009200c41e0006c6a2206419c036a280200210720064198036a2208210602400340200628020022092f0106220a410574210b410021064100210c02400240024002400340200b2006460d0102402004200920066a41086a412010d004220d0d00410021060c030b200641206a2106200c41016a210c200d417f4a0d000b200c417f6a210a0b20070d014101210641002107200a210c0b200541186a200c360200200541086a410c6a2008360200200541106a20093602002005200736020c2005200636020820060d0702400240200941e8026a2206200c410c6c6a280200220d0d004100210c0c010b2006200c410c6c6a2802082206417f4c0d02024020060d004101210c0c010b20061027220c450d04200c200d200610ce041a0b200020063602042000200c360200200041086a20063602000c080b2007417f6a21072009200a4102746a41ec036a21060c010b0b1039000b20064101102a000b2007417f6a21072009200a4102746a41880b6a21060c000b0b41d8a8c1004118200541086a4180a9c10010a201000b20002001280210200220032004200141146a28020028020c1106000b20012001280200417f6a360200200541206a24000b8f1901187f230041d0116b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e00010ce041a024002400240024020032f01062201410b490d00200241b0036a410041e00210cd041a20024198066a410041a00810cd041a0240024041880b10272209450d00200941003b010620094100360200200941086a200241b0036a41e00210ce042101200941e8026a20024198066a41a00810ce042106200220032f00c8013b01ac032002200341ca016a2d00003a00ae03200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210a200341cf016a280000210b200341d3016a280000210c200341d7016a280000210d20024198066a200341a8076a41e00010ce041a2001200341e8016a20032f010641796a220041057410ce042101200620034188086a200041e0006c10ce042106200341063b0106200920003b0106200220022f01ac033b019403200220022d00ae033a0096032002200229039803370380032002200229009d0337008503200241b0036a20024198066a41e00010ce041a0240024020044107490d00200441057420016a41c07e6a2001200441796a22074105746a2201200041ffff037120076b41057410cf041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200441e0006c20066a220041c07b6a200041e07a6a220e200941066a22002f010020076b41e0006c10cf041a200e200241a0026a41e00010ce041a0c010b200341086a20044105746a220141206a2001200341066a22002f010020046b41057410cf041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220e41e0006a200e20002f010020046b41e0006c10cf041a200e200241a0026a41e00010ce041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e00010ce041a2002411c6a41026a220f20042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e00010ce041a20032802002206450d0320032f0104211020024198066a410272211103402002419c026a41026a2212200f2d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e00010ce041a201041ffff0371210702400240024020062f01062203410b490d002011410041b20b10cd041a41b80b10272201450d0520014100360200200141046a20024198066a41b40b10ce041a200220062f00c8013b01ac032002200641ca016a2d00003a00ae03200220062900db01370398032002200641e0016a29000037009d03200641cb016a2800002113200641cf016a2800002114200641d3016a2800002115200641d7016a280000211620024198066a200641a8076a41e00010ce041a200141086a200641e8016a20062f0106220041796a220341057410ce042117200141e8026a20064188086a200341e0006c10ce042118200141880b6a200641a40b6a2000417a6a220841027410ce042119200641063b0106200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024198066a41e00010ce041a200220022d00ae0322033a009603200220022f01ac0322003b0194032002200229009d033700850320022002290398033703800320024194066a41026a220820033a0000200220003b01940620022002290380033703800120022002290085033700850120024198066a200241b0036a41e00010ce041a201041ffff037122004107490d0120172007417a6a22044105746a2017200741796a22034105746a220020012f010620036b41057410cf041a200041186a200229008d023700002000200d36000f2000200c36000b2000200b3600072000200a360003200041026a20122d00003a0000200020022f019c023b00002000200229038802370013200741e0006c20186a220041c07b6a200041e07a6a220020012f010620036b41e0006c10cf041a2000200241a0026a41e00010ce041a200120012f010641016a22003b01062007410274220a20196a416c6a201920044102746a2210200041ffff0371220720046b41027410cf041a2010200936020020072004490d022001200a6a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020032007490d000c030b0b200641086a2200200741016a22044105746a200020074105746a2200200320076b220141057410cf041a2000200d36000f2000200c36000b2000200b3600072000200a360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002006200741e0006c6a220041c8036a200041e8026a2200200141e0006c10cf041a2000200241a0026a41e00010ce041a2006200341016a22033b01062007410274200641880b6a22006a41086a200020044102746a2200200341ffff037120046b41027410cf041a20002009360200201041ffff037120062f010622034f0d07200920043b010420092006360200200420034f0d072003417f6a210120062004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042006360200200041046a21002001200341016a2203470d000c080b0b200641086a2203200741016a22044105746a200320074105746a220320062f0106221020076b221941057410cf041a2003200d36000f2003200c36000b2003200b3600072003200a360003200341026a20122d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200641e8026a200741e0006c6a220341e0006a2003201941e0006c10cf041a2003200241a0026a41e00010ce041a2006201041016a22033b010620074102742219200641880b6a22106a41086a201020044102746a2210200341ffff037120046b41027410cf041a20102009360200200020062f010622044f0d00200620196a418c0b6a2103034020032802002200200741016a22073b010420002006360200200341046a210320042007470d000b0b20024184026a41026a220320082d00003a0000200220022f0194063b01840220022002290380013703f00120022002290085013700f50120024190016a20024198066a41e00010ce041a200f20032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e00010ce041a0240200628020022030d002013210a2016210d2015210c2014210b200121090c050b20062f010421102013210a2016210d2015210c2014210b20032106200121090c000b0b41880b4108102a000b41b80b4108102a000b200320044105746a220041286a200041086a2210200120046b41057410cf041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000201020022903203700002003200441e0006c6a220041c8036a200041e8026a220e20032f010620046b41e0006c10cf041a200e200241a0026a41e00010ce041a200320032f010641016a3b01060c010b20024198066a410272410041b20b10cd041a41b80b10272203450d0120034100360200200341046a20024198066a41b40b10ce041a2003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200320032f010622044105746a220041086a20022f011c3b00002000410a6a2002411c6a41026a2d00003a0000200041176a200d360000200041136a200c3600002000410f6a200b3600002000410b6a200a3600002000411b6a2002290308370000200041206a200229000d3700002003200441e0006c6a41e8026a200241206a41e00010ce041a200341880b6a200441016a22004102746a2009360200200320003b0106200920003b0104200920033602000b200241d0116a2400200e0f0b41b80b4108102a000bc31e03087f037e127f23004180076b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a2900003703002004200229000037036002400240024002400240024002400240024020012802002205418883c000460d00200128020421060c010b41002106200441e8026a410041e00210cd041a200441c0016a410041840110cd041a41ec0310272205450d01200541003b010620054100360200200541086a200441e8026a41e00210ce041a200541e8026a200441c0016a41840110ce041a20014100360204200120053602000b02400340200541086a2107200541066a210820052f0106220941057421024100210a0240024003402002450d01200441e0006a2007412010d004220b450d02200241606a2102200a41016a210a200741206a2107200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200520094102746a41ec036a28020021050c010b0b200441e8026a41086a22022005200a410c6c6a220741f0026a220a2802003602002004200741e8026a22072902003703e80220072003290200370200200a200341086a280200360200200441c0016a41086a20022802002202360200200420042903e802220c3703c0012000410c6a20023602002000200c370204200041013602000c060b200441086a41186a220b200441e0006a41186a2202290300370300200441086a41106a200441e0006a41106a2207290300220c370300200441086a41086a200441e0006a41086a220a290300220d37030020042004290360220e3703082001200128020841016a3602082007200c370300200a200d3703002002200b2903003703002004200e370360200441d8026a41086a2206200341086a280200360200200420032902003703d802024020082f01002203410b490d00200441e8026a410041e00210cd041a200441c0016a410041840110cd041a41ec031027220f450d02200f41003b0106200f4100360200200f41086a200441e8026a41e00210ce042107200f41e8026a200441c0016a41840110ce04210a200441e8026a41086a220b200541b8036a280200360200200420052900db013703a8012004200541e0016a2900003700ad01200420052902b0033703e802200420052f00c8013b01bc012004200541ca016a2d00003a00be01200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a20052f010641796a220241057410ce042107200a200541bc036a2002410c6c10ce04210a200541063b0106200f20023b0106200420042f01bc013b01a401200420042d00be013a00a601200420042903a8013703c001200420042900ad013700c501200441286a41086a200b280200360200200420042903e8023703280240024020094107490d00200941057420076a41c07e6a2007200941796a220b4105746a2207200241ffff0371200b6b41057410cf041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a290300370000200720042903603700002009410c6c200a6a220241b87f6a200241ac7f6a2202200f41066a22082f0100200b6b410c6c10cf041a200241086a200441d8026a41086a280200360200200220042903d8023702000c010b200541086a20094105746a220241206a200220082f010020096b41057410cf041a200241186a200441e0006a41186a290300370000200241106a200441e0006a41106a290300370000200241086a200441e0006a41086a29030037000020022004290360370000200541e8026a2009410c6c6a2202410c6a200220082f010020096b410c6c10cf041a200241086a200441d8026a41086a280200360200200220042903d8023702000b200820082f010041016a3b010020044198016a41026a220220042d00a6013a0000200441c8026a41086a2214200441286a41086a280200360200200420042f01a4013b019801200420042903c001370350200420042900c501370055200420042903283703c8022004413c6a41026a221520022d00003a0000200420042f0198013b013c2004200429005537002d20042004290350370328200441c0006a41086a22162014280200360200200420042903c80237034020052802002206450d0420052f01042103200441e8026a4102722117034020044194016a41026a221820152d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a41086a221920162802003602002004200429034037039801200341ffff0371210502400240024020062f01062202410b490d002017410041960410cd041a419c041027220b450d07200b4100360200200b41046a200441e8026a41980410ce041a200420062f00c8013b01bc012004200641ca016a2d00003a00be012004200641db016a2900003703a8012004200641e0016a2900003700ad01200641cb016a280000211a200641cf016a280000211b200641d3016a280000211c200641d7016a280000211d200441e8026a41086a221e200641b8036a2802003602002004200641b0036a2902003703e802200b41086a200641e8016a20062f0106220741796a220241057410ce04211f200b41e8026a200641bc036a2002410c6c10ce042120200b41ec036a20064188046a2007417a6a220941027410ce042108200641063b0106200b20023b010602402009450d00410021022008210703402007280200220a20023b0104200a200b360200200741046a21072009200241016a2202470d000b0b200441d8026a41086a2202201e280200360200200420042d00be0122073a00a601200420042f01bc01220a3b01a401200420042903a8013703c001200420042900ad013700c501200420042903e8023703d802200441c4026a41026a220920073a00002004200a3b01c402200420042903c0013703e802200420042900c5013700ed0220142002280200360200200420042903d8023703c802200341ffff037122074107490d01201f2005417a6a220a4105746a201f200541796a22024105746a2207200b2f010620026b41057410cf041a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20182d00003a0000200720042f0194013b0000200720042903603700132005410c6c20206a220741b87f6a200741ac7f6a2207200b2f0106220320026b410c6c10cf041a200741086a20192802003602002007200429039801370200200b200341016a22073b01062005410274221020086a416c6a2008200a4102746a2203200741ffff03712205200a6b41027410cf041a2003200f3602002005200a490d02200b20106a41d4036a210703402007280200220a200241016a22023b0104200a200b360200200741046a210720022005490d000c030b0b200641086a2207200541016a220a4105746a200720054105746a2207200220056b41057410cf041a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20044194016a41026a2d00003a0000200720042f0194013b00002007200429036037001320062005410c6c6a220241f4026a200241e8026a220720062f0106220b20056b410c6c10cf041a200241f0026a20044198016a41086a28020036020020072004290398013702002006200b41016a22023b01062005410274200641ec036a22076a41086a2007200a4102746a2207200241ffff0371220b200a6b41027410cf041a2007200f360200200341ffff0371200b4f0d082006200a417f6a22024102746a41f0036a210703402007280200220a200241016a22023b0104200a2006360200200741046a21072002200b490d000c090b0b200641086a2202200541016a22034105746a200220054105746a220220062f010620056b41057410cf041a200241186a20042900653700002002201336000f2002201236000b2002201136000720022010360003200241026a20182d00003a0000200220042f0194013b000020022004290360370013200641e8026a2005410c6c6a2202410c6a200220062f0106220a20056b410c6c10cf041a200241086a201928020036020020022004290398013702002006200a41016a22023b010620054102742210200641ec036a220a6a41086a200a20034102746a2208200241ffff0371220a20036b41027410cf041a2008200f3602002007200a4f0d00200620106a41f0036a2102034020022802002207200541016a22053b010420072006360200200241046a2102200a2005470d000b0b20044190016a41026a220220092d00003a000020044180016a41086a22072014280200360200200420042f01c402220a3b019001200420042903e802370350200420042900ed02370055200420042903c80237038001201520022d00003a00002004200a3b013c2004200429005537002d200420042903503703282016200728020036020020042004290380013703400240200628020022020d00201a2110201d2113201c2112201b2111200b210f0c060b20062f01042103201a2110201d2113201c2112201b211120022106200b210f0c000b0b200520094105746a220b41286a200b41086a2201200320096b41057410cf041a200b41206a2002290300370000200b41186a2007290300370000200b41106a200a2903003700002001200429036037000020052009410c6c6a220241f4026a200241e8026a220720052f010620096b410c6c10cf041a200241f0026a2006280200360200200720042903d802370200200520052f010641016a3b01060c040b41ec034104102a000b41ec034104102a000b419c044104102a000b200441e8026a410272410041960410cd041a419c0410272202450d0220024100360200200241046a200441e8026a41980410ce041a2002200128020022073602ec03200120023602002001200128020441016a360204200741003b010420072002360200200220022f0106220a4105746a220741086a20042f013c3b00002007410a6a2004413c6a41026a2d00003a0000200741176a2013360000200741136a20123600002007410f6a20113600002007410b6a20103600002007411b6a2004290328370000200741206a200429002d3700002002200a410c6c6a220741f0026a200441c0006a41086a280200360200200741e8026a2004290340370200200241ec036a200a41016a22074102746a200f360200200220073b0106200f20073b0104200f20023602000b200041003602000b20044180076a24000f0b419c044104102a000bde2003167f037e067f230041c0026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006712109024002400240024002400240034002400240024002402003450d00024020054101710d002000200110db032003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200a200a417f6a220d2000200a4105746a2000200d4105746a412010d004220e410048220f1b2210200a41016a2211200d200a200f1b220a200020114105746a2000200a4105746a412010d00441004822111b220a2000200a4105746a200020104105746a412010d00422104100481b210a200c200c417f6a220d2000200c4105746a2000200d4105746a412010d004221241004822131b2214200c4101722215200d200c20131b220c200020154105746a2000200c4105746a412010d00422134100481b220c2000200c4105746a200020144105746a412010d00422144100481b210c200b200b417f6a220d2000200b4105746a2000200d4105746a412010d004221541004822161b2217200b41016a2218200d200b20161b220b200020184105746a2000200b4105746a412010d004220d4100481b220b2000200b4105746a200020174105746a412010d00422164100481b210b41024101200f1b200e411f7620111b2010411f766a2012411f766a2013411f766a2014411f766a2015411f766a200d411f766a2016411f766a210d0b2000200c4105746a2000200a4105746a412010d004220f411f76200d6a2000200b4105746a2000200a200c200f410048220f1b220e4105746a412010d0042210411f766a210d2000200b200e20104100481b220b4105746a2000200c200a200f1b22194105746a412010d004417f4c0d01200b21190c020b2000200110dc030c0f0b200d41016a220d410c490d0002402001410176220b450d00200020014105746a41606a210a2000210c0340200441206a41186a220d200c41186a220f290000370300200441206a41106a220e200c41106a2210290000370300200441206a41086a2211200c41086a22122900003703002004200c290000370320200a41086a2213290000211a200a41106a2214290000211b200a41186a2215290000211c200c200a290000370000200f201c3700002010201b3700002012201a3700002015200d2903003700002014200e29030037000020132011290300370000200a2004290320370000200a41606a210a200c41206a210c200b417f6a220b0d000b0b20012019417f736a21194101210a0c010b200d45210a0b02402009417f73200a45724101710d002000200110dd030d0d0b2002450d02201920014f0d0102402002200020194105746a220a412010d00441004e0d0020002108200121070c040b200441206a41186a2212200041186a220e290000370300200441206a41106a2213200041106a2210290000370300200441206a41086a2214200041086a221129000037030020042000290000370320200a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2000200a290000370000200e201c3700002010201b3700002011201a370000200d2012290300370000200b2013290300370000200c2014290300370000200a2004290320370000200441c0016a41186a2217200e290000370300200441c0016a41106a22182010290000370300200441c0016a41086a22192011290000370300200420002900003703c001200041606a2115200041206a21164100210c2001210b03400240200c200b417f6a220d4f0d002016200c4105746a210a0340200441c0016a200a412010d004417f4c0d01200a41206a210a200d200c41016a220c470d000b200d210c0b2015200b4105746a210a02400340200c200b417f6a220b4f0d01200441c0016a200a412010d004210d200a41606a220f210a200d4100480d000b20122016200c4105746a220a41186a220d2900003703002013200a41106a221d2900003703002014200a41086a22062900003703002004200a290000370320200f41286a221e290000211a200f41306a221f290000211b200f41386a2220290000211c200a200f41206a220f290000370000200d201c370000201d201b3700002006201a37000020202012290300370000201f2013290300370000201e2014290300370000200f2004290320370000200c41016a210c0c010b0b200020042903c001370000200e2017290300370000201020182903003700002011201929030037000002402001200c41016a220a490d002000200a4105746a21002001200a6b220141154f0d010c0c0b0b200a2001103e000b41ec81c500201920011037000b2007450d010b201920074f0d01200441206a41186a2216200841186a221e290000370300200441206a41106a2217200841106a221f290000370300200441206a41086a2218200841086a222029000037030020042008290000370320200820194105746a220a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2008200a290000370000201e201c370000201f201b3700002020201a370000200d2016290300370000200b2017290300370000200c2018290300370000200a2004290320370000200441186a2205201e290000370300200441106a2209201f290000370300200441086a2221202029000037030020042008290000370300200841206a21014100211d2007417f6a220d450d022001210a0340200a2004412010d00441004e0d03200a41206a210a200d201d41016a221d470d000b200d211d0c020b41b481c500410041001037000b41c481c500201920071037000b200820074105746a210c200d210b02400340200c2100200b220a201d4d22060d01200a417f6a210b200041606a220c2004412010d004417f4a0d000b0b0240200a201d490d00200d200a490d0241800121144100210f410021124100210d4100211141800121152001201d4105746a2222210103400240200020016b220a419fc0004b22190d00200a410576220a41807f6a200a2012200f492011200d49220c72220b1b210a0240200b450d002015200a200c1b2115200a2014200c1b21140c010b200a200a41017622156b21140b02402011200d470d00024020150d00200441c0006a220d21110c010b4100210a200441c0006a2211210d2001210c0340200d200a3a0000200d200c2004412010d004417f73411f766a210d200c41206a210c2015200a41016a220a470d000b0b02402012200f470d00024020140d00200441c0016a220f21120c010b200041606a210a4100210c200441c0016a2212210f0340200f200c3a0000200f200a2004412010d004411f766a210f200a41606a210a2014200c41016a220c470d000b0b0240200f20126b220a200d20116b220c200c200a4b1b2213450d002016200120112d00004105746a220a41186a2900003703002017200a41106a2900003703002018200a41086a2900003703002004200a290000370320200120112d00004105746a220a200020122d0000417f734105746a220c290000370000200a41186a200c41186a290000370000200a41106a200c41106a290000370000200a41086a200c41086a290000370000024020134101460d004100210a034020002012200a6a220e2d0000417f734105746a220c20012011200a6a41016a22102d00004105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200120102d00004105746a220c2000200e41016a2d0000417f734105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200a41026a210c200a41016a220b210a200c2013490d000b2012200b6a21122011200b6a21110b200020122d0000417f734105746a220a2004290320370000200a41186a2016290300370000200a41106a2017290300370000200a41086a2018290300370000201241016a2112201141016a21110b200020144105746b20002012200f461b2100200120154105746a20012011200d461b210120190d000b024002402011200d4f0d002000210a034020162001200d417f6a220d2d00004105746a220c41186a220b2900003703002017200c41106a220f2900003703002018200c41086a22002900003703002004200c290000370320200a41606a220a41086a220e290000211a200a41106a2210290000211b200a41186a2212290000211c200c200a290000370000200b201c370000200f201b3700002000201a3700002012201629030037000020102017290300370000200e2018290300370000200a20042903203700002011200d490d000c020b0b2001210a2012200f4f0d000340200f417f6a220f2d0000210c2016200a41186a220b2900003703002017200a41106a220d2900003703002018200a41086a22012900003703002004200a2900003703202000200c417f734105746a220c41086a220e290000211a200c41106a2210290000211b200c41186a2211290000211c200a200c290000370000200b201c370000200d201b3700002001201a3700002011201629030037000020102017290300370000200e2018290300370000200c2004290320370000200a41206a210a2012200f490d000b0b20082004290300370000201e2005290300370000201f2009290300370000202020212903003700002007200a20226b410576201d6a22014d0d032016201e2900003703002017201f2900003703002018202029000037030020042008290000370320200820014105746a220a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2008200a290000370000201e201c370000201f201b3700002020201a370000200d2016290300370000200b2017290300370000200c2018290300370000200a2004290320370000200720016b220c450d04200c20012001200c4b1b210b2007410376210d200a41206a2100024002402001200c417f6a220c490d002000200c200a200310e001200821000c010b200820012002200310e001200a2102200c21010b200b200d4f2105200141154f0d010c050b0b201d200a103e000b200a200d107f000b41c481c500200120071037000b41d481c5001058000b20014102490d00200041606a210f4101210b0340200b410574210a200b417f6a210c200b41016a210b02402000200a6a220a2000200c4105746a220d412010d004417f4a0d00200441c0016a41186a220e200a41186a2210290000370300200441c0016a41106a2211200a41106a2212290000370300200441c0016a41086a2213200a41086a22142900003703002004200a2900003703c001200a200d2900003700002014200d41086a2900003700002012200d41106a2900003700002010200d41186a2900003700004100210d0240200c450d00200f210a03400240200441c0016a200a412010d0044100480d00200c210d0c020b200a41206a200a290000370000200a41386a200a41186a290000370000200a41306a200a41106a290000370000200a41286a200a41086a290000370000200a41606a210a200c417f6a220c0d000b0b2000200d4105746a220a20042903c001370000200a41186a200e290300370000200a41106a2011290300370000200a41086a20132903003700000b200f41206a210f200b2001470d000b0b200441c0026a24000bf51602097f027e23004180046b2209240020092004370310200920033703082009200536021c2009200736022420092006360220024002400240024002400240024002400240024002402001280234200128025022062802b801460d002005420020052903082203200641386a2903007d2204200420035622061b37030802400240024020060d00200941d8006a20024200410110a00120094194016a280200210a200941d8006a41386a280200210b20092d0060220641037122054103460d0120050e03020102020b200041fab6c30036020420004101360200200041086a41233602000c030b2000419db7c30036020420004101360200200041086a411936020020060d02200a450d02200b10290c020b20094198016a2802002105200941286a41186a220c200141f4006a290000370300200941286a41106a220d200141ec006a290000370300200941286a41086a220e200141e4006a2900003703002009200129005c3703284100210f41002107024020060d002005417f4c0d030240024020050d00410121070c010b200510272207450d052007200b200510ce041a0b200a450d00200b10290b200941a0016a420037030020094198016a4280808080800137030020094188016a41f8b4c300360200200941d8006a412c6a2001411c6a2210360200200941d8006a41246a4200370200200941f8006a418883c000360200200941d8006a41186a2005360200200941ec006a2005360200200941d8006a41e4006a200241086a290000370200200941d8006a41ec006a200241106a290000370200200941d8006a41f4006a200241186a29000037020020094208370390012009410036027420092007360268200920022900003702b401200920012802583602b001200920012903503703a8012009200128023441016a36028c01200129030021032009200129030837036020092003370358200941d8016a41246a200e290300370200200941d8016a412c6a200d2903003702002009418c026a200c290300370200200941d8016a41186a200841086a280200360200200920023602e001200920092903283702f401200920082902003703e8012009200941206a3602e40120092009411c6a3602dc012009200941086a3602d801200941d8016a411c6a210d0240024002400240024020092903082203200941086a41086a290300220484500d002009200928021c4100200d200220032004200941d8006a10a203200928020022020d012009280274210f20092802e00121020b200f41016a220541004c0d08200941d8016a41106a2111200941d8006a411c6a210e20092005360274200941d8006a41206a2105200941fc006a280200210b0240024003402005280200220a41086a2108200a2f0106220c4105742105410021060240024003402005450d0120022008412010d0042207450d02200541606a2105200641016a2106200841206a21082007417f4a0d000b2006417f6a210c0b200b450d02200b417f6a210b200a200c4102746a41880b6a21050c010b0b200941a0036a2208200a200641e0006c6a220541ad036a290000370300200941a8036a2206200541b5036a290000370300200941b0036a2207200541bd036a2900003703002009200541a5036a29000037039803200541a4036a2d00004101470d00200941a1026a2008290300370000200941a9026a2006290300370000200941b1026a2007290300370000200941013a0098022009200929039803370099022009200f3602740c010b20094198026a200928028401200220092802880128021011020020092009280274417f6a3602744101210620092d0098024101470d040b200941c0026a41186a200941b1026a290000370300200941c0026a41106a200941a9026a290000370300200941c0026a41086a200941a1026a29000037030020092009290099023703c00220094198036a200941c0026a20092802b001280200108402410121062009280298034101470d0220094198036a41086a2802002101200928029c0321020c010b200928020421010b200941ec016a280200450d0b20092802e80110290c0b0b200941e0036a41186a220820094198036a410472220541186a2802002207360200200941e0026a41106a200541086a290200370300200941e0026a41186a200541106a29020037030020094180036a2007360200200941043602e402200941b98fc5003602e002200920052902003703e80220092802ac0121052008200d41186a2900002203370300200941e0036a41106a200d41106a2900002204370300200941e0036a41086a2208200d41086a2900002212370300200941c4036a2012370200200941cc036a2004370200200941d4036a20033702002009200d29000022033703e003200920033702bc0320092802d801220741086a29030021032009200941d8006a3602b803200729030021042009290358211220092903602113200920033703a0032009200437039803200920133703b003200920123703a80320092802e40122072802042102200728020021072008201141086a280200360200200920112902003703e00320094188036a2005200941e0026a20094198036a20072002200941e0036a20092802dc01280200106241002102410021072009280288030e03070609070b410021070240200941ec016a280200450d0020092802e80110290b410021020c070b200041d1b6c30036020420004101360200200041086a41293602000b200841046a280200450d08200828020010290c080b1039000b20054101102a000b41d8a8c1004118200941e0026a4180a9c10010a201000b20094194036a280200210720094190036a2802002102200928028c0321060b200941f8026a280200450d00200941f4026a28020010290b20094198036a41086a220a200e41086a290200370300200941c8006a41086a220b20094198036a410c6a2802003602002009200e290200370398032009200929029c0337034820092802a401210c20092802a001210d200928029c012105200928029801210f200928029401210e2009280290012108024020092802682211450d00200928026c450d00201110290b200a200b280200220b36020020092009290348220337039803200941d8006a41086a200b360200200920033703582010200941d8006a10e60120092008200f41e8006c6a360264200920083602602009200e36025c20092008360258200141386a200941d8006a102c20092005200c41a8016c6a360264200920053602602009200d36025c20092005360258200141c4006a200941d8006a10262000410c6a2007360200200041086a200236020020002006360204200041003602000c020b20094190036a2802002101200928028c032102200941f8026a280200450d00200941f4026a28020010290b024020092802682205450d00200928026c450d00200510290b200941f8006a2802002105200928028001210a02400240200928027c22060d00200521080c010b2006210720052108034020082802880b21082007417f6a22070d000b0340200520052f01064102746a41880b6a28020021052006417f6a22060d000b0b200941b4036a20052f0106360200200941b0036a4100360200200941ac036a20053602002009200a3602b803200941003602a803200942003703a0032009200836029c03200941003602980320094198036a10d90102402009280298012208450d002009280290012105200841e8006c210803400240200541dc006a280200450d00200541d8006a28020010290b024020052d00004105490d00200541286a280200450d00200541246a28020010290b200541e8006a2105200841987f6a22080d000b0b0240200928029401450d0020092802900110290b024020092802a4012205450d00200541a8016c2108200928029c0141206a210503402005103d200541a8016a2105200841d87e6a22080d000b0b024020092802a001450d00200928029c0110290b200041086a200136020020002002360204200041013602000b20094180046a24000bcd0202097f027e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010d004220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a220541e8026a280200450d00200541f8026a290300210c200541f0026a290300210d0c010b200341086a20012802102002200141146a28020028021c110200200341106a290300210c200128020021042003290308210d0b20012004417f6a3602002000200c3703082000200d370300200341206a24000f0b41d8a8c1004118200341186a4180a9c10010a201000b940301097f230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a280200210602400240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010d004220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b200341086a22082007200a41e0006c6a220541ad036a290000370300200341106a220a200541b5036a290000370300200341186a220b200541bd036a2900003703002003200541a5036a290000370300200541a4036a2d00004101460d010b200020012802102002200141146a280200280210110200200128020021040c010b200041013a000020002003290300370001200041096a2008290300370000200041116a200a290300370000200041196a200b2903003700000b20012004417f6a360200200341206a24000f0b41d8a8c100411820034180a9c10010a201000b950201097f230041106b220224000240200028020041016a220341004c0d0020002003360200200041046a2104200041086a28020021050240024003402004280200220641086a210720062f01062208410574210441002109024003402004450d0120012007412010d004220a450d03200441606a2104200941016a2109200741206a2107200a417f4a0d000b2009417f6a21080b02402005450d002005417f6a2105200620084102746a41880b6a21040c010b0b20002802102001200041146a2802002802181104002104200028020021030c010b2006200941e0006c6a41a4036a2d000041014621040b20002003417f6a360200200241106a240020040f0b41d8a8c1004118200241086a4180a9c10010a201000bde0202097f037e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010d004220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a22054180036a290300220ca7450d0020054190036a290300210d20054188036a290300210e0c010b200320012802102002200141146a280200280214110200200341106a290300210d200128020021042003290308210e2003290300210c0b20012004417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b41d8a8c1004118200341186a4180a9c10010a201000b961208057f017e107f047e017f017e0a7f047e230041800d6b22022400024020002802000d002000417f360200200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b200241246a20042f0106360200200241086a41186a4100360200200241086a41146a20043602002002200336022820024100360218200242003703102002200136020c2002410036020820024180026a200241086a10d501024020022903a00222074202510d002000410c6a2108200041046a2109200241a00a6a41146a210a200241a00a6a41206a210b20024180026a4104722104200241dd026a210c200241bd026a210d200241fd026a210e200241c8026a210f200241b0026a211020024180026a41286a21110340200241d0006a41086a220120024180026a41086a2212290300370300200241d0006a41106a220520024180026a41106a2213290300370300200241d0006a41186a220620024180026a41186a2214290300370300200241306a41086a2215200c41086a290000370300200241306a41106a2216200c41106a290000370300200241306a41186a2217200c41186a29000037030020022002290380023703502002200c290000370330200f29030021182010290300211920022903c002211a20022903a802211b20022d00dc02211c20022903b802211d20022802d002210320022802d402211e20022802d802211f2002412c6a41026a200e41026a2d000022203a00002002200e2f000022213b012c200241f8006a41086a22222015290300370300200241f8006a41106a22232016290300370300200241f8006a41186a22242017290300370300200241f4006a41026a222520203a000020022002290330370378200220213b017420024198016a41186a2221200629030037030020024198016a41106a2226200529030037030020024198016a41086a2227200129030037030020022002290350370398010240024002400240024020092802002216418883c000460d00200028020821170c010b200241a00a6a410041e00210cd041a20024180026a410041a00810cd041a41880b10272216450d0141002117201641003b010620164100360200201641086a200241a00a6a41e00210ce041a201641e8026a20024180026a41a00810ce041a20004100360208200020163602040b0340201641086a210520162f01062220410574210141002106024003402001450d0120024198016a2005412010d0042215450d04200141606a2101200641016a2106200541206a21052015417f4a0d000b2006417f6a21200b02402017450d002017417f6a2117201620204102746a41880b6a28020021160c010b0b200241d0016a41186a20212903002228370300200241d0016a41106a20262903002229370300200241d0016a41086a2027290300222a3703002002200229039801222b3703d001200a202b370200200a41086a202a370200200a41106a2029370200200a41186a2028370200200220083602b00a200220203602ac0a200220093602a80a200220163602a40a200241003602a00a20112018370300201320193703002002201a3703a0022002201b370388022002201c3a00bc022002201f3602b8022002201e3602b402200220033602b0022002201d370398022002200737038002200d2002290378370000200d41086a2022290300370000200d41106a2023290300370000200d41186a2024290300370000200c20022f01743b0000200c41026a20252d00003a0000200241a00a6a20024180026a10de011a0c020b41880b4108102a000b2016200641e0006c6a220641f0026a22012001290300201b20075022011b370300200641f8026a22052005290300201920011b370300200641e8026a22052005290300200720011b370300200241a00a6a41186a22152024290300370300200241a00a6a41106a22162023290300370300200241a00a6a41086a22172022290300370300200220022903783703a00a200641a4036a22052d000021202014200641bd036a22222900003703002013200641b5036a22232900003703002012200641ad036a22132900003703002002200641a5036a2224290000370380022027200241a00a6a20024180026a201c41ff0171410146221c1b220141086a2900003703002026200141106a2900003703002021200141186a2900003703002002200129000037039801200541012020201c1b3a0000202420022903980137000020132027290300370000202320262903003700002022202129030037000020064188036a2201201a2001290300201da722011b37030020064190036a22052018200529030020011b37030020064180036a2205201d200529030020011b37030002400240201e0d00200321010c010b201e210520032101034020012802ec0321012005417f6a22050d000b0340200320032f01064102746a41ec036a2802002103201e417f6a221e0d000b0b20032f010621052002201f3602b801200220053602b401200241003602b001200220033602ac01200241003602a801200242003703a0012002200136029c01200241003602980120024180026a20024198016a10d70102402002280280024101470d0020064198036a21030340200241a00a6a41286a200441286a280200360200200b200441206a2902003703002015200441186a22012902003703002016200441106a22052902003703002017200441086a2206290200370300200220042902003703a00a200241d0016a41186a2001290000370300200241d0016a41106a2005290000370300200241d0016a41086a2006290000370300200220042900003703d001200241f0016a41086a200b41086a2802003602002002200b2902003703f001200241c0016a2003200241d0016a200241f0016a10df01024020022802c001450d0020022802c4012201450d0020022802c801450d00200110290b20024180026a20024198016a10d7012002280280024101460d000b0b20024198016a10d6010b20024180026a200241086a10d50120022903a00222074202520d000b0b200241086a10d9012000200028020041016a360200200241800d6a24000f0b41c8a8c100411020024180026a41f0a8c10010a201000bd80202027f017e0240024002400240024002400240024002400240024002400240024020012802000e0400010203000b41012102410110272201450d05200141003a0000410121030c040b410110272202450d05200241013a00002001290308210420024101410910282202450d0620022004370001200129031021044112210320024109411210282201450d07200120043700090c020b41012102410110272201450d07200141023a0000410121030c020b410110272202450d07200241033a00002001290308210420024101410910282202450d0820022004370001200129031021044112210320024109411210282201450d09200120043700090b411121020b2000200236020820002003360204200020013602000f0b41014101102a000b41014101102a000b41094101102a000b41124101102a000b41014101102a000b41014101102a000b41094101102a000b41124101102a000b130020004101360204200041f4afc1003602000b3400200041f4b0c10036020420004100360200200041146a4105360200200041106a4184b1c100360200200041086a420f3702000b2501017f230041206b22022400200242003703082000200241086a10e701200241206a24000b820603037f027e017f230041206b220424004101210502402001a722064101470d002000427f2000290300220720027c220820082007542205200041086a2209290300220720037c2005ad7c220820075420082007511b22051b3703002009427f200820051b370300410021050b024002400240024020014201560d00024020060e020400040b2005450d0342002107200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004410036021020044110200441106a100521050240024020042802102200417f470d00420021010c010b2004420037031820044200370310200441106a20052000411020004110491b10ce041a2000410f4d0d02200441186a290300210120042903102107200510290b200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004427f200120037c200720027c22032007542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030c030b42002107200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004410036021020044110200441106a100521050240024020042802102200417f470d00420021010c010b2004420037031820044200370310200441106a20052000411020004110491b10ce041a2000410f4d0d02200441186a290300210120042903102107200510290b200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004427f200120037c200720027c22032007542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030c020b418f89c3004133104e000b418f89c3004133104e000b200441206a24000b130020004103360204200041f0b7c1003602000b3400200041bff4c10036020420004100360200200041146a4103360200200041106a41d8bec100360200200041086a42083702000b130020004104360204200041f0c2c1003602000b3201017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241a0c21e3600000b3201017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242c0f0003700000b3201017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241d086033600000ba70201047f23004190016b2202240002400240411210272203450d00200341106a41002f00c0a7413b0000200341086a41002900b8a741370000200341002900b0a74137000020034112412410282203450d0120032001360012200241086a41186a22014200370300200241086a41106a22044200370300200241086a41086a220542003703002002420037030820034116200241086a1000200241f0006a41186a2001290300370300200241f0006a41106a2004290300370300200241f0006a41086a200529030037030020022002290308370370200241086a200241f0006a10f3010240024020022903084201510d00200042003703000c010b2000200241086a41e80010ce041a0b2003102920024190016a24000f0b41124101102a000b41244101102a000bcb0706047f017e027f017e047f027e230041c0016b22022400200241003602a00120014120200241a0016a10052101024002400240024020022802a0012203417f460d0020010d010b200042003703000c010b200241a0016a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a200241a0016a2001200410ce041a2003411f4d0d01200241206a41086a200241a0016a41086a2205290000370300200241206a41106a200241a0016a41106a290000370300200241206a41186a200241a0016a41186a290000370300200220022900a001220637036020022006370320200242003703a801200242003703a001200241a0016a200120046a2207200320046b2203411020034110491b220810ce041a2003410f4d0d012005290300210620022903a0012109200241a0016a200320086b2204412020044120491b22036a41004100412020036b2003411f4b1b10cd041a200241a0016a200720086a220a200310ce041a2004411f4d0d01200241c0006a41086a220b200241a0016a41086a2208290000370300200241c0006a41106a220c200241a0016a41106a2205290000370300200241c0006a41186a220d200241a0016a41186a2207290000370300200220022900a001220e3703602002200e3703402002420037036820024200370360200241e0006a200a20036a200420036b2203411020034110491b10ce041a2003410f4d0d012008200241206a41086a2903003703002005200241206a41106a2903003703002007200241206a41186a29030037030020024180016a41086a2204200b29030037030020024180016a41106a220a200c29030037030020024180016a41186a220b200d290300370300200220022903203703a0012002200229034037038001200241e0006a41086a2203290300210e2002290360210f20032008290300370300200241e0006a41106a22082005290300370300200241e0006a41186a22052007290300370300200241086a22072004290300370300200241106a2204200a290300370300200241186a220a200b290300370300200220022903a001370360200220022903800137030020011029200041206a200e370300200041186a200f370300200041106a20063703002000200937030820004201370300200041286a2002290360370300200041306a2003290300370300200041386a2008290300370300200041c0006a2005290300370300200041c8006a2002290300370300200041d0006a2007290300370300200041d8006a2004290300370300200041e0006a200a2903003703000b200241c0016a24000f0b418f89c3004133104e000bc30701087f230041e00b6b220424000240024020002802000d002000417f360200200441286a41186a200141186a290000370300200441286a41106a200141106a290000370300200441286a41086a200141086a290000370300200420012900003703280240024020002802042205418883c000460d00200041086a28020021060c010b4100210620044180096a410041e00210cd041a200441e0006a410041a00810cd041a41880b10272205450d02200541003b010620054100360200200541086a20044180096a41e00210ce041a200541e8026a200441e0006a41a00810ce041a200041086a4100360200200020053602040b200041046a210702400240034020052f010622084105742109410021014100210a02400240034020092001460d01200441286a200520016a41086a412010d004220b450d02200141206a2101200a41016a210a200b417f4a0d000b200a417f6a21080b2006450d022006417f6a2106200520084102746a41880b6a28020021050c010b0b2000410c6a210b410121010c010b200441086a41186a200441286a41186a290300370300200441086a41106a200441286a41106a290300370300200441086a41086a200441286a41086a290300370300200420042903283703082000410c6a210b410021062008210a410021010b0240024020010d002004419c096a200441086a41086a290300370200200441a4096a200441086a41106a290300370200200441ac096a200441086a41186a2903003702002004200b360290092004200a36028c09200420073602880920042005360284092004200636028009200420042903083702940920044180016a200429035037030020044188016a200441d0006a41086a29030037030020044194016a420037020020044200370378200442003703602004418883c00036029001200441003a009c012004419d016a2004290028370000200441a5016a200441286a41086a290000370000200441ad016a200441286a41106a290000370000200441b5016a200441286a41186a290000370000200441bc016a200441c7006a28000036000020044180096a200441e0006a10de0121010c010b200441f8006a4200370300200441f4006a418883c000360200200441003602800120044100360270200442003703682004418883c000360264200441003602602005200a41e0006c6a41e8026a2101200441e0006a10d6010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441e00b6a24000f0b41c8a8c1004110200441e0006a41f0a8c10010a201000b41880b4108102a000bad2304017f027e147f047e230041a0056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e0400010203000b200341c4046a4101360200200342013702b404200341ccfdc4003602b0042003410236028c01200341c4fdc40036028801200320034188016a3602c004200341b0046a41c0c9c1001057000b200141306a2903002104200141286a2903002105200341fc006a41026a200141076a2d00003a0000200341e0006a41086a200141186a290200370300200341e0006a410d6a2001411d6a290000370000200320012f00053b017c2003200141106a29020037036041d588c3002106412a210720022d00000d1520022d00014101470d15200141086a28020021062001410c6a280200210720012d00042101200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703c003200320083a00bf03200320093a00be032003200a3b01bc032003200b3a00bb032003200c3a00ba032003200d3b01b8032003200e3a00b7032003200f3a00b603200320103b01b403200320113a00b303200320183a00aa03200320193b01a803200320142013410874722012411874723600af03200320172016410874722015411874723600ab0320034188046a41026a2202200341fc006a41026a2d00003a0000200320032f017c3b018804200341b0046a41086a2208200341e0006a41086a290300370300200341b0046a410d6a2209200341e0006a410d6a290000370000200320032903603703b0040240200141ff01714101460d0020034184046a41026a20022d00003a0000200341c8026a41086a2008290300370300200341c8026a410d6a2009290000370000200320032f0188043b018404200320032903b0043703c8020c130b20034190046a200641067610cc012003280290042102024002402003280298042006413f7122014b0d00410021010c010b20034184046a41026a200220014105746a220141026a2d00003a0000200341d0026a200141136a290000370300200341d5026a200141186a290000370000200320012f00003b0184042003200129000b3703c8022001280007210720012800032106410121010b0240200328029404450d00200210290b20010d1241012101411521074184efc20021060c130b41a584c2002106410e210720022d00004101470d14200241086a2802004102490d14200241046a28020041ff01710d1420012802042102411210272201450d01200141106a41002f00c0a7413b0000200141086a41002900b8a741370000200141002900b0a74137000020014112412410282201450d0220012002360012200341b0046a41186a22024200370300200341b0046a41106a22064200370300200341b0046a41086a22074200370300200342003703b00420014116200341b0046a100020034190046a41186a200229030037030020034190046a41106a200629030037030020034190046a41086a2007290300370300200320032903b00437039004200341b0046a20034190046a10f301024020032903b00442015222020d0020034190046a4120100c0b20032802b8042106200341a8036a200341bc046a41dc0010ce041a20020d03200341c8026a200341a8036a41dc0010ce041a20011029200341e8016a200341c8026a41dc0010ce041a200320063602880120034188016a410472200341e8016a41dc0010ce041a20034188016a41186a2903002104200329039801211a411810272201450d04200141106a41002900cf8c40370000200141086a41002900c78c40370000200141002900bf8c4037000020014118413810282201450d052001200341a8016a2202290000370018200141306a200241186a290000370000200141286a200241106a290000370000200141206a200241086a290000370000200341c8006a20014138108401200341c8006a41106a290300211b2003290350211c2003280248210620011029420021052002201c420020061b221c201a201c201c201a56201b420020061b221b200456201b2004511b22011b221a7d201b2004201b20011b221d7d201c201a54ad7d109c01200341b0046a41086a22014200370300200342003703b00441b18ac0004116200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c802200341003602b004200341c8026a4110200341b0046a100521020240024020032802b0042201417f470d00420021040c010b200342003703b804200342003703b004200341b0046a20022001411020014110491b10ce041a2001410f4d0d07200341b8046a290300210420032903b0042105200210290b200341b0046a41086a22014200370300200342003703b00441b18ac0004116200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c802200342002004201d7d2005201a54ad7d221c2005201a7d221b200556201c200456201c2004511b22011b3703b80420034200201b20011b3703b004200341c8026a4110200341b0046a41101003410021060c130b41a584c2002106410e210720022d00004101470d13200241086a2802004104490d13200241046a28020041ff01710d1320012802042106411210272201450d06200141106a41002f00c0a7413b0000200141086a41002900b8a741370000200141002900b0a74137000020014112412410282201450d0720012006360012200341b0046a41186a22024200370300200341b0046a41106a22074200370300200341b0046a41086a22084200370300200342003703b00420014116200341b0046a100020034190046a41186a200229030037030020034190046a41106a200729030037030020034190046a41086a2008290300370300200320032903b0043703900420034190046a412041b8d6c50041004100100b2102200110292002417f460d0f200341b0046a41086a22014200370300200342003703b004418486c5004112200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c80241002102200341003602b004200341c8026a4110200341b0046a1005210720032802b0042201417f460d092003200136028c012003200736028801200341b0046a20034188016a104520032802b004220c450d08200341b8046a280200210220032902b404210520032802b404210d02402001450d00200710290b2005a72005422088a72201470d0b0c0a0b41124101102a000b41244101102a000b200110290c0c0b41184101102a000b41384101102a000b418f89c3004133104e000b41124101102a000b41244101102a000b418f89c3004133104e000b4104210c410021010b200141016a22072001490d0320014101742208200720072008491b220d41ffffffff0371200d470d03200d41027422074100480d030240024020010d0020071027210c0c010b200c200141027420071028210c0b200c450d01200221010b200c20014102746a2006360200200341b0046a41086a22014200370300200342003703b004418486c5004112200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c802200341003602b804200342013703b0042003200241016a22013602880120034188016a200341b0046a103002400240200120024f0d0020032802b804210920032802b404210820032802b00421020c010b410020032802b80422016b2106200241027441046a210a20032802b4042108200c210703402007280200210b02400240200820066a4104490d0020032802b00421020c010b200141046a22022001490d0520084101742209200220022009491b22094100480d050240024020080d002009102721020c010b20032802b00420082009102821020b2002450d04200320093602b404200320023602b004200921080b200741046a21072003200141046a22093602b804200220016a200b3600002006417c6a210620092101200a417c6a220a0d000b0b200341c8026a411020022009100302402008450d00200210290b41002106200d450d06200c10290c060b20074104102a000b20094101102a000b102b000b41eac9c1002106411921070c030b20034190046a41026a20034184046a41026a2d00003a0000200341b0046a41086a200341c8026a41086a290300370300200341b0046a410d6a200341c8026a410d6a290000370000200320032f0184043b019004200320032903c8023703b004410021010b20034184016a41026a220220034190046a41026a2d00003a000020034188016a41086a2208200341b0046a41086a29030037030020034188016a41106a200341b0046a41106a290300370300200320032f0190043b018401200320032903b0043703880120010d01200341306a2005200442c0843d420010d404200341206a2003290330221c200341306a41086a290300221b42c0fb42427f10d304200341106a201c201b42d08603420010d30420034180016a41026a20022d00003a0000200341e8016a41086a2008290300370300200341e8016a410d6a220220034188016a410d6a290000370000200320032f0184013b01800120032003290388013703e801200341c0006a200341a8036a2003290310221b200520032903207c42148042ffffffff0f837c221c428080e983b1de16201c428080e983b1de1656200341106a41086a290300201c201b54ad7c221c420052201c501b22011b221b201c420020011b221c10ac0102402003280240450d0041d0c9c1002106411a21070c020b200341086a41ee85c500411610b501200328020c210120032802082108200341b0046a41086a22094200370300200342003703b00441ee85c5004116200341b0046a1004200341c8026a41086a220a2009290300370300200320032903b0043703c80220032001410020081b220841016a3602b004200341c8026a4110200341b0046a4104100320034188016a41086a200341a8036a41086a29030037030020034188016a41106a200341a8036a41106a29030037030020034188016a41186a200341a8036a41186a290300370300200a200341e8016a41086a290300370300200341c8026a410d6a2002290000370000200320032903a80337038801200320032f0180013b018804200320034182016a2d00003a008a04200320032903e8013703c802411210272201450d02200141106a41002f00c0a7413b0000200141086a41002900b8a741370000200141002900b0a74137000020014112412410282202450d0320022008360012200341b0046a41186a22014200370300200341b0046a41106a22094200370300200341b0046a41086a220a4200370300200342003703b00420024116200341b0046a100020034190046a41186a200129030037030020034190046a41106a200929030037030020034190046a41086a200a290300370300200320032903b00437039004412010272201450d042001200329038801370000200141186a20034188016a41186a290300370000200141106a20034188016a41106a290300370000200141086a20034188016a41086a2903003700002001412041c00010282201450d0520012005370020200141286a2004370000200141c00041800110282201450d062001201b370050200120032f0188043b00302001200736003720012006360033200120032903c80237003b200141d8006a201c370000200141326a20032d008a043a0000200141c3006a200341c8026a41086a290300370000200141c8006a200341d5026a29000037000020034190046a4120200141e00010032001102920021029200341bc046a200836020041002106200341b0046a41086a41003a00002003410a3a00b00441b8d6c5004100200341b0046a1088010b0b2000200736020420002006360200200341a0056a24000f0b41124101102a000b41244101102a000b41204101102a000b41c0004101102a000b4180014101102a000bf90a03027f017e077f230041d0006b22042400200441306a41086a220542003703002004420037033041c1c8c100411d200441306a1004200441206a41086a20052903003703002004200429033037032002400240024002400240024002400240024002400240200441206a411041b8d6c50041004100100b417f470d00200441106a41888dc300410d1094012004290318420020042802101b210602402002a74101470d0020044184ccc100411a109401024020042903082006580d0020042802000d0b0b200441306a41086a22054200370300200442003703304184ccc100411a200441306a1004200441206a41086a2005290300370300200420042903303703202004200620014201867c370330200441206a4110200441306a410810030b200028020821052000280204210720002802002108200441306a41086a220042003703002004420037033041c1c8c100411d200441306a1004200441206a41086a2000290300370300200420042903303703202004410036023820044201370330410810272200450d01200442888080808001370234200420003602302000200637000020004108411010282200450d02200442908080808002370234200020013700082004200036023020042005360244200441c4006a200441306a103002402005450d002008200541286c6a21092004280234210a2004280238210b20082100034002400240200a200b6b4120490d00200b41206a21052004280230210c0c010b200b41206a2205200b490d0b200a410174220c20052005200c491b220d4100480d0b02400240200a0d00200d1027210c0c010b2004280230200a200d1028210c0b200c450d062004200d3602342004200c360230200d210a0b200c200b6a220b41186a200041186a290000370000200b41106a200041106a290000370000200b41086a200041086a29000037000020042005360238200b2000290000370000200041206a29030021010240200a20056b41074b0d00200541086a220b2005490d0b200a410174220d200b200b200d491b220b4100480d0b02400240200a0d00200b1027210c0c010b200c200a200b1028210c0b200c450d072004200b3602342004200c360230200b210a0b2004200541086a220b360238200c20056a20013700002009200041286a2200470d000b0b2004280234210c200428023821000240024020024201510d0002400240200c2000460d00200428023021050c010b200041016a22052000490d0b2000410174220c20052005200c491b220c4100480d0b0240024020000d00200c102721050c010b20042802302000200c102821050b2005450d082004200c360234200420053602300b2004200041016a220a360238200520006a41003a00000c010b02400240200c2000460d00200428023021050c010b200041016a22052000490d0a2000410174220c20052005200c491b220c4100480d0a0240024020000d00200c102721050c010b20042802302000200c102821050b2005450d082004200c360234200420053602300b2004200041016a220b360238200520006a41013a00000240200c200b6b41074b0d00200b41086a220a200b490d0a200c410174220d200a200a200d491b220a4100480d0a02400240200c0d00200a102721050c010b2005200c200a102821050b2005450d092004200a36023420042005360230200a210c0b2004200041096a220a3602382005200b6a20033700000b200441206a41102005200a10030240200c450d00200510290b2007450d0a200810290c0a0b200041046a280200450d09200028020010290c090b41084101102a000b41104101102a000b200d4101102a000b200b4101102a000b200c4101102a000b200c4101102a000b200a4101102a000b102b000b200041046a280200450d00200028020010290b200441d0006a24000b02000ba80102027f047e230041c0006b21020240200128020022032001280204470d00200041003602000f0b2001200341e0006a360200200241086a200341c8006a2900002204370300200241106a200341d0006a2900002205370300200241186a200341d8006a29000022063703002002200341c0006a290000220737030020002003360200200020073700042000410c6a2004370000200041146a20053700002000411c6a20063700000b290020004101360204200041086a200128020420012802006b41e0006e2201360200200020013602000bd10304037f027e067f027e23004180016b210302402001280200220420012802042205460d002001200441e0006a360200200341206a41186a200441d8006a2900002206370300200341206a41106a200441d0006a2900002207370300200341106a22082007370300200341086a2209200441c8006a290000370300200341186a220a20063703002003200441c0006a290000370300200341e0006a41186a220b200a290300370300200341e0006a41106a220c2008290300370300200341e0006a41086a220d20092903003703002003200329030037036002402002450d00200541a07f6a2105034020052004460d022001200441c0016a360200200441a0016a2900002106200441b8016a2900002107200441b0016a290000210e200341206a41086a200441a8016a290000220f3703002009200f3703002008200e370300200a20073703002003200637032020032006370300200b200a290300370300200c2008290300370300200d200929030037030020032003290300370360200441e0006a21042002417f6a22020d000b0b20002004360200200020032903603702042000410c6a200d290300370200200041146a200c2903003702002000411c6a200b2903003702000f0b200041003602000bf60505097f017e017f017e037f23004180026b2202240020024100360218200241186a2001280200220320012802042204410420044104491b220510ce041a2001200420056b22063602042001200320056a2205360200024002400240200441034b0d00200041003602000c010b20022802182107200242003702042002418883c000360200200241086a210802402007450d00200241a0016a41027221094100210a034020024200370318200241186a20052006410820064108491b220410ce041a2001200620046b3602042001200520046a36020002400240200641074d0d002002290318210b200241186a200110442002280218220c0d010b2000410036020020022802002002280204200228020810fc010c030b200229021c210d2002200b370310024002402002280200220e418883c000460d002002280204210f0c010b2009410041da0010cd041a200241186a410041840110cd041a41e4011027220e450d044100210f200e4100360200200e41046a200241a0016a41dc0010ce041a200e41e0006a200241186a41840110ce041a200241003602042002200e3602000b200a41016a210a024002400340200e41086a2105200e2f01062210410374210641002104024003402006450d01200241106a2005410810d0042203450d03200641786a2106200441016a2104200541086a21052003417f4a0d000b2004417f6a21100b0240200f450d00200f417f6a210f200e20104102746a41e4016a280200210e0c010b0b2002200b37022c20022008360228200220103602242002200e36021c20024100360218200220023602202002200d3702a4012002200c3602a001200241186a200241a0016a10fd010c010b200e2004410c6c6a220641e4006a220528020021042005200d370200200641e0006a220528020021062005200c3602002006450d002004450d00200610290b200a2007460d0120012802002105200128020421060c000b0b20002002290300370200200041086a20082802003602000b20024180026a24000f0b41e4014104102a000bd90303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200441e0006a2802002104200141016a21010c010b02400240200028020022010d002003ad210541002106410021010c010b20003301044220862003ad842105410121060b200010292005a72103024002402005422088a7220720012f01064f0d00200121040c010b034002400240200128020022040d002003ad2105410021040c010b200641016a210620013301044220862003ad8421050b200110292005a72103200421012005422088a7220720042f01064f0d000b0b200741027420046a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a280200210402402006417f6a2201450d00034020002802e40121002001417f6a22010d000b0b410021010b2004450d012002417f6a210202402005a7450d00200410290b20020d000b0b02402000418883c000460d0020002802002101200010292001450d0020012802002104200110292004450d00024020042802002201450d000340200410292001210420012802002200210120000d000b0b200410290b0be71207027f017e057f027e017f017e0a7f230041b0036b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241f0016a41086a2207200141086a280200360200200220012902003703f001024002400240024020002f01062201410b490d00200241d0026a410272410041da0010cd041a200241386a410041840110cd041a0240024041e40110272208450d0020084100360200200841046a200241d0026a41dc0010ce041a200841e0006a200241386a41840110ce042107200241386a41086a2209200041b0016a280200360200200220002902a8013703382000413c6a330000210a2000413e6a310000210b20002d003f210c2000350038210d200841086a200041c0006a20002f010641796a220141037410ce04210e2007200041b4016a2001410c6c10ce042107200041063b0106200820013b0106200241d0026a41086a2009280200360200200220022903383703d002200d200a200b4210868442208684210a0240024020034107490d002003410374200e6a41506a200e200341796a22094103746a220e200141ffff037120096b41037410cf041a200e20043700002003410c6c20076a220341b87f6a200341ac7f6a2203200841066a22012f010020096b410c6c10cf041a200341086a200241f0016a41086a280200360200200320022903f0013702000c010b200041086a20034103746a220741086a2007200041066a22012f010020036b41037410cf041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c10cf041a200741086a200241f0016a41086a280200360200200720022903f0013702000b200120012f010041016a3b0100200241286a41086a220f200241d0026a41086a22102802002203360200200241086a221120033602002002200c3a0017200220022903d00222043703282002200a3e02102002200a4230883c00162002200a4220883d011420022004370300200229031021042000280200220c450d0320002f01042112200241d0026a410272211303402002200641016a22063602202002200c360224200f201128020036020020022002290300370328201241ffff03712109024002400240200c2f01062200410b490d002013410041da0010cd041a200241f0016a200241d0026a41dc0010ce041a200241386a410041b40110cd041a41940210272207450d0520074100360200200741046a200241f0016a41dc0010ce041a200741e0006a200241386a41b40110ce042103200c41386a290000210a200241386a41086a2214200c41b0016a2802003602002002200c41a8016a290200370338200741086a200c41c0006a200c2f0106220141796a220041037410ce0421152003200c41b4016a2000410c6c10ce042116200741e4016a200c4180026a2001417a6a220e41027410ce042117200c41063b0106200720003b01060240200e450d00410021002017210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b20102014280200220036020020022002290338220b3703d002201420003602002002200b370338201241ffff037122034107490d0120152009417a6a22034103746a2015200941796a22004103746a220120072f010620006b41037410cf041a200120043700002009410c6c20166a220141b87f6a200141ac7f6a220120072f0106220e20006b410c6c10cf041a200141086a200f280200360200200120022903283702002007200e41016a22013b01062009410274221220176a416c6a201720034102746a220e200141ffff0371220920036b41027410cf041a200e200836020020092003490d02200720126a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320002009490d000c030b0b200c41086a2201200941016a22034103746a200120094103746a2201200020096b220741037410cf041a20012004370000200c2009410c6c6a220141ec006a200141e0006a220e2007410c6c10cf041a200141e8006a200241286a41086a280200360200200e2002290328370200200c200041016a22003b01062009410274200c41e4016a22016a41086a200120034102746a2201200041ffff0371220720036b41027410cf041a20012008360200201241ffff037120074f0d07200c2003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b01042001200c360200200341046a210320002007490d000c080b0b200c41086a2200200941016a220e4103746a200020094103746a2200200c2f0106220120096b221241037410cf041a20002004370000200c41e0006a2009410c6c6a2200410c6a20002012410c6c10cf041a200041086a200f28020036020020002002290328370200200c200141016a22003b010620094102742217200c41e4016a22016a41086a2001200e4102746a2212200041ffff03712201200e6b41027410cf041a20122008360200200320014f0d00200c20176a41e8016a2100034020002802002203200941016a22093b01042003200c360200200041046a210020012009470d000b0b200241106a41086a2014280200220036020020112000360200200220022903382204370310200220043703000240200c28020022000d0020072108200a21040c050b200c2f010421122000210c200a2104200721080c000b0b41e4014104102a000b4194024104102a000b200020034103746a220941106a200941086a2209200120036b41037410cf041a2009200437000020002003410c6c6a220141ec006a200141e0006a220920002f010620036b410c6c10cf041a200141e8006a2007280200360200200920022903f001370200200020002f010641016a3b01060c010b200241d0026a410272410041da0010cd041a200241f0016a200241d0026a41dc0010ce041a200241386a410041b40110cd041a41940210272200450d0120004100360200200041046a200241f0016a41dc0010ce041a200041e0006a200241386a41b40110ce0421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f01062203410c6c6a22012002290300370200200020034103746a41086a2004370000200141086a200241086a280200360200200041e4016a200341016a22034102746a2008360200200020033b0106200820033b0104200820003602000b200241b0036a24000f0b4194024104102a000b840b02037f017e024002400240024002400240024002400240024002400240024020002802000e0400010203000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0c20024101742204200320032004491b22044100480d0c0240024020020d002004102721030c010b200128020020022004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0c20024101742200200420042000491b22004100480d0c0240024020020d002000102721020c010b200128020020022000102821020b2002450d0520012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0b20024101742204200320032004491b22044100480d0b0240024020020d002004102721030c010b200128020020022004102821030b2003450d0520012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d0b20024101742200200320032000491b22004100480d0b0240024020020d002000102721020c010b200128020020022000102821020b2002450d0620012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0a20024101742204200320032004491b22044100480d0a0240024020020d002004102721030c010b200128020020022004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0a20024101742200200420042000491b22004100480d0a0240024020020d002000102721020c010b200128020020022000102821020b2002450d0720012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0920024101742204200320032004491b22044100480d090240024020020d002004102721030c010b200128020020022004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d0920024101742200200320032000491b22004100480d090240024020020d002000102721020c010b200128020020022000102821020b2002450d0820012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20044101102a000b20004101102a000b20044101102a000b20004101102a000b20044101102a000b20004101102a000b20044101102a000b20004101102a000b102b000b130020004101360204200041d8cdc1003602000b340020004180f4c10036020420004100360200200041146a4107360200200041106a41a4d1c100360200200041086a42073702000b130020004101360204200041f8dcc1003602000bff0101057f230041106b2202240020024100360208200242013703002002410d36020c2002410c6a20021030024002400240024020022802042203200228020822046b410d490d002004410d6a2105200228020021030c010b2004410d6a22052004490d0220034101742206200520052006491b22064100480d020240024020030d002006102721030c010b200228020020032006102821030b2003450d0120022006360204200220033602000b20022005360208200320046a2204410029009ecc41370000200441056a41002900a3cc4137000020002002290300370200200041086a2002280208360200200241106a24000f0b20064101102a000b102b000ba504010b7f230041106b220324002003420037030820012002200341086a102020032003290308370300200120026a21040240024002400240200241086a220520024f0d00200341086a2106200321074100210841002105410121094100210a0340200841017421022006200741016a220b6b210c034020072d00002107024002400240024020082005470d002008417f417f200c200420016b6a22052005200c491b220541016a220d200d2005491b6a22052008490d072002200520052002491b22054100480d070240024020080d002005102721090c010b200920082005102821090b2009450d010b200920086a20073a00000240024002400240200a41ff01710e03010300010b20042001460d010c050b0240200b2006460d004100210a0c040b20042001470d040b200841016a21080c090b4101210a200b2006470d01200841016a21080c080b20054101102a000b200841016a2108200b21070c020b200841016a21084102210a200241026a21022001220741016a21010c000b0b0b410121092005450d0120054100480d002005102722090d0120054101102a000b102b000b410021080340200920086a200320086a2d00003a0000200841016a22084108470d000b024020020d00410821080c010b200920086a2107410021080340200720086a200120086a2d00003a00002002200841016a2208470d000b200420016b41086a21080b200020083602082000200536020420002009360200200341106a24000bad10030a7f027e047f23004190016b22032400024002400240024002400240411410272204450d00200441106a410028009c9342360000200441086a410029009493423700002004410029008c934237000020044114413410282204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341e8006a41186a22054200370300200341e8006a41106a22064200370300200341e8006a41086a220742003703002003420037036820044134200341e8006a1000200341c0006a41186a2005290300370300200341c0006a41106a2006290300370300200341c0006a41086a20072903003703002003200329036837034020034100360268200341c0006a4120200341e8006a1005210820032802682209417f460d042008450d042003200936022420032008360220200341106a200341206a102e2003280210450d0320032802142105200341086a200341206a102e2003280208450d03200328020c21072003200341206a102e2003280200450d032003280204210a200341003a0068200341e8006a2003280220220b20032802242206410047220c10ce041a2006200c490d0220032006200c6b3602242003200b200c6a3602202006450d0320032d0068220c41014b0d034100210602400240200c0e020100010b410121060b200341e8006a200341206a10442003280268220c450d032003413c6a41026a220b2003418c016a41026a2d00003a0000200320032f008c013b013c200329026c220d422088210e02402009450d00200810290b200ea72108200da72109200341e8006a41026a200b2d00003a0000200320032f013c3b01680c050b41144101102a000b41344101102a000b200c2006103e000b418f89c3004133104e000b410221060b200410290240024020064102470d004101210441a2e1c1002105411121070c010b200341c0006a41026a200341e8006a41026a2d00003a0000200320032f01683b0140410021040b2003411c6a41026a200341c0006a41026a2d00003a0000200320032f01403b011c024002402004450d002000200536020420004101360200200041086a20073602000c010b2003418c016a41026a220b2003411c6a41026a2d00003a0000200320032f011c3b018c01024002400240024002400240024002400240200228025820054b0d0020092102200c21040c010b411510272204450d012004410d6a41002900ce9242370000200441086a41002900c99242370000200441002900c1924237000020044115413510282204450d02200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341e8006a41186a22054200370300200341e8006a41106a22064200370300200341e8006a41086a220742003703002003420037036820044135200341e8006a1000200341c0006a41186a2005290300370300200341c0006a41106a2006290300370300200341c0006a41086a20072903003703002003200329036837034020034100360268200341c0006a4120200341e8006a1005210502400240024020032802682206417f460d002005450d002003200636022420032005360220200341e8006a200341206a10442003280268220f450d06200329026c210d02402006450d00200510290b20041029200341e8006a200f200d422088a72002108502200da72110200341e8006a41086a2802002107200328026c210520032802684101470d022000200536020420004101360200200041086a20073602002010450d01200f10290c010b20041029200041086a411a360200200041b3e1c100360204200041013602000b2009450d09200c10290c090b200341c0006a41026a221120034187016a2d00003a0000200320032f0085013b014020034184016a2d0000210620034180016a2802002108200341fc006a2802002102200341f8006a2802002104200341f4006a280200210a02402009450d00200c10290b2003418c016a41026a20112d00003a0000200320032f01403b018c012008417f4c0d044101210c02402008450d0020081027220c450d06200c2004200810ce041a0b200341206a41146a2008360200200341206a41106a20083602002003200a36022820032007360224200320053602202003200c36022c2003200641ff01714101463a0038411410272209450d06200941106a410028009c9342360000200941086a410029009493423700002009410029008c934237000020094114413410282209450d07200920012900003700142009412c6a200141186a290000370000200941246a200141106a2900003700002009411c6a200141086a290000370000200341e8006a41186a22014200370300200341e8006a41106a22114200370300200341e8006a41086a221242003703002003420037036820094134200341e8006a1000200341c0006a41186a2001290300370300200341c0006a41106a2011290300370300200341c0006a41086a2012290300370300200320032903683703402003412036026c2003200341c0006a360268200341206a200341e8006a105b2009102902402008450d00200c10290b2010450d00200f10290b20002005360204200020032f018c013b001d200041003602002000411c6a20063a0000200041186a2008360200200041146a2002360200200041106a20043602002000410c6a200a360200200041086a20073602002000411f6a200b2d00003a00000c070b41154101102a000b41354101102a000b418f89c3004133104e000b1039000b20084101102a000b41144101102a000b41344101102a000b20034190016a24000b9e6a04147f027e0d7f027e230041c0046b22042400200441b0036a20012002200310ff02200441b0036a41086a280200210520042802b40321060240024020042802b0034101470d002000200636020420004101360200200041086a20053602000c010b200441c4036a2802002207412c6c2108200441c8036a2802002109200441c0036a280200210a200441bc036a280200210b4100210c4100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004102470d000b200441d8006a200b200d6a41586a1080032004280258210c200428025c21010b4100210e20014100200c1b210f2007412c6c2108200c41b8d6c500200c1b21104100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004108470d000b200441d0006a200b200d6a41586a1080032004280250210e200428025421010b4100211120014100200e1b21122007412c6c2108200e41b8d6c500200e1b210d4100210102400340024020082001470d000c020b200b20016a21022001412c6a220c210120022d00004104470d000b200441c8006a200b200c6a41586a10800320042802482111200428024c21010b4100210e2001410020111b21132007412c6c2108201141b8d6c50020111b21144100210102400340024020082001470d000c020b200b20016a21022001412c6a220c210120022d00004103470d000b200441c0006a200b200c6a41586a1080032004280240210e200428024421010b4100211541002102024020014100200e1b2201450d00200141286c2108200e41b8d6c500200e1b41186a2101410021020340200220012d0000456a2102200141286a2101200841586a22080d000b0b200d201241146c6a21114100211202400240024003400240200d2011470d0020122015714101710d0341bb91c50041c38fc500201241017122011b2108411c411e20011b21010c020b41e18fc500210841382101200d41086a280200417c6a220e41024b0d01200d280200210c024002400240200e0e03000401000b41012115200c41b98fc500460d01200c28000041e3c2b1e306460d010c030b41012112200c41bd8fc500460d00200c41bd8fc500410610d0040d020b0240200d410c6a280200450d0041df90c5002108411321010c020b0240200d41106a280200220120026b220c20014d0d0041f290c5002108412a21010c020b41b990c5002108412621012013200c4d0d012014200c4102746a220c450d01419990c500210841202101200f200c280200220c4d0d012010200c4104746a220c450d01419c91c5002108411f2101200c2802080d01200d41146a210d200c2d000d4104460d000b0b200020083602040c010b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004106470d000b200441386a200b200d6a41586a108003200428023c450d00200041878dc500360204411f21010c010b2007412c6c21082003280268210c410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004105470d000b200441306a200b200d6a41586a22011080030240200428023441014d0d0041182101200041a68dc5003602040c020b200441286a2001108003200428022c450d0020042802282201450d002001280200200c4d0d0041222101200041be8dc5003602040c010b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004107470d000b200441206a200b200d6a41586a1080032004280220220120042802244104746a2108034020012008460d012001450d012001410c6a2102200141106a210120022d0000410271450d000b41322101200041ca8ec5003602040c010b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d0000410b470d000b200b200d6a220141606a2802002202450d00200141586a280200220d200241186c6a210c0340200d220241186a210d2002280208410374210120022802002102024003402001450d01200141786a210120022d00042108200241086a21022008410271450d000b41312101200041998ec5003602040c030b200d200c470d000b0b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004102470d000b200441186a200b200d6a41586a108003200428021c2201450d002004280218220220014104746a211103402002450d01200241106a210e200420022d000d22083a00b0032002280200220120022802086a210c410021024100200441b0036a20084104461b210d024003400240024002400240200241ff01710e03000102000b2001200c460d014100210220012108200141016a21010c020b2001200c460d034101210220012108200141016a21010c010b200d450d0241022102200d21084100210d0b20082d0000410271450d000b41392101200041e08dc5003602040c030b200e2102200e2011470d000b0b2007412c6c21084100210c4100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004102470d000b200441106a200b200d6a41586a1080032004280210210c200428021421010b4100210e20014100200c1b210f2007412c6c2108200c41b8d6c500200c1b21104100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004103470d000b200441086a200b200d6a41586a1080032004280208210e200428020c21010b200e41b8d6c500200e1b220220014100200e1b41286c6a210d4100211302400240024003400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002200d460d00412d210141dff5c200210820022802084103470d1102402002280200220c419ab0c500460d00200c419ab0c500410310d0040d120b200241286a21114115210c41d8f4c200210e4114210141cbf5c200210802400240024020022d00180e040014011b000b4136210c41a2f4c200210e200f200228021c22014d0d1a201020014104746a2214450d1a2002280214210c200228020c210220092d00700d01200c410b470d01413821014193f5c2002108200241ab8ac500460d13200241ab8ac500410b10d004450d130c160b412f2101418cf6c200210820022802144106470d120240200228020c220c419cf4c200460d00200c419cf4c200410610d0040d130b02402013450d00411f2101200041bbf6c2003602040c1b0b2002411c6a2113201121020c160b4126210141edf4c2002108200c417d6a220c41134b0d110240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200c0e14002a2a2a0e042a062d0b0a2a011110172a2a0c15000b2002419db0c500460d292002419db0c500410310d004450d29419db0c5002002410310d0040d2941011027220e450d19200e41003a0000024020142d000c41e000470d0020142802084101470d002014280200211241002102034020024101460d03200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c310b200241a888c500460d0141a888c5002002410f10d004450d010240200241b788c500460d0041b788c5002002410f10d0040d290b410110272212450d1a201241003a000020142d000c41e000470d2a20142802084101470d2a2014280200211541002102034020024101460d04201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000c2b0b0b20142d000d2101200e10292011210220014104460d2b0c2d0b41041027220e450d17200e4100360000024020142d000c41e000470d0020142802084104470d002014280200211241002102034020024104460d23200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c2e0b0240200241c688c500460d00200229000042e5f0d1fbb5ac98b6ec00520d260b410710272212450d1820124100360003201241013a0002201241003b000020142d000c41e000470d2620142802084107470d262014280200211541002102034020024107460d03201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000c270b0b20142d000d220c4104460d262012102920112102200c41fb0171450d280c240b200241ce88c500460d0141ce88c5002002410a10d004450d01200241d888c500460d0241d888c5002002410a10d004450d020240200241e288c500460d0041e288c5002002410a10d0040d070b4126210c41edf4c200210e20142d000c41e000470d2a20142802080d2a2011210220142d000d4104460d270c2a0b20142d000d220c4104460d232012102920112102200c41fb0171450d260c220b410710272212450d1520124100360003201241013a0002201241003b0000024020142d000c41e000470d0020142802084107470d0020142802002115410021020340024020024107470d0020142d000d220c4104460d022012102920112102200c41fb0171450d280c240b201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000b0b20121029200041edf4c2003602040c290b41021027220e450d15200e41003b0000024020142d000c41e000470d0020142802084102470d002014280200211241002102034020024102460d1e200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c280b0240200241f788c500460d0041f788c5002002410d10d0040d200b4126210c41edf4c200210e20142d000c41e000470d2620142802080d262011210220142d000d4104460d230c260b02402002418489c500460d00418489c5002002410c10d0040d1f0b4126210c41edf4c200210e20142d000c41e000470d2520142802080d252011210220142d000d4104460d220c250b02402002419b89c500460d00419b89c5002002411510d0040d1e0b4126210c41edf4c200210e20142d000c41e000470d2420142802080d242011210220142d000d4104460d210c240b0240200241b089c500460d0041b089c5002002410a10d0040d1d0b41021027220e450d12200e41003b0000024020142d000c41e000470d0020142802084102470d002014280200211241002102034020024102460d03200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c240b0240200241ba89c500460d0041ba89c5002002410710d0040d1c0b4126210c41edf4c200210e20142d000c41e000470d2220142802080d222011210220142d000d4104460d1f0c220b20142d000d2101200e10292011210220014104460d1e0c200b200241c189c500460d0141c189c5002002411110d004450d010240200241f289c500460d0041f289c5002002411110d0040d1a0b41041027220e450d12200e4100360000024020142d000c41e000470d0020142802084104470d002014280200211241002102034020024104460d07200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c210b200241d289c500460d0141d289c5002002411010d004450d01200241e289c500460d0241e289c5002002411010d004450d020240200241b68ac500460d0041b68ac5002002411010d0040d190b4126210c41edf4c200210e20142d000c41e000470d1f20142802080d1f2011210220142d000d4104460d1c0c1f0b41021027220e450d0e200e41003b0000024020142d000c41e000470d0020142802084102470d002014280200211241002102034020024102460d16200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c1f0b4126210c41edf4c200210e20142d000c41e000470d1d20142802080d1d20142d000d22014104460d1d20112102200141fb0171450d1a0c1b0b41031027220e450d0d200e41003a0002200e41003b0000024020142d000c41e000470d0020142802084103470d002014280200211241002102034020024103460d15200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c1d0b0240200241838ac500460d0041838ac5002002411610d0040d150b410210272212450d0e201241003b0000024020142d000c41e000470d0020142802084102470d002014280200211541002102034020024102460d04201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000b0b201210290c140b20142d000d2101200e10292011210220014104460d170c190b0240200241998ac500460d0041998ac5002002411210d0040d130b4126210c41edf4c200210e20142d000c41e000470d1920142802080d192011210220142d000d4104460d160c190b20142d000d2101201210292011210220014104460d150c170b024020130d0041002116410021170c100b024020132802040d00200041daf6c200360204413221010c190b024020132802002216201341086a28020022174d0d002000418cf7c20036020441c90021010c190b201720032802644d0d0f200041d5f7c20036020441c10021010c180b41014101102a000b41044101102a000b41014101102a000b41074101102a000b41074101102a000b41024101102a000b41024101102a000b41024101102a000b41034101102a000b41044101102a000b41024101102a000b20142d000d2101200e10292011210220014104460d080c0a0b20142d000d2101200e10292011210220014104460d070c090b20142d000d2101200e10292011210220014104460d060c080b20142d000d2101200e10292011210220014104460d050c070b20092903082118200441b8036a220242003703002004418883c0003602b4032009290310211920042018a7417f2018428080808010541b3602c00320042019a7417f2019428080808010541b3602b003200441b0036a4104722201410d1081032001410c108103200141071081032001410f108103200441b0036a410c6a220128020021132002280200211120042802c003211a20042802b403210c20042802b003211b200441c0036a220820073602002001200a3602002004200b3602b803200420053602b403200420063602b003200441e0006a200441b0036a108203024002400240410110272201450d00200141003a0000200420042f01b003220d3b01a002200841e0083b01002002428180808010370300200420013602b403200441013602b0032004200d3b01c203200441e0006a200441b0036a108303210b0240410310272202450d00200241026a41002d009cb0453a0000200241002f009ab0453b00000240410310272208450d00200841026a41002d009fb0453a0000200841002f009db0453b000002400240024002400240024002400240200441f4006a280200220d200441e0006a41106a2802002201470d00200141016a220d2001490d012001410174220e200d200d200e491b220dad42287e2218422088a70d012018a7220e4100480d010240024020010d00200e102721010c010b200428026c200141286c200e102821010b2001450d072004200d3602702004200136026c2004280274210d0b200428026c200d41286c6a220141003a00182001200836020c2001428380808030370204200120023602002001411c6a200b360200200141106a4283808080303702002004200428027441016a360274200441b0036a200441e0006a418c0110ce041a200441f0016a200441b0036a108403200441f0016a41106a280200220f412c6c210120042802f801220e41586a210202400340410021082001450d01200141546a2101200241286a210d2002412c6a220b2102200d2d00004103470d000b200b41086a2802002201450d00200141286c2102200b28020041186a2101410021080340200820012d0000456a2108200141286a2101200241586a22020d000b0b200f412c6c2101200e41586a21022008417f6a210d02400340410021082001450d01200141546a2101200241286a210b2002412c6a22072102200b2d00004103470d000b200741086a2802002201450d00200141286c2102200728020041186a2101410021080340200820012d0000456a2108200141286a2101200241586a22020d000b0b200f412c6c2101200e41606a21020240034041002107024020010d00410021010c020b200141546a2101200241206a210b2002412c6a22142102200b2d00004104470d000b201428020021010b0240024002400240200f450d00200120086a211c200e200f412c6c6a211d4100211e4100211403400240200e2d000041786a220141034b0d00024002400240024020010e0403010200030b200e28020c2201450d03200e280204220b200141186c6a211f0340201421200240200b22212802144104742202450d00202128020c21010340024020012d0000410b470d00200141046a2208280200220b200d490d002008200b41016a3602000b200141106a2101200241706a22020d000b0b02400240024002400240024002400240024002400240410810272201450d002001428080808010370200410410272222450d012021410c6a21082022410036020020212802142223450d0241002102410121122023210b4101210f4101211541012114024003402002200b4f0d01200241016a210502400240024002400240024002400240200828020020024104746a2d0000220b417e6a220241044b0d0020020e050101010302010b200b1085032124200c210b201121250340200b410c6a2107200b41086a2126200b2f010621104100210202400240034020102002460d01202620026a2106200741086a2107200241016a210202404100417f410120062d00002206202441ff0171220a4b1b2006200a461b41016a0e03000301000b0b2002417f6a21100b024020250d00201b210b0c070b2025417f6a2125200b20104102746a41ec006a280200210b0c010b0b201b210b20072802000e0404100304040b200b1085032124200c210b2011212502400340200b410c6a2107200b41086a2126200b2f010621104100210202400240034020102002460d01202620026a2106200741086a2107200241016a210202404100417f410120062d00002206202441ff0171220a4b1b2006200a461b41016a0e03000301000b0b2002417f6a21100b024020250d00201b210b0c030b2025417f6a2125200b20104102746a41ec006a280200210b0c010b0b201b210b024020072802000e0401110001010b200741046a280200210b0b2014417f6a220220144f0d0f200220144b0d0f200f202220024102746a28020022024d0d0f200120024103746a22072802042202200b6a220b2002490d0f2007200b360204024002402012200f460d00201221100c010b201241016a22022012490d1e2012410174220b20022002200b491b221041ffffffff01712010470d1e201041037422024100480d1e0240024020120d002002102721010c010b200120124103742002102821010b2001450d0c0b2001200f4103746a22024101360204200220053602000240024020152014460d00201521060c010b201541016a22022015490d1e2015410174220b20022002200b491b220641ffffffff03712006470d1e200641027422024100480d1e0240024020150d002002102721220c010b202220154102742002102821220b2022450d0d0b200f41016a2102202220144102746a200f360200201441016a21140c050b2014450d0e2014417f6a21140c030b2014450d0d024002402012200f460d00201221100c010b201241016a22022012490d1c2012410174220b20022002200b491b221041ffffffff01712010470d1c201041037422024100480d1c0240024020120d002002102721010c010b200120124103742002102821010b2001450d0c0b2001200f4103746a22024101360204200220053602000240024020152014417f6a220b460d00201521060c010b20154101742202201420142002491b220641ffffffff03712006470d1c200641027422024100480d1c0240024020150d002002102721220c010b202220154102742002102821220b2022450d0d0b200f41016a21022022200b4102746a200f3602000c030b200741046a280200210b0b2014417f6a220220144f0d0b200220144b0d0b200f202220024102746a28020022024d0d0b200120024103746a22072802042202200b6a220b2002490d0b2007200b3602040b20122110200f2102201521060b20052023460d0a2021280214210b201021122002210f20062115200521020c000b0b41a0b0c5002002200b1037000b41084104102a000b41044104102a000b200141086a210741012106410121100c060b20024104102a000b20024104102a000b20024104102a000b20024104102a000b02402012450d00200110290b4101211e024020150d00202021140c080b20221029202021140c070b2002450d01200120024103746a21070b20012114410121020340200129020021182004412d3a00b003200420184220883e02b403200820022018a76a220b417f6a200441b0036a1086032004410b3a00b0032004200d3602b4032008200b200441b0036a108603200241026a21022007200141086a2201470d000b201421010b02402010450d00200110290b02402006450d00202210290b202141186a210b02400240201a450d0020212802142202450d00202128020c210120024104742102410021080340024020012d0000412c470d002001410b3a0000200141046a201c360200200841016a21080b200141106a2101200241706a22020d000b4101211420080d010b202021140b200b201f470d000c040b0b200e2802042201200d490d02200e200141016a3602040c020b200e28020c2201450d01200e280204220b2001411c6c6a21070340200b2201411c6a210b024020012802182202450d0020012802102101200241027421020340024020012802002208200d490d002001200841016a3602000b200141046a21012002417c6a22020d000b0b200b2007460d020c000b0b200e28020c2201450d00200141146c2102200e28020441106a2101034002402001417c6a2802000d0020012802002208200d490d002001200841016a3602000b200141146a21012002416c6a22020d000b0b200e412c6a220e201d470d000b201e4101710d0220144101710d01200428028002210720042802f801210e0b200441fc016a280200211220042802f401211420042802f001210f410021100c020b200441b0036a41106a200441f0016a41106a280200360200200441b0036a41086a200441f0016a41086a290300370300200420042903f0013703b003200441a0026a200441b0036a108203411010272202450d07200241063a0000410110272201450d06200141003a000041011027220b450d05200b20012d00003a000020011029411010272208450d04200841063a000041f00010272201450d03200141063a00602001412c3b01502001200d3602442001410b3a0040200141d8003a00302001201a3602242001412d3a0020200141003602142001410f3a0010200141003602042001410f3a0000024020082d00004109470d00200828020841ffffffff0371450d00200828020410290b20081029024020022d00004109470d00200228020841ffffffff0371450d00200228020410290b20021029200441d4036a4287808080f000370200200441d0036a2001360200200441cc036a4100360200200441b0036a410c6a4281808080800c370200200441b8036a4101360200200441003602dc03200442043702c4032004200b3602b403200441013602b003200441a0026a200441b0036a108703200441b0036a200441a0026a418c0110ce041a20044188026a200441b0036a10840320044188026a410c6a280200211220044198026a2802002107200428028802210f200428028c022114200428029002210e410021100c010b200441fc016a280200211220042802f801210e02402004280280022207450d002007412c6c2102200e2101034020011088032001412c6a2101200241546a22020d000b0b41012110411a211441fc8ec500210f02402012450d00200e10290b0b02402011450d000340200c28026c210c2011417f6a22110d000b0b4100210841002101024003402013450d01024002402001200c2f01064f0d00200c20014103746a41146a2902002118200141016a21010c010b02400240200c28020022010d002008ad21184100210d410021010c010b200c3301044220862008ad8421184101210d0b200c10292018a72108024002402018422088a7220b20012f01064f0d00200121020c010b034002400240200128020022020d002008ad2118410021020c010b200d41016a210d20013301044220862008ad8421180b200110292018a72108200221012018422088a7220b20022f01064f0d000b0b200b41027420026a41f0006a280200210c2002200b4103746a41146a29020021180240200d417f6a2201450d000340200c28026c210c2001417f6a22010d000b0b410021010b2013417f6a21132018a74103470d000b0b0240200c418883c000460d00200c2802002101200c10292001450d0020012802002102200110292002450d00024020022802002201450d000340200210292001210220012802002208210120080d000b0b200210290b02402010450d002000200f36020420004101360200200041086a20143602000c160b200441a0026a41106a2007360200200441a0026a410c6a20123602002004200e3602a802200420143602a4022004200f3602a002200441b0036a200441a0026a2009280260108903024020042802b0034101470d000240200441b0036a41086a280200450d0020042802b40310290b200041968fc50036020420004101360200200041086a41233602000c160b200441c4036a2802002102200441b0036a41106a2802002112200441b0036a410c6a2802002110200441b8036a280200210d20042802b4032108200328025821032004410036029002200442013703880202400240410410272201450d002004410436028c022004200428029002220b41046a3602900220042001360288022001200b6a200836000002400240200428028c02220820042802900222016b4104490d0020042802880221080c010b200141046a220b2001490d0320084101742201200b200b2001491b22014100480d030240024020080d002001102721080c010b20042802880220082001102821080b2008450d022004200136028c02200420083602880220042802900221010b2004200141046a36029002200820016a200d36000020102002412c6c22016a210d024020020d00201021010c0e0b200141546a2113200441b0036a4101722102200441b0036a41276a210b200441b0036a41206a210c200441b0036a41186a210e200441b0036a41106a2107200441b0036a41086a211120102101034020012d00002108200b200141286a280000360000200c200141216a290000370300200e200141196a2900003703002007200141116a2900003703002011200141096a2900003703002004200141016a2900003703b00302402008410f470d002001412c6a21010c0f0b200441a0026a41276a2214200b280000360000200441a0026a41206a220f200c290300370300200441a0026a41186a200e2903002218370300200441a0026a41106a20072903002219370300200441a0026a41086a20112903002227370300200420042903b00322283703a00220022028370000200241086a2027370000200241106a2019370000200241186a2018370000200241206a200f290300370000200241276a2014280000360000200420083a00b003200441e0006a200441b0036a20044188026a108a0320042d00602208411a470d0d201341546a21132001412c6a2201200d470d000b200d21010c0d0b41044101102a000b20014101102a000b102b000b41f0004108102a000b41104108102a000b41014101102a000b41014101102a000b41104108102a000b200e4104102a000b41034101102a000b41034101102a000b41014101102a000b200428026421152004280268210302402013450d002001412c6a2101200441b0036a4101722102200441b0036a41276a210c200441b0036a41206a210e200441b0036a41186a2107200441b0036a41106a2111200441b0036a41086a2113034020012d0000210b200c200141286a280000360000200e200141216a2900003703002007200141196a2900003703002011200141116a2900003703002013200141096a2900003703002004200141016a2900003703b003200b410f460d01200441a0026a41276a2214200c280000360000200441a0026a41206a220f200e290300370300200441a0026a41186a20072903002218370300200441a0026a41106a20112903002219370300200441a0026a41086a20132903002227370300200420042903b00322283703a00220022028370000200241086a2027370000200241106a2019370000200241186a2018370000200241206a200f290300370000200241276a20142800003600002004200b3a00b003200441b0036a1088032001412c6a2201200d470d000b0b02402012450d00201010290b0240200428028c02450d0020042802880210290b024020084105470d002003450d00201510290b200041d791c50036020420004101360200200041086a41253602000c0a0b02402001200d460d00200441b0036a4101722102200441b0036a41276a210b200441b0036a41206a210c200441b0036a41186a210e200441b0036a41106a2107200441b0036a41086a2111034020012d00002108200b200141286a280000360000200c200141216a290000370300200e200141196a2900003703002007200141116a2900003703002011200141096a2900003703002004200141016a2900003703b0032008410f460d01200441a0026a41276a2213200b280000360000200441a0026a41206a2214200c290300370300200441a0026a41186a200e2903002218370300200441a0026a41106a20072903002219370300200441a0026a41086a20112903002227370300200420042903b00322283703a00220022028370000200241086a2027370000200241106a2019370000200241186a2018370000200241206a2014290300370000200241276a2013280000360000200420083a00b003200441b0036a1088032001412c6a2201200d470d000b0b02402012450d00201010290b2004280288022101200429028c0221182000411c6a41003a0000200041146a2018370200200041106a20013602002000410c6a2017360200200041086a2016360200200020033602042000411d6a20042f00f0013b0000200041003602002000411f6a200441f2016a2d00003a00000c090b200020083602040c070b20121029200041edf4c2003602040c060b20121029200041edf4c2003602040c050b02400240200241ec88c500460d0041ec88c5002002410b10d0040d010b4126210c41edf4c200210e20142d000c41e000470d0420142802080d042011210220142d000d4104460d010c040b024002402002419089c500460d00419089c5002002410b10d0040d010b4126210c41edf4c200210e20142d000c41e000470d0420142802080d042011210220142d000d4104460d010c040b0240200241ab8ac500460d0041ab8ac5002002410b10d0040d020b0240024041021027220c450d00200c41003b0000024020142d000c41e000470d0020142802084102470d002014280200210e41002101034020014102460d03200c20016a2102200e20016a2108200141016a210120082d000020022d0000460d000b0b200c10290c030b41024101102a000b20142d000d2101200c10292011210220014104460d000c020b0b41262101200041edf4c2003602040c020b4126210c41edf4c200210e0b200c21012000200e3602040b20004101360200200041086a200136020002402007450d00200b2007412c6c6a2100200b210c0340200c220d412c6a210c02400240200d2d00002201410d4b0d00024002400240024002400240024002400240024002400240024020010e0e0001020304050607080e090a0b0c000b200d41086a280200450d0d200d41046a28020010290c0d0b0240200d41086a280200450d00200d41046a28020010290b200d41146a280200450d0c200d41106a28020010290c0c0b0240200d410c6a2802002202450d00200d41046a28020021012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b200d41086a280200450d0b200d28020410290c0b0b0240200d410c6a2802002202450d00200d41046a2802002101200241286c210203400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200241586a22020d000b0b200d41086a280200450d0a200d28020410290c0a0b200d41086a280200450d09200d41046a28020010290c090b200d41086a280200450d08200d41046a28020010290c080b200d41086a280200450d07200d41046a28020010290c070b0240200d410c6a2802002201450d00200d41046a280200220820014104746a210e0340024020082802082202450d0020082802002101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200841106a21010240200841046a280200450d00200828020010290b200121082001200e470d000b0b200d41086a280200450d06200d28020410290c060b0240200d410c6a2802002202450d00200d41046a2802002101200241146c210203400240200141046a280200450d00200128020010290b200141146a21012002416c6a22020d000b0b200d41086a280200450d05200d28020410290c050b0240200d410c6a2802002201450d00200d41046a28020022082001411c6c6a210e034002402008410c6a2802002202450d0020082802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200e470d000b0b200d41086a280200450d04200d28020410290c040b0240200d410c6a2802002201450d00200d41046a2802002208200141186c6a210e03400240200841046a280200450d00200828020010290b0240200841146a2802002202450d00200828020c2101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200841186a21010240200841106a280200450d00200828020c10290b200121082001200e470d000b0b200d41086a280200450d03200d28020410290c030b0240200d410c6a2802002201450d00200d41046a28020022082001411c6c6a210e034002402008410c6a2802002202450d0020082802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200e470d000b0b200d41086a280200450d02200d28020410290c020b0240200d41046a2d0000220141024b0d0002400240024020010e03000102000b200d410c6a280200450d04200d41086a28020010290c040b0240200d41146a2802002202450d00200d410c6a28020021012002410c6c21020340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200241746a22020d000b0b200d41106a280200450d03200d28020c10290c030b0240200d41146a2802002201450d00200d410c6a280200220720014104746a211103402007220e41106a21070240200e2802042201450d000240200e410c6a2802002202450d002002410c6c21020340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200241746a22020d000b0b200e41086a280200450d00200e28020410290b20072011470d000b0b200d41106a280200450d02200d28020c10290c020b200d410c6a280200450d01200d41086a28020010290c010b0240200d41086a280200450d00200d41046a28020010290b0240200d41146a2802002201450d00200d41186a280200450d00200110290b200d41246a280200450d00200d41206a28020010290b200c2000470d000b0b200a450d00200b10290b200441c0046a24000bb21c05017f027e037f027e097f23004180066b220224004202210302400240024002400240024002400240024002400240200129036822044202520d00200241186a20014198016a41880110ce041a0c010b20024186026a200141036a2d00003a0000200241e8016a41086a200141146a290200370300200241e8016a410d6a200141196a290000370000200220012f00013b0184022002200129020c3703e80120012d000021052001280204210620012802082107200241c0026a200141dc006a290000370300200241b8026a200141d4006a290000370300200241b0026a200141cc006a290000370300200241a8026a200141c4006a290000370300200241a0026a2001413c6a29000037030020024188026a41106a200141346a29000037030020024188026a41086a2001412c6a2900003703002002200129002437038802200241c8026a41086a20014188016a290300370300200241c8026a41106a20014190016a290300370300200220014180016a2903003703c802200141f8006a290300210820012903702109200241086a41888dc300410d10940142002103024020044201520d002009500d022002290310420020022802081b2203200820082003541b2203200320087d2009827d21030b41101027220a450d02200a41086a41002900bf8d43370000200a41002900b78d43370000200a411041201028220a450d03200a2003370010200241e0056a41186a220b4200370300200241e0056a41106a220c4200370300200241e0056a41086a220d4200370300200242003703e005200a4118200241e0056a1000200241c0056a41186a200b290300370300200241c0056a41106a200c290300370300200241c0056a41086a200d290300370300200220022903e0053703c005200241c0056a412041b8d6c50041004100100b210b200a102902400240200b417f470d004101210a411f210b41afb8c300210c0c010b200241b8036a2003108702200241be056a20022d00ba033a0000200241e8056a200241cb036a290000370300200241ed056a200241b8036a41186a290000370000200220022f01b8033b01bc05200220022900c3033703e00520022800bb03210c20022800bf03210b4100210a0b200241b8056a41026a220d200241bc056a41026a220e2d00003a000020024190056a41086a220f200241e0056a41086a221029030037030020024190056a41106a200241e0056a41106a290300370300200220022f01bc053b01b805200220022903e005370390050240200a450d002002419c036a41026a200241b4056a41026a2d00003a000020024180036a41086a200241a0036a41086a29030037030020024180036a41106a200241a0036a41106a290300370300200220022f01b4053b019c03200220022903a00337038003200041086a200b3602002000200c3602042000410136020020014198016a103d0c0a0b200241a0036a410d6a221120024190056a410d6a290000370000200241a0036a41086a220a200f2903003703002002419c036a41026a220f200d2d00003a000020024180036a41086a220d200a29030037030020024180036a41106a200241a0036a41106a290300370300200220022f01b8053b019c03200220022903900537038003200241fc026a41026a220a200f2d00003a0000200220022f019c033b01fc02200241e0026a410d6a220f20024180036a410d6a290000370000200241e0026a41086a2212200d29030037030020022002290380033703e002200241b8036a20014198016a41880110ce041a200241b8036a4198016a2008370300200241c8046a2009370300200241f7046a200b360000200241f3046a200c360000200241d8046a220b20022903c802370300200241e0046a200241c8026a41086a290300370300200241e8046a200241c8026a41106a290300370300200241f2046a200a2d00003a0000200241fb046a20022903e00237000020024183056a201229030037000020024188056a200f290000370000200220043703c004200220022f01fc023b01f004200e20024184026a41026a2d00003a00002010200241e8016a41086a290300370300200241e0056a410d6a2201200241e8016a410d6a290000370000200220022f0184023b01bc05200220022903e8013703e005024002400240200541ff01714101470d0020024180036a200641067610cc01200228028003210a024002402002280288032006413f7122014b0d00410021010c010b200241b8056a41026a200a20014105746a220141026a2d00003a0000200241a8036a200141136a290000370300200241ad036a200141186a290000370000200220012f00003b01b8052002200129000b3703a0032001280007210720012800032106410121010b0240200228028403450d00200a10290b20010d01410121014184efc2002106411521070c020b200241b8056a41026a200241bc056a41026a2d00003a0000200241a0036a41086a200241e0056a41086a29030037030020112001290000370000200220022f01bc053b01b805200220022903e0053703a0030b20024180036a41026a200241b8056a41026a2d00003a0000200241e0056a41086a200241a0036a41086a290300370300200241e0056a410d6a200241a0036a410d6a290000370000200220022f01b8053b018003200220022903a0033703e005410021010b200241b4056a41026a220a20024180036a41026a2d00003a0000200241c0056a41086a220c200241e0056a41086a290300370300200241c0056a41106a200241e0056a41106a290300370300200220022f0180033b01b405200220022903e0053703c00502402001450d002000200636020420004101360200200041086a2007360200200241b8036a103d0c0a0b200241a3056a200c290300370000200241a8056a200241cd056a290000370000200220022f01b4053b01900520022007360097052002200636009305200220022903c00537009b052002200a2d00003a009205200241003602e805200242013703e005200241b8036a200241e0056a10320240024020022903c0044201510d000240024020022802e40520022802e8052201460d0020022802e005210a0c010b200141016a220a2001490d0a20014101742206200a200a2006491b22064100480d0a0240024020010d0020061027210a0c010b20022802e005200120061028210a0b200a450d07200220063602e4052002200a3602e00520022802e80521010b2002200141016a3602e805200a20016a41003a00000c010b20022903d00420022903c8042204420c882203420120034201561b8021030240024020022802e405220a20022802e80522016b4102490d0020022802e005210a0c010b200141026a22062001490d09200a4101742201200620062001491b22014100480d0902400240200a0d0020011027210a0c010b20022802e005200a20011028210a0b200a450d07200220013602e4052002200a3602e00520022802e80521010b2002200141026a3602e805200a20016a2003a741047420047aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b200b200241e0056a10542002200241e0046a3602c005200241c0056a200241e0056a10590240024020022802e405220c20022802e805220a6b4120490d0020022802e00521010c010b200a41206a2201200a490d08200c410174220a20012001200a491b22064100480d0802400240200c0d002006102721010c010b20022802e005200c2006102821010b2001450d07200220063602e405200220013602e00520022802e805210a2006210c0b2001200a6a2206200241f0046a220b290000370000200641186a200b41186a290000370000200641106a200b41106a290000370000200641086a200b41086a29000037000002400240200a41206a220a4180024b0d0002402001200a20024188026a20024190056a10140d004101210a0c020b2001200a20024188026a20024190056a101545210a0c010b200241e0056a41186a22064200370300200241e0056a41106a220b4200370300200241e0056a41086a220d4200370300200242003703e0052001200a200241e0056a1000200241c0056a41186a2006290300370300200241c0056a41106a200b290300370300200241c0056a41086a200d290300370300200220022903e0053703c0050240200241c0056a412020024188026a20024190056a10140d004101210a0c010b200241c0056a412020024188026a20024190056a101545210a0b0240200c450d00200110290b200a450d08200241c8016a41186a20024190056a41186a290300370300200241c8016a41106a20024190056a41106a290300370300200241c8016a41086a20024190056a41086a290300370300200241a0016a41086a200241d0046a290300370300200241a0016a41106a200241d8046a290300370300200241a0016a41186a200241e0046a290300370300200241c0016a200241e8046a29030037030020022002290390053703c8012002200241c8046a2903003703a00120022903c0042103200241186a200241b8036a41880110ce041a0b200041086a20022903c801370300200041286a2003370300200041306a20022903a001370300200041206a200241c8016a41186a290300370300200041186a200241c8016a41106a290300370300200041106a200241c8016a41086a290300370300200041386a200241a0016a41086a290300370300200041c0006a200241a0016a41106a290300370300200041c8006a200241a0016a41186a290300370300200041d0006a200241a0016a41206a290300370300200041d8006a200241186a41880110ce041a2000410036020020024180066a24000f0b41a8cec5001058000b41104101102a000b41204101102a000b20064101102a000b20014101102a000b20064101102a000b102b000b200041a981c20036020420004101360200200041086a411a360200200241b8036a103d0b20024180066a24000bfb0301067f230041e0006b22022400024002400240411010272203450d00200341086a41002900bf8d43370000200341002900b78d4337000020034110412010282203450d0120032001370010200241c0006a41186a22044200370300200241c0006a41106a22054200370300200241c0006a41086a220642003703002002420037034020034118200241c0006a1000200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903403703002002410036024020024120200241c0006a100521060240024020022802402204417f460d00200241c0006a2004412020044120491b22056a41004100412020056b2005411f4b1b10cd041a200241c0006a2006200510ce041a2004411f4d0d04200241206a41186a2204200241c0006a41186a290000370300200241206a41106a2205200241c0006a41106a290000370300200241206a41086a2207200241c0006a41086a2900003703002002200229004037032020061029200041186a2004290300370000200041106a2005290300370000200041086a2007290300370000200020022903203700000c010b200041186a4200370000200041106a4200370000200041086a4200370000200042003700000b20031029200241e0006a24000f0b41104101102a000b41204101102a000b418f89c3004133104e000bf70603057f027e067f230041c0016b22022400200242003703800120024180016a2001280200220320012802042204410820044108491b220510ce041a2001200420056b22063602042001200320056a220536020002400240200441074b0d00200042003703000c010b2002290380012107200242003703800120024180016a20052006410820064108491b220410ce041a2001200620046b22033602042001200520046a22053602000240200641074d0d00200229038001210820024180016a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a20024180016a2005200410ce041a2001200320046b22063602042001200520046a220536020002402003411f4b0d00200042003703000c020b200241e0006a41186a220320024180016a41186a2209290000370300200241e0006a41106a220a20024180016a41106a220b290000370300200241e0006a41086a220c20024180016a41086a220d290000370300200220022900800137036020024180016a200641c000200641c000491b22046a4100410041c00020046b2004413f4b1b10cd041a20024180016a2005200410ce041a2001200620046b3602042001200520046a36020002402006413f4b0d00200042003703000c020b200241386a220120024180016a41386a290000370300200241306a220420024180016a41306a290000370300200241286a220520024180016a41286a290000370300200241206a220620024180016a41206a290000370300200241186a220e2009290000370300200241106a2209200b290000370300200241086a220b200d290000370300200241c0006a41086a220d200c290300370300200241c0006a41106a220c200a290300370300200241c0006a41186a220a2003290300370300200220022900800137030020022002290360370340200041106a200837030020002007370308200041186a2002290340370300200041206a200d290300370300200041286a200c290300370300200041306a200a290300370300200041386a2002290300370300200041c0006a200b290300370300200041c8006a2009290300370300200041d0006a200e290300370300200041d8006a2006290300370300200041e0006a2005290300370300200041e8006a2004290300370300200041f0006a2001290300370300200042013703000c010b200042003703000b200241c0016a24000b860204017f017e037f017e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1000200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703002003410036022020034120200341206a1005210202400240024020032802202201417f470d000c010b20034200370320200341206a20022001410820014108491b10ce041a200141074d0d012003290320210820021029420121040b2000200837030820002004370300200341c0006a24000f0b418f89c3004133104e000bc80101027f230041206b22022400200241106a41086a220342003703002002420037031020002001200241106a1004200241086a2003290300370300200220022903103703002002410036021020024110200241106a10052101024002400240024020022802102200417f470d00410221000c010b200241003a0010200241106a20012000410047220310ce041a20002003490d012000450d0220022d001021002001102920024110100c0b200241206a240020000f0b20032000103e000b418f89c3004133104e000b870802087f0a7e230041e0026b22022400200241386a2001280200200128020428020c1100000240024020022903384201520d0020024198026a4101722103200241386a41086a2104200241ab016a21050340200241a8016a41186a2206200441186a290000370300200241a8016a41106a2207200441106a290000370300200241a8016a41086a2208200441086a290000370300200220042900003703a80120024198026a200241a8016a108c02024002400240024020022d0098024101460d00200241003602e8010c010b200241c0026a41186a200341186a290000370300200241c0026a41106a200341106a290000370300200241c0026a41086a200341086a290000370300200220032900003703c002200241c8016a200241c0026a108d0220022802e80122090d010b4200210a4200210b0c010b200241c8016a41086a290300210b20022903c801210a20022802ec01450d00200910290b20024198026a41086a2008290300220c37030020024198026a41106a2007290300220d37030020024198026a41186a2006290300220e370300200220022903a801220f37039802200241c8016a41086a2207200c370300200241c8016a41106a2208200d370300200241c8016a41186a2209200e3703002002200f3703c801200241206a41b18ac0004116108601200241106a2002290328200241206a41106a290300427f420010d4042002200a200b20022903104200200228022022061b220c4201200c420156200241106a41086a290300420020061b220c420052200c501b22061b200c420020061b10d404024002402002290300220c50450d00410221060c010b200241c0026a41186a2009290300370300200241c0026a41106a2008290300370300200241c0026a41086a2007290300370300200220022903c8013703c002200220022800a8013602a001200220052800003600a3014200211041002106200c2111200a2112200b21130b20024180016a41086a200241c0026a41086a29030037030020024180016a41106a200241c0026a41106a29030037030020024180016a41186a200241c0026a41186a290300370300200220022903c00237038001200220022802a001360278200220022800a30136007b024020064102460d002000201137031020004200370308200042003703002000200229038001370320200020063a004020002002280278360041200041186a2010370300200041d0006a2013370300200041c8006a2012370300200041c4006a200228007b360000200041286a20024188016a290300370300200041306a20024190016a290300370300200041386a20024180016a41186a2903003703000c030b200241386a2001280200200128020428020c11000020022903384201510d000b0b200041023a00400b200241e0026a24000bbd0402087f047e230041e0006b22022400024002400240410e10272203450d00200341066a41002900c7a244370000200341002900c1a2443700002003410e412e10282203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a22054200370300200242003703202003412e200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002410036024020024120200241c0006a100521050240024020022802402201417f460d00200241206a2001412020014120491b22046a41004100412020046b2004411f4b1b10cd041a200241206a2005200410ce041a2001411f4d0d04200241c0006a41186a2201200241206a41186a2204290300370300200241c0006a41106a2206200241206a41106a2207290300370300200241c0006a41086a2208200241206a41086a2209290300370300200220022903203703402005102920042001290300220a37030020072006290300220b37030020092008290300220c37030020022002290340220d370320200041013a00002000200d370001200041096a200c370000200041116a200b370000200041196a200a3700000c010b200041003a00000b20031029200241e0006a24000f0b410e4101102a000b412e4101102a000b418f89c3004133104e000bee05010c7f230041d0016b2202240002400240024002400240410e10272203450d00200341066a410029009fa34437000020034100290099a3443700002003410e412e10282203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241f8006a41186a22014200370300200241f8006a41106a22044200370300200241f8006a41086a22054200370300200242003703782003412e200241f8006a1000200241d8006a41186a2001290300370300200241d8006a41106a2004290300370300200241d8006a41086a20052903003703002002200229037837035820024100360278200241d8006a4120200241f8006a1005210420022802782201417f460d03200220013602cc01200220043602c801200241f8006a200241c8016a10d3032002280298012205450d02200241386a41186a2206200241f8006a41186a290300370300200241386a41106a2207200241f8006a41106a290300370300200241386a41086a2208200241f8006a41086a290300370300200241086a41086a2209200241f8006a412c6a290200370300200241086a41106a220a200241f8006a41346a290200370300200241086a41186a220b200241f8006a413c6a290200370300200241286a220c200241f8006a41c4006a290200370300200241306a220d200241f8006a41cc006a280200360200200220022903783703382002200229029c0137030802402001450d00200410290b200020022903383703002000200536022020002002290308370224200041186a2006290300370300200041106a2007290300370300200041086a20082903003703002000412c6a2009290300370200200041346a200a2903003702002000413c6a200b290300370200200041c4006a200c290300370200200041cc006a200d2802003602000c040b410e4101102a000b412e4101102a000b418f89c3004133104e000b200041003602200b20031029200241d0016a24000b8e0a03077f037e047f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b220810ce041a2001200720086b3602042001200620086a360200024002402007411f4b0d00410021070c010b20024190016a41186a2003290300220937030020024190016a41106a2004290300220a37030020024190016a41086a2005290300220b370300200241f0006a41086a200b370300200241f0006a41106a200a370300200241f0006a41186a2009370300200220022903b00122093703900120022009370370410121070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b0010240024020070d00200041003602080c010b200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b00137033020022001105202402002290300a70d00200041003602080c010b20022903082109200241b0016a41186a22044200370300200241b0016a41106a22054200370300200241b0016a41086a220c4200370300200242003703b001200241b0016a2001280200220320012802042207412020074120491b220810ce041a2001200720086b22063602042001200320086a220836020002402007411f4b0d00200041003602080c010b200241d0006a41086a200c290300370300200241d0006a41106a2005290300370300200241d0006a41186a2004290300370300200220022903b001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a200241b0016a2008200710ce041a2001200620076b3602042001200820076a36020002402006411f4b0d00200041003602080c010b200241f0006a41086a2203200241b0016a41086a2207290300370300200241f0006a41106a2204200241b0016a41106a2208290300370300200241f0006a41186a2205200241b0016a41186a2206290300370300200220022903b001370370200241106a200110430240200228021022010d00200041003602080c010b2007200241306a41086a2903003703002008200241306a41106a2903003703002006200241306a41186a29030037030020024190016a41086a220c200241d0006a41086a29030037030020024190016a41106a220d200241d0006a41106a29030037030020024190016a41186a220e200241d0006a41186a290300370300200220022903303703b00120022002290350370390012002290214210a200241106a41186a220f2005290300370300200241106a41106a22052004290300370300200241106a41086a22042003290300370300200220022903703703102000200a37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2007290300370200200041246a20082903003702002000412c6a2006290300370200200041346a2002290390013702002000413c6a200c290300370200200041c4006a200d290300370200200041cc006a200e290300370200200041ec006a200f290300370200200041e4006a2005290300370200200041dc006a2004290300370200200041d4006a20022903103702000b200241d0016a24000bcb2a04057f027e027f047e230041e0046b22022400200241003a00d402200241d4026a2001280200220320012802042204410047220510ce041a0240024002400240024002400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041123a00000c0b0b024020022d00d402220441104b0d000240024002400240024002400240024002400240024002400240024002400240024020040e11000102030405060708090a0b0c0d0e0f10000b200241d8036a2001103c20022802d8032104200241d4026a200241d8036a41047241840110ce041a024020044112470d00200041123a00000c1c0b200241d0016a200241d4026a41840110ce041a41880110272205450d1220052004360200200541046a200241d0016a41840110ce041a20022001105302402002290300a70d00200041123a00002005103d200510290c1c0b200241106a290300210720022903082108200041013a0000200020022f00b0013b0001200041086a2008370300200041046a2005360200200041186a2002290358370300200041106a2007370300200041036a200241b2016a2d00003a0000200041206a200241d8006a41086a290300370300200041286a200241d8006a41106a290300370300200041306a200241d8006a41186a2903003703000c1b0b200241186a2001102e024020022802180d00200041123a00000c1b0b200228021c2101200041023a0000200020022f00d4023b0001200041046a2001360200200041086a20022903d803370300200041036a200241d4026a41026a2d00003a0000200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c1a0b200241206a2001102e024020022802200d00200041123a00000c1a0b20022802242106200241003a00d402200241d4026a2001280200220320012802042204410047220510ce041a20042005490d112001200420056b3602042001200320056a360200024002402004450d0020022d00d402220141ff007122044106490d010b200041123a00000c1a0b200041033a0000200041046a2006360200200041026a20043a0000200020014107763a0001200041086a20022903d803370300200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c190b200241286a2001102e024020022802280d00200041123a00000c190b200228022c2106200241003a00d402200241d4026a2001280200220320012802042204410047220510ce041a20042005490d112001200420056b3602042001200320056a360200024002402004450d0020022d00d402220141ff007122044106490d010b200041123a00000c190b200041043a0000200041046a2006360200200041026a20043a0000200020014107763a0001200041086a20022903d803370300200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c180b200241d8036a2001103c20022802d8032104200241d4026a200241d8036a41047241840110ce041a024020044112470d00200041123a00000c180b200241d0016a200241d4026a41840110ce041a41880110272205450d1120052004360200200541046a200241d0016a41840110ce041a200241003a00d402200241d4026a2001280200220920012802042204410047220310ce041a20042003490d122001200420036b22063602042001200920036a2203360200024002402004450d0020022d00d402220a4103490d010b200041123a00000c170b200242003703d803200241d8036a20032006410820064108491b220410ce041a2001200620046b22093602042001200320046a22043602000240200641074b0d00200041123a00000c170b20022903d8032107200242003703d803200241d8036a20042009410820094108491b220310ce041a2001200920036b3602042001200420036a3602000240200941074b0d00200041123a00000c170b200041106a20022903d803370300200041086a2007370300200041046a20053602002000200a3a0001200041053a0000200041186a2002290358370300200041206a200241d8006a41086a290300370300200041286a200241d8006a41106a290300370300200041306a200241d8006a41186a2903003703000c170b200241003602d402200241d4026a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a3602000240200641034b0d00200041123a00000c170b20022802d4022101200041063a0000200020022f00d0013b0001200041046a2001360200200041086a20022903d803370300200041036a200241d2016a2d00003a0000200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c160b200241d8036a2001103c20022802d8032101200241d4026a200241d8036a41047241840110ce041a024020014112470d00200041123a00000c160b200241d0016a200241d4026a41840110ce041a41880110272204450d1120042001360200200441046a200241d0016a41840110ce041a200041073a0000200020022f00b0013b0001200041036a200241b2016a2d00003a0000200041046a2004360200200041086a2002290358370300200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a290300370300200041306a200241d8006a41286a2903003703000c150b200241d8036a2001103c20022802d8032101200241d4026a200241d8036a41047241840110ce041a024020014112470d00200041123a00000c150b200241d0016a200241d4026a41840110ce041a41880110272204450d1120042001360200200441046a200241d0016a41840110ce041a200041083a0000200020022f00b0013b0001200041036a200241b2016a2d00003a0000200041046a2004360200200041086a2002290358370300200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a290300370300200041306a200241d8006a41286a2903003703000c140b41002109200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b22033602042001200520046a220436020002402006411f4d0d00200241d0016a41186a200241d4026a41186a2900002207370300200241d0016a41106a200241d4026a41106a2900002208370300200241d0016a41086a200241d4026a41086a290000220b370300200241d8006a41086a200b370300200241d8006a41106a2008370300200241d8006a41186a2007370300200220022900d40222073703d00120022007370358410121090b200241d8036a41186a2205200241d8006a41186a290300370300200241d8036a41106a2206200241d8006a41106a290300370300200241d8036a41086a220a200241d8006a41086a290300370300200220022903583703d803024020090d00200041123a00000c140b200241b0016a41186a2005290300370300200241b0016a41106a2006290300370300200241b0016a41086a200a290300370300200220022903d8033703b001200242003703d803200241d8036a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041123a00000c140b20022903d8032107200242003703d803200241d8036a20042006410820064108491b220510ce041a2001200620056b3602042001200420056a3602000240200641074b0d00200041123a00000c140b20024190016a41086a200241b0016a41086a290300220837030020024190016a41106a200241b0016a41106a290300220b37030020024190016a41186a200241b0016a41186a290300220c370300200220022903b001220d3703900120022903d803210e200041093a00002000200d370001200041096a2008370000200041116a200b370000200041196a200c370000200041216a200228008901360000200041246a2002418c016a280000360000200041306a200e370300200041286a20073703000c130b41002103200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b3602042001200520046a36020002402006411f4d0d00200241d0016a41186a200241d4026a41186a2900002207370300200241d0016a41106a200241d4026a41106a2900002208370300200241d0016a41086a200241d4026a41086a290000220b370300200241d8006a41086a200b370300200241d8006a41106a2008370300200241d8006a41186a2007370300200220022900d40222073703d00120022007370358410121030b200241d8036a41186a2201200241d8006a41186a290300370300200241d8036a41106a2204200241d8006a41106a290300370300200241d8036a41086a2205200241d8006a41086a290300370300200220022903583703d803024020030d00200041123a00000c130b200241b0016a41186a20012903002207370300200241b0016a41106a20042903002208370300200241b0016a41086a2005290300220b370300200220022903d803220c3703b0012000410a3a00002000200c370001200041096a200b370000200041116a2008370000200041196a2007370000200041216a200229009001370000200041296a20024190016a41086a290000370000200041306a2002419f016a2900003700000c120b200241306a2001102e024020022802300d00200041123a00000c120b200228023421012000410b3a0000200020022f00d4023b0001200041046a2001360200200041086a20022903d803370300200041036a200241d6026a2d00003a0000200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c110b200241c8006a2001105202402002290348a70d00200041123a00000c110b20022903502107200241c0006a2001102e024020022802400d00200041123a00000c110b20022802442104200241386a2001102e024020022802380d00200041123a00000c110b200228023c21012000410c3a0000200020022f00d4023b0001200041106a2007370300200041086a2001360200200041046a2004360200200041186a20022903d803370300200041036a200241d6026a2d00003a0000200041206a200241d8036a41086a290300370300200041286a200241d8036a41106a290300370300200041306a200241d8036a41186a2903003703000c100b200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b3602042001200520046a36020002402006411f4b0d00200041123a00000c100b200241d8006a41086a200241d4026a41086a2900002208370300200241d8006a41106a200241d4026a41106a290000220b370300200241d8006a41186a200241d4026a41186a290000220c370300200220022900d40222073703d803200220073703582000410d3a000020002007370001200041096a2008370000200041116a200b370000200041196a200c370000200041216a20022900b001370000200041296a200241b0016a41086a290000370000200041306a200241bf016a2900003700000c0f0b2000410e3a00000c0e0b200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b3602042001200520046a36020002402006411f4b0d00200041123a00000c0e0b200241d8006a41086a200241d4026a41086a2900002208370300200241d8006a41106a200241d4026a41106a290000220b370300200241d8006a41186a200241d4026a41186a290000220c370300200220022900d40222073703d803200220073703582000410f3a000020002007370001200041096a2008370000200041116a200b370000200041196a200c370000200041216a20022900b001370000200041296a200241b0016a41086a290000370000200041306a200241b0016a410f6a2900003700000c0d0b200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b22033602042001200520046a220436020002402006411f4b0d00200041123a00000c0d0b200241d8006a41086a200241d4026a41086a290000370300200241d8006a41106a200241d4026a41106a290000370300200241d8006a41186a200241d4026a41186a290000370300200220022900d40222073703d80320022007370358200241003a00d402200241d4026a20042003410047220510ce041a20032005490d0a2001200320056b3602042001200420056a360200024002402003450d0020022d00d40222014106490d010b200041123a00000c0d0b200241b0016a41186a200241d8006a41186a2903002207370300200241b0016a41106a200241d8006a41106a2903002208370300200241b0016a41086a200241d8006a41086a290300220b37030020022002290358220c3703b001200041103a00002000200c370001200041096a200b370000200041116a2008370000200041196a2007370000200041216a20013a0000200041226a2002290190013701002000412a6a20024190016a41086a290100370100200041306a2002419e016a2901003701000c0c0b200041113a00000c0b0b200041123a00000c0a0b20052004103e000b4188014108102a000b20052004103e000b20052004103e000b4188014108102a000b20032004103e000b4188014108102a000b4188014108102a000b20052003103e000b2005103d200510290b200241e0046a24000b890a02057f047e230041d0036b22022400200241003a00c802200241c8026a2001280200220320012802042204410047220510ce041a02400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041053a00000c060b02400240024020022d00c802220441034b0d0002400240024020040e0400010204000b200241c0016a2001102d20022802c00122010d04200041053a00000c0a0b200241c8026a2001103c20022802c8022101200241c0016a200241c8026a41047241840110ce041a024020014112470d00200041053a00000c0a0b200241386a200241c0016a41840110ce041a41880110272204450d0520042001360200200441046a200241386a41840110ce041a200041023a0000200020022f00353b0001200041036a200241356a41026a2d00003a0000200041046a2004360200200041086a2002290214370200200041106a200241146a41086a290200370200200041186a200241146a41106a290200370200200041206a200241146a41186a2902003702000c090b20022001102e024020022802000d00200041053a00000c090b20022802042105200241c8026a2001103c20022802c8022101200241c0016a200241c8026a41047241840110ce041a024020014112470d00200041053a00000c090b200241386a200241c0016a41840110ce041a41880110272204450d0520042001360200200441046a200241386a41840110ce041a200041033a0000200020022f00353b0001200041036a200241376a2d00003a0000200041086a2004360200200041046a20053602002000410c6a2002290214370200200041146a200241146a41086a2902003702002000411c6a200241246a290200370200200041246a2002412c6a2802003602000c080b200041053a00000c070b200241c8026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241c8026a2005200410ce041a2001200620046b3602042001200520046a3602002006411f4d0d05200241c0016a41186a200241c8026a41186a290000370300200241c0016a41106a200241c8026a41106a290000370300200241c0016a41086a200241c8026a41086a290000370300200220022900c8023703c001200241086a2001102e024020022802080d00200041053a00000c070b200228020c2106200241003a00c802200241c8026a2001280200220320012802042204410047220510ce041a20042005490d042001200420056b3602042001200320056a360200024020040d00200041053a00000c070b200241386a41086a200241c0016a41086a2903002207370300200241386a41106a200241c0016a41106a2903002208370300200241386a41186a200241c0016a41186a2903002209370300200220022903c001220a37033820022d00c8022101200041043a00002000200a370001200041096a2007370000200041116a2008370000200041196a2009370000200041246a2006360200200041216a20013a00000c060b20022902c4012107200041013a0000200020022f00383b0001200041086a2007370000200041046a2001360000200041106a20022902c802370200200041036a2002413a6a2d00003a0000200041186a200241c8026a41086a290200370200200041206a200241c8026a41106a2902003702000c050b20052004103e000b4188014108102a000b4188014108102a000b20052004103e000b200041053a00000b200241d0036a24000bc12308057f017e017f027e017f037e087f027e230041f0056b22022400200241003a0070200241f0006a2001280200220320012802042204410047220510ce041a02400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041073a00000c060b02400240024002400240024020022d0070220441054b0d000240024002400240024020040e06000102030406000b200241d8026a200110f10220024180056a200241d8026a41f00010ce041a200220022800c9033602d0032002200241cc036a2800003600d303024020022d00c80322014102470d00200041073a00000c100b200241e8016a20024180056a41f00010ce041a200220022800d3033600e304200220022802d0033602e004200241f7006a200241e8016a41f00010ce041a200041013a0000200041016a200241f0006a41f70010ce041a200041f8006a20013a0000200041f9006a20022802e004360000200041fc006a20022800e3043600000c0f0b200241086a2001105202402002290308a70d00200041073a00000c0f0b20022903102107200241f0006a20011044200228027022010d05200041073a00000c0e0b200241f0006a2001105020024180056a41086a2204200241f9006a29000037030020024180056a41106a220520024181016a29000037030020024180056a41186a220320024189016a29000037030020024180056a411f6a220620024190016a2800003600002002200229007137038005024020022d007022084102470d00200041073a00000c0e0b200241e8016a411f6a2006280000360000200241e8016a41186a2003290300370300200241e8016a41106a2005290300370300200241e8016a41086a200429030037030020022002290380053703e801200241286a2001105302402002290328a70d00200041073a00000c0e0b200241286a41106a290300210720022903302109200241186a2001105202402002290318a70d00200041073a00000c0e0b2002290320210a200241f0006a20011044200228027022010d05200041073a00000c0d0b200241d0006a2001105302402002290350a70d00200041073a00000c0d0b200241e0006a290300210720022903582109200241c0006a2001105202402002290340a70d00200041073a00000c0d0b2002290348210a20024180056a41186a2206420037030020024180056a41106a2208420037030020024180056a41086a220b4200370300200242003703800520024180056a2001280200220320012802042204412020044120491b220510ce041a2001200420056b3602042001200320056a360200024002402004411f4b0d00410021040c010b200241e8016a41186a2006290300220c370300200241e8016a41106a2008290300220d370300200241e8016a41086a200b290300220e370300200241d0036a41086a200e370300200241d0036a41106a200d370300200241d0036a41186a200c3703002002200229038005220c3703e8012002200c3703d003410121040b200241f0006a41186a2205200241d0036a41186a290300370300200241f0006a41106a2203200241d0036a41106a290300370300200241f0006a41086a2206200241d0036a41086a290300370300200220022903d003370370024020040d00200041073a00000c0d0b200241e0046a41186a2005290300370300200241e0046a41106a2003290300370300200241e0046a41086a2006290300370300200220022903703703e004200241f0006a20011044200228027022010d05200041073a00000c0c0b20024180056a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a20024180056a2005200410ce041a2001200620046b22033602042001200520046a220436020002402006411f4b0d00200041073a00000c0c0b200241e0046a41086a20024180056a41086a290000370300200241e0046a41106a20024180056a41106a290000370300200241e0046a41186a20024180056a41186a29000037030020022002290080052207370370200220073703e004200241003a0070200241f0006a20042003410047220510ce041a20032005490d072001200320056b22063602042001200420056a22043602002003450d0820022d0070220541014b0d08410021030240024020050e020100010b20024180056a2006412020064120491b22056a41004100412020056b2005411f4b1b10cd041a20024180056a2004200510ce041a2001200620056b3602042001200420056a3602002006411f4d0d09200241f0006a41086a20024180056a41086a2900002207370300200241d0036a41186a20024180056a41186a290000370300200241d0036a41106a20024180056a41106a290000370300200241d0036a41086a200737030020022002290080052207370370200220073703d003410121030b200241a0046a41086a2201200241d0036a41086a290300370300200241a0046a41106a2204200241d0036a41106a290300370300200241a0046a41186a2205200241d0036a41186a290300370300200241c0046a41086a2206200241e0046a41086a290300370300200241c0046a41106a2208200241e0046a41106a290300370300200241c0046a41186a220b200241e0046a41186a290300370300200220022903d0033703a004200220022903e0043703c004200041053a0000200041216a20033a0000200020022903c004370001200041096a2006290300370000200041116a2008290300370000200041196a200b290300370000200041226a20022903a0043700002000412a6a2001290300370000200041326a20042903003700002000413a6a2005290300370000200041f8006a2002418e036a290100370100200041f2006a20024188036a290100370100200041ea006a20024180036a290100370100200041e2006a200241f8026a290100370100200041da006a200241d8026a41186a290100370100200041d2006a200241d8026a41106a290100370100200041ca006a200241d8026a41086a290100370100200041c2006a20022901d8023701000c0b0b200041073a00000c0a0b20024180056a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a20024180056a2005200410ce041a2001200620046b22033602042001200520046a22053602002006411f4d0d08200241e0046a41086a20024180056a41086a2208290000370300200241e0046a41106a20024180056a41106a220b290000370300200241e0046a41186a20024180056a41186a220f29000037030020022002290080052207370370200220073703e00420024180056a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a20024180056a2005200410ce041a2001200320046b22063602042001200520046a220436020002402003411f4b0d00200041073a00000c0a0b200241d0036a41086a2008290000370300200241d0036a41106a200b290000370300200241d0036a41186a200f29000037030020022002290080053703d003200242003703e002200242003703d802200241d8026a20042006411020064110491b220510ce041a2001200620056b3602042001200420056a36020002402006410f4b0d00200041073a00000c0a0b200241e0026a290300210720022903d8022109200241e8006a2001102e02402002280268450d0002400240200228026c22104180012010418001491b220b0d004101210f0c010b200b41057422041027220f450d090b02402010450d00200241d8026a41186a2111200241d8026a41106a2112200241d8026a41086a21134100210841002103410021050340201142003703002012420037030020134200370300200242003703d802200241d8026a2001280200221420012802042204412020044120491b220610ce041a2001200420066b3602042001201420066a36020002402004411f4b0d00200b450d03200f10290c030b200541016a2104200241f0006a41186a22062011290300370300200241f0006a41106a22142012290300370300200241f0006a41086a22152013290300370300200220022903d80237037002402005200b470d0002402008200420042008491b220b41ffffff3f71200b470d00200b41057422164100480d000240024020050d0020161027210f0c010b200f200320161028210f0b200f0d0120164101102a000b102b000b200f20036a22052002290370370000200541186a2006290300370000200541106a2014290300370000200541086a2015290300370000200841026a2108200341206a21032004210520102004470d000b0b200f0d040b200041073a00000c090b20022902742109200041023a0000200020022f0080053b0001200041106a2007370300200041086a2009370000200041046a2001360000200041036a20024180056a41026a2d00003a0000200041186a200241d8026a41e80010ce041a0c080b200241d0036a41086a2204200241e8016a41086a290300370300200241d0036a41106a2205200241e8016a41106a290300370300200241d0036a41186a2203200241e8016a41186a290300370300200241d0036a411f6a2206200241e8016a411f6a280000360000200220022903e8013703d0032002290274210c200041033a0000200020022f00e0043b0001200041036a200241e2046a2d00003a0000200041046a20083a0000200041c0006a2007370300200041386a2009370300200041c8006a200a3703002000412c6a200c370200200041286a2001360200200041056a20022903d0033700002000410d6a2004290300370000200041156a20052903003700002000411d6a2003290300370000200041246a2006280000360000200041f8006a200241d8026a41286a290300370300200041f0006a200241f8026a290300370300200041e8006a200241d8026a41186a290300370300200041e0006a200241d8026a41106a290300370300200041d8006a200241d8026a41086a290300370300200041d0006a20022903d8023703000c070b200241c0046a41086a200241e0046a41086a290300220c370300200241c0046a41106a200241e0046a41106a290300220d370300200241c0046a41186a200241e0046a41186a290300220e370300200220022903e00422173703c00420022902742118200041386a2007370300200041306a2009370300200041043a000020002017370001200041096a200c370000200041116a200d370000200041196a200e370000200041216a20022f00a0043b0000200041236a200241a2046a2d00003a0000200041c0006a200a370300200041286a2018370000200041246a2001360000200041c8006a20022903d802370300200041d0006a200241d8026a41086a290300370300200041d8006a200241d8026a41106a290300370300200041e0006a200241d8026a41186a290300370300200041e8006a200241f8026a290300370300200041f0006a200241d8026a41286a290300370300200041f8006a200241d8026a41306a2903003703000c060b200241c0046a41186a2201200241e0046a41186a290300370300200241c0046a41106a2204200241e0046a41106a290300370300200241c0046a41086a2205200241e0046a41086a290300370300200241a0046a41086a2203200241d0036a41086a290300370300200241a0046a41106a2206200241d0036a41106a290300370300200241a0046a41186a2208200241d0036a41186a290300370300200220022903e0043703c004200220022903d0033703a004200041063a0000200020022903c004370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a20022903a004370000200041296a2003290300370000200041316a2006290300370000200041396a2008290300370000200041c1006a20022f009d043b0000200041c3006a2002419f046a2d00003a0000200041d8006a2007370300200041d0006a2009370300200041c8006a2010ad422086200bad84370000200041c4006a200f360000200041f8006a200241f8036a41186a290300370300200041f0006a200241f8036a41106a290300370300200041e8006a200241f8036a41086a290300370300200041e0006a20022903f8033703000c050b20052004103e000b20052003103e000b200041073a00000c020b20044101102a000b200041073a00000b200241f0056a24000ba30b01077f230041106b2202240002400240024002400240024002400240024020002d0000417f6a220341034b0d00024002400240024020030e0400010203000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c20034101742205200420042005491b22054100480d0c0240024020030d002005102721040c010b200128020020032005102821040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210320022000410c6a280200220036020c2002410c6a200110302000450d0320004105742106200141046a210703400240024020072802002204200528020022006b4120490d00200128020021040c010b200041206a22082000490d0d20044101742200200820082000491b22004100480d0d0240024020040d002000102721040c010b200128020020042000102821040b2004450d072001200436020020072000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000c040b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0b20034101742205200420042005491b22054100480d0b0240024020030d002005102721040c010b200128020020032005102821040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000280204200110320c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a20034101742205200420042005491b22054100480d0a0240024020030d002005102721040c010b200128020020032005102821040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041046a200110302000280208200110320c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0920034101742205200420042005491b22054100480d090240024020030d002005102721040c010b200128020020032005102821040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d0920044101742203200520052003491b22034100480d090240024020040d002003102721040c010b200128020020042003102821040b2004450d0720012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a29000037000020032000290001370000200041246a2001103002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d0920034101742205200420042005491b22054100480d090240024020030d002005102721040c010b200128020020032005102821040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00213a00000b200241106a24000f0b20054101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20054101102a000b102b000bf71802047f017e20002802582102024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2802002203200141086a28020022046b4104490d00200128020021030c010b200441046a22052004490d1320034101742204200520052004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240200141046a2802002203200528020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0320012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0520012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0820012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0920012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0a20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290348210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290350210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0c20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028025c210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0d20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280260210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0e20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280264210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0f20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280268210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d1020012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240200141046a28020020022802002204460d00200128020021030c010b200441016a22032004490d1320044101742202200320032002491b22024100480d130240024020040d002002102721030c010b200128020020042002102821030b2003450d1120012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a20002d00703a0000200028026c210302400240200141046a2802002204200228020022006b4104490d00200128020021040c010b200041046a22022000490d1320044101742200200220022000491b22004100480d130240024020040d002000102721040c010b200128020020042000102821040b2004450d1220012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000f0b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20024101102a000b20004101102a000b102b000bb01405167f017e017f027e037f230041206b220224000240024020014115490d0002402001410176220341ffffff3f712003470d0020034105742204417f4c0d0041012105024002402004450d00200410272205450d010b200041606a2106200041a07f6a210741042108410021094100210a2001210b034002400240200b220c417f6a220d0d004101210e4100210b0c010b0240024002400240024002402000200d4105746a200c410574220f20006a41406a412010d0044100480d004102200c6b210d2007200f6a21044101210e03400240200d200e6a4101470d004100210b200c210e0c080b200e41016a210e200441206a2004412010d0042110200441606a21042010417f4a0d000b200c200e6b210d0c010b2007200f6a2104024003400240200d4101470d004100210d0c020b200d417f6a210d200441206a2004412010d0042110200441606a210420104100480d000b0b200c200d490d01200c20014b0d03200c200d6b220e4101762211450d002006200f6a21042000200d4105746a21100340200241186a220f201041186a2212290000370300200241106a2213201041106a2214290000370300200241086a2215201041086a221629000037030020022010290000370300200441086a22172900002118200441106a2219290000211a200441186a220b290000211b201020042900003700002012201b3700002014201a37000020162018370000200b200f290300370000201920132903003700002017201529030037000020042002290300370000200441606a2104201041206a21102011417f6a22110d000b0b0240200d0d00200d210b0c050b0240200e41094d0d00200d210b0c050b200c20014b0d01200c200d6b21112000200d4105746a210f0340200c200d417f6a220b490d040240200c200b6b220e4102490d002000200d4105746a22042000200b4105746a220d412010d004417f4a0d00200d2900002118200d2004290000370000200241186a2215200d41186a2210290000370300200241106a2216200d41106a2212290000370300200241086a2217200d41086a22132900003703002013200441086a2900003700002012200441106a2900003700002010200441186a29000037000020022018370300410121140240200e4103490d00200d41c0006a2002412010d004417f4a0d0041022110200f210402400340200441186a200441386a290000370000200441106a200441306a290000370000200441086a200441286a2900003700002004200441206a221229000037000020112010460d01200441c0006a21132010211420122104201041016a211020132002412010d004417f4a0d020c000b0b201021140b200d20144105746a22042002290300370000200441186a2015290300370000200441106a2016290300370000200441086a20172903003700000b200b450d05200f41606a210f201141016a2111200b210d200e410a4f0d050c000b0b200d200c103e000b200c200d417f6a220b490d010b200c2001107f000b200b200c103e000b0240024002402009200a470d0002400240200941016a22042009490d0020094101742210200420042010491b220441ffffffff01712004470d002004410374221041004e0d010b102b000b0240024020090d002010102721080c010b200820094103742010102821080b2008450d01200421090b2008200a4103746a2204200e3602042004200b360200200a41016a2215210a20154102490d0103400240024002400240200820152213417f6a22154103746a2204280200450d00201341037420086a221141746a280200220e200428020422104d0d004102210a201341024d0d0620082013417d6a22044103746a280204220d2010200e6a4d0d014103210a201341034d0d06201141646a280200200d200e6a4d0d012013210a0c060b20134103490d012004280204211020082013417d6a22044103746a280204210d0b200d2010490d010b2013417e6a21040b0240024002400240024002402013200441016a221c4d0d00201320044d0d01200820044103746a2216280204221d20162802006a22042008201c4103746a22172802002219490d02200420014b0d03201641046a211e200020194105746a22122017280204221441057422106a210e2004410574210d200420196b220a20146b220420144f0d042005200e2004410574221010ce04220f20106a21110240024020144101480d00200441014e0d010b200e2104200f21100c060b2006200d6a210d200e21040340200d200441606a220e201141606a220a200a200e412010d004410048220c1b2210290000370000200d41186a201041186a290000370000200d41106a201041106a290000370000200d41086a201041086a2900003700002011200a200c1b211102402012200e2004200c1b2204490d00200f21100c070b200d41606a210d200f2110200f2011490d000c060b0b41d8e3c100201c20131037000b41d8e3c100200420131037000b20192004103e000b20042001107f000b20052012201010ce04220f20106a21110240024020144101480d00200a20144a0d010b20122104200f21100c010b2000200d6a210c200f21102012210403402004200e2010200e2010412010d004410048220a1b220d290000370000200441186a200d41186a290000370000200441106a200d41106a290000370000200441086a200d41086a2900003700002010201041206a200a1b2110200441206a2104200e41206a200e200a1b220e200c4f0d01201120104b0d000b0b20042010201120106b41607110ce041a201e201d20146a360200201620193602002017201741086a201c417f7320136a41037410cf041a2015210a201541014d0d020c000b0b20104104102a000b200b0d000b02402009450d00200810290b2003450d03200510290c030b20044101102a000b1039000b20014102490d002001417f6a2110200141057420006a41206a210c410121110340024002400240024020102204417f6a221020014b0d00200120106b220d4102490d03200020044105746a2204200020104105746a220a412010d004417f4a0d03200a2900002118200a2004290000370000200241186a2212200a41186a220e290000370300200241106a2213200a41106a220f290000370300200241086a2214200a41086a22082900003703002008200441086a290000370000200f200441106a290000370000200e200441186a2900003700002002201837030041012104200d4103490d02200a41c0006a2002412010d004417f4a0d024100210f200c21040340200441406a220d200441606a220e290000370000200d41186a200e41186a290000370000200d41106a200e41106a290000370000200d41086a200e41086a2900003700002011200f220d460d02200d417f6a210f20042002412010d004210e200441206a2104200e417f4a0d020c000b0b20102001103e000b4102200d6b21040b200a20044105746a22042002290300370000200441186a2012290300370000200441106a2013290300370000200441086a20142903003700000b200c41606a210c2011417f6a211120100d000b0b200241206a24000be91a03037f027e067f230041f0016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e12000102030405060708090a0b0c0d0e0f1011000b200241e8006a200141086a10960220004100360200200041106a200241e8006a41086a290300370300200041086a20022903683703000c110b109702000b20004102360200200041086a200141086a2903003703000c0f0b200241e8006a200141046a1038200041033602002000410c6a200241f0006a280200360200200020022903683702040c0e0b109802000b0240024002400240200141086a280200417f6a220341014b0d0020030e020102010b41e4bdc0001058000b41012103024002402001410c6a22042d00004101460d00200241026a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01002002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b200241246a41026a200241026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01003b012420022002290368370328200141386a29030021052001290330210641012107200241106a21010c010b41012103024002402001410c6a22042d00004101460d00200241ee016a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01ec012002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b41022107200241246a41026a200241ec016a41026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01ec013b012420022002290368370328200220012903303703102002200141386a290300370318200141c8006a290300210520012903402106200221010b20012006370300200120053703082000410c6a20033a0000200041086a2007360200200020022f01243b000d2000410f6a200241266a2d00003a0000200041106a2004360200200041146a20022903283702002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a280200360200200041386a200241106a41086a290300370300200041306a2002290310370300200041c0006a2002290300370300200041c8006a200241086a290300370300200041053602000c0c0b200241e8006a200141086a10990220004106360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c0b0b200241e8006a41186a200141286a290000370300200241e8006a41106a200141206a290000370300200241f0006a200141186a290000370300200241e8006a41286a200141386a290000370300200241e8006a41306a200141c0006a290000370300200241e8006a41386a200141c8006a2900003703002002200141106a2900003703682002200141306a290000370388012001410c6a2802002203417f4c0d0b0240024020030d00410121010c010b20012802042104200310272201450d0d20012004200310ce041a0b200241286a41386a2204200241e8006a41386a290300370300200241286a41306a2207200241e8006a41306a290300370300200241286a41286a2208200241e8006a41286a290300370300200241286a41206a2209200241e8006a41206a290300370300200241286a41186a220a200241e8006a41186a290300370300200241286a41106a220b200241e8006a41106a290300370300200241286a41086a220c200241e8006a41086a290300370300200220022903683703282000410c6a2003360200200041086a200336020020002001360204200041106a2002290328370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a2004290300370200200041073602000c0a0b200241e8006a200141086a109a0220004108360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c090b200241e8006a200141046a109b0220004109360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c080b200241e8006a200141046a109b022000410a360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c070b200241e8006a200141086a10c8012000410b360200200041c0006a200241e8006a41386a290300370300200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c060b2000410c360200200041086a200141086a2903003703000c050b2001410c6a2802002203417f4c0d050240024020030d00410121010c010b20012802042104200310272201450d0820012004200310ce041a0b200020013602042000410d3602002000410c6a2003360200200041086a20033602000c040b024002400240024002400240200141086a280200417f6a220341024b0d0020030e03010203010b4190a9c1001058000b200141386a2903002105200141306a290300210641012103024002402001410c6a2d00004101460d00200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a00002002200141146a29020037036820012f000d2001410f6a2d0000411074722104200141106a2802002101410021030c010b200141106a28020021010b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a29030037030020022002290368370328410121070c030b2001410c6a28020022034108762104410221070c010b2001410c6a28020022034108762104410321070b0b2000410e360200200041386a2005370300200041306a2006370300200041106a2001360200200041086a2007360200200041146a20022903283702002000410c6a2004410874200341ff0171723602002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a2802003602000c030b200241e8006a200141086a109c02200041086a200241e8006a41800110ce041a2000410f3602000c020b02400240024002402001280204417f6a220341014b0d0020030e020102010b41f8e2c1001058000b41880110272203450d072003200141086a280200109502410121010c010b4101210302400240200141086a2d00004101460d00200241e8006a41086a200141186a290200370300200241e8006a41106a200141206a290200370300200241e8006a41186a200141286a2d00003a00002002200141106a29020037036820012f00092001410b6a2d00004110747241087421072001410c6a2802002104410021030c010b2001410c6a2802002104410021070b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a2903003703002002200229036837032820032007722103410221010b20002001360204200041103602002000410c6a2004360200200041086a2003360200200041106a2002290328370200200041186a200241286a41086a290300370200200041206a200241286a41106a290300370200200041286a200241286a41186a2802003602000c010b200241e8006a200141086a10b101200041086a200241e8006a41d80010ce041a200041113602000b200241f0016a24000f0b1039000b20034101102a000b20034101102a000b4188014108102a000bac0703037f017e077f0240024002400240024002400240024002400240024002400240024002402001280200417f6a220241054b0d0020020e06010203040506010b41b48ec3001058000b200041013602000f0b2001410c6a2802002202417f4c0d040240024020020d00410121010c010b20012802042103200210272201450d0620012003200210ce041a0b20002001360204200041023602002000410c6a2002360200200041086a20023602000f0b20004103360200200041086a200141086a2903003703000f0b2001410c6a2802002202417f4c0d020240024020020d00410121010c010b20012802042103200210272201450d0520012003200210ce041a0b20002001360204200041043602002000410c6a2002360200200041086a20023602000f0b2001410c6a2802002204ad42187e2205422088a70d012005a72203417f4c0d01200128020421020240024020030d00410421060c010b200310272206450d050b0240024020040d00410021070c010b2002200441186c6a210841002107200621010340200241086a2802002203417f4c0d03200228020021090240024020030d004101210a0c010b20031027220a450d080b200a2009200310ce04210a200241146a2802002209417f4c0d032002410c6a280200210b0240024020090d004101210c0c010b20091027220c450d090b200c200b200910ce04210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200741016a2107200241186a22022008470d000b0b20002006360204200041053602002000410c6a2007360200200041086a20043602000f0b2001410c6a280200220cad420c7e2205422088a70d002005a72202417f4c0d00200128020421030240024020020d00410421080c010b200210272208450d070b02400240200c0d00410021090c010b2003200c410c6c6a210b41002109200821020340200341086a2802002201417f4c0d02200328020021070240024020010d004101210a0c010b20011027220a450d0a0b200a2007200110ce042107200241086a2001360200200241046a2001360200200220073602002002410c6a2102200941016a21092003410c6a2203200b470d000b0b20002008360204200041063602002000410c6a2009360200200041086a200c3602000f0b1039000b20024101102a000b20024101102a000b20034104102a000b20034101102a000b20094101102a000b20024104102a000b20014101102a000b0a0041dc8dc3001058000b0a004198eec2001058000bbf0c03047f017e057f230041206b2202240002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2203410c4b0d0020030e0d0102030405060708090a0b0c0d010b41e8fcc4001058000b4101210302400240200141046a2d00004101460d002002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030c010b200141086a28020021040b200041286a2001290328370300200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a28020036020020012d00012101200041013a0000200020013a00010c0c0b200041023a0000200041106a200141106a290300370300200041086a200141086a2903003703000c0b0b200041033a0000200041106a200141106a290300370300200041086a200141086a2903003703000c0a0b200041043a00000c090b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a2802003602000c080b2001410c6a2802002205ad42247e2206422088a70d082006a72204417f4c0d08200141046a28020021030240024020040d00410421070c010b200410272207450d0a0b0240024020050d00410021040c010b200541246c2108410021042002411e6a21092007210103400240024020032d00004101460d002009200341036a2d00003a0000200341046a280000210a200341016a2f0000210b200241086a200341106a290000370300200241106a200341186a290000370300200241186a200341206a2d00003a00002002200b3b011c2002200341086a2900003703004100210b0c010b200341046a280200210a4101210b0b200341246a21032001200b3a0000200141046a200a360200200141016a20022f011c3b0000200141036a20092d00003a0000200141086a2002290300370200200141106a200241086a290300370200200141186a200241106a290300370200200141206a200241186a280200360200200141246a2101200441016a21042008415c6a22080d000b0b200041063a00002000410c6a2004360200200041086a2005360200200041046a20073602000c070b200041073a00000c060b200041083a0000200020012d00013a00010c050b4101210302400240200141046a2d00004101460d002002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030c010b200141086a28020021010b200041093a0000200041046a20033a0000200041056a20022f011c3b0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c040b2000410a3a0000200041046a200141046a2802003602000c030b2000410b3a00000c020b2000410c3a0000200041046a200141046a2802003602000c010b2001410c6a280200220841ffffff3f712008470d0120084105742203417f4c0d01200141046a280200210a0240024020030d004101210b0c010b20031027220b450d040b0240024020080d0041002108410021010c010b200841057421044160200a6b2109200b2101200a2103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200a20084105746a20096a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2008360200200041046a200b3602000b200241206a24000f0b1039000b20044104102a000b20034101102a000be50701017f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220241104b0d0020020e110102030405060708090a0b0c0d0e0f1011010b41c499c4001058000b41880110272202450d102002200141046a28020010c103200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b200041023a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b41880110272202450d0d2002200141046a28020010c103200041046a2002360200200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200020012d00013a00010f0b200041063a0000200041046a200141046a2802003602000f0b41880110272202450d0c2002200141046a28020010c103200041073a0000200041046a20023602000f0b41880110272202450d0c2002200141046a28020010c103200041083a0000200041046a20023602000f0b200041093a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041306a200141306a290300370300200041286a200141286a2903003703000f0b2000410a3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041046a200141046a2802003602000f0b2000410c3a0000200041106a200141106a290300370300200041046a200141046a2902003702000f0b2000410d3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410e3a00000f0b2000410f3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b200041103a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b200041113a00000f0b4188014108102a000b4188014108102a000b4188014108102a000b4188014108102a000beb0301067f024002400240024002400240024020012d0000417f6a220241034b0d0020020e0401020304010b41c893c2001058000b2001410c6a280200220341ffffff3f712003470d0320034105742202417f4c0d03200141046a28020021040240024020020d00410121050c010b200210272205450d050b0240024020030d0041002103410021010c010b20034105742106416020046b21072005210120042102034020012002290000370000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a290000370000200141206a2101200241206a2102200641606a22060d000b200420034105746a20076a41057641016a21010b200041013a00002000410c6a2001360200200041086a2003360200200041046a20053602000f0b200141046a10f7022101200041023a0000200041046a20013602000f0b200141046a2802002102200041086a200141086a10f702360200200041046a2002360200200041033a00000f0b200041043a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b1039000b20024101102a000ba60f05027f017e027f027e017f230041c0006b22022400024002400240024002400240024002400240024002400240024020012d0000417f6a220341054b0d0020030e06010203040506010b4190e1c2001058000b200041f9006a2002280020360000200041086a200141086a290300370300200041fc006a200241236a280000360000200041106a200141106a290300370300200041186a200141186a290300370300200041206a200141206a290300370300200041286a200141286a290300370300200041306a200141306a290300370300200041386a200141386a290300370300200041c0006a200141c0006a290300370300200041c8006a200141c8006a290300370300200041d0006a200141d0006a290300370300200041d8006a200141d8006a290300370300200041e0006a200141e0006a290300370300200041e8006a200141e8006a290300370300200041f0006a200141f0006a290300370300200041f8006a200141f8006a2d00004100473a0000200041013a00000c050b2001410c6a2802002203417f4c0d05200141106a29030021040240024020030d00410121010c010b200141046a2802002105200310272201450d0720012005200310ce041a0b200041023a00002000410c6a2003360200200041086a2003360200200041046a2001360200200041106a20043703000c040b4101210502400240200141046a2d00004101460d00200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002106410021050c010b200141086a28020021060b200141306a2802002203417f4c0d04200141c0006a290300210420012903382107200129034821080240024020030d00410121010c010b20012802282109200310272201450d0720012009200310ce041a0b200041c0006a2004370300200041386a2007370300200041046a20053a0000200041056a20022f01003b0000200041086a20063602002000410c6a2002290320370200200041c8006a2008370300200041306a20033602002000412c6a2003360200200041286a2001360200200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a00000c030b200141386a2903002104200141306a2903002107200141c0006a2903002108200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d030240024020030d00410121010c010b200141246a2802002105200310272201450d0720012005200310ce041a0b20002002290320370001200041043a0000200041386a2004370300200041306a2007370300200041c0006a20083703002000412c6a2003360200200041286a2003360200200041246a2001360200200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a2903003700000c020b200241186a2205200141196a290000370300200241106a2206200141116a290000370300200241086a2209200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2005290300370000200041116a2006290300370000200041096a20092903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a00000c010b200241186a200141196a290000370300200241106a200141116a290000370300200241086a200141096a29000037030020022001290001370300200241206a41186a200141396a290000370300200241206a41106a200141316a290000370300200241206a41086a200141296a2900003703002002200141216a290000370320200141cc006a280200220341ffffff3f712003470d0120034105742205417f4c0d01200141d8006a2903002104200141d0006a2903002107200141c4006a28020021010240024020050d00410121060c010b200510272206450d060b20062001200341057410ce042101200041d8006a2004370300200041d0006a2007370300200041cc006a2003360200200041c8006a2003360200200041c4006a2001360200200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000020002002290300370001200041216a2002290320370000200041296a200241206a41086a290300370000200041316a200241206a41106a290300370000200041396a200241206a41186a290300370000200041063a00000b200241c0006a24000f0b1039000b20034101102a000b20034101102a000b20034101102a000b20054101102a000bc9b30103047f027e057f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002203410d4b0d000240024002400240024002400240024002400240024002400240024020030e0e000102030405060708090a0b0c0d000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a20034101742205200420042005491b22054100480d5a0240024020030d002005102721040c010b200128020020032005102821040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a280200210420052802002103024020002d00014101460d000240024020042003460d00200128020021000c010b200341016a22002003490d5b20034101742204200020002004491b22044100480d5b0240024020030d002004102721000c010b200128020020032004102821000b2000450d1120012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c0e0b0240024020042003460d00200128020021000c010b200341016a22002003490d5a20034101742204200020002004491b22044100480d5a0240024020030d002004102721000c010b200128020020032004102821000b2000450d1120012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d1220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5920044101742203200520052003491b22034100480d590240024020040d002003102721040c010b200128020020042003102821040b2004450d1320012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5920034101742200200520052000491b22004100480d590240024020030d002000102721030c010b200128020020032000102821030b2003450d1420012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5820034101742205200420042005491b22054100480d580240024020030d002005102721040c010b200128020020032005102821040b2004450d1420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a000020002d0008220341024b0d0b02400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a20034101742205200420042005491b22054100480d5a0240024020030d002005102721040c010b200128020020032005102821040b2004450d1720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5a20044101742203200520052003491b22034100480d5a0240024020040d002003102721040c010b200128020020042003102821040b2004450d1820012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a29030021062000290330210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5a20034101742200200420042000491b22004100480d5a0240024020030d002000102721030c010b200128020020032000102821030b2003450d1920012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5920044101742203200520052003491b22034100480d590240024020040d002003102721040c010b200128020020042003102821040b2004450d1a20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5820034101742205200420042005491b22054100480d580240024020030d002005102721040c010b200128020020032005102821040b2004450d1a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d1b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d1c20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a29030021062000290350210702400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d1d20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a2203200637000820032007370000200041e8006a29030021062000290360210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5820034101742200200420042000491b22004100480d580240024020030d002000102721030c010b200128020020032000102821030b2003450d1e20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d1e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002d0008220341024b0d0a02400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d2120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5920034101742200200420042000491b22004100480d590240024020030d002000102721030c010b200128020020032000102821030b2003450d2220012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5820034101742205200420042005491b22054100480d580240024020030d002005102721040c010b200128020020032005102821040b2004450d2220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d2320012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200028022c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5820034101742200200520052000491b22004100480d580240024020030d002000102721030c010b200128020020032000102821030b2003450d2420012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d2420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d2520012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a29030021062000290330210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5720034101742200200420042000491b22004100480d570240024020030d002000102721030c010b200128020020032000102821030b2003450d2620012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0a0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5620034101742205200420042005491b22054100480d560240024020030d002005102721040c010b200128020020032005102821040b2004450d2620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5620034101742205200420042005491b22054100480d560240024020030d002005102721040c010b200128020020032005102821040b2004450d2720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5620034101742200200520052000491b22004100480d560240024020030d002000102721030c010b200128020020032000102821030b2003450d2820012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c090b02400240200141046a2208280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d5520034101742209200520052009491b22094100480d550240024020030d002009102721050c010b200128020020032009102821050b2005450d2820012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41053a000020002d00082203410a4b0d080240024002400240024002400240024002400240024020030e0b000102030405060708090a000b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5f20034101742209200520052009491b22094100480d5f0240024020030d002009102721050c010b200128020020032009102821050b2005450d3320012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41003a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5f20054101742203200a200a2003491b22034100480d5f0240024020050d002003102721050c010b200128020020052003102821050b2005450d3420012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2009360000200041186a2903002106200029031021070240024020082802002203200428020022006b4110490d00200128020021030c010b200041106a22052000490d5f20034101742200200520052000491b22004100480d5f0240024020030d002000102721030c010b200128020020032000102821030b2003450d3520012003360200200141046a2000360200200141086a28020021000b2004200041106a360200200320006a22012006370008200120073700000c120b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5e20034101742209200520052009491b22094100480d5e0240024020030d002009102721050c010b200128020020032009102821050b2005450d3520012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41013a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5e20054101742203200a200a2003491b22034100480d5e0240024020050d002003102721050c010b200128020020052003102821050b2005450d3620012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2009360000200041286a2903002106200029032021070240024020082802002205200428020022036b4110490d00200128020021050c010b200341106a22092003490d5e20054101742203200920092003491b22034100480d5e0240024020050d002003102721050c010b200128020020052003102821050b2005450d3720012005360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200520036a2203200637000820032007370000200028021021032002200041186a280200220036020c2002410c6a200110302000450d1120004105742109200141046a210c03400240024020082802002205200428020022006b4120490d00200128020021050c010b200041206a220a2000490d5f20054101742200200a200a2000491b22004100480d5f0240024020050d002000102721050c010b200128020020052000102821050b2005450d3920012005360200200c2000360200200b28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200941606a22090d000c120b0b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5d20004101742205200320032005491b22054100480d5d0240024020000d002005102721030c010b200128020020002005102821030b2003450d3820012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c100b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5c20034101742209200520052009491b22094100480d5c0240024020030d002009102721050c010b200128020020032009102821050b2005450d3820012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41033a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5c20054101742203200a200a2003491b22034100480d5c0240024020050d002003102721050c010b200128020020052003102821050b2005450d3920012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200936000020002d0009220041024b0d0f02400240024020000e03000102000b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5e20004101742205200320032005491b22054100480d5e0240024020000d002005102721030c010b200128020020002005102821030b2003450d3c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c110b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5d20004101742205200320032005491b22054100480d5d0240024020000d002005102721030c010b200128020020002005102821030b2003450d3c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c100b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5c20004101742205200320032005491b22054100480d5c0240024020000d002005102721030c010b200128020020002005102821030b2003450d3c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c0f0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5b20034101742209200520052009491b22094100480d5b0240024020030d002009102721050c010b200128020020032009102821050b2005450d3c20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41043a0000200028020c21050240024020082802002203200428020022006b4104490d00200128020021030c010b200041046a22082000490d5b20034101742200200820082000491b22004100480d5b0240024020030d002000102721030c010b200128020020032000102821030b2003450d3d20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0e0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5a20034101742209200520052009491b22094100480d5a0240024020030d002009102721050c010b200128020020032009102821050b2005450d3d20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41053a0000200028020c21050240024020082802002203200428020022006b4104490d00200128020021030c010b200041046a22082000490d5a20034101742200200820082000491b22004100480d5a0240024020030d002000102721030c010b200128020020032000102821030b2003450d3e20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0d0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5920034101742209200520052009491b22094100480d590240024020030d002009102721050c010b200128020020032009102821050b2005450d3e20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41063a0000200028020c21050240024020082802002203200428020022006b4104490d00200128020021030c010b200041046a22082000490d5920034101742200200820082000491b22004100480d590240024020030d002000102721030c010b200128020020032000102821030b2003450d3f20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0c0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5820034101742209200520052009491b22094100480d580240024020030d002009102721050c010b200128020020032009102821050b2005450d3f20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41073a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5820054101742203200a200a2003491b22034100480d580240024020050d002003102721050c010b200128020020052003102821050b2005450d4020012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200936000002400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5820034101742208200520052008491b22084100480d580240024020030d002008102721050c010b200128020020032008102821050b2005450d4120012005360200200141046a2008360200200141086a28020021030b2004200341016a360200200520036a20002d00093a00000c0b0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5720034101742209200520052009491b22094100480d570240024020030d002009102721050c010b200128020020032009102821050b2005450d4120012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41083a00000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22092003490d5720054101742203200920092003491b22034100480d570240024020050d002003102721050c010b200128020020052003102821050b2005450d4220012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220341186a200041096a220541186a290000370000200341106a200541106a290000370000200341086a200541086a290000370000200320052900003700000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22082003490d5720054101742203200820082003491b22034100480d570240024020050d002003102721050c010b200128020020052003102821050b2005450d4320012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c0a0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5620034101742209200520052009491b22094100480d560240024020030d002009102721050c010b200128020020032009102821050b2005450d4320012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41093a00000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22082003490d5620054101742203200820082003491b22034100480d560240024020050d002003102721050c010b200128020020052003102821050b2005450d4420012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c090b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5520034101742209200520052009491b22094100480d550240024020030d002009102721050c010b200128020020032009102821050b2005450d4420012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a410a3a00000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22092003490d5520054101742203200920092003491b22034100480d550240024020050d002003102721050c010b200128020020052003102821050b2005450d4520012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220341186a200041096a220541186a290000370000200341106a200541106a290000370000200341086a200541086a290000370000200320052900003700000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22092003490d5520054101742203200920092003491b22034100480d550240024020050d002003102721050c010b200128020020052003102821050b2005450d4620012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220341186a200041296a220541186a290000370000200341106a200541106a290000370000200341086a200541086a29000037000020032005290000370000200029035021060240024020082802002203200428020022006b4108490d00200128020021030c010b200041086a22052000490d5520034101742200200520052000491b22004100480d550240024020030d002000102721030c010b200128020020032000102821030b2003450d4720012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a20063700000c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5420034101742205200420042005491b22054100480d540240024020030d002005102721040c010b200128020020032005102821040b2004450d4720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200041046a2001109e020c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5320034101742205200420042005491b22054100480d530240024020030d002005102721040c010b200128020020032005102821040b2004450d4720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041046a2001109e020c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5220034101742205200420042005491b22054100480d520240024020030d002005102721040c010b200128020020032005102821040b2004450d4720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a0000024002400240024020002d00040e0400010203000b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5520034101742205200420042005491b22054100480d550240024020030d002005102721040c010b200128020020032005102821040b2004450d4b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5520044101742203200520052003491b22034100480d550240024020040d002003102721040c010b200128020020042003102821040b2004450d4c20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5520044101742203200520052003491b22034100480d550240024020040d002003102721040c010b200128020020042003102821040b2004450d4d20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c080b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5420034101742205200420042005491b22054100480d540240024020030d002005102721040c010b200128020020032005102821040b2004450d4d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5420044101742203200520052003491b22034100480d540240024020040d002003102721040c010b200128020020042003102821040b2004450d4e20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c070b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5320034101742205200420042005491b22054100480d530240024020030d002005102721040c010b200128020020032005102821040b2004450d4e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000280208210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5320034101742200200520052000491b22004100480d530240024020030d002000102721030c010b200128020020032000102821030b2003450d4f20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c060b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5220034101742205200420042005491b22054100480d520240024020030d002005102721040c010b200128020020032005102821040b2004450d4f20012004360200200141046a2005360200200141086a28020021030b200141086a2208200341016a360200200420036a41033a0000200028020821032002200041106a280200220436020c2002410c6a2001103002402004450d0020044105742109200141046a210a034002400240200a2802002205200828020022046b4120490d00200128020021050c010b200441206a220b2004490d5420054101742204200b200b2004491b22044100480d540240024020050d002004102721050c010b200128020020052004102821050b2005450d5220012005360200200a2004360200200828020021040b2008200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200941606a22090d000b0b2000280214210320022000411c6a280200220036020c2002410c6a200110302000450d0520004105742108200141086a2105200141046a210903400240024020092802002204200528020022006b4120490d00200128020021040c010b200041206a220a2000490d5320044101742200200a200a2000491b22004100480d530240024020040d002000102721040c010b200128020020042000102821040b2004450d522001200436020020092000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200841606a22080d000c060b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d800120034101742205200420042005491b22054100480d80010240024020030d002005102721040c010b200128020020032005102821040b2004450d5220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000280204220341024b0d0402400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d820120034101742205200420042005491b22044100480d82010240024020030d002004102721050c010b200128020020032004102821050b2005450d5520012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200028020821032002200041106a280200220036020c2002410c6a200110302000450d062003200041286c6a210a200141046a210503400240024020052802002208200428020022006b4120490d00200128020021080c010b200041206a22092000490d830120084101742200200920092000491b22004100480d83010240024020080d002000102721080c010b200128020020082000102821080b2008450d572001200836020020052000360200200428020021000b2004200041206a360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a29030021060240024020052802002208200428020022006b4108490d00200128020021080c010b200041086a22092000490d830120084101742200200920092000491b22004100480d83010240024020080d002000102721080c010b200128020020082000102821080b2008450d582001200836020020052000360200200428020021000b2004200041086a360200200820006a2006370000200a200341286a2203470d000c070b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d810120004101742204200320032004491b22044100480d81010240024020000d002004102721030c010b200128020020002004102821030b2003450d5720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c050b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d800120004101742204200320032004491b22044100480d80010240024020000d002004102721030c010b200128020020002004102821030b2003450d5720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a00000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d5720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a000020002d0008220341044b0d030240024002400240024020030e050001020304000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d830120034101742205200420042005491b22054100480d83010240024020030d002005102721040c010b200128020020032005102821040b2004450d5c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d830120034101742200200520052000491b22004100480d83010240024020030d002000102721030c010b200128020020032000102821030b2003450d5d20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d820120034101742205200420042005491b22054100480d82010240024020030d002005102721040c010b200128020020032005102821040b2004450d5d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d820120034101742200200420042000491b22004100480d82010240024020030d002000102721030c010b200128020020032000102821030b2003450d5e20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d810120034101742205200420042005491b22054100480d81010240024020030d002005102721040c010b200128020020032005102821040b2004450d5e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200028022c210802400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d5f20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2008360000200041386a29030021062000290330210702400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d6020012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320063700082003200737000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d6120012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d800120034101742205200420042005491b22054100480d80010240024020030d002005102721040c010b200128020020032005102821040b2004450d6120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d800120034101742200200420042000491b22004100480d80010240024020030d002000102721030c010b200128020020032000102821030b2003450d6220012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d6220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d7f20034101742200200420042000491b22004100480d7f0240024020030d002000102721030c010b200128020020032000102821030b2003450d6320012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7e20034101742205200420042005491b22054100480d7e0240024020030d002005102721040c010b200128020020032005102821040b2004450d6320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a000020002d0008220341054b0d0202400240024002400240024020030e06000102030405000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d830120034101742205200420042005491b22054100480d83010240024020030d002005102721040c010b200128020020032005102821040b2004450d6920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d830120044101742203200520052003491b22034100480d83010240024020040d002003102721040c010b200128020020042003102821040b2004450d6a20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d830120044101742203200520052003491b22034100480d83010240024020040d002003102721040c010b200128020020042003102821040b2004450d6b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a29030021062000290350210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d830120034101742200200420042000491b22004100480d83010240024020030d002000102721030c010b200128020020032000102821030b2003450d6c20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d820120034101742205200420042005491b22054100480d82010240024020030d002005102721040c010b200128020020032005102821040b2004450d6c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d820120044101742203200520052003491b22034100480d82010240024020040d002003102721040c010b200128020020042003102821040b2004450d6d20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d820120044101742203200520052003491b22034100480d82010240024020040d002003102721040c010b200128020020042003102821040b2004450d6e20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d810120034101742205200420042005491b22054100480d81010240024020030d002005102721040c010b200128020020032005102821040b2004450d6e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d6f20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d800120034101742205200420042005491b22054100480d80010240024020030d002005102721040c010b200128020020032005102821040b2004450d6f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d800120034101742200200520052000491b22004100480d80010240024020030d002000102721030c010b200128020020032000102821030b2003450d7020012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d7f20044101742203200520052003491b22034100480d7f0240024020040d002003102721040c010b200128020020042003102821040b2004450d7120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d7220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00293a00000c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7e20034101742205200420042005491b22054100480d7e0240024020030d002005102721040c010b200128020020032005102821040b2004450d7220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d7e20044101742203200520052003491b22034100480d7e0240024020040d002003102721040c010b200128020020042003102821040b2004450d7320012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200028022c21082002200041346a280200220036020c2002410c6a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d7e20044101742203200520052003491b22034100480d7e0240024020040d002003102721040c010b200128020020042003102821040b2004450d7420012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2008200010ce041a0c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7d20034101742205200420042005491b22054100480d7d0240024020030d002005102721040c010b200128020020032005102821040b2004450d7420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a280200210820052802002103024020002d00014101460d000240024020082003460d00200128020021000c010b200341016a22002003490d7e20034101742205200020002005491b22054100480d7e0240024020030d002005102721000c010b200128020020032005102821000b2000450d7620012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d7e20004101742205200320032005491b22054100480d7e0240024020000d002005102721030c010b200128020020002005102821030b2003450d7720012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20042d00003a00000c020b0240024020082003460d00200128020021000c010b200341016a22002003490d7d20034101742205200020002005491b22054100480d7d0240024020030d002005102721000c010b200128020020032005102821000b2000450d7720012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a000002400240200141046a2802002203200528020022006b4120490d00200128020021030c010b200041206a22052000490d7d20034101742200200520052000491b22004100480d7d0240024020030d002000102721030c010b200128020020032000102821030b2003450d7820012003360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200320006a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a290000370000200120042900003700000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7c20034101742205200420042005491b22054100480d7c0240024020030d002005102721040c010b200128020020032005102821040b2004450d7820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d7c20034101742205200420042005491b22054100480d7c0240024020030d002005102721040c010b200128020020032005102821040b2004450d7920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000290308210602400240200141046a2802002204200528020022036b4108490d00200128020021040c010b200341086a22052003490d7c20044101742203200520052003491b22034100480d7c0240024020040d002003102721040c010b200128020020042003102821040b2004450d7a20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341086a360200200420036a200637000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d7c20044101742203200520052003491b22034100480d7c0240024020040d002003102721040c010b200128020020042003102821040b2004450d7b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041106a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000b200241106a24000f0b20054101102a000b20044101102a000b20044101102a000b20054101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20034101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20004101102a000b20094101102a000b20094101102a000b20034101102a000b20004101102a000b20094101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20094101102a000b20034101102a000b20054101102a000b20054101102a000b20054101102a000b20094101102a000b20004101102a000b20094101102a000b20004101102a000b20094101102a000b20004101102a000b20094101102a000b20034101102a000b20084101102a000b20094101102a000b20034101102a000b20034101102a000b20094101102a000b20034101102a000b20094101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20054101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20044101102a000b20004101102a000b102b000b20054101102a000b20044101102a000b20004101102a000b20004101102a000b20044101102a000b20044101102a000b20054101102a000b20054101102a000b20004101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20034101102a000b20034101102a000b20054101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b102b000bde1f01047f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000220241054b0d0002400240024002400240024020020e06000102030405000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1c20024101742204200320032004491b22044100480d1c0240024020020d002004102721030c010b200128020020022004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41003a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1c20034101742202200420042002491b22024100480d1c0240024020030d002002102721030c010b200128020020032002102821030b2003450d0820012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a290000370000200220002900013700002000280244210502400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d1c20034101742202200420042002491b22024100480d1c0240024020030d002002102721030c010b200128020020032002102821030b2003450d0920012003360200200141046a2002360200200141086a28020021020b200141086a2204200241046a360200200320026a200536000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1c20034101742202200420042002491b22024100480d1c0240024020030d002002102721030c010b200128020020032002102821030b2003450d0a20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041216a220341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200220032900003700002000280248210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d1c20024101742200200420042000491b22004100480d1c0240024020020d002000102721020c010b200128020020022000102821020b2002450d0b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1b20024101742204200320032004491b22044100480d1b0240024020020d002004102721030c010b200128020020022004102821030b2003450d0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1b20034101742202200420042002491b22024100480d1b0240024020030d002002102721030c010b200128020020032002102821030b2003450d0c20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a2900003700002002200029000137000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1b20034101742202200420042002491b22024100480d1b0240024020030d002002102721030c010b200128020020032002102821030b2003450d0d20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041216a220341186a290000370000200241106a200341106a290000370000200241086a200341086a2900003700002002200329000037000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d1b20024101742204200320032004491b22044100480d1b0240024020020d002004102721030c010b200128020020022004102821030b2003450d0e20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00413a00002000280244210502400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d1b20034101742202200420042002491b22024100480d1b0240024020030d002002102721030c010b200128020020032002102821030b2003450d0f20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241046a360200200320026a20053600002000280248210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d1b20024101742200200420042000491b22004100480d1b0240024020020d002000102721020c010b200128020020022000102821020b2002450d1020012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1a20024101742204200320032004491b22044100480d1a0240024020020d002004102721030c010b200128020020022004102821030b2003450d1020012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1a20034101742202200420042002491b22024100480d1a0240024020030d002002102721030c010b200128020020032002102821030b2003450d1120012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1920024101742204200320032004491b22044100480d190240024020020d002004102721030c010b200128020020022004102821030b2003450d1120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1920034101742202200420042002491b22024100480d190240024020030d002002102721030c010b200128020020032002102821030b2003450d1220012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1820024101742204200320032004491b22044100480d180240024020020d002004102721030c010b200128020020022004102821030b2003450d1220012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1820034101742202200420042002491b22024100480d180240024020030d002002102721030c010b200128020020032002102821030b2003450d1320012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a2900003700002002200029000137000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d1820024101742204200320032004491b22044100480d180240024020020d002004102721030c010b200128020020022004102821030b2003450d1420012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d00213a00000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1720024101742204200320032004491b22044100480d170240024020020d002004102721030c010b200128020020022004102821030b2003450d1420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41053a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1720034101742202200420042002491b22024100480d170240024020030d002002102721030c010b200128020020032002102821030b2003450d1520012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a2900003700002002200029000137000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d1720024101742204200320032004491b22044100480d170240024020020d002004102721030c010b200128020020022004102821030b2003450d1620012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d00213a00000b0f0b20044101102a000b20024101102a000b20024101102a000b20024101102a000b20004101102a000b20044101102a000b20024101102a000b20024101102a000b20044101102a000b20024101102a000b20004101102a000b20044101102a000b20024101102a000b20044101102a000b20024101102a000b20044101102a000b20024101102a000b20044101102a000b20044101102a000b20024101102a000b20044101102a000b102b000b130020004102360204200041bce4c1003602000b130020004102360204200041d0cbc5003602000b130020004101360204200041e0e7c2003602000b1300200041033602042000419085c0003602000b130020004103360204200041a89ec4003602000b130020004101360204200041ccc8c5003602000b13002000410b3602042000418ccbc3003602000b130020004106360204200041808bc2003602000b130020004104360204200041f8bec0003602000b130020004103360204200041f8c1c5003602000b130020004105360204200041dca1c1003602000b130020004106360204200041b484c2003602000b130020004101360204200041f888c0003602000bb10501027f4190ce0021024100210302400240024002400240024002400240024002400240024002400240024002400240024020012802000e1200110c0c1101020304090a0b11110d110e11000b417f2102200141086a280200417f6a220141054b0d0e41012103024002400240024020010e06140001020303140b41c0843d21020c120b4190ce0021020c120b41c09a0c21020c110b4190ce0021020c100b200141086a280200417f6a220141014b0d0d41c0843d21024100210320010e020f030f0b200141086a2d0000417f6a2201410c4b0d0c41a0c21e21024100210302400240024020010e0d111100000101111101020c0c0c110b4180b51821020c0f0b41b0e32d21020c0e0b4101210341f0930921020c0e0b41f0930921020c0c0b200141086a2d0000417f6a220141104b0d0a41c096b10221024100210320010e110c0c010100000c0c0101070702020203030c0b4101210341a0c21e21020c0b0b41c09a0c21020c090b41a08d0621020c080b41a0c21e21020c070b20012d0004417f6a220141034b0d054101210341a08d0621020240024020010e0409090001090b41c096b10221020c080b41c09a0c21020c070b20012d0004417f6a220141034b0d044101210341a08d0621020240024020010e0408080001080b41c096b10221020c070b41c09a0c21020c060b200141086a280200417f6a220141094b0d0341a0cb98012102410021030240024020010e0a07070700070102020202070b41d0a5cc0021020c050b4180ade20421020c040b410121034190ce0021020c040b200141086a280200417f6a220141024b0d0141a0c21e210241002103024020010e03040000040b4101210341a08d0621020c030b410121032001280204417f6a220141014b0d0041c0843d210220010e020200020b4190ce0021020b410021030b200020033a0004200020023602000be4910108017f017e097f017e037f017e0e7f067e230041a0076b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e12000102030405060708090a0b0c0f10111213000b200141106a29030021042001410c6a280200210520022d0001210620022d000021020240024002400240024002400240024002400240200141086a28020022070e0700010203040607000b20034194036a41013602002003420137028403200341ccfdc40036028003200341023602dc06200341c4fdc4003602d8062003200341d8066a3602900320034180036a4190b8c3001057000b4100210841ad88c3004100200220067241ff01711b21094128210a4101210b0c4a0b2004a7210702400240200241ff01710d004101210b200641ff01714101460d010b41d588c3002109412a210a4101210b410021082007450d4a0c490b20070d020c470b4101210b0240200220067241ff0171450d0041ad88c30021094128210a410021080c490b410810272202450d192002200437000041a0b8c300410a200241081003200210290c460b2004a721070240200220067241ff0171450d0041ad88c30021094128210a4101210b4100210820070d470c480b41aab8c300410520052004422088a710034101210b2007450d450b200510290c440b2004422088a721092004a7210a0240200220067241ff0171450d0002402009450d00200941186c21082005210203400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200841686a22080d000b0b41ad88c30021094101210c4100210d200a0d020c430b0240200941186c2202450d00200520026a21082005210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022008470d000b0b02402009450d00200941186c21082005210203400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200841686a22080d000b0b4101210c200a450d41200510290c410b2004422088a721092004a7210a200220067241ff0171450d0102402009450d002009410c6c21082005210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b41ad88c30021094100210c4101210d200a450d410b200510290c400b02402009410c6c2202450d00200520026a21082005210203402002280200200241086a280200100c2002410c6a22022008470d000b0b02402009450d002009410c6c21082005210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b4101210d200a450d3d200510290c3d0b10ae02000b418988c30021094124210a4101210820022d00000d2a20022d000141ff01714102470d2a200141086a290300210420034190056a41086a22024200370300200342003703900541bdcbc500411320034190056a100420034190046a41086a200229030037030020032003290390053703900420034190046a411041b8d6c50041004100100b417f470d12200341186a41ceecc200410d109401024002402003290320500d002003280218450d00200341086a41ceecc200410d109401200329031042b9067c42b90620032802081b2004560d010b20034190056a41086a22024200370300200342003703900541ceecc200410d20034190056a100420034190046a41086a22062002290300370300200320032903900537039004200320043703800320034190046a411020034180036a4108100341012108200341013a00800320024200370300200342003703900541bdcbc500411320034190056a10042006200229030037030020032003290390053703900420034190046a411020034180036a410110030c0b0b41e8ebc2001058000b20034188036a2001410c6a2802003602002003200129020437038003200341286a20034180036a20022d000020022d000110af02200328022c210a200328022821094100210b410121080c3f0b10b002000b200341fc026a41026a22062001410f6a2d00003a0000200341f0046a41086a2207200141206a290300370300200341f0046a410d6a2209200141256a290000370000200320012f000d3b01fc022003200141186a2903003703f004200141386a290300210e200141306a2903002104200141146a280200210f200141106a28020021082001410c6a2d0000211020022d0001211120022d0000210a024002400240200141086a2802000e03000102000b20034180036a41146a41013602002003420137028403200341ccfdc40036028003200341023602dc06200341c4fdc4003602d8062003200341d8066a3602900320034180036a41c0bec0001057000b2002411a6a2901002112200241196a2d00002113200241186a2d00002114200241166a2f01002115200241156a2d00002116200241146a2d00002117200241126a2f0100210b200241116a2d00002105200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d000021182002410c6a2d000021192002410a6a2f0100211a200241096a2d0000211b200241086a2d0000211c200241066a2f0100211d200241056a2d0000211e200241046a2d0000211f200241026a2f0100212020034188046a41026a20062d00003a000020034198066a41086a200729030037030020034198066a410d6a2009290000370000200320032f01fc023b018804200320032903f004370398064101210241d588c300210941002106412a210702400240200a41ff0171450d004100210a0c010b4100210a201141ff01714101470d00201d410874201e72201c41187472210941002102201b2107201a21062019210a0b200641ffff0371410874200741ff017172200a41187472210a20020d32200320123703e805200320133a00e705200320143a00e605200320153b01e405200320163a00e305200320173a00e2052003200b3b01e005200320053a00df052003200c3a00de052003200d3b01dc05200320183a00db052003200a3600d705200320093600d3052003201f3a00d205200320203b01d005200341b8066a41026a220220034188046a41026a2d00003a0000200320032f0188043b01b80620034180036a41086a20034198066a41086a29030037030020034180036a410d6a220620034198066a410d6a2900003700002003200329039806370380030240201041ff01714101460d00200341c8066a41026a20022d00003a0000200341b0046a41086a20034180036a41086a290300370300200341b0046a410d6a2006290000370000200320032f01b8063b01c80620032003290380033703b0040c2e0b20034190046a200841067610cc012003280290042106024002402003280298042008413f7122024b0d00410021020c010b200341c8066a41026a200620024105746a220241026a2d00003a0000200341b8046a200241136a290000370300200341bd046a200241186a290000370000200320022f00003b01c8062003200229000b3703b0042002280007210f20022800032108410121020b0240200328029404450d00200610290b20020d2d410121024115210f4184efc20021080c2e0b200141c8006a2903002112200141c0006a290300212120034198066a41026a20062d00003a0000200341d8066a41086a2007290300370300200341d8066a410d6a2009290000370000200320032f01fc023b019806200320032903f0043703d80602402011200a7241ff0171450d0041ad88c30021094128210a410121084101210b0c3e0b200341b8066a41026a220220034198066a41026a2d00003a000020034180036a41086a2206200341d8066a41086a29030037030020034180036a410d6a2207200341d8066a410d6a290000370000200320032f0198063b01b806200320032903d806370380030240201041ff01714101460d00200341c8066a41026a20022d00003a0000200341b0046a41086a2006290300370300200341b0046a410d6a2007290000370000200320032f01b8063b01c80620032003290380033703b0040c2b0b200341d0056a200841067610cc0120032802d00521060240024020032802d8052008413f7122024b0d00410021020c010b200341c8066a41026a200620024105746a220241026a2d00003a0000200341b8046a200241136a290000370300200341bd046a200241186a290000370000200320022f00003b01c8062003200229000b3703b0042002280007210f20022800032108410121020b024020032802d405450d00200610290b20020d2a410121024184efc20021084115210f0c2b0b20034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d80620034190026a20034180036a200341d8066a10b102200328029402210a20032802900221094100210f410121084101210b0c3d0b200141086a280200210c2001280204210d200341d8066a2001410c6a41c40010ce041a2002411a6a2901002104200241196a2d00002106200241186a2d00002107200241166a2f01002111200241156a2d0000210f200241146a2d00002110200241126a2f01002113200241116a2d00002114200241106a2d000021152002410e6a2f010021162002410d6a2d000021172002410c6a2d0000210b2002410a6a2f01002105200241096a2d00002118200241086a2d00002119200241066a2f0100211a200241056a2d0000211b200241046a2d0000211c200241026a2f0100211d20022d0001210820022d00002102200341e8046a20034194076a290200370300200341e0046a2003418c076a290200370300200341d8046a20034184076a290200370300200341d0046a200341fc066a290200370300200341b0046a41186a200341f4066a290200370300200341b0046a41106a200341d8066a41146a290200370300200341b0046a41086a200341d8066a410c6a290200370300200320032902dc063703b00441d588c3002109412a210a20020d26200841ff01714101470d26200320043703a805200320063a00a705200320073a00a605200320113b01a4052003200f3a00a305200320103a00a205200320133b01a005200320143a009f05200320153a009e05200320163b019c05200320173a009b052003201c3a0092052003201d3b01900520032005410874201872200b41187472360097052003201a410874201b722019411874723600930520034180036a20034190056a108d0220032802a0032202450d0e200341d0056a41106a20034180036a41386a290300370300200341d0056a41086a20034180036a41306a290300370300200341d0056a41186a200341c0036a290300370300200341d0056a41206a200341c8036a28020036020020034190046a41086a200341dc056a29020037030020034190046a41106a2208200341e4056a29020037030020034190046a41186a200341ec056a290200370300200320034180036a41286a2903003703d005200320032902d40537039004024020032802a403450d00200210290b200341f0046a41086a20034190046a41086a290300370300200341f0046a41106a2008290300370300200341f0046a41186a20034190046a41186a29030037030020032003290390043703f00420034190056a41386a200341b0046a41386a29030037030020034190056a41306a200341b0046a41306a29030037030020034190056a41286a200341b0046a41286a29030037030020034190056a41206a200341b0046a41206a29030037030020034190056a41186a200341b0046a41186a29030037030020034190056a41106a200341b0046a41106a29030037030020034190056a41086a200341b0046a41086a290300370300200320032903b0043703900520034198066a200341f0046a108d0120034180036a200328029806220220032802a006108e010240024020032d0080034101460d00200341003a00d0050c010b200341d0056a20034180036a41c10010ce041a0b0240200328029c06450d00200210290b20034190056a41206a2105200341f1056a2118200341d0056a410172211941042109410a2107034002400240200741766a2213410a4b22160d0020034190056a21060240024020130e0b0102020202020202020200010b200521060b0240412010272208450d0020082006290000370000200841186a200641186a290000370000200841106a200641106a290000370000200841086a200641086a29000037000041202102410021150c020b41204101102a000b4101211541b8d6c500210641002102410121080b200320023602c406200320023602c006200320083602bc06200320073602b806200341c8066a200341b8066a108f0120032802d006210a20032802c806211120034100360280032011200a20034180036a1005211002400240200328028003220a417f460d0020034190046a200a4120200a4120491b220f6a410041004120200f6b200f411f4b1b10cd041a20034190046a2010200f10ce041a200a411f4d0d1220034180036a41186a220a20034190046a41186a29030037030020034180036a41106a220f20034190046a41106a29030037030020034180036a41086a221420034190046a41086a2903003703002003200329039004370380032010102920034198066a41186a2210200a29030037030020034198066a41106a2217200f29030037030020034198066a41086a220b2014290300370300200320032903800337039806024020032802cc06450d00201110290b02402002450d00200810290b200a2010290300370300200f20172903003703002014200b29030037030020032003290398063703800320034180036a200341f0046a412010d004450d0141b0e2c10021094118210a0c290b024020032802cc06450d00201110290b2002450d00200810290b0240024020032d00d0054101470d004100210841b8d6c500210a024020160d000240024020130e0b0002020202020202020201000b412021082019210a0c010b412021082018210a0b024020022008470d002006200a460d022006200a200210d004450d020b0240024020080d00410121110c010b200810272211450d142011200a200810ce041a0b2003200836028c0320032008360288032003201136028403200320073602800320034198066a20034180036a108f01200328029806220a20032802a006100c0240200328029c06450d00200a10290b2008450d00201110290b4101210a024020150d0020021027220a450d14200a2006200210ce041a0b2003200236028c0320032002360288032003200a36028403200320073602800320034198066a20034180036a108f0120032802a00621072003280298062106412010272208450d14200820032903f004370000200841186a200341f0046a41186a290300370000200841106a200341f0046a41106a290300370000200841086a200341f0046a41086a29030037000020062007200841201003200810290240200328029c06450d00200610290b2002450d00200a10290b024020094108460d00200941d0e3c1006a2802002107200941046a21090c010b0b20034180036a200341f0046a108d0120032802880321062003280280032108412010272202450d132002200329039005370000200241186a20034190056a41186a290300370000200241106a20034190056a41106a290300370000200241086a20034190056a41086a2903003700002002412041c00010282202450d14200220032903b005370020200241386a20034190056a41386a290300370000200241306a20034190056a41306a290300370000200241286a20034190056a41286a29030037000020082006200241c0001003200210290240200328028403450d00200810290b200341013a00800320034190056a41086a22024200370300200342003703900541a7c8c500410f20034190056a100420034190046a41086a200229030037030020032003290390053703900420034190046a411020034180036a41011003410021090240200c450d00200d10290b0c270b20034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d80620034198026a20034180036a200341d8066a10b202200328029c02210a200328029802210941002113410121084101210b4101210f410121100c3d0b200341d8066a41206a200141246a290200370300200341d8066a41186a2001411c6a290200370300200341d8066a41106a200141146a290200370300200341d8066a41086a2001410c6a290200370300200320012902043703d80620034180036a41206a200241206a29020037030020034180036a41186a200241186a29020037030020034180036a41106a200241106a29020037030020034180036a41086a200241086a2902003703002003200229020037038003200341a0026a200341d8066a20034180036a10b30220032802a402210a20032802a002210941002114410121084101210b4101210f41012110410121130c3d0b200341d8066a41206a200141246a290200370300200341d8066a41186a2001411c6a290200370300200341d8066a41106a200141146a290200370300200341d8066a41086a2001410c6a290200370300200320012902043703d80620034180036a41206a200241206a29020037030020034180036a41186a200241186a29020037030020034180036a41106a200241106a29020037030020034180036a41086a200241086a2902003703002003200229020037038003200341a8026a200341d8066a20034180036a10b40220032802ac02210a20032802a802210941002115410121084101210b4101210f4101211041012113410121140c3d0b20034180036a41386a200141c0006a29030037030020034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d806200341b0026a20034180036a200341d8066a10c90120032802b402210a20032802b002210941002116410121084101210b4101210f410121104101211341012114410121150c3d0b418988c30021094124210a4101210820022d00000d2020022d000141ff01714102470d20200141086a290300210420034190056a41086a22024200370300200342003703900541a18ac000411020034190056a100420034190046a41086a200229030037030020032003290390053703900420034190046a411041b8d6c50041004100100b417f470d10200341b8026a41888dc300410d10940120032903c002420020032802b8021b2004540d0120034190056a41086a22024200370300200342003703900541a18ac000411020034190056a100420034190046a41086a2002290300370300200320032903900537039004200320043703800320034190046a411020034180036a410810030b410021094101210b0c350b41f08bc0001058000b200141086a2802002106200128020421070240024020022d00000d004101210820022d000141ff01714101460d010b41d588c3002109412a210a41002117410121082006450d1d200710290c1d0b200241096a280000210a2006450d1b200710290c1b0b20034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d806200341c8026a20034180036a200341d8066a10f50120032802cc02210a20032802c8022109410121084101210b0c320b20034180036a200141086a41800110ce041a200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d806200341d0026a20034180036a200341d8066a10b50220032802d402210a20032802d002210941002106410121084101210b4101210f4101211041012113410121144101211541012116410121170c390b200141086a280200210820012802042106200341f0046a41086a22092001411c6a290200370300200341f0046a410d6a220a200141216a2900003700002003200141146a2902003703f0042002411a6a2901002104200241196a2d00002111200241186a2d0000210f200241166a2f01002110200241156a2d00002113200241146a2d00002114200241126a2f01002115200241116a2d00002116200241106a2d000021172002410e6a2f0100210b2002410d6a2d000021052002410c6a2d0000210c2002410a6a2f0100210d200241096a2d00002118200241086a2d00002119200241066a2f0100211a200241056a2d0000211b200241046a2d0000211c200241026a2f0100211d20022d0001210720022d0000210202400240024020060e03000201000b20034180036a41146a41013602002003420137028403200341ccfdc40036028003200341023602dc06200341c4fdc4003602d8062003200341d8066a3602900320034180036a4194e6c1001057000b200141106a28020021202001410c6a280200211f20034198066a410d6a200a29000037000020034198066a41086a2009290300370300200320032903f0043703980641012106412a210a4100211e41d588c300210902400240200241ff0171450d00410021020c010b41002102200741ff01714101470d00201a410874201b72201941187472210941002106200c211e200d21022018210a0b200241ffff0371410874201e41187472200a41ff017172210a20060d16200320043703e805200320113a00e7052003200f3a00e605200320103b01e405200320133a00e305200320143a00e205200320153b01e005200320163a00df05200320173a00de052003200b3b01dc05200320053a00db052003200a3600d705200320093600d3052003201c3a00d2052003201d3b01d00520034190056a41086a22024200370300200342003703900541a4e6c100410820034190056a1004200341d8066a41086a200229030037030020032003290390053703d8062003410036028003200341d8066a411020034180036a10052102024002402003280280032206417f460d002002450d0020034180036a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a20034180036a2002200710ce041a2006411f4d0d0e20034190046a41186a220620034180036a41186a220729000037030020034190046a41106a220920034180036a41106a220a29000037030020034190046a41086a221120034180036a41086a220f2900003703002003200329008003370390042002102920072006290300370300200a2009290300370300200f20112903003703002003200329039004370380030c010b20034188036a420037030020034190036a420037030020034198036a420037030020034200370380030b0240200341d0056a20034180036a412010d004450d0041ace6c10021094131210a0c170b20034180036a410d6a220220034198066a410d6a29000037000020034180036a41086a220620034198066a41086a2903003703002003200329039806370380030240200841ff01714101460d0020034190056a410d6a200229000037000020034190056a41086a2006290300370300200320032903800337039005200841087621080c140b20034190046a201f41067610cc01200328029004210602400240200328029804201f413f7122024b0d00410021020c010b20034198056a200620024105746a220241136a2900003703002003419d056a200241186a2900003700002003200229000b3703900520022f0000200241026a2d0000411074722108200228000721202002280003211f410121020b0240200328029404450d00200610290b20020d1341012106411521204184efc200211f0c140b4101210641d588c30021094100210a412a211e02400240200241ff0171450d00410021020c010b41002102200741ff01714101470d00201a410874201b722019411874722109410021062018211e200d210a200c21020b200a41ffff0371410874201e41ff017172200241187472210a20060d112003201c3a00d2052003201d3b01d005200320043703e805200320113a00e7052003200f3a00e605200320103b01e405200320133a00e305200320143a00e205200320153b01e005200320163a00df05200320173a00de052003200b3b01dc05200320053a00db052003200a3600d705200320093600d30520034190056a41086a22024200370300200342003703900541a4e6c100410820034190056a1004200341d8066a41086a200229030037030020032003290390053703d8062003410036028003200341d8066a411020034180036a10052102024002402003280280032206417f460d002002450d0020034180036a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a20034180036a2002200710ce041a2006411f4d0d0e20034190046a41186a220620034180036a41186a220729000037030020034190046a41106a220920034180036a41106a220a29000037030020034190046a41086a221120034180036a41086a220f2900003703002003200329008003370390042002102920072006290300370300200a2009290300370300200f20112903003703002003200329039004370380030c010b20034188036a420037030020034190036a420037030020034198036a420037030020034200370380030b0240200341d0056a20034180036a412010d004450d0041dde6c10021094122210a0c120b20034180036a200841880110ce041a41002109200341003b01d806200341d8026a20034180036a200341d8066a10ad020240024020032802d80222020d00410121020c010b200220032802dc021010410021020b200320023a0082032003410c3b01800341b8d6c500410020034180036a108801200810290c140b200141d4006a2802002110200141d0006a280200211320022d0001210820022d00002102200341d8066a200141086a41c80010ce041a02400240024020020d00200841ff01714102460d010b02402010450d00201310290b0240200341e4066a280200450d0020032802e00610290b200341ec066a28020021060240200341f4066a2802002202450d002002410c6c21082006210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b418988c3002109200341f0066a280200450d01200610290c010b200341f0026a4193c8c500411410b50120034180036a20032802f402410020032802f0021b2214200341fc066a221510b201200328028003220820032802880341b8d6c50041004100100b21020240200328028403450d00200810290b02402002417f470d00200341e0026a41888dc300410d10940120034188036a20032903e802420020032802e0021b37030020034180036a41106a20032902fc0637030020034198036a20034184076a290200370300200341a0036a2003418c076a290200370300200341a8036a20034194076a2902003703002003410d3a00800341b8d6c500410020034180036a1088012003410036028803200342013703800320032802e00621072003200341d8066a41106a28020022023602d005200341d0056a20034180036a103002400240200328028403220620032802880322086b2002490d0020032802800321060c010b200820026a22092008490d122006410174220a20092009200a491b22094100480d120240024020060d002009102721060c010b20032802800320062009102821060b2006450d0f200320093602840320032006360280030b2003200820026a36028803200620086a2007200210ce041a200341ec066a28020021082003200341f4066a28020022023602d005200341d0056a20034180036a10300240024020020d002003280288032111200328028403210920032802800321070c010b20082002410c6c6a210f03402008280200210a2003200841086a28020022023602d005200341d0056a20034180036a103002400240200328028403220920032802880322066b2002490d0020032802800321070c010b200620026a22072006490d1420094101742211200720072011491b22114100480d140240024020090d002011102721070c010b20032802800320092011102821070b2007450d1220032011360284032003200736028003201121090b2003200620026a221136028803200720066a200a200210ce041a2008410c6a2208200f470d000b0b200341d0056a2014201510b20120032802d805210f20032802d005210a20034100360288032003420137038003200320113602900520034190056a20034180036a103002400240200328028403220620032802880322086b2011490d0020032802800321020c010b200820116a22022008490d1220064101742214200220022014491b22144100480d120240024020060d002014102721020c010b20032802800320062014102821020b2002450d1120032014360284032003200236028003201421060b200220086a2007201110ce041a200a200f2002200820116a100302402006450d00200210290b024020032802d405450d00200a10290b2009450d00200710290b02402010450d00201310290b0240200341e4066a280200450d0020032802e00610290b200341ec066a28020021060240200341f4066a2802002202450d002002410c6c21082006210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b41002109200341f0066a280200450d00200610290b4124210a41002111410121084101210b4101210f41012110410121134101211441012115410121164101211741012106410121070c380b41084101102a000b41a0ebc2001058000b4189e2c10021094127210a0c170b418f89c3004133104e000b20084101102a000b20024101102a000b41204101102a000b41204101102a000b41c0004101102a000b41dc8ac0001058000b418f89c3004133104e000b418f89c3004133104e000b20094101102a000b20114101102a000b20144101102a000b102b000b2008103d200810290c030b20034180036a410d6a20034190056a410d6a29000037000020034180036a41086a20034190056a41086a290300370300200320032903900537038003410021060b200341d8066a41086a220220034180036a41086a290300370300200341d8066a41106a20034180036a41106a29030037030020032003290380033703d80602402006450d002020210a201f21090c020b200341b0046a410d6a200341d8066a410d6a290000370000200341b0046a41086a2002290300370300200320032903d8063703b00420034190056a41086a22064200370300200342003703900541a4e6c100410820034190056a10042002200629030037030020032003290390053703d8062003410036028003200341d8066a411020034180036a10052102024002402003280280032206417f460d002002450d0020034180036a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a20034180036a2002200710ce041a2006411f4d0d0420034190046a41186a220620034180036a41186a220729000037030020034190046a41106a220920034180036a41106a220a29000037030020034190046a41086a221120034180036a41086a220f2900003703002003200329008003370390042002102920072006290300370300200a2009290300370300200f20112903003703002003200329039004370380030c010b20034188036a420037030020034190036a420037030020034198036a420037030020034200370380030b200341d8066a41186a20034180036a41186a2903002204370300200341d8066a41106a20034180036a41106a290300220e370300200341d8066a41086a220220034180036a41086a22062903002212370300200320032903800322213703d8062003418a036a201237010020034192036a200e3701002003419a036a20043701002003418c023b01800320032021370182034100210941b8d6c500410020034180036a10880120034180036a410d6a2207200341b0046a410d6a2900003700002006200341b0046a41086a290300370300200320032903b0043703800320034190056a41086a220a4200370300200342003703900541a4e6c100410820034190056a10042002200a29030037030020032003290390053703d806412010272202450d03200220083b0000200220203600072002201f360003200220032903800337000b200241026a20084110763a0000200241136a2006290300370000200241186a2007290000370000200341d8066a4110200241201003200210290b0b41002107410121084101210b4101210f41012110410121134101211441012115410121164101211741012106410121110c230b418f89c3004133104e000b41204101102a000b410021174101210b4101210f4101211041012113410121144101211541012116410121064101210741012111410021090c200b4101210b4101210f41012110410121134101211441012115410121160c1d0b4101210b0c150b200c450d00200d10290b41002110410121084101210b4101210f0c150b200341d0056a41026a200341c8066a41026a2d00003a000020034180036a41086a200341b0046a41086a29030037030020034180036a410d6a200341b0046a410d6a290000370000200320032f01c8063b01d005200320032903b00437038003410021020b2003418c046a41026a2206200341d0056a41026a2d00003a000020034190056a41086a220720034180036a41086a29030037030020034190056a41106a20034180036a41106a290300370300200320032f01d0053b018c0420032003290380033703900520020d0220034193036a200729030037000020034198036a2003419d056a290000370000200320032f018c043b0180032003200f360087032003200836008303200320032903900537008b03200320062d00003a00820302400240024002400240411410272202450d00200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d0120022003290380033700142002412c6a20034198036a290300370000200241246a20034180036a41106a2903003700002002411c6a20034180036a41086a290300370000200341f8016a20024134108401200341f8016a41106a2903002122200329038002212320032802f8012108200210292023420020081b222320045422062022420020081b2222200e542022200e5122021b0d0220232004562022200e5620021b450d04200341e0016a41b18ac0004116108601200341f0016a290300212420032903e801212520032802e001210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a2008290300370300200320032903900537039004200342002024420020021b22242006ad200e20227d7c7c2025420020021b2222202320047d222554ad7d2223202220257d2225202256202320245620232024511b22021b3703d80520034200202520021b3703d005200341d0056a21020c030b41144101102a000b41344101102a000b200341c8016a41b18ac0004116108601200341d8016a290300212420032903d001212520032802c801210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a20082903003703002003200329039005370390042003427f2024420020021b2224200e20227d2004202354ad7d7c2025420020021b2222200420237d7c22232022542202ad7c22222002202220245420222024511b22021b3703d8052003427f202320021b3703d005200341d0056a21020b20034190046a41102002411010030b20034180036a2004200e10890102400240024002400240411810272202450d00200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d012002200329038003370018200241306a20034198036a290300370000200241286a20034180036a41106a290300370000200241206a20034180036a41086a290300370000200341b0016a20024138108401200341b0016a41106a290300210420032903b801210e20032802b001210820021029200e420020081b220e20215422062004420020081b2204201254200420125122021b0d02200e202156200420125620021b450d0420034198016a41b18ac0004116108601200341a8016a290300212220032903a0012123200328029801210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a2008290300370300200320032903900537039004200342002022420020021b22222006ad201220047d7c7c2023420020021b2204200e20217d222354ad7d220e200420237d2223200456200e202256200e2022511b22021b3703d80520034200202320021b3703d005200341d0056a21020c030b41184101102a000b41384101102a000b20034180016a41b18ac000411610860120034190016a29030021222003290388012123200328028001210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a20082903003703002003200329039005370390042003427f2022420020021b2222201220047d2021200e54ad7d7c2023420020021b22042021200e7d7c220e2004542202ad7c22042002200420225420042022511b22021b3703d8052003427f200e20021b3703d005200341d0056a21020b20034190046a41102002411010030b20034180036a20212012109c010c040b20034190046a41026a200341c8066a41026a2d00003a000020034180036a41086a200341b0046a41086a29030037030020034180036a410d6a200341b0046a410d6a290000370000200320032f01c8063b019004200320032903b00437038003410021020b2003418c046a41026a220620034190046a41026a2d00003a000020034190056a41086a220720034180036a41086a29030037030020034190056a41106a20034180036a41106a290300370300200320032f0190043b018c042003200329038003370390052002450d010b200f210a20082109410121084101210b0c0e0b200341eb066a2007290300370000200341f0066a2003419d056a290000370000200320032f018c043b01d8062003200f3600df06200320083600db0620032003290390053700e306200320062d00003a00da06411410272202450d02200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d03200220032903d0053700142002412c6a200341e8056a290300370000200241246a200341d0056a41106a2903003700002002411c6a200341d0056a41086a290300370000200341e8006a20024134108401200341e8006a41106a2903002121200329037021222003280268210820021029411410272202450d04200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d05200220032903d8063700142002412c6a200341f0066a290300370000200241246a200341d8066a41106a2903003700002002411c6a200341d8066a41086a290300370000200341d0006a20024134108401200341d0006a41106a2903002124200329035821252003280250210620021029024020044280a094a58d1d7c22122004542202200e2002ad7c2223200e54201220045a1b450d004128210a41d0bec0002109410121084101210b0c0e0b02402022420020081b222220127d22262022562021420020081b222120237d2022201254ad7d221220215620122021511b450d00411d210a41e8b5c3002109410121084101210b0c0e0b2024420020061b21212025420020061b21220240200442ffffe883b1de1656200e420052200e501b0d00202220218450450d00411f210a4185b6c3002109410121084101210b0c0e0b200341c8006a200341d0056a4102202620121091010240200328024822090d000240202220047c222320225422022021200e7c2002ad7c222220215420222021511b450d00412d210a41a4b6c3002109410121084101210b0c0f0b200341d0056a200341d8066a412010d004450d01200341d0056a20262012108901411410272202450d07200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d08200220032903d8063700142002412c6a200341d8066a41186a2208290300370000200241246a200341d8066a41106a2903003700002002411c6a200341d8066a41086a29030037000020034180036a41186a2206420037030020034180036a41106a2207420037030020034180036a41086a2209420037030020034200370380032002413420034180036a100020034190046a41186a200629030037030020034190046a41106a200729030037030020034190046a41086a200929030037030020032003290380033703900420034190046a412041b8d6c50041004100100b21062002102902402006417f470d00200341d8066a108701200341b8036a2022370300200341b0036a202337030020034180036a41086a41003a000020034189036a20032903d80637000020034191036a200341d8066a41086a29030037000020034199036a200341e8066a290300370000200341a1036a2008290300370000200341023a00800341b8d6c500410020034180036a1088010b200341d8066a20232022108901200341306a41b18ac0004116108601200341306a41106a2903002112200329033821212003280230210220034190056a41086a22064200370300200342003703900541b18ac000411620034190056a100420034190046a41086a2006290300370300200320032903900537039004200342002012420020021b22222021420020021b22124280a094a58d1d54ad7d222120124280e0ebdaf2627c22232012562021202256201242ff9f94a58d1d561b22021b3703880320034200202320021b3703800320034190046a411020034180036a41101003200341e8036a4200370300200341e0036a4280a094a58d1d370300200341d8036a200e370300200341d0036a200437030020034180036a41086a41023a000020034189036a20032903d00537000020034191036a200341d0056a41086a29030037000020034199036a200341d0056a41106a290300370000200341a1036a200341d0056a41186a290300370000200341a9036a20032903d806370000200341b1036a200341d8066a41086a290300370000200341b9036a200341d8066a41106a290300370000200341c1036a2008290300370000200341023a00800341b8d6c500410020034180036a1088010c010b200328024c210a410121084101210b0c0d0b410021090b410121084101210b0c0b0b41144101102a000b41344101102a000b41144101102a000b41344101102a000b41144101102a000b41344101102a000b4100210c410021090c010b4100210d410021090b4128210a4101210b4100210802402007417f6a220241054b0d004101210f410121104101211341012114410121154101211641012117410121064101210741012111024002400240024020020e06100010010203100b4100210841000d062004a70d050c060b4100210841000d052004a70d040c050b200d450d0402402004422088a72202450d00200241186c21062005210203400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200641686a22060d000b0b2004a70d030c040b200c450d0302402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d00200228020010290b2002410c6a2102200641746a22060d000b0b2004a70d020c030b02402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d00200228020010290b2002410c6a2102200641746a22060d000b0b2004a70d010c020b410021084101210f410121104101211341012114410121154101211641012117410121064101210741012111410021090c0a0b200510290b4101210f0b410121100b410121130b410121140b410121150b410121160b410121170b410121060b41012107410121110b024002402001280200220241104b0d000240024002400240024002400240024002400240024020020e11000c0c010c0c0203040506070c080c090a000b2008450d0b0240200141086a280200220241054b0d0002400240024020020e060f0f000f01020f0b200141106a280200450d0e2001410c6a28020010290c0e0b200141106a280200450d0d2001410c6a28020010290c0d0b0240200141146a2802002208450d002001410c6a2802002102200841186c210803400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200841686a22080d000b0b200141106a280200450d0c200128020c10290c0c0b0240200141146a2802002208450d002001410c6a28020021022008410c6c210803400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b200141106a280200450d0b200128020c10290c0b0b200b450d0a02402001410c6a2802002202450d0020012802042207200241f8006c6a211103400240200741106a2802002208450d0020072802082102200841246c210803400240024020022d0000220641034b0d0002400240024020060e0404000102040b2002410c6a280200450d03200241086a28020010290c030b2002410c6a280200450d02200241086a28020010290c020b2002410c6a280200450d01200241086a28020010290c010b200241086a280200450d00200241046a28020010290b200241246a21022008415c6a22080d000b0b200741f8006a210202402007410c6a280200450d00200728020810290b2002210720022011470d000b0b200141086a280200450d0a200128020410290c0a0b200f450d090240200141086a2d00002202410c4b0d0020024106470d0a200141106a280200450d0a2001410c6a28020010290c0a0b200141106a280200450d092001410c6a28020010290c090b2010450d08200141086a280200450d08200128020410290c080b2013450d07200141086a2d0000417f6a220241074b0d07024002400240024020020e08000b0b0b010b0203000b2001410c6a2202280200103d200228020010290c0a0b2001410c6a2202280200103d200228020010290c090b2001410c6a2202280200103d200228020010290c080b2001410c6a2202280200103d200228020010290c070b2014450d0620012d0004417f6a220241024b0d0602400240024020020e03000102000b2001410c6a280200450d08200141086a28020010290c080b200141086a2202280200103d200228020010290c070b2001410c6a2202280200103d200228020010290c060b2015450d0520012d0004417f6a220241024b0d0502400240024020020e03000102000b2001410c6a280200450d07200141086a28020010290c070b200141086a2202280200103d200228020010290c060b2001410c6a2202280200103d200228020010290c050b2016450d04200141086a280200417f6a220241014b0d040240024020020e020001000b200141106a280200450d052001410c6a28020010290c050b200141106a280200450d042001410c6a28020010290c040b2017450d03200141086a280200450d03200128020410290c030b2006450d020240200141086a2d0000220241054b0d0002400240024020020e06060600010206060b200141106a280200450d052001410c6a28020010290c050b200141346a280200450d04200141306a28020010290c040b200141306a280200450d032001412c6a28020010290c030b200141d0006a280200450d02200141cc006a28020010290c020b2007450d0120012802044101470d01200141086a2202280200103d200228020010290c010b2011450d000240200141146a280200450d00200141106a28020010290b0240200141246a2802002208450d002001411c6a28020021022008410c6c210803400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b0240200141206a280200450d00200128021c10290b200141d4006a280200450d00200141d0006a28020010290b2000200a36020420002009360200200341a0076a24000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccfdc4003602002000410236021c200041c4fdc4003602182000200041186a360210200041908fc3001057000be42107067f017e017f017e017f027e137f230041e0026b22042400200128020821052001280204210620012802002107418988c30021084124210902400240200241ff01710d00200341ff01714102470d0020044188016a41086a22014200370300200442003703880141fcc7c500411720044188016a1004200441186a41086a200129030037030020042004290388013703182004410036028801200441186a411020044188016a10052101024002400240024002400240024002402004280288012202417f460d002001450d00200441003a00880120044188016a20012002410047220310ce041a20022003490d042002450d0120042d00880121022001102920024102460d002002410171450d0041f086c3002108411c21090c080b200441013a00c00220044188016a41086a22014200370300200442003703880141fcc7c500411720044188016a1004200441186a41086a220220012903003703002004200429038801370318200441186a4110200441c0026a41011003200441086a41888dc300410d1094012004290310210a20042802082103200142003703002004420037038801418bf4c200411120044188016a10042002200129030037030020042004290388013703182004410036028801200441186a411020044188016a10052101024002402004280288012202417f460d002001450d00200420023602c402200420013602c00220044188016a200441c0026a1046200428028801220b450d04200429028c01210c2002450d01200110290c010b4108210b4200210c0b02400240200ca7200c422088a72201470d00200141016a22022001490d012001410174220d20022002200d491bad220e42c8007e220f422088a70d01200fa722024100480d010240024020010d0020021027210b0c010b200b200141c8006c20021028210b0b200b450d03200c42808080807083200e84210c0b200b200141c8006c6a220141003a00002001200a420020031b220e37030820012004280018360001200141046a200441186a41036a2800003600002001200429038801370310200141186a20044188016a41086a290300370300200141206a20044188016a41106a290300370300200141286a20044188016a41186a290300370300200141306a20044188016a41206a290300370300200141386a20044188016a41286a290300370300200141c0006a20044188016a41306a290300370300200c4280808080107c210a2007200541f8006c6a2110024020050d00200721110c070b200441ff016a2112200441b7016a2113200441ef006a2114200441276a2115200441dc016a211620044188016a41346a21172004419c016a211820044188016a410c6a2119200441b6026a211a200441a2026a41046a211b2007211103402011280208211c2011290300210c20044188016a2011410c6a41ec0010ce041a201141f8006a2111201c450d07200441186a20044188016a41ec0010ce041a2004201c360290012004200c370388012019200441186a41ec0010ce041a200441003602b002200442013703a80202400240024002400240412010272201450d00200442a080808080043702ac02200420013602a80220012018290000370000200141086a201841086a290000370000200141106a201841106a290000370000200141186a201841186a29000037000020044188016a200441a8026a10540240024020042802ac02220220042802b00222036b4120490d00200341206a210120042802a80221050c010b200341206a22012003490d0720024101742205200120012005491b220d4100480d070240024020020d00200d102721050c010b20042802a8022002200d102821050b2005450d022004200d3602ac02200420053602a802200d21020b200420013602b002200520036a22032017290000370000200341086a201741086a290000370000200341106a201741106a290000370000200341186a201741186a2900003700000240200220016b411f4b0d00200141206a22032001490d072002410174220d20032003200d491b22034100480d070240024020020d002003102721050c010b200520022003102821050b2005450d03200420033602ac02200420053602a8020b200520016a220541086a201641086a290000370000200541106a201641106a290000370000200541186a201641186a2900003700002004200141206a3602b002200520162900003700002004200428029801221d3602c002200441c0026a200441a8026a103002400240201d0d0020042802b002210520042802ac02210820042802a80221020c010b201d41246c210920042802ac02210820042802b0022101201c21030340200441c0026a2003104f20042802c002211e02400240200820016b20042802c802220d490d002001200d6a210520042802a80221020c010b2001200d6a22052001490d0920084101742202200520052002491b221f4100480d090240024020080d00201f102721020c010b20042802a8022008201f102821020b2002450d062004201f3602ac02200420023602a802201f21080b200420053602b002200220016a201e200d10ce041a024020042802c402450d00201e10290b200341246a2103200521012009415c6a22090d000b0b200441c0026a41186a22034200370300200441c0026a41106a220d4200370300200441c0026a41086a221e4200370300200442003703c00220022005200441c0026a100020044180026a41186a2220200329030037030020044180026a41106a2221200d29030037030020044180026a41086a2222201e290300370300200420042903c0023703800202402008450d00200210290b200c50450d04418c87c3002108411021090c0b0b41204101102a000b200d4101102a000b20034101102a000b201f4101102a000b0240200c200e580d00419c87c3002108411821090c070b200441c0026a200c427f7c1087020240200441c0026a2018412010d004450d0041b487c3002108411921090c070b0240200c200e5a0d0041cd87c3002108412621090c070b200b200a422088a7220241c8006c221f6a2105200b2101024002400240024002400240201f41d901490d00200b21010340024020012d00004101470d0020122001460d07200141016a20044180026a412010d004450d070b0240200141c8006a22082d00004101470d0020132001460d03200141c9006a20044180026a412010d004450d030b024020014190016a22082d00004101470d0020142001460d0420014191016a20044180026a412010d004450d040b0240200141d8016a22082d00004101470d0020152001460d06200141d9016a20044180026a412010d004450d060b2005200141a0026a22016b41d8014b0d000b0b20052001470d02410021010c040b200821010c030b200821010c020b0340024020012d00004101470d0020122001460d03200141016a20044180026a412010d004450d030b2005200141c8006a2201470d000b410021010c010b200821010b200441c0026a200c108702200441c0026a20044180026a412010d004210541f387c30021084116210920010d062005450d06200441c0026a109801200441c0026a410210960320034200370300200d4200370300201e4200370300200442003703c002200441c0026a4101109603201e2022290300370300200d20212903003703002003202029030037030020042004290380023703c00202400240200aa72002470d00200241016a22012002490d0320024101742205200120012005491bad220c42c8007e220f422088a70d03200fa722014100480d030240024020020d0020011027210b0c010b200b201f20011028210b0b200b450d01200a42808080807083200c84210a0b200b201f6a220141013a0000200141096a201e290300370000200120042903c0023700012003290300210c200d290300210f200141003a0021200141116a200f370000200141196a200c370000200120042900a80237002c200141346a200441a8026a41086a2900003700002001413a6a201a290000370000200120042801a202360142200141c6006a201b2f01003b01000240201d450d00201d41246c2105201c210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b0240200428029401450d00201c10290b200a4280808080107c210a20112010470d010c090b0b20014108102a000b102b000b418f89c3004133104e000b20024108102a000b418f89c3004133104e000b20032002103e000b0240201d450d00201d41246c2105201c210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b0240200428029401450d00201c10290b024020112010460d00034020112802082203450d012011410c6a280200210d0240201141106a2802002201450d00200141246c21052003210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b201141f8006a21110240200d450d00200310290b20112010470d000b0b02402006450d00200710290b200aa7450d03200b10290c030b20112010460d00034020112802082203450d012011410c6a280200210d0240201141106a2802002201450d00200141246c21052003210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b201141f8006a21110240200d450d00200310290b20112010470d000b0b02402006450d00200710290b20044188016a41086a220142003703002004420037038801418bf4c200411120044188016a1004200441186a41086a200129030037030020042004290388013703184100210820044100360290012004420137038801200b200a422088a720044188016a109203200428028c012101200441186a41102004280288012205200428029001100302402001450d00200510290b0240200aa7450d00200b10290b0c010b02402005450d002007200541f8006c6a210d2007210303400240200341106a2802002205450d0020032802082101200541246c210503400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b200341f8006a210102402003410c6a280200450d00200328020810290b200121032001200d470d000b0b2006450d00200710290b2000200936020420002008360200200441e0026a24000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccfdc4003602002000410236021c200041c4fdc4003602182000200041186a360210200041f4eec2001057000b83d50106017f037e0c7f017e157f057e23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0e000102030405060708090a0b0c0d000b2003419c046a41013602002003420137028c04200341ccfdc40036028804200341023602fc01200341c4fdc4003602f8012003200341f8016a3602980420034188046a41d4fdc4001057000b200141306a2903002104200141286a29030021052002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f010021122001411d6a29000021132001411c6a2d000021142001411b6a2d00002115200141196a2f00002116200141186a2d00002117200141176a2d00002118200141156a2f00002119200141146a2d0000211a200141136a2d0000211b200141116a2f0000211c200141106a2d0000211d2001410c6a280200211e200141086a280200211f200141076a2d00002120200141056a2f00002121200141046a2d0000212220012d00012123412a212441d588c30021250240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202841ffff0371410874202741187472202441ff017172212420260d4f410e10272202450d3f200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d3e20022006370026200220073a0025200220083a0024200220093b00222002200a3a00212002200b3a00202002200c3b001e2002200d3a001d2002200e3a001c2002200f3b001a200220103a00192002202436001520022025360011200220113a0010200220123b000e200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803200341e8036a412041b8d6c50041004100100b21262002102902402026417f460d0041aefec4002125411421240c500b0240202241ff01714101470d0020034188046a201f41067610cc01200328028804212602400240200328029004201f413f7122024b0d00410021020c010b202620024105746a2202290018211320022d0017211420022d0016211520022f0014211620022d0013211720022d0012211820022f0010211920022d000f211a20022d000e211b20022f000c211c20022d000b211d2002280007211e2002280003211f20022d0002212020022f00002121410121020b0240200328028c04450d00202610290b2002450d4f0b2003201337039002200320143a008f02200320153a008e02200320163b018c02200320173a008b02200320183a008a02200320193b0188022003201a3a0087022003201b3a0086022003201c3b0184022003201d3a0083022003201e3600ff012003201f3600fb01200320203a00fa01200320213b01f801410e10272202450d3d200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d3c200220032903f80137000e200241266a200341f8016a41186a2903003700002002411e6a200341f8016a41106a290300370000200241166a200341f8016a41086a290300370000200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803200341e8036a412041b8d6c50041004100100b2126200210292026417f470d4d02402005428080e983b1de165441002004501b450d0041fdfdc4002125413121240c500b20034188046a41186a200341f8016a41186a29030037030020034188046a41106a200341f8016a41106a29030037030020034188046a41086a200341f8016a41086a290300370300200320032903f80137038804410e10272202450d3b200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d3a20022006370026200220073a0025200220083a0024200220093b00222002200a3a00212002200b3a00202002200c3b001e2002200d3a001d2002200e3a001c2002200f3b001a200220103a00192002202436001520022025360011200220113a0010200220123b000e200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803412010272226450d392026200329038804370000202641186a20034188046a41186a290300370000202641106a20034188046a41106a290300370000202641086a20034188046a41086a290300370000200341e8036a41202026412010032026102920021029410d10272202450d38200241056a41002900aca344370000200241002900a7a3443700002002410d412d10282202450d3720022006370025200220073a0024200220083a0023200220093b00212002200a3a00202002200b3a001f2002200c3b001d2002200d3a001c2002200e3a001b2002200f3b0019200220103a00182002202436001420022025360010200220113a000f200220123b000d200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412d200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803024002400240024002400240202341037122264103460d0020260e03010203010b200341e8036a41204101410010030c040b410021270c020b410121270c010b410221270b200320273a00f004410110272226450d37202620273a0000200341e8036a4120202641011003202610290b20021029411410272202450d35200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d342002200637002c200220073a002b200220083a002a200220093b00282002200a3a00272002200b3a00262002200c3b00242002200d3a00232002200e3a00222002200f3b0020200220103a001f2002202436001b20022025360017200220113a0016200220123b0014200320024134108401200341106a2903002113200329030821292003280200212620021029200341cc046a2006370200200341cb046a20073a0000200341ca046a20083a0000200341c8046a20093b0100200341c7046a200a3a0000200341c6046a200b3a0000200341c4046a200c3b0100200341c3046a200d3a0000200341c2046a200e3a0000200341c0046a200f3b0100200341bf046a20103a0000200341bb046a2024360000200341b7046a2025360000200341b6046a20113a0000200341b0046a4100360200200341a0046a2013420020261b220620042029420020261b2213200554200620045420062004511b22021b2206370300200320123b01b404200342083703a80420032013200520021b22133703980420032006370390042003201337038804200341f8016a20034188046a10d803200341ac046a280200450d4c20032802a80410290c4c0b20022d00000d4a20022d00014101470d4a200141106a2903002106200141086a2903002113200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a29010037038004200320253a00ff03200320243a00fe03200320263b01fc03200320273a00fb03200320283a00fa03200320073b01f803200320083a00f703200320093a00f6032003200a3b01f4032003200b3a00f303200320123a00ea032003201f3b01e8032003200e200d410874200c41187472723600ef0320032011201041087472200f411874723600eb0320034188046a200341e8036a108c02024020032d0088044101460d0041d2fec4002125410b21240c4f0b2003200329028c0437006b200320032d008b043a006a200320032f0089043b01682003200341a1046a2900003703800120032003419d046a28000036027c200320034195046a290000370274200320034188046a410c6a22022d00003a007320034188046a200341e8006a108d0220032802a8042224450d49200341f0046a41086a20034188046a41346a2902002204370300200341b0016a41086a22262004370300200341b0016a41106a222720034188046a413c6a290200370300200341b0016a41186a222820034188046a41c4006a2902003703002003200341b4046a29020022043703f004200320043703b001200341d4046a280200210720034188046a41286a2802002108200235020021042003280288042102200329028c042105200329039804212920032802ac042125200341f8016a41186a20034188046a41186a290300222a370300200341f8016a410c6a20043e0200200341f8016a41286a20083602002003419c026a20253602002003202937038802200320053702fc012003202436029802200320023602f801200341f8016a41c4006a2028290300370200200341f8016a413c6a2027290300370200200341f8016a41346a2026290300370200200320032903b0013702a402200320073602c402411410272202450d32200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d31200220032903e8033700142002412c6a200341e8036a41186a290300370000200241246a200341e8036a41106a2903003700002002411c6a200341e8036a41086a290300370000200341186a20024134108401200341186a41106a29030021052003290320210420032802182124200210292004420020241b220420032903f801222b7d222c2004562005420020241b2205200341f8016a41086a290300222d7d2004202b54ad7d220420055620042005511b450d470c480b200141106a2903002113200141086a29030021042002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f01002112412a212441d588c30021250240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202841ffff0371410874202741187472202441ff017172212420260d4d2003200637038001200320073a007f200320083a007e200320093b017c2003200a3a007b2003200b3a007a2003200c3b01782003200d3a00772003200e3a00762003200f3b0174200320103a00732003202436006f2003202536006b200320113a006a200320123b016820034188046a200341e8006a108d0220032802a8042226450d48200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22242006370300200341c0016a222720034188046a413c6a290200370300200341b0016a41186a222820034188046a41c4006a2902003703002003200341b4046a29020022063703f004200320063703b001200341d4046a280200210720034188046a41286a280200212520034188046a410c6a35020021292003280288042108200329028c04212b200329039804210620032802ac042102200341f8016a41186a20034188046a41186a2903002205370300200341f8016a410c6a20293e0200200341f8016a41286a20253602002003419c026a200236020020032006370388022003202b3702fc012003202636029802200320083602f801200341f8016a41c4006a2028290300370200200341f8016a413c6a2027290300370200200341f8016a41346a2024290300370200200320032903b0013702a402200320073602c40202400240024002402025411f4b0d00200620042006200454200520135420052013511b22241b22042005201320241b221384500d03200341f8016a41186a4200200520137d2006200454ad7d2229200620047d222b428080e983b1de165441002029501b22241b37030020034200202b20241b37038802200341306a4189c7c500411210b501200328023421272003280230212820252002470d02200241016a22072002490d4920024101742208200720072008491b2207ad42187e2229422088a70d492029a7220841004e0d010c490b41ddfec4002125412321242002450d50202610290c500b0240024020020d002008102721260c010b2026200241186c2008102821260b2026450d312003200736029c0220032026360298020b2026202541186c6a22022005201320241b37030820022006200420241b3703002002202741a0056a41a00520281b360210200320032802a00241016a3602a002200341e8006a200341f8016a10d803200328029c0221020b2002450d4a20032802980210290c4a0b41d588c3002125412a212420022d00000d4c20022d00014101470d4c200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a2901003703c801200320253a00c701200320243a00c601200320263b01c401200320273a00c301200320283a00c201200320073b01c001200320083a00bf01200320093a00be012003200a3b01bc012003200b3a00bb01200320123a00b2012003201f3b01b0012003200e200d410874200c41187472723600b70120032011201041087472200f411874723600b30120034188046a200341b0016a108d0220032802a8042207450d47200341c8026a41086a200341bc046a290200370300200341c8026a41106a200341c4046a290200370300200341c8026a41186a200341cc046a2902003703002003200341b4046a2902003703c80220034188046a41186a2903002129200341b0046a280200210920034194046a3502002106200329039804212b20032802ac04210a2003350288042104200329028c042113200341c8006a4189c7c500411210b501410021282006422086201342208884210620042013422086842113024002400240200941186c2202450d00200328024c410020032802481b2126200720026a2127200941186c41686a2125200721020340200241086a2903002105200229030021042026200241106a2802002224490d024200200620057d2013200454ad7d2205201320047d2204201356200520065620052006511b22241b21064200200420241b2113202541686a2125200241186a22022027470d000b0b410821080240200a0d00410021240c020b20071029410021240c010b411810272208450d2e2008200437030020082024360210200820053703080240024020250d0041012128410121240c010b200241186a210b200941186c20076a41686a210c41012128410121240340200b210202400340200241086a2903002105200229030021042026200241106a2802002225490d014200200620057d2013200454ad7d2205201320047d2204201356200520065620052006511b22251b21064200200420251b2113200241186a22022027470d000c030b0b024020242028470d00202841016a22242028490d4820284101742209202420242009491b2224ad42187e222c422088a70d48202ca722094100480d480240024020280d002009102721080c010b2008202841186c2009102821080b2008450d300b200241186a210b2008202841186c6a220920053703082009200437030020092025360210202841016a2128200c2002470d000b0b200a450d00200710290b200341b0046a2028360200200341ac046a20243602002003202b3703980420034188046a41186a2029370300200341cc046a200341c8026a41186a290300370200200341c4046a200341d8026a290300370200200341bc046a200341d0026a2903003702002003201337038804200320032903c8023702b404200320083602a80420032006370390040240202b2029844200520d002028450d0a0b200341b0016a20034188046a10d8030c430b200141106a2903002113200141086a2903002104200141186a280200211f2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f0100211241d588c3002125412a21240240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202741ffff0371410874202441ff017172202841187472212420260d4b2003200637038003200320073a00ff02200320083a00fe02200320093b01fc022003200a3a00fb022003200b3a00fa022003200c3b01f8022003200d3a00f7022003200e3a00f6022003200f3b01f402200320103a00f302200320243600ef02200320253600eb02200320113a00ea02200320123b01e80220034188046a200341e8026a108d0220032802a8042202450d46200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22252006370300200341b0016a41106a222420034188046a413c6a290200370300200341b0016a41186a222720034188046a41c4006a290200370300200320034188046a412c6a29020022063703f004200320063703b001200341d4046a280200212820034188046a41286a280200210720034188046a410c6a35020021062003280288042108200329028c042105200329039804212920032802ac042126200341f8016a41186a20034188046a41186a290300370300200341f8016a410c6a20063e0200200341f8016a41286a20073602002003419c026a20263602002003202937038802200320053702fc012003200236029802200320083602f801200341f8016a41c4006a2027290300370200200341f8016a413c6a2024290300370200200341f8016a41346a2025290300370200200320032903b0013702a402200320283602c4020240201f410a4b0d00200341f8016a412c6a222510ca0320032013370358200320043703502003201f360260411210272202450d2b200241106a41002f0088a3443b0000200241086a4100290080a344370000200241002900f8a24437000020024112413210282202450d2a200220252900003700122002412a6a202541186a290000370000200241226a202541106a2900003700002002411a6a202541086a290000370000200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00420024132200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a10052124024002402003280288042226417f460d002024450d00200320263602f404200320243602f00420034188046a200341f0046a10af0320032d00a00422254102460d2b200341b0016a41186a2227200341b9046a290000370300200341b0016a41106a2207200341b1046a290000370300200341b0016a41086a2208200341a9046a290000370300200341e8006a41086a2209200341ca046a290100370300200341e8006a41106a220a200341d2046a290100370300200341e8006a41186a220b200341da046a290100370300200320032900a1043703b0012003200341c2046a290100370368200341c1046a2d0000212802402026450d00202410290b200341c8026a41086a2008290300370300200341c8026a41106a2007290300370300200341c8026a41186a202729030037030020034188036a41086a200929030037030020034188036a41106a200a29030037030020034188036a41186a200b290300370300200320032903b0013703c80220032003290368370388030c010b200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00441b3a4c400411a200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521240240024002402003280288042226417f460d002024450d00200341f0046a2026412020264120491b22276a41004100412020276b2027411f4b1b10cd041a200341f0046a2024202710ce041a2026411f4d0d2c200341b0016a41186a2226200341f0046a41186a290300370300200341b0016a41106a2227200341f0046a41106a290300370300200341b0016a41086a2228200341f0046a41086a290300370300200320032903f0043703b00120241029200341a8036a41186a20262903002206370300200341a8036a41106a20272903002213370300200341a8036a41086a20282903002204370300200320032903b00122053703a803200341c8036a41186a2006370300200341c8036a41106a2013370300200341c8036a41086a2004370300200320053703c8034112102722240d0141124101102a000b200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00441b3a4c400411a200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e803412010272224450d2a20242025290000370000202441186a202541186a290000370000202441106a202541106a290000370000202441086a202541086a290000370000200341e8036a412020244120100320241029410021280c010b202441106a41002f0088a3443b0000202441086a4100290080a344370000202441002900f8a24437000020244112413210282224450d28202420032903c8033700122024412a6a200341c8036a41186a290300370000202441226a200341c8036a41106a2903003700002024411a6a200341c8036a41086a290300370000200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f00420244132200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521262003280288042227417f460d262026450d262003202736026c2003202636026820034188046a200341e8006a10af0320032d00a00422284102460d2720034188046a41086a290300210620032903880421132003280298042107200341b0016a200341a1046a41c70010ce041a02402027450d00202610290b200341e8006a200341b0016a41c10010ce041a200320283a00880420034188046a410172200341e8006a41c10010ce041a200341cc016a200341aa046a410020032d00a9044101461b360200200320063703b801200320133703b001200320253602c801200320073602c001200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f00420244132200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e8032003410036027020034201370368200341b0016a41106a200341e8006a10302003200341b0016a3602f004200341f0046a200341e8006a10590240024020032802c80122070d00200341003a00f00402400240200328026c222720032802702207460d00200328026821260c010b200741016a22262007490d4920074101742227202620262027491b22274100480d490240024020070d002027102721260c010b200328026820072027102821260b2026450d282003202736026c200320263602680b2003200741016a2228360270202620076a41003a00000c010b200341013a00f00402400240200328026c20032802702227460d00200328026821260c010b202741016a22262027490d4820274101742228202620262028491b22284100480d480240024020270d002028102721260c010b200328026820272028102821260b2026450d262003202836026c200320263602680b2003202741016a360270202620276a41013a000002400240200328026c2208200328027022286b411f4d0d00200821270c010b202841206a22272028490d4820084101742209202720272009491b22274100480d480240024020080d002027102721260c010b202620082027102821260b2026450d252003202736026c200320263602680b202620286a220841086a200741086a290000370000200841106a200741106a290000370000200841186a200741186a2900003700002003202841206a2228360270200820072900003700000b0240024020032802cc0122070d00200341003a00f004024020272028470d00202741016a22072027490d4920274101742208200720072008491b22074100480d490240024020270d002007102721260c010b202620272007102821260b2026450d252003200736026c200320263602680b2003202841016a360270202620286a41003a000020032802702128200328026c2127200328026821260c010b200341013a00f004024020272028470d00202741016a22082027490d4820274101742209200820082009491b22084100480d480240024020270d002008102721260c010b202620272008102821260b2026450d232003200836026c200320263602680b2003202841016a360270202620286a41013a000002400240200328026c2227200328027022286b4120490d00200328026821260c010b202841206a22262028490d4820274101742208202620262008491b22084100480d480240024020270d002008102721260c010b200328026820272008102821260b2026450d222003200836026c20032026360268200821270b202620286a220841086a200741086a290000370000200841106a200741106a290000370000200841186a200741186a2900003700002003202841206a2228360270200820072900003700000b200341e8036a412020262028100302402027450d00202610290b20241029200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00441b3a4c400411a200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e803412010272224450d1f20242025290000370000202441186a202541186a290000370000202441106a202541106a290000370000202441086a202541086a290000370000200341e8036a41202024412010032024102920034188036a41086a200341c8036a41086a29030037030020034188036a41106a200341c8036a41106a29030037030020034188036a41186a200341c8036a41186a290300370300200320032903c80337038803410121280b410021250b20034188046a41086a200341c8026a41086a29030037030020034188046a41106a200341c8026a41106a29030037030020034188046a41186a200341c8026a41186a290300370300200341b0016a41086a20034188036a41086a290300370300200341b0016a41106a20034188036a41106a290300370300200341b0016a41186a20034188036a41186a290300370300200320032903c8023703880420032003290388033703b001200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00420024132200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e8032003410036027020034201370368200341d0006a41106a200341e8006a10302003200341d0006a3602f004200341f0046a200341e8006a10590240024020254101460d00200341003a00f00402400240200328026c222420032802702227460d00200328026821250c010b202741016a22252027490d4720274101742224202520252024491b22244100480d470240024020270d002024102721250c010b200328026820272024102821250b2025450d1f2003202436026c200320253602680b2003202741016a2226360270202520276a41003a00000c010b200341013a00f00402400240200328026c20032802702224460d00200328026821250c010b202441016a22252024490d4620244101742226202520252026491b22264100480d460240024020240d002026102721250c010b200328026820242026102821250b2025450d1d2003202636026c200320253602680b2003202441016a360270202520246a41013a000002400240200328026c2227200328027022266b411f4d0d00202721240c010b202641206a22242026490d4620274101742207202420242007491b22244100480d460240024020270d002024102721250c010b202520272024102821250b2025450d1c2003202436026c200320253602680b202520266a222741086a20034188046a41086a290300370000202741106a20034188046a41106a290300370000202741186a20034188046a41186a2903003700002003202641206a222636027020272003290388043700000b02400240202841ff01714101460d00200341003a00f004024020242026470d00202441016a22272024490d4720244101742228202720272028491b22274100480d470240024020240d002027102721250c010b202520242027102821250b2025450d1c2003202736026c200320253602680b2003202641016a360270202520266a41003a000020032802702126200328026c2124200328026821250c010b200341013a00f004024020242026470d00202441016a22272024490d4620244101742228202720272028491b22274100480d460240024020240d002027102721250c010b202520242027102821250b2025450d1a2003202736026c200320253602680b2003202641016a360270202520266a41013a000002400240200328026c2224200328027022266b4120490d00200328026821250c010b202641206a22252026490d4620244101742227202520252027491b22274100480d460240024020240d002027102721250c010b200328026820242027102821250b2025450d192003202736026c20032025360268202721240b202520266a222741086a200341b0016a41086a290300370000202741106a200341b0016a41106a290300370000202741186a200341b0016a41186a2903003700002003202641206a2226360270202720032903b0013700000b200341e8036a412020252026100302402024450d00202510290b20021029200328029c02450d4920032802980210290c490b4180ffc4002125411b21242026450d4b200210290c4b0b2001410c6a2802002109200141086a2802002108200141046a28020021282002411a6a2901002106200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d0000211f200241046a2d00002114200241026a2f0100211541d588c3002125412a21240240024020022d0000450d004101212641002127410021070c010b41012126410021274100210720022d00014101470d002002410c6a2d000021072002410a6a2f01002127200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202741ffff0371410874202441ff017172200741187472212420260d40200320063703c0032003200a3a00bf032003200b3a00be032003200c3b01bc032003200d3a00bb032003200e3a00ba032003200f3b01b803200320103a00b703200320113a00b603200320123b01b4032003201f3a00b303200320243600af03200320253600ab03200320143a00aa03200320153b01a80320034188046a200341a8036a108d02024020032802a804220a0d004110212441c2fec40021250c410b200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22022006370300200341c0016a222520034188046a413c6a290200370300200341b0016a41186a222420034188046a41c4006a290200370300200320034188046a412c6a29020022063703f004200320063703b001200341d4046a280200212620034188046a41286a280200212720034188046a410c6a35020021062003280288042107200329028c042113200329039804210420032802ac04210b200341f8016a41186a20034188046a41186a290300370300200341f8016a410c6a20063e0200200341f8016a41286a2027360200200341f8016a41246a200b3602002003200437038802200320133702fc012003200a36029802200320073602f801200341f8016a41c4006a2024290300370200200341f8016a413c6a2025290300370200200341f8016a41346a2002290300370200200320032903b0013702a402200320263602c40220090d3e41ba80c500212541172124410121020c3f0b20022d00000d4520022d00014101470d45200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a29010037038001200320253a007f200320243a007e200320263b017c200320273a007b200320283a007a200320073b0178200320083a0077200320093a00762003200a3b01742003200b3a0073200320123a006a2003201f3b01682003200e200d41087472200c4118747236006f20032011201041087472200f4118747236006b20034188046a200341e8006a108d0220032802a8042202450d44200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22242006370300200341c0016a222620034188046a413c6a290200370300200341b0016a41186a222720034188046a41c4006a290200370300200320034188046a412c6a29020022063703f004200320063703b001200341d4046a280200212820034188046a41286a280200210720034188046a410c6a35020021062003280288042108200329028c042113200329039804210420032802ac042125200341f8016a41186a20034188046a41186a290300370300200341f8016a410c6a20063e0200200341f8016a41286a20073602002003419c026a20253602002003200437038802200320133702fc012003200236029802200320083602f801200341f8016a41c4006a2027290300370200200341f8016a413c6a2026290300370200200341f8016a41346a2024290300370200200320032903b0013702a402200320283602c402200341f8016a412c6a222410c903202410ca032025450d46200210290c460b20022d00000d4420022d00014101470d4420012d00012114200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a2901003703c801200320253a00c701200320243a00c601200320263b01c401200320273a00c301200320283a00c201200320073b01c001200320083a00bf01200320093a00be012003200a3b01bc012003200b3a00bb01200320123a00b2012003201f3b01b0012003200e200d41087472200c411874723600b70120032011201041087472200f411874723600b30120034188046a200341b0016a108d0220032802a8042226450d43200341f8016a41086a200341bc046a29020037030020034188026a200341c4046a290200370300200341f8016a41186a200341cc046a2902003703002003200341b4046a2902003703f80120032802ac042127410d10272202450d12200241056a41002900aca344370000200241002900a7a3443700002002410d412d10282202450d11200220032903f80137000d200241256a200341f8016a41186a2903003700002002411d6a200341f8016a41106a290300370000200241156a200341f8016a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22284200370300200342003703f0042002412d200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2028290300370300200320032903f0043703e803024002400240024002400240201441037122254103460d0020250e03010203010b200341e8036a41204101410010030c040b410021240c020b410121240c010b410221240b200320243a00f004410110272225450d11202520243a0000200341e8036a4120202541011003202510290b200210292027450d45202610290c450b2001411d6a29000021132001411c6a2d000021142001411b6a2d00002115200141196a2f00002116200141186a2d00002117200141176a2d00002118200141156a2f00002119200141146a2d0000211a200141136a2d0000211b200141116a2f0000211c200141106a2d0000211d2001410c6a280200211e200141086a2802002107200141076a2d00002120200141056a2f00002121200141046a2d000021222002411a6a2901002106200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211f41d588c3002125412a21240240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202741ffff0371410874202441ff017172202841187472212420260d47200320063703e002200320083a00df02200320093a00de022003200a3b01dc022003200b3a00db022003200c3a00da022003200d3b01d8022003200e3a00d7022003200f3a00d602200320103b01d402200320113a00d302200320243600cf02200320253600cb02200320123a00ca022003201f3b01c80220034188046a200341c8026a108c0241012126024020032d0088044101460d0041d2fec4002125410b2124410121270c490b2003200329028c043700eb02200320032d008b043a00ea02200320032f0089043b01e8022003200341a1046a2900003703800320032003419d046a2800003602fc02200320034195046a2900003702f402200320034194046a2d00003a00f3020240202241ff01714101470d0020034188046a200741067610cc012003280288042125024002402003280290042007413f7122024b0d00410021020c010b202520024105746a2202290018211320022d0017211420022d0016211520022f0014211620022d0013211720022d0012211820022f0010211920022d000f211a20022d000e211b20022f000c211c20022d000b211d2002280007211e2002280003210720022d0002212020022f00002121410121020b0240200328028c04450d00202510290b2002450d470b200320133703a003200320143a009f03200320153a009e03200320163b019c03200320173a009b03200320183a009a03200320193b0198032003201a3a0097032003201b3a0096032003201c3b0194032003201d3a0093032003201e36008f032003200736008b03200320203a008a03200320213b018803410e10272202450d0e200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d0d200220032903880337000e200241266a20034188036a41186a2903003700002002411e6a20034188036a41106a290300370000200241166a20034188036a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e803200341e8036a412041b8d6c50041004100100b2125200210292025417f470d4520034188036a200341e8026a412010d004450d44410e10272202450d0c200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d0b200220032903c80237000e200241266a200341c8026a41186a2903003700002002411e6a200341c8026a41106a290300370000200241166a200341c8026a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e803412010272225450d0a2025200329038803370000202541186a20034188036a41186a290300370000202541106a20034188036a41106a290300370000202541086a20034188036a41086a290300370000200341e8036a41202025412010032025102920021029410e10272202450d09200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d08200220032903e80237000e200241266a200341e8026a41186a2903003700002002411e6a200341e8026a41106a290300370000200241166a200341e8026a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a10052126024002402003280288042224417f470d00410021250c010b200320243602542003202636025020034188046a200341d0006a10d30320032802a8042225450d08200341f0046a41186a20034188046a41186a290300370300200341f0046a41106a20034188046a41106a290300370300200341f0046a41086a20034188046a41086a290300370300200341f8016a41086a200341b4046a290200370300200341f8016a41106a200341bc046a290200370300200341f8016a41186a200341c4046a290200370300200341f8016a41206a200341cc046a290200370300200341a0026a200341d4046a28020036020020032003290388043703f004200320032902ac043703f80102402024450d00202610290b200341e8036a4120100c0b200341c8036a41186a2224200341f0046a41186a290300370300200341c8036a41106a2226200341f0046a41106a290300370300200341c8036a41086a2227200341f0046a41086a290300370300200341b0016a41086a2228200341f8016a41086a290300370300200341b0016a41106a2207200341f8016a41106a290300370300200341b0016a41186a2208200341f8016a41186a290300370300200341b0016a41206a2209200341f8016a41206a290300370300200341b0016a41286a220a200341f8016a41286a280200360200200320032903f0043703c803200320032903f8013703b001024020250d00200210290c450b200341a8036a41186a220b2024290300370300200341a8036a41106a22242026290300370300200341a8036a41086a22262027290300370300200341e8006a41086a22272028290300370300200341e8006a41106a22282007290300370300200341e8006a41186a22072008290300370300200341e8006a41206a22082009290300370300200341e8006a41286a2209200a280200360200200320032903c8033703a803200320032903b0013703682002102920034188046a41186a200b29030037030020034188046a41106a202429030037030020034188046a41086a2026290300370300200341ac046a2003290368370200200341b4046a2027290300370200200341bc046a2028290300370200200341c4046a2007290300370200200341cc046a2008290300370200200341d4046a2009280200360200200320032903a80337038804200320253602a804410e10272202450d06200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d05200220032903880337000e200241266a20034188036a41186a2903003700002002411e6a20034188036a41106a290300370000200241166a20034188036a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e803200341203602fc012003200341e8036a3602f80120034188046a200341f8016a10c7032002102920032802ac04450d4420032802a80410290c440b4101212620022d000120022d0000720d39200141046a280200210220034188046a41086a22254200370300200342003703880441bdc6c500411620034188046a1004200341f8016a41086a202529030037030020032003290388043703f8012003200236028804200341f8016a411020034188046a410410030c380b024020022d000120022d000072450d0041ad88c3002125412821240c460b41012126200341013a00b00120034188046a41086a22024200370300200342003703880441d7c7c500411320034188046a1004200341f8016a41086a200229030037030020032003290388043703f801200341f8016a4110200341b0016a410110030c370b4101212620022d000120022d0000720d37200141046a280200210220034188046a41086a22254200370300200342003703880441f0c6c500411920034188046a1004200341f8016a41086a202529030037030020032003290388043703f8012003200236028804200341f8016a411020034188046a410410030c360b200141086a2802002108200141046a2802002109024020022d000120022d000072450d0041ad88c30021254128212441002127410121262008450d45200910290c450b2001410c6a280200210220034188046a41086a22254200370300200342003703880441d180c500411520034188046a1004200341f8016a41086a202529030037030020032003290388043703f80120034100360290042003420137038804200320023602b001200341b0016a20034188046a10300240024020020d002003280290042124200328028c04212620032802880421270c010b200241057421282003280288042127200328028c042126200328029004212520092102034002400240202620256b4120490d00202541206a21240c010b202541206a22242025490d3e20264101742207202420242007491b22074100480d3e0240024020260d002007102721270c010b202720262007102821270b02402027450d00200721260c010b20074101102a000b202720256a22252002290000370000202541186a200241186a290000370000202541106a200241106a290000370000202541086a200241086a29000037000020242125200241206a2102202841606a22280d000b2003202636028c04200320243602900420032027360288040b200341f8016a411020272024100302402026450d00202710290b410121262008450d34200910290c340b200341f8016a41186a200341b4046a220241186a290000370300200341f8016a41106a200241106a290000370300200341f8016a41086a200241086a290000370300200342f3e885db96cddbb3203703c803200320022900003703f801200341386a41888dc300410d10940120032003290340420020032802381b3703e803200341e8006a200341f8016a109301200328026c21252003280268210220032802702124200341fc006a200341c8036a36020020032002202441286c6a360274200320023602702003202536026c200320023602682003200341e8036a360278200341f0046a200341e8006a104a200341e8006a41086a200341f0046a41086a280200360200200320032903f004370368200341f8016a200341e8006a10a701200341f8016a108b010c390b412e4101102a000b410e4101102a000b418f89c3004133104e000b412e4101102a000b410e4101102a000b41204101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b41014101102a000b412d4101102a000b410d4101102a000b20274101102a000b20274101102a000b20274101102a000b20244101102a000b20264101102a000b20244101102a000b41204101102a000b20084101102a000b20084101102a000b20074101102a000b20274101102a000b20284101102a000b20274101102a000b419bffc400419f01104e000b418f89c3004133104e000b41324101102a000b41204101102a000b418f89c3004133104e000b418f89c3004133104e000b41324101102a000b41124101102a000b20094108102a000b41184108102a000b20084108102a000b41344101102a000b41144101102a000b41344101102a000b41144101102a000b41014101102a000b412d4101102a000b410d4101102a000b41204101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b41002127410021250c0f0b41002125410121270c0e0b41ad88c300212541282124410121270c0d0b0240024002400240200941246c22240d0020282102410021260c010b200341c8026a41026a2225202841036a2d00003a0000200341e8036a41086a2227202841146a290000370300200341e8036a410d6a2207202841196a290000370000200320282f00013b01c8022003202829000c3703e803202841246a2102024020282d0000220c4102470d00410021260c010b2028280008210d2028280004212620034188036a41026a20252d00003a0000200341e8006a41086a2027290300370300200341e8006a410d6a2007290000370000200320032f01c8023b018803200320032903e8033703680240200c4101460d00200341e8026a41026a20034188036a41026a2d00003a0000200341f0046a41086a200341e8006a41086a290300370300200341f0046a410d6a200341e8006a410d6a290000370000200320032f0188033b01e802200320032903683703f0040c020b200341c8036a202641067610cc0120032802c80321270240024020032802d0032026413f7122254b0d00410021250c010b200341e8026a41026a202720254105746a222541026a2d00003a0000200341f8046a202541136a290000370300200341fd046a202541186a290000370000200320252f00003b01e8022003202529000b3703f0042025280007210d20252800032126410121250b024020032802cc03450d00202710290b20250d014184efc20021260b410121254100210c410021240c010b20034188046a410d6a2225200341f0046a410d6a29000037000020034188046a41086a2227200341f0046a41086a290300370300200341d0006a41026a2207200341e8026a41026a2d00003a0000200341b0016a41086a220c2027290300370300200341b0016a410d6a22272025290000370000200320032f01e8023b0150200320032903f0043703b00102400240412010272225450d00202520032f01503b00002025200d36000720252026360003202520032903b00137000b202541026a20072d00003a0000202541136a200c290300370000202541186a2027290000370000024002400240202820246a221e2002470d00201e21020c010b200341c8026a41026a2226202841276a2d00003a0000200341e8036a41086a2227202841386a290000370300200341e8036a410d6a22072028413d6a290000370000200320282f00253b01c802200320282900303703e803202841c8006a210220282d0024220c4102470d010b200341023a0088044101210c41002126410121240c030b202828002c21152028280028212420034188036a41026a20262d00003a0000200341e8006a41086a2027290300370300200341e8006a410d6a2007290000370000200320032f01c8023b018803200320032903e8033703680240200c4101460d00200341e8026a41026a20034188036a41026a2d00003a0000200341f0046a41086a200341e8006a41086a290300370300200341f0046a410d6a200341e8006a410d6a290000370000200320032f0188033b01e802200320032903683703f0040c020b200341c8036a202441067610cc0120032802c80321260240024020032802d0032024413f7122244b0d0041002127200d21150c010b200341e8026a41026a202620244105746a222441026a2d00003a0000200341f8046a202441136a290000370300200341fd046a202441186a290000370000200320242f00003b01e8022003202429000b3703f0042024280007211520242800032124410121270b024020032802cc03450d00202610290b20270d0120034190046a41153602004184efc200212620034184efc20036028c044101210c200341013a008804410121240c020b41204101102a000b20034194046a221020032903f00437020020034188046a41086a2015360200200341a1046a2202200341f0046a410d6a22192900003700002003419c046a200341f0046a41086a2207290300370200200341b0016a41086a221120034191046a290000370300200341b0016a41186a22122002290000370300200341b0016a41106a221f20034199046a2900003703002003202436028c04200320032f01e8023b0089042003200341e8026a41026a221a2d00003a008b0420032003290089043703b001200941246c41b87f6a211d20034188046a41017221264102210f4120210e4102210c41002127410121240340200341f0046a41186a220d2012290300370300200341f0046a41106a2214201f29030037030020072011290300370300200320032903b0013703f0040240200c417f6a2024470d00200f200c200c200f491b222441ffffff3f712024470d06202441057422024100480d062025200e2002102822250d0020024101102a000b2025200e6a220220032903f004370000200241186a200d290300370000200241106a2014290300370000200241086a20072903003700000240024002400240202741f803460d00201d2027470d01201e21020c020b202820276a41c8006a21020c010b200341c8026a41026a2214202820276a220241cb006a2d00003a0000200341e8036a41086a2216200241dc006a290000370300200341e8036a410d6a2217200241e1006a2900003700002003200241c9006a2f00003b01c8022003200241d4006a2900003703e803200241c8006a2d000022184102470d01200241ec006a21020b200341023a008804410021260c020b200241d0006a280000211b200241cc006a280000210d20034188036a41026a221c20142d00003a0000200341e8006a41086a22142016290300370300200341e8006a410d6a22162017290000370000200320032f01c8023b018803200320032903e8033703680240024020184101460d00201a201c2d00003a00002007201429030037030020192016290000370000200320032f0188033b01e802200320032903683703f004201b21150c010b200341c8036a200d41067610cc01200d413f7121144100211620032802c8032117024020032802d00320144d0d00201a201720144105746a220d41026a2d00003a00002007200d41136a2900003703002019200d41186a2900003700002003200d2f00003b01e8022003200d29000b3703f004200d2800072115200d280003210d410121160b024020032802cc03450d00201710290b20160d0020034115360290044184efc200212620034184efc20036028c04200341013a008804200241ec006a21020c020b202620032f01e8023b0000201020032903f004370000202641026a201a2d00003a0000201041086a20072903003700002010410d6a201929000037000020032015360290042003200d36028c04200341003a0088042011202641086a290000370300201f202641106a2900003703002012202641186a290000370300200320262900003703b001200f41026a210f200e41206a210e200c41016a210c202741246a21270c000b0b0240024020260d004100210d0c010b4101210d02402024450d00202510290b20262125411521240b200341f8016a412c6a21072028200941246c6a21270240034020272002460d0120022d00002126200241246a210220264102470d000b0b02402008450d00202810290b0240200d450d00410021020c010b200710c9032003200c36025820032024360254200320253602500240024002400240024002400240024002400240024002400240411210272202450d00200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a24437000020024112413210282209450d01200920072900003700122009412a6a200741186a290000370000200941226a200741106a2900003700002009411a6a200741086a290000370000200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00420094132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a10052102024002402003280288042226417f460d002002450d00200320263602ec04200320023602e804200341e8026a200341e8046a102d0240024020032802e802220e450d0020032802ec02212720034188046a200341e8046a10940320032d00880422254102470d012027450d00200e10290b418f89c3004133104e000b200341b0016a41186a2228200341a1046a290000370300200341b0016a41106a220720034199046a290000370300200341b0016a41086a220820034191046a290000370300200341e8006a41086a220a200341b2046a290100370300200341e8006a41106a220b200341ba046a290100370300200341e8006a41186a220c200341c2046a29010037030020032003290089043703b0012003200341aa046a290100370368200341a9046a2d00002124200341f0046a41086a220d2008290300370300200341f0046a41106a22082007290300370300200341f0046a41186a22072028290300370300200341c8036a41086a2228200a290300370300200341c8036a41106a220a200b290300370300200341c8036a41186a220b200c290300370300200320032903b0013703f004200320032903683703c80302402026450d00200210290b200341c8026a41086a200d290300370300200341c8026a41106a2008290300370300200341c8026a41186a200729030037030020034188036a41086a202829030037030020034188036a41106a200a29030037030020034188036a41186a200b290300370300200320032903f0043703c802200320032903c803370388032027450d01200e10290c010b200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00441c6a3c400411a200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521020240024002402003280288042225417f460d002002450d00200341f0046a2025412020254120491b22246a41004100412020246b2024411f4b1b10cd041a200341f0046a2002202410ce041a2025411f4d0d06200341b0016a41186a2225200341f0046a41186a290300370300200341b0016a41106a2224200341f0046a41106a290300370300200341b0016a41086a2226200341f0046a41086a290300370300200320032903f0043703b00120021029200341c8036a41186a20252903002206370300200341c8036a41106a20242903002213370300200341c8036a41086a20262903002204370300200320032903b00122053703c803200341e8006a41186a2006370300200341e8006a41106a2013370300200341e8006a41086a2004370300200320053703684112102722020d0141124101102a000b200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00441c6a3c400411a200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e803412010272202450d0620022007290000370000200241186a200741186a290000370000200241106a200741106a290000370000200241086a200741086a290000370000200341e8036a412020024120100320021029410021240c010b200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a2443700002002411241321028220a450d06200a2003290368370012200a412a6a200341e8006a41186a290300370000200a41226a200341e8006a41106a290300370000200a411a6a200341e8006a41086a290300370000200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f004200a4132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521022003280288042224417f460d072002450d07200320243602ec02200320023602e802200341f0046a200341e8026a102d0240024020032802f004220b450d00200341f8046a280200212520032802f404210c200341b0016a200341e8026a10940320032d00b00122264102470d01200c450d00200b10290b418f89c3004133104e000b20034188046a200341b0016a410172222741c10010ce041a200341b0016a20034188046a41c30010ce041a02402024450d00200210290b20034188046a200341b0016a41c30010ce041a200320263a00b001202720034188046a41c10010ce041a20032d00d101210d200341f0046a41186a22024200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f004200a4132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e80320034201370388042003410036029004200320253602f004200341f0046a20034188046a1030024002402025450d0020254105742128410020032802900422256b2126200328028c042127200b2102034002400240202720266a4120490d0020032802880421240c010b202541206a22242025490d1620274101742208202420242008491b22084100480d160240024020270d002008102721240c010b20032802880420272008102821240b2024450d0c2003200836028c042003202436028804200821270b202420256a222441086a200241086a290000370000202441106a200241106a290000370000202441186a200241186a2900003700002003202541206a22253602900420242002290000370000202641606a2126200241206a2102202841606a22280d000c020b0b20032802900421250b200341013a00f00402400240200328028c042025460d0020032802880421020c010b202541016a22022025490d1320254101742224200220022024491b22244100480d130240024020250d002024102721020c010b20032802880420252024102821020b2002450d0a2003202436028c0420032002360288040b2003202541016a36029004200220256a41013a000002400240200328028c04222620032802900422246b411f4d0d00202621250c010b202441206a22252024490d1320264101742227202520252027491b22254100480d130240024020260d002025102721020c010b200220262025102821020b2002450d0b2003202536028c0420032002360288040b200220246a222641086a200741086a290000370000202641106a200741106a290000370000202641186a200741186a2900003700002003202441206a2228360290042026200729000037000002400240200341d2016a4100200d4101461b22260d00200341003a00f0040240024020252028460d00202521080c010b202541016a22262025490d1520254101742227202620262027491b22084100480d150240024020250d002008102721020c010b200220252008102821020b2002450d0e2003200836028c0420032002360288040b2003202441216a222436029004200220286a41003a00000c010b200341013a00f0040240024020252028460d00202521270c010b202541016a22272025490d1420254101742208202720272008491b22274100480d140240024020250d002027102721020c010b200220252027102821020b2002450d0e2003202736028c0420032002360288040b2003202441216a222536029004200220286a41013a000002400240202720256b411f4d0d00202721080c010b202541206a22282025490d1420274101742208202820282008491b22084100480d140240024020270d002008102721020c010b200220272008102821020b2002450d0f2003200836028c0420032002360288040b200220256a222541086a202641086a290000370000202541106a202641106a290000370000202541186a202641186a2900003700002003202441c1006a222436029004202520262900003700000b200341e8036a412020022024100302402008450d00200210290b0240200c450d00200b10290b200a1029200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00441c6a3c400411a200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e803412010272202450d0e20022007290000370000200241186a200741186a290000370000200241106a200741106a290000370000200241086a200741086a290000370000200341e8036a41202002412010032002102920034188036a41086a200341e8006a41086a29030037030020034188036a41106a200341e8006a41106a29030037030020034188036a41186a200341e8006a41186a2903003703002003200329036837038803410121240b410021250b20034195046a200341c8026a41086a2903003700002003419d046a200341c8026a41106a290300370000200341a5046a200341c8026a41186a290300370000200341ad046a20243a0000200341ae046a200329038803370100200341b6046a20034188036a41086a290300370100200341be046a20034188036a41106a290300370100200341c6046a20034188036a41186a290300370100200320253a008c04200320032903c80237008d042003200341d0006a36028804200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00420094132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e803200341003602b801200342013703b00120032802502102200320032802582225360268200341e8006a200341b0016a1030024002402025450d0020254105742107410020032802b80122256b212620032802b001212820032802b401212703400240202720266a411f4b0d00202541206a22242025490d1420274101742208202420242008491b22244100480d140240024020270d002024102721280c010b202820272024102821280b2028450d03202421270b202820256a22242002290000370000202441186a200241186a290000370000202441106a200241106a290000370000202441086a200241086a290000370000202641606a2126202541206a2125200241206a2102200741606a22070d000b200320273602b401200320253602b801200320283602b0010b20034188046a410472200341b0016a10c60320032802b4012102200341e8036a412020032802b001222520032802b801100302402002450d00202510290b2009102902402003280254450d00200328025010290b0240200328029c02450d0020032802980210290b4100212641012127410021250c1a0b20244101102a000b41124101102a000b41324101102a000b418f89c3004133104e000b41204101102a000b41324101102a000b419bffc400419f01104e000b20084101102a000b20244101102a000b20254101102a000b20084101102a000b20274101102a000b20084101102a000b41204101102a000b0240200b450d00200a10290b20020d0041012127410021260c0b0b41012127410021262008450d0a202810290c0a0b024020032802ac04450d0020032802a80410290b410021250c080b102b000b20032013202c202c201356200420065620042006511b22021b221320297c220537038802200341f8016a41186a2006200420021b2206202a7c2005201354ad7c37030020032013202b7c22043703f80120032006202d7c2004201354ad7c37038002200341e8006a200341f8016a10d803200328029c0221250b2025450d0220032802980210290c020b41c2fec4002125411021240c040b41d588c3002125412a21240c030b4100212541012126410121270c030b41e4fdc4002125411921240c010b4184efc2002125411521240b41012126410121270b0240024020012d00002202410d4b0d00410120027441be3f710d01024020024106460d002002410d470d012027450d02200141086a280200450d02200141046a28020010290c020b2026450d01200141086a280200450d01200141046a28020010290c010b200141086a280200450d00200141046a28020010290b200020243602042000202536020020034190056a24000bb0c90107017f027e017f017e157f017e027f230041a0086b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e12000102030405060708090b0c0d0e0f101112000b200341b4036a4101360200200342013702a403200341ccfdc4003602a00320034102360264200341c4fdc4003602602003200341e0006a3602b003200341a0036a41a09ac4001057000b200141106a2903002104200141086a2903002105200141046a28020021062002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f01002113024002400240024020022d0000450d002003200737028402200320083a008302200320093a0082022003200a3b018002410121020c010b2002410c6a2d000021142002410a6a2f01002115200241096a2d00002116200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703800241012102201a41ff01714101460d010b412a21164100211441d588c300211a410021150c010b2018410874201972201741187472211a410021020b201541ffff0371410874201441187472201641ff017172211420020d5920032007370378200320083a0077200320093a00762003200a3b01742003200b3a00732003200c3a00722003200d3b01702003200e3a006f2003200f3a006e200320103b016c200320113a006b200320143600672003201a360063200320123a0062200320133b01600240200542808084fea6dee1115441002004501b450d0041b09ac400211a410d21140c5a0b200341106a200341e0006a2005200410ac0102402003280210450d0041bd9ac400211a411a21140c5a0b200341086a41b086c500411910b501200328020c210220032802082114200341b8076a41086a221a4200370300200342003703b80741b086c5004119200341b8076a1004200341f0066a41086a2215201a290300370300200320032903b8073703f00620032002410020141b221641016a3602a003200341f0066a4110200341a0036a41041003412010272202450d1120022003290360370000200341b4036a428180808010370200200241186a200341e0006a41186a290300370000200241106a200341e0006a41106a290300370000200241086a200341e0006a41086a290300370000200320053703a003200320023602b003200320043703a8032016200341a0036a10c203201a4200370300200342003703b80741b7d2c3004115200341b8076a10042015201a290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a0240024020032802a0032208417f460d00201a450d0020032008360284022003201a36028002200341a0036a20034180026a103f20032802a0032214450d14200341a8036a280200210220032802a40321152008450d01201a10290c010b4108211441002102410021150b200341a0036a200610c103200341c0006a41186a2208200341e0006a41186a290300370300200341c0006a41106a2209200341e0006a41106a290300370300200341c0006a41086a220a200341e0006a41086a29030037030020032003290360370340024020152002470d00200241016a221a2002490d4920024101742215201a201a2015491b2215ad42b0017e2207422088a70d492007a7221a4100480d490240024020020d00201a102721140c010b2014200241b0016c201a102821140b2014450d140b2014200241b0016c220b6a200341a0036a41880110ce04221a201636028801201a200329034037028c01201a4194016a200a290300370200201a419c016a2009290300370200201a41a4016a2008290300370200200320153602a403200320143602a0032003200241016a221a3602a803200341b8076a41086a22084200370300200342003703b80741b7d2c3004115200341b8076a1004200341f0066a41086a2008290300370300200320032903b8073703f00620034110360284022003200341f0066a36028002200341a0036a20034180026a10330240201a2002490d00200b41b0016a211a2014210203402002103d200241b0016a2102201a41d07e6a221a0d000b0b02402015450d00201410290b200341b8036a2004370300200341b0036a2005370300200341ac036a201636020041002116200341a8036a41003a0000200341053a00a00341b8d6c5004100200341a0036a1088012006103d200610294101211541012106410121084100211a0c5a0b200141046a280200210a2002411a6a2901002107200241196a2d00002116200241186a2d00002108200241166a2f01002109200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f01002113024002400240024020022d0000450d002003200737028402200320163a008302200320083a008202200320093b018002410121020c010b2002410c6a2d000021142002410a6a2f01002106200241096a2d00002115200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703800241012102201a41ff01714101460d010b412a21154100211441d588c300211a410021060c010b2018410874201972201741187472211a410021020b200641ffff0371410874201441187472201541ff017172211420020d5520032007370378200320163a0077200320083a0076200320093b01742003200b3a00732003200c3a00722003200d3b01702003200e3a006f2003200f3a006e200320103b016c200320113a006b200320143600672003201a360063200320123a0062200320133b0160200341a0036a200a10b603024020032802b00322020d0041d79ac400211a41242114410121150c570b200341bc036a2802002116200341a0036a41186a280200211a20032802b4032106200341186a200341e0006a20032902a403220742208620033502a003842204200341ac036a350200422086200742208884220710ac0120032802180d54200341c0006a41186a200341e0006a41186a290300370300200341c0006a41106a2215200341e0006a41106a290300370300200341c0006a41086a2209200341e0006a41086a2903003703002003200329036037034002402006201a460d00200621080c520b200641016a22142006490d4720064101742208201420142008491b220841ffffff3f712008470d47200841057422144100480d470240024020060d002014102721020c010b200220064105742014102821020b20020d5120144101102a000b2002411a6a2901002107200241196a2d0000211a200241186a2d00002114200241166a2f01002106024020022d0000450d0020032007370284022003201a3a008302200320143a008202200320063b0180020c500b200241156a2d00002116200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002117200241026a2f01002118200141026a2d00002119200141046a280200211b20022d0001210220012d0001211c200320073703800241012115200241ff01714101460d060c4f0b2002411a6a2901002107200241196a2d0000211a200241186a2d00002114200241166a2f01002106024020022d0000450d0020032007370284022003201a3a008302200320143a008202200320063b0180020c4f0b200141026a2d00002118200141046a280200211920012d0001211b200241156a2d00002115200241146a2d00002116200241126a2f01002108200241116a2d00002109200241106a2d0000210a2002410e6a2f0100210b2002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241086a2d00002110200241066a2f01002111200241056a2d00002112200241046a2d00002113200241026a2f0100211720022d000121022003200737038002200241ff01714101470d4e200320073703782003201a3a0077200320143a0076200320063b0174200320153a0073200320163a0072200320083b0170200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b200320133a0062200320173b01602003200e410874200d41187472200f7236006720032011410874201272201041187472360063200341a0036a200341e0006a10c30320032d00a0034101470d4d200341ac036a2d00002102200341ad036a2900002107200341b5036a280000211a20032f00a103211420032d00a303210620032902a40321042003200341b9036a2900003703b8032003201a3602b403200320073702ac03200320023a00ab03200320043700a303200320063a00a203200320143b01a003200341a0036a2019201b41ff0171410047201810c403211a41222114410121150c540b2002410c6a2802002109200241086a280200210a200241046a2802002106200141106a2903002105200141086a2903002107200141046a2802002115200241036a2d0000211620012d0001211420022d0000211a20022f0001210820034180026a41086a2002411c6a2802003602002003200241146a290200370380020240024002400240201a4101470d00200641ff01710d01200a2009490d010c020b201a4103460d010b201a20082016411074727241ff01710d010b42002104200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a024020032802a0032202417f460d00200342003703a003200341a0036a201a2002410820024108491b10ce041a200241074d0d1220032903a0032104201a10290b200341a0036a201541880110ce041a200341e0006a2004200742c0d102200742c0d102561b7c200341a0036a2014200510b503410121060240024020032802604101470d002003280264221a0d010b20151029410021150c4c0b200341e8006a28020021140c4a0b2015103d4128211441ad88c300211a0c490b41a584c200211a410e211420022d0000417f6a220941024b0d51200141046a280200210a410121154101210641012108410121160240024020090e03005701000b200241046a2d00000d5241012115410121064101210841012116200241086a28020041036c2002410c6a280200410174490d560b200341a0036a200a10a703024020032802a8034112470d0041bf9dc400211a410d2114410121150c530b20032802a003210220034180026a200341a0036a410472419c0110ce041a20032002360260200341e0006a41047220034180026a419c0110ce041a200341003602a803200342013703a003200341e0006a41086a2214200341a0036a103220032802a403211a20032802a803210620032802a003210220034180026a41186a2215420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002200620034180026a1000200341c8056a41186a22062015290300370300200341c8056a41106a22152016290300370300200341c8056a41086a2216200829030037030020032003290380023703c8050240201a450d00200210290b200341a0036a41186a2006290300370300200341a0036a41106a2015290300370300200341a0036a41086a2016290300370300200320032903c8053703a003411710272202450d102002410f6a41002900af9b44370000200241086a41002900a89b44370000200241002900a09b4437000020024117413710282202450d11200220032903a0033700172002412f6a200341a0036a41186a2216290300370000200241276a200341a0036a41106a22082903003700002002411f6a200341a0036a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413720034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a412041b8d6c50041004100100b211a20021029201a417f460d472014103d41cc9dc400211a41252114410121150c520b200141046a280200210641a584c200211a410e211420022d0000417f6a221541024b0d450240024020150e03004701000b200241086a2802004101742002410c6a280200490d46200241046a28020041ff01710d460b200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341f0066a411041b8d6c50041004100100b417f460d4141d19bc400211a411521140c450b200141046a280200210641a584c200211a410e211420022d0000417f6a221541024b0d3f0240024020150e03004101000b200241046a2d00000d40200241086a28020041036c2002410c6a280200410174490d400b200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341f0066a411041b8d6c50041004100100b417f460d3e41d19bc400211a411521140c3f0b200141306a2903002104200141286a290300210720034190086a200141196a29000037030020034188086a200141116a290000370300200341f8076a41086a200141096a290000370300200320012900013703f8074101211541a584c200211a410e211420022d0000417e6a220641014b0d4f0240024020060e020001000b200241046a2d00000d50200241086a28020041036c2002410c6a280200410174490d500b200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005210220032802a003221a417f460d3c2002450d3c2003201a3602dc07200320023602d807200341a0036a200341d8076a103c20032802a0034112460d38200341e0006a200341a0036a41880110ce041a200341003a009f082003419f086a20032802d807221620032802dc072214410047220610ce041a20142006490d0f2003201420066b3602dc072003201620066a3602d807024002402014450d0020032d009f0822064103490d010b200341e0006a103d0c390b2003280260211420034180026a200341e0006a41047241840110ce041a20144112460d38200341c8056a20034180026a41840110ce041a0240201a450d00200210290b200341c0046a200341c8056a41840110ce041a20032014360260200341e0006a410472200341c0046a41840110ce041a20064102460d3941f29bc400211a412a21140c3a0b200320073703b8032003201a3a00b703200320143a00b603200320063b01b403200320163a00b303200320083a00b203200320093b01b0032003200a3a00af032003200b3a00ae032003200c3b01ac032003200d3a00ab03200320173a00a203200320183b01a0032003200f410874200e411874722010723600a703200320124108742013722011411874723600a303200341a0036a201b201c41ff0171410047201910c403211a412221140c4e0b200341f0076a200141196a290000370300200341d8076a41106a200141116a290000370300200341d8076a41086a200141096a290000370300200320012900013703d8074101211541a584c200211a410e211420022d00004101470d4d200241236a2d00002116200241216a2f000021082002411f6a2d000021092002411d6a2f0000210a2002410f6a2d0000210b2002410d6a2f0000210c2002410b6a2d0000210d200241096a2f0000210e200241076a2d0000210f200241056a2f00002110200241246a3502002105200241206a310000211d200241116a2900002107200241106a2d000021112002410c6a2d00002112200241086a2d00002113200241046a2d000021062003200241196a28000036028802200320073703800220064101470d4d200320032902840222043d018808200320113a008308200320044238883c008f08200320044230883c008e08200320044220883d018c08200320044218883c008b08200320044210883c008a08200320073d018408200320074218883c0087082003200c200b411074724108742012723600ff072003200e200d411074724108742013723600fb0720032010200f4110747222023b01f807200320024110763a00fa0720032007a74110763a0086082003201d421886200a200941107472ad42ffffff0783842008201641107472ad42ffffff07834220868420054238868437039008200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a100521020240024020032802a003221a417f460d002002450d002003201a3602bc07200320023602b807200341a0036a200341b8076a103c20032802a0034112460d37200341e0006a200341a0036a41880110ce041a200341003a009f082003419f086a20032802b807221620032802bc072214410047220610ce041a20142006490d102003201420066b3602bc072003201620066a3602b807024002402014450d0020032d009f084103490d010b200341e0006a103d0c380b2003280260211420034180026a200341e0006a41047241840110ce041a20144112460d37200341c8056a20034180026a41840110ce041a0240201a450d00200210290b200341c0046a200341c8056a41840110ce041a200320143602a003200341a0036a410472200341c0046a41840110ce041a2003410036026820034201370360200341a0036a200341e0006a10322003280264211a200328026821062003280260210220034180026a41186a221642003703004110211420034180026a41106a2208420037030020034180026a41086a2209420037030020034200370380022002200620034180026a1000200341e0006a41186a2016290300370300200341e0006a41106a2008290300370300200341e0006a41086a200929030037030020032003290380023703600240201a450d00200210290b200341d8076a200341e0006a412010d0042102200341a0036a103d41d39cc400211a20020d4f200341a0036a200341d8076a10c50320032802a803220b0d01410021024101210b420021070c360b4114211441bf9cc400211a0c4e0b410021020240024020032902ac032207422088a7221a41014b0d00201a0e023601360b0340201a410176221420026a22062002200b20064105746a200341f8076a412010d0044101481b2102201a20146b221a41014b0d000b0b200b20024105746a200341f8076a412010d004221a450d33201a411f7620026a21020c340b4101211520022d000120022d0000720d31200141046a28020010ab030c480b4101211520022d000120022d0000720d30200141086a2802002106200141046a2802002102200341e0006a200141106a290300220710ac03200328026021140240024002402003280268221a20024d0d00201420024190016c6a22162802004112460d01201420024190016c6a4188016a2802002006470d012016103d20164112360200200341a0036a41086a200341e0006a41086a280200360200200320032903603703a003411710272202450d102002410f6a41002900ffd143370000200241086a41002900f8d143370000200241002900f0d14337000020024117412e10282202450d112002200737001720034180026a41186a221a420037030020034180026a41106a2214420037030020034180026a41086a2206420037030020034200370380022002411f20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2014290300370300200341c0046a41086a200629030037030020032003290380023703c00420034120360284022003200341c0046a36028002200341a0036a20034180026a10312002102920032802a0032114024020032802a8032202450d0020024190016c211a201421020340024020022802004112460d002002103d0b20024190016a2102201a41f07e6a221a0d000b0b20032802a403450d4a201410290c4a0b201a450d010b201a4190016c211a201421020340024020022802004112460d002002103d0b20024190016a2102201a41f07e6a221a0d000b0b02402003280264450d00201410290b41f19dc400211a411221140c4b0b200341e0006a41186a200141196a290000370300200341e0006a41106a200141116a290000370300200341e0006a41086a200141096a29000037030020032001290001370360200241166a2f0100211a200241186a2d00002114200241196a2d000021062002411a6a2901002107024020022d0000450d002003200737028402200320063a008302200320143a0082022003201a3b0180020c450b200241026a2f01002116200241046a2d00002108200241056a2d00002109200241066a2f0100210a200241086a2d0000210b200241096a2d0000210c2002410a6a2f0100210d2002410c6a2d0000210e2002410d6a2d0000210f2002410e6a2f01002110200241106a2d00002111200241116a2d00002112200241126a2f01002113200241146a2d00002117200241156a2d0000211820022d000121022003200737038002200241ff01714101470d44410f10272202450d0e200241076a41002900909d44370000200241002900899d443700002002410f412f10282202450d0f2002200329036037000f200241276a200341e0006a41186a221c2903003700002002411f6a200341e0006a41106a221e290300370000200241176a200341e0006a41086a221f29030037000020034180026a41186a2215420037030020034180026a41106a2219420037030020034180026a41086a221b420037030020034200370380022002412f20034180026a1000200341c0046a41186a2015290300370300200341c0046a41106a2019290300370300200341c0046a41086a201b29030037030020032003290380023703c004200341c0046a412041b8d6c50041004100100b21152002102902402015417f460d0041989dc400211a410f2114410121150c4b0b200341a0036a41186a201c290300370300200341a0036a41106a201e290300370300200341a0036a41086a201f290300370300200320032903603703a003410f10272202450d10200241076a41002900909d44370000200241002900899d443700002002410f412f10282215450d11201520032903a00337000f201541276a200341a0036a41186a2903003700002015411f6a200341a0036a41106a290300370000201541176a200341a0036a41086a29030037000020034180026a41186a2202420037030020034180026a41106a2219420037030020034180026a41086a221b420037030020034200370380022015412f20034180026a1000200341c0046a41186a2002290300370300200341c0046a41106a2019290300370300200341c0046a41086a201b29030037030020032003290380023703c004412010272202450d1220022007370018200220063a0017200220143a00162002201a3b0014200220183a0013200220173a0012200220133b0010200220123a000f200220113a000e200220103b000c2002200f3a000b2002200d410874200c72200e411874723600072002200a410874200972200b41187472360003200220083a0002200220163b0000200341c0046a412020024120100320021029201510294100211a410121150c4a0b2002411a6a2901002107200241196a2d00002114200241186a2d00002106200241166a2f01002115024020022d0000450d002003200737028402200320143a008302200320063a008202200320153b0180020c440b200241156a2d00002116200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002117200241026a2f0100211820022d000121022003200737038002200241ff01714101470d43410f10272202450d124100211a200241076a41002900909d44370000200241002900899d443700002002410f412f10282202450d1320022007370027200220143a0026200220063a0025200220153b0023200220163a0022200220083a0021200220093b001f2002200a3a001e2002200b3a001d2002200c3b001b2002200d3a001a2002200f410874201072200e4118747236001620022012410874201372201141187472360012200220173a0011200220183b000f20034180026a41186a2214420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002412f20034180026a1000200341c0046a41186a2014290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a4120100c20021029410121150c460b200341f8076a41186a200141196a290000370300200341f8076a41106a200141116a290000370300200341f8076a41086a200141096a290000370300200320012900013703f8072002411a6a2901002107200241196a2d0000211a200241186a2d00002114200241166a2f01002106024020022d0000450d0020032007370284022003201a3a008302200320143a008202200320063b0180020c430b200241156a2d00002115200241146a2d00002116200241126a2f01002108200241116a2d00002109200241106a2d0000210a2002410e6a2f0100210b2002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241086a2d00002110200241066a2f01002111200241056a2d00002112200241046a2d00002113200241026a2f0100211720022d000121022003200737038002200241ff01714101470d42200320073703e0052003201a3a00df05200320143a00de05200320063b01dc05200320153a00db05200320163a00da05200320083b01d805200320093a00d7052003200a3a00d6052003200b3b01d4052003200c3a00d305200320133a00ca05200320173b01c8052003200e410874200f72200d411874723600cf05200320114108742012722010411874723600cb05200341a0036a200341f8076a10c30320032d00a0034101470d41200320032902a403370063200320032d00a3033a0062200320032f00a1033b01602003200341b9036a2900003703782003200341b5036a2800003602742003200341ad036a29000037026c2003200341ac036a2d00003a006b0240200341e0006a200341c8056a412010d004450d0041a79dc400211a410b2114410121150c490b200341a0036a41186a200341f8076a41186a290300370300200341a0036a41106a200341f8076a41106a290300370300200341a0036a41086a200341f8076a41086a290300370300200320032903f8073703a003410f10272202450d134100211a200241076a41002900909d44370000200241002900899d443700002002410f412f10282202450d14200220032903a00337000f200241276a200341a0036a41186a2903003700002002411f6a200341a0036a41106a290300370000200241176a200341a0036a41086a29030037000020034180026a41186a2214420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002412f20034180026a1000200341c0046a41186a2014290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a4120100c20021029410121150c480b200141216a2d0000210a200341206a41186a200141196a290000370300200341206a41106a200141116a290000370300200341206a41086a200141096a290000370300200320012900013703202002411a6a2901002107200241196a2d00002116200241186a2d00002108200241166a2f01002109200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f01002113024002400240024020022d0000450d002003200737028402200320163a008302200320083a008202200320093b018002410121020c010b2002410c6a2d000021142002410a6a2f01002106200241096a2d00002115200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703800241012102201a41ff01714101460d010b41d588c300211a41002106412a2115410021140c010b2018410874201972201741187472211a410021020b200641ffff0371410874201541ff017172201441187472211420020d46200320143600d7062003201a3600d306200320123a00d206200320133b01d0062003200e3a00df062003200f3a00de06200320103b01dc06200320113a00db06200320163a00e706200320083a00e606200320093b01e4062003200b3a00e3062003200c3a00e2062003200d3b01e006200320073703e806200341f0066a41186a2007370300200341f0066a41106a20032903e006370300200341f0066a41086a200341d0066a41086a290300370300200320032903d0063703f006200341c8056a41186a200341206a41186a290300370300200341c8056a41106a200341206a41106a290300370300200341c8056a41086a200341206a41086a2903003703002003200a3a00e805200320032903203703c805411510272202450d142002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d15200220032903f0063700152002412d6a200341f0066a41186a290300370000200241256a200341f0066a41106a2903003700002002411d6a200341f0066a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005211a0240024020032802a0032216417f460d00201a450d00200320163602fc072003201a3602f807200341a0036a200341f8076a10fc0220032d00c10322064102460d18200341e0006a41186a2208200341da036a290100370300200341e0006a41106a2209200341d2036a290100370300200341e0006a41086a220a200341ca036a29010037030020034180026a41086a220b200341eb036a29000037030020034180026a41106a220c200341f3036a29000037030020034180026a41186a220d200341fb036a290000370300200320032901c2033703602003200341e3036a29000037038002200341e2036a2d0000211502402016450d00201a10290b200341c0006a41086a200a290300370300200341c0006a41106a2009290300370300200341c0006a41186a2008290300370300200341f8076a41086a200b290300370300200341f8076a41106a200c290300370300200341f8076a41186a200d2903003703002003200329036037034020032003290380023703f8070c010b20034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a221542003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005211a02400240024020032802a0032206417f460d00201a450d0020034180026a2006412020064120491b22156a41004100412020156b2015411f4b1b10cd041a20034180026a201a201510ce041a2006411f4d0d1b200341a0036a41186a220620034180026a41186a290300370300200341a0036a41106a221520034180026a41106a290300370300200341a0036a41086a221620034180026a41086a29030037030020032003290380023703a003201a102920034198076a41186a2006290300220737030020034198076a41106a2015290300220437030020034198076a41086a20162903002205370300200320032903a003221d37039807200341b8076a41186a2007370300200341b8076a41106a2004370300200341b8076a41086a20053703002003201d3703b80741151027221a0d0141154101102a000b20034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a221542003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c00441201027221a450d1b201a20032903f006370000201a41186a200341f0066a41186a290300370000201a41106a200341f0066a41106a290300370000201a41086a200341f0066a41086a290300370000200341c0046a4120201a41201003201a1029410021150c010b201a410d6a41002900bbd143370000201a41086a41002900b6d143370000201a41002900aed143370000201a4115413510282215450d1b201520032903b8073700152015412d6a200341b8076a41186a290300370000201541256a200341b8076a41106a2903003700002015411d6a200341b8076a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2216420037030020034200370380022015413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201629030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005210820032802a0032209417f460d1d2008450d1d20032009360284022003200836028002200341a0036a20034180026a10fc0220032d00c103220b4102460d1c200341f8076a41186a221a200341a0036a41186a290300370300200341f8076a41106a2206200341a0036a41106a290300370300200341f8076a41086a2216200341a0036a41086a290300370300200320032903a0033703f80720032d00c003210a200341e0006a200341c2036a220c41c10010ce041a02402009450d00200810290b200341d8076a41086a22082016290300370300200341d8076a41106a22092006290300370300200341d8076a41186a220d201a290300370300200320032903f8073703d80720034180026a200341e0006a41c10010ce041a201a200d2903003703002006200929030037030020162008290300370300200320032903d8073703f8072003200b3a00a003200341a0036a41017220034180026a41c10010ce041a200341e0006a41186a201a290300370300200341e0006a41106a2006290300370300200341e0006a41086a2016290300370300200320032903f80737036020032d00c103210920034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2216420037030020034200370380022015413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201629030037030020032003290380023703c00441201027221a450d1e201a2003290360370000201a41186a200341e0006a41186a290300370000201a41106a200341e0006a41106a290300370000201a41086a200341e0006a41086a29030037000002400240200a41054b0d000240024002400240024002400240200a0e06000102030405000b200341003a009f080c050b200341013a009f080c040b200341023a009f080c030b200341033a009f080c020b200341043a009f080c010b200341053a009f080b41c0002106201a412041c0001028221a450d21201a20032d009f083a002041012108200341013a009f08412121160c010b200341013a009f0841000d3b41c000210641202116201a412041c0001028221a450d2120032d009f0821080b201a20166a20083a000002402006201641016a22086b411f4b0d0041000d3b2006410174220a200841206a220b200b200a491b220a4100480d3b201a2006200a1028221a450d2c200a21060b201a20086a220820032903f006370000200841186a200341f0066a41186a290300370000200841106a200341f0066a41106a290300370000200841086a200341f0066a41086a290300370000201641216a210802400240200c410020094101461b22160d0041002116200341003a009f080240024020062008460d00200821060c010b41000d3d20064101742216200641016a220820082016491b22164100480d3d201a200620161028221a450d2420032d009f0821160b201a20066a20163a0000200641016a21060c010b200341013a009f080240024020062008460d004101210a20062109200821060c010b41000d3c20064101742208200641016a220920092008491b22094100480d3c201a200620091028221a450d2420032d009f08210a0b201a20066a200a3a000002402009200641016a22086b411f4b0d0041000d3c2009410174220a200841206a220b200b200a491b220a4100480d3c201a2009200a1028221a0d00200a4101102a000b201a20086a22082016290000370000200841186a201641186a290000370000200841106a201641106a290000370000200841086a201641086a290000370000200641216a21060b200341c0046a4120201a20061003201a10292015102920034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a221542003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c00441201027221a450d23201a20032903f006370000201a41186a200341f0066a41186a290300370000201a41106a200341f0066a41106a290300370000201a41086a200341f0066a41086a290300370000200341c0046a4120201a41201003201a1029200341f8076a41086a200341b8076a41086a290300370300200341f8076a41106a200341b8076a41106a290300370300200341f8076a41186a200341b8076a41186a290300370300200320032903b8073703f807410121150b410021060b200341ad036a200341c0006a41086a290300370000200341b5036a200341c0006a41106a290300370000200341bd036a200341c0006a41186a290300370000200341c5036a20153a0000200341c6036a20032903f807370100200341ce036a200341f8076a41086a290300370100200341d6036a200341f8076a41106a290300370100200341de036a200341f8076a41186a290300370100200320063a00a403200320032903403700a5032003200341c8056a3602a00320034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341003602682003420137036041201027221a450d22201a20032903c805370000201a41186a200341c8056a41186a290300370000201a41106a200341c8056a41106a290300370000201a41086a200341c8056a41086a290300370000200342a080808080043702642003201a360260024020032d00e805220641054b0d00024002400240024002400240024020060e06000102030405000b200341003a009f080c050b200341013a009f080c040b200341023a009f080c030b200341033a009f080c020b200341043a009f080c010b200341053a009f080b201a412041c0001028221a450d24201a20032d009f083a00202003201a360260200342c080808090043702640b200341a0036a410472200341e0006a10c6032003280264211a200341c0046a412020032802602206200328026810030240201a450d00200610290b20021029200342e4cab5fbb6ccdcb0e3003703900720034190076a200341d0066a427f10a601200341a0036a41086a41083a0000200341a9036a20032903d006370000200341b1036a200341d0066a41086a290300370000200341b9036a200341d0066a41106a290300370000200341c1036a200341d0066a41186a290300370000200341c9036a2003290320370000200341d1036a200341206a41086a290300370000200341d9036a200341206a41106a290300370000200341e1036a200341206a41186a290300370000200341053a00a0034100211a41b8d6c5004100200341a0036a108801410121150c470b2002411a6a2901002107200241196a2d00002116200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f01002112024002400240024020022d0000450d002003200737028402200320163a008302200320083a008202200320093b018002410121020c010b2002410c6a2d000021142002410a6a2f01002106200241096a2d00002115200241086a2d00002113200241066a2f01002117200241056a2d0000211820022d0001211a200320073703800241012102201a41ff01714101460d010b41d588c300211a41002106412a2115410021140c010b2017410874201872201341187472211a410021020b200641ffff0371410874201541ff017172201441187472211420020d45200320073703b007200320163a00af07200320083a00ae07200320093b01ac072003200a3a00ab072003200b3a00aa072003200c3b01a8072003200d3a00a7072003200e3a00a6072003200f3b01a407200320103a00a3072003201436009f072003201a36009b07200320113a009a07200320123b019807411510272202450d23410d21142002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d2420022003290398073700152002412d6a20034198076a41186a290300370000200241256a20034198076a41106a2903003700002002411d6a20034198076a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a412041b8d6c50041004100100b211a200210290240201a417f470d0041b29dc400211a410121150c470b411510272202450d252002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d2620022003290398073700152002412d6a20034198076a41186a290300370000200241256a20034198076a41106a2903003700002002411d6a20034198076a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2214420037030020034180026a41086a2206420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2014290300370300200341c0046a41086a200629030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005211a20032802a0032214417f460d29201a450d29200320143602cc052003201a3602c805200341a0036a200341c8056a10fc0220032d00c10322064102460d27200341e0006a41086a200341ca036a290100370300200341e0006a41106a200341d2036a290100370300200341e0006a41186a200341da036a29010037030020034180026a41086a200341eb036a29000037030020034180026a41106a200341f3036a29000037030020034180026a41186a200341fb036a290000370300200320032901c2033703602003200341e3036a29000037038002200341e2036a2d0000211520032c00c003211602402014450d00201a10290b200341c0046a4120100c0c2a0b41204101102a000b418f89c3004133104e000b201a4108102a000b418f89c3004133104e000b41174101102a000b41374101102a000b20062014103e000b20062014103e000b41174101102a000b412e4101102a000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41204101102a000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41154101102a000b41354101102a000b418f89c3004133104e000b418f89c3004133104e000b41204101102a000b41354101102a000b418f89c3004133104e000b419bffc400419f01104e000b41204101102a000b41c0004101102a000b41c0004101102a000b20164101102a000b20094101102a000b41204101102a000b41204101102a000b41c0004101102a000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b418f89c3004133104e000b200a4101102a000b41022106410021160b200341d8076a41186a2208200341e0006a41186a290300370300200341d8076a41106a2209200341e0006a41106a290300370300200341d8076a41086a220a200341e0006a41086a290300370300200341b8076a41086a221a20034180026a41086a290300370300200341b8076a41106a220b20034180026a41106a290300370300200341b8076a41186a220c20034180026a41186a290300370300200320032903603703d80720032003290380023703b8072002102941002114024020064102460d00200341c8056a41086a200a290300370300200341c8056a41106a2009290300370300200341c8056a41186a2008290300370300200341f8076a41086a201a290300370300200341f8076a41106a200b290300370300200341f8076a41186a200c290300370300200320032903d8073703c805200320032903b8073703f8074100210202400240024002400240024002400240024002400240201541ff01714101470d00411510272202450d012002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d02200220032903f8073700152002412d6a20034190086a290300370000200241256a20034188086a2903003700002002411d6a200341f8076a41086a2903003700000b0240024020064101470d00411510272214450d042014410d6a41002900bbd143370000201441086a41002900b6d143370000201441002900aed14337000020144115413510282214450d05201420032903c8053700152014412d6a200341c8056a41186a290300370000201441256a200341c8056a41106a2903003700002014411d6a200341c8056a41086a29030037000020034180026a41186a2208420037030020034180026a41106a2209420037030020034180026a41086a220a420037030020034200370380022014413520034180026a1000200341c0046a41186a2008290300370300200341c0046a41106a2009290300370300200341c0046a41086a200a29030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005210b024020032802a003220c417f460d00200b0d020b41e0a3c40041d300104e000b20034180026a41186a2214420037030020034180026a41106a2208420037030020034180026a41086a220942003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a2014290300370300200341c0046a41106a2008290300370300200341c0046a41086a200929030037030020032003290380023703c0040240201541ff01714101460d00200341c0046a4120100c0c0a0b412010272214450d05201420032903f807370000201441186a200341f8076a41186a290300370000201441106a200341f8076a41106a290300370000201441086a200341f8076a41086a290300370000200341c0046a4120201441201003201410290c090b2003200c3602f4062003200b3602f006200341a0036a200341f0066a10fc0220032d00c103220d4102460d0520034180026a41206a220e200341a0036a41206a220f2d00003a000020034180026a41186a2208200341a0036a41186a221029030037030020034180026a41106a2209200341a0036a41106a221129030037030020034180026a41086a220a200341a0036a41086a2212290300370300200320032903a00337038002200341e0006a200341c2036a221341c10010ce041a0240200c450d00200b10290b201320032900603701002012200a2903003703002011200929030037030020102008290300370300200f200e2d00003a0000200341ca036a200341e0006a41086a290000370100200341d2036a200341e0006a41106a290000370100200341da036a200341e0006a41186a29000037010020032003290380023703a0032003200d3a00c103200341e2036a20153a0000200341e3036a20032903f807370000200341eb036a200341f8076a41086a290300370000200341f3036a200341f8076a41106a290300370000200341fb036a200341f8076a41186a2903003700002008420037030020094200370300200a420037030020034200370380022014413520034180026a1000200341c0046a41186a2008290300370300200341c0046a41106a2009290300370300200341c0046a41086a200a29030037030020032003290380023703c0042003410036026820034201370360412010272215450d06201520032903a003370000201541086a200341a0036a41086a290300370000201541106a200341a0036a41106a290300370000201541186a200341a0036a41186a290300370000200342a0808080800437026420032015360260024020032d00c003220841054b0d00024002400240024002400240024020080e06000102030405000b410021080c050b410121080c040b410221080c030b410321080c020b410421080c010b410521080b200320083a0080022015412041c00010282215450d08201520083a0020200342c08080809004370264200320153602600b200341c1036a200341e0006a10c60320032802642115200341c0046a4120200328026022082003280268100302402015450d00200810290b201410294101210b0c090b41154101102a000b41354101102a000b41154101102a000b41354101102a000b41204101102a000b418f89c3004133104e000b41204101102a000b41c0004101102a000b410021144100210b0b0240024002400240024002400240024020020d00410021060c010b20034180026a41186a2215420037030020034180026a41106a2208420037030020034180026a41086a2209420037030020034200370380022002413520034180026a1000200341c0046a41186a2015290300370300200341c0046a41106a2008290300370300200341c0046a41086a200929030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005210a20032802a003220c417f460d02200a450d022003200c3602f4062003200a3602f006200341a0036a200341f0066a10fc0220032d00c1034102460d0120034180026a41206a220d200341a0036a41206a220e2d00003a000020034180026a41186a2215200341a0036a41186a220f29030037030020034180026a41106a2208200341a0036a41106a221029030037030020034180026a41086a2209200341a0036a41086a2211290300370300200320032903a00337038002200341e0006a200341c2036a221241c10010ce041a0240200c450d00200a10290b2011200929030037030020102008290300370300200f2015290300370300200e200d2d00003a000020032003290380023703a0032012200341e0006a41c10010ce0420032903c805370100200341ca036a200341c8056a41086a290300370100200341d2036a200341c8056a41106a290300370100200341da036a200341c8056a41186a290300370100200320063a00c10320154200370300200842003703002009420037030020034200370380022002413520034180026a1000200341c0046a41186a2015290300370300200341c0046a41106a2008290300370300200341c0046a41086a200929030037030020032003290380023703c0042003410036026820034201370360412010272206450d03200620032903a003370000200641086a200341a0036a41086a290300370000200641106a200341a0036a41106a290300370000200641186a200341a0036a41186a290300370000200342a0808080800437026420032006360260024020032d00c003221541054b0d00024002400240024002400240024020150e06000102030405000b410021150c050b410121150c040b410221150c030b410321150c020b410421150c010b410521150b200320153a0080022006412041c00010282206450d05200620153a0020200342c08080809004370264200320063602600b200341c1036a200341e0006a10c60320032802642106200341c0046a4120200328026022152003280268100302402006450d00201510290b20021029410121060b200b20144572450d040c050b418f89c3004133104e000b41e0a3c40041d300104e000b41204101102a000b41c0004101102a000b201410290b02402002452006720d00200210290b201621140b42002107201a4200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a201a290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a0240024020032802a0032202417f460d00200342003703a003200341a0036a201a2002410820024108491b10ce041a200241074d0d0120032903a0032107201a10290b200342e4cab5fbb6ccdcb0e300370360200341e0006a20034198076a427f427f2014410274419886c5006a3502004280af1a7e20077c410210a801200341a0036a41086a41093a0000200341a0036a41096a200329039807370000200341b1036a20034198076a41086a290300370000200341b9036a200341a8076a290300370000200341c1036a200341b0076a290300370000200341053a00a0034100211a41b8d6c5004100200341a0036a108801410121150c1c0b418f89c3004133104e000b41ad88c300211a412821140c1a0b41e39cc400211a412621142007a7450d19200b10290c190b200341a0036a41186a200341f8076a41186a290300370300200341a0036a41106a200341f8076a41106a290300370300200341a0036a41086a200341f8076a41086a290300370300200320032903f8073703a00302400240024002400240024020022007422088a722144b0d00024020142007a7470d00201441016a221a2014490d1020144101742206201a201a2006491b221a41ffffff3f71201a470d10201a41057422064100480d100240024020140d0020061027210b0c010b200b201441057420061028210b0b200b450d02201aad21070b200b20024105746a221a41206a201a201420026b41057410cf041a201a41186a200341a0036a41186a290300370000201a41106a200341a0036a41106a290300370000201a41086a200341a0036a41086a290300370000201a20032903a003370000200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a100521020240024020032802a003221a417f460d002002450d00200342003703a003200341a0036a2002201a4108201a4108491b10ce041a201a41074d0d0420032903a00321042002102920044280af1a7c21040c010b4280af1a21040b411310272202450d032002410f6a41002800bb9c44360000200241086a41002900b49c44370000200241002900ac9c443700002002411341331028220c450d04200c20032903d807370013200c412b6a200341d8076a41186a290300370000200c41236a200341d8076a41106a290300370000200c411b6a200341d8076a41086a29030037000020034180026a41186a2202420037030020034180026a41106a221a420037030020034180026a41086a220642003703002003420037038002200c413320034180026a1000200341c0046a41186a2002290300370300200341c0046a41106a201a290300370300200341c0046a41086a200629030037030020032003290380023703c004200341003602a803200342013703a003410810272202450d05200220043700002003428880808080013702a403200320023602a0032003201441016a2202360260200341e0006a200341a0036a103002400240024020020d0020032802a803211a20032802a403211620032802a00321080c010b410020032802a803221a6b2106201441057441206a210920032802a003210820032802a4032116200b210203400240201620066a411f4b0d00201a41206a2214201a490d132016410174220a20142014200a491b22144100480d130240024020160d002014102721080c010b200820162014102821080b2008450d03201421160b2008201a6a22142002290000370000201441186a200241186a290000370000201441106a200241106a290000370000201441086a200241086a290000370000200641606a2106201a41206a211a200241206a2102200941606a22090d000b200320163602a4032003201a3602a803200320083602a0030b2007a72102200341c0046a41202008201a100302402016450d00200810290b200c102902402002450d00200b10290b200341a0036a41086a410a3a0000200341a9036a20032903f807370000200341c9036a20032903d807370000200341b1036a200341f8076a41086a290300370000200341b9036a200341f8076a41106a290300370000200341c1036a200341f8076a41186a290300370000200341d1036a200341d8076a41086a290300370000200341d9036a200341d8076a41106a290300370000200341e1036a200341d8076a41186a290300370000200341053a00a003200341f0036a20043703004100211a41b8d6c5004100200341a0036a108801200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341f0066a4110100c0c1f0b20144101102a000b41d0b1c5001058000b20064101102a000b418f89c3004133104e000b41134101102a000b41334101102a000b41084101102a000b418f89c3004133104e000b418f89c3004133104e000b200341003602a803200342013703a003200341e0006a200341a0036a103220032802a403211a20032802a803211420032802a003210220034180026a41186a2206420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002201420034180026a1000200341a0036a41186a2006290300370300200341a0036a41106a2016290300370300200341a0036a41086a200829030037030020032003290380023703a0030240201a450d00200210290b0240200341f8076a200341a0036a412010d004450d0041e69bc400211a410c21140c010b42002105200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a221a2002290300370300200320032903b8073703f006200341f0066a4110100c20024200370300200342003703b80741888dc300410d200341b8076a1004201a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a024020032802a0032202417f460d00200342003703a003200341a0036a201a2002410820024108491b10ce041a200241074d0d0220032903a0032105201a10290b200341a0036a200341e0006a41880110ce041a20034180026a2005200742c0d102200742c0d102561b7c200341a0036a4102200410b50302402003280280024101470d00200328028402221a450d0020034188026a28020021140c160b4100211a0c150b200341e0006a103d0c140b418f89c3004133104e000b419c9cc400211a411021140c120b200341003602a803200342013703a0032006200341a0036a103220032802a403211a20032802a803211420032802a003210220034180026a41186a2215420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002201420034180026a1000200341e0006a41186a22142015290300370300200341e0006a41106a2016290300370300200341e0006a41086a200829030037030020032003290380023703600240201a450d00200210290b200341a0036a41186a2014290300370300200341a0036a41106a200341e0006a41106a290300370300200341a0036a41086a200341e0006a41086a290300370300200320032903603703a00320034180026a200341a0036a10c503024002400240200328028802221a450d00200329038002210442002107200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a10052102024020032802a0032214417f460d002002450d00200342003703a003200341a0036a20022014410820144108491b10ce041a201441074d0d0220032903a0032107200210290b02402003418c026a280200450d00201a10290b200720045a0d0041b79bc400211a411a21140c030b200341a0036a200641880110cf041a200341023a00a804200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f00620034100360288022003420137038002200341a0036a20034180026a1032024020032d00a804220241024b0d00024002400240024020020e03000102000b4100211a0c020b4101211a0c010b4102211a0b2003201a3a009f08024002402003280284022003280288022202460d0020032802800221140c010b200241016a221a2002490d0620024101742214201a201a2014491b221a4100480d060240024020020d00201a102721140c010b2003280280022002201a102821140b2014450d032003201a36028402200320143602800220032d009f08211a20032802880221020b2003200241016a36028802201420026a201a3a00000b2003280284022102200341f0066a4110200328028002221a200328028802100302402002450d00201a10290b200341a0036a103d200610294100210841012115410121060c0b0b418f89c3004133104e000b201a4101102a000b2006103d200610294100210841012115410121060c110b200341003602a803200342013703a0032006200341a0036a103220032802a403211a20032802a803211420032802a003210220034180026a41186a2215420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002201420034180026a1000200341e0006a41186a22142015290300370300200341e0006a41106a2016290300370300200341e0006a41086a200829030037030020032003290380023703600240201a450d00200210290b200341a0036a41186a2014290300370300200341a0036a41106a200341e0006a41106a290300370300200341a0036a41086a200341e0006a41086a290300370300200320032903603703a00320034180026a200341a0036a10c5030240200328028802221a450d00200329038002210442002107200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a10052102024020032802a0032214417f460d002002450d00200342003703a003200341a0036a20022014410820144108491b10ce041a201441074d0d0320032903a0032107200210290b02402003418c026a280200450d00201a10290b200720045a0d0041b79bc400211a411a21140c040b200341a0036a200641880110cf041a200341003a00a804200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f00620034100360288022003420137038002200341a0036a20034180026a1032024020032d00a804220241024b0d00024002400240024020020e03000102000b4100211a0c020b4101211a0c010b4102211a0b2003201a3a009f08024002402003280284022003280288022202460d0020032802800221140c010b200241016a221a2002490d0220024101742214201a201a2014491b221a4100480d020240024020020d00201a102721140c010b2003280280022002201a102821140b2014450d042003201a36028402200320143602800220032d009f08211a20032802880221020b2003200241016a36028802201420026a201a3a00000b2003280284022102200341f0066a4110200328028002221a200328028802100302402002450d00201a10290b200341a0036a103d2006102941002106410121150c060b102b000b418f89c3004133104e000b201a4101102a000b2006103d200610294100210641012115410121080c0c0b2016200341c8056a41186a2903003703002008200341c8056a41106a290300370300200341a0036a41086a200341c8056a41086a290300370300200320032903c8053703a003200341013a00f80702400240411710272202450d004100211a2002410f6a41002900af9b44370000200241086a41002900a89b44370000200241002900a09b4437000020024117413710282202450d01200220032903a0033700172002412f6a200341a0036a41186a290300370000200241276a200341a0036a41106a2903003700002002411f6a200341a0036a41086a29030037000020034180026a41186a2206420037030020034180026a41106a2215420037030020034180026a41086a2216420037030020034200370380022002413720034180026a1000200341c0046a41186a2006290300370300200341c0046a41106a2015290300370300200341c0046a41086a201629030037030020032003290380023703c00441012115200341c0046a4120200341f8076a4101100320021029200a10ab032014103d0c090b41174101102a000b41374101102a000b201510294101210641002115410121080c0a0b410121080b410121164100211a0c0a0b41959bc400211a410b2114410121150c060b41d588c300211a412a2114410121150c050b2002201a4105746a22142003290340370000201441186a200341c0006a41186a290300370000201441106a2015290300370000201441086a200929030037000041012115200341a0036a41186a201a41016a360200200341b4036a2008360200200320073703a803200320043703a003200320163602bc03200320023602b003200a200341a0036a10c2030b4100211a0b4101210641012108410121160c050b41fb9ac400211a411a21142006450d0020021029410121150c010b410121150b41012106410121080b410121160c010b2006103d20061029410021164101211541012106410121080b0240024020012d0000417f6a2202410f4b0d00024002400240024020020e1000040404010402030404040405040505000b2016450d04200141046a2202280200103d200228020010290c040b2015450d03200141046a2202280200103d200228020010290c030b2006450d02200141046a2202280200103d200228020010290c020b2008450d01200141046a2202280200103d200228020010290c010b200241074b0d00024002400240024020020e080004040401040203000b200141046a2202280200103d200228020010290c030b200141046a2202280200103d200228020010290c020b200141046a2202280200103d200228020010290c010b200141046a2202280200103d200228020010290b200020143602042000201a360200200341a0086a24000bd75d02157f037e230041d0036b2203240002400240024002400240024002400240024002400240024002400240024002400240024020012d000022040e0500010d0302000b200341b4026a4101360200200342013702a402200341ccfdc4003602a00220034102360274200341c4fdc4003602702003200341f0006a3602b002200341a0026a41bce4c2001057000b200141086a2802002105200141046a2802002106024020022d000120022d000072450d0041ad88c300210741282108410021094101210a02402005450d00200610290b4101210b0c100b2001410c6a280200210c200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a1005210202400240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a002220d450d02200341a8026a280200210a20032802a402210e2007450d01200210290c010b4101210d4100210a4100210e0b200d200a1094022006200c109402200d4100200a1b210920064100200c1b2108200d41206a200d200a1b2107200641206a2006200c1b21022006200c4105746a210f200d200a4105746a2110410021114100211241012113410021144100211541012116034002400240024002400240024002402009450d0003402008450d02024020092008460d0020092008412010d004220a0d040b410020072007201046220a1b2109410020022002200f46220b1b21082007200741206a200a1b21072002200241206a200b1b210220090d000b0b4100210920080d04201320112006200c10ba0102402012450d00201310290b02402015450d00201610290b02402005450d00200610290b4101210a200e450d16200d10290c160b200341a0026a41186a220a200941186a290000370300200341a0026a41106a220b200941106a290000370300200341a0026a41086a2217200941086a290000370300200320092900003703a002024020122011470d00201141016a22082011490d0a20114101742209200820082009491b221241ffffff3f712012470d0a201241057422084100480d0a0240024020110d002008102721130c010b201320114105742008102821130b2013450d020b201320114105746a220820032903a002370000200841186a200a290300370000200841106a200b290300370000200841086a20172903003700002007200741206a200720104622091b210a410021084100200720091b21090c040b200a417f4a0d02200341a0026a41186a220a200941186a290000370300200341a0026a41106a220b200941106a290000370300200341a0026a41086a2217200941086a290000370300200320092900003703a002024020122011470d00201141016a22092011490d0920114101742212200920092012491b221241ffffff3f712012470d09201241057422094100480d090240024020110d002009102721130c010b201320114105742009102821130b2013450d020b201320114105746a220920032903a002370000200941186a200a290300370000200941106a200b290300370000200941086a20172903003700002007200741206a200720104622091b210a4100200720091b21090c030b20084101102a000b20094101102a000b200341a0026a41186a220a200841186a290000370300200341a0026a41106a220b200841106a290000370300200341a0026a41086a2217200841086a290000370300200320082900003703a0020240024020152014470d00201441016a22082014490d0720144101742215200820082015491b221541ffffff3f712015470d07201541057422084100480d070240024020140d002008102721160c010b201620144105742008102821160b2016450d010b201620144105746a220820032903a002370000200841186a200a290300370000200841106a200b290300370000200841086a2017290300370000410020022002200f46220a1b2108201441016a21142002200241206a200a1b21020c020b20084101102a000b201141016a2111200a21070c000b0b418f89c3004133104e000b200141216a2d0000210e200141246a2802002105200341306a41186a200141196a290000370300200341306a41106a200141116a290000370300200341306a41086a200141096a290000370300200320012900013703302002411a6a2901002118200241196a2d0000210f200241186a2d00002110200241166a2f01002114200241156a2d00002111200241146a2d00002115200241126a2f01002116200241116a2d00002117200241106a2d000021122002410e6a2f010021132002410d6a2d00002106200241046a2d0000210d200241026a2f0100210c41d588c3002107412a21080240024020022d0000450d00410121094100210a4100210b0c010b410121094100210a4100210b20022d00014101470d002002410c6a2d0000210b2002410a6a2f0100210a200241096a2d00002108200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021090b200a41ffff0371410874200841ff017172200b411874722108024020090d00200320183703682003200f3a0067200320103a0066200320143b0164200320113a0063200320153a0062200320163b0160200320173a005f200320123a005e200320133b015c200320063a005b20032008360057200320073600532003200d3a00522003200c3b0150200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a10052102024002400240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022208450d02200341a8026a280200210920032802a402210a02402007450d00200210290b20082009200341d0006a10f90221020240200a450d00200810290b2002450d010c030b41014100200341d0006a10f9020d020b41d2e5c2002107411221080c020b418f89c3004133104e000b200341a0026a200341306a10f202024020032802a80222100d0041bfe5c2002107411321080c010b200341b8026a2802002111200341b4026a28020021144110210820032802ac02210b41e4e5c20021070240200520032802a0022217470d00200341bc026a280200210f20032802a40221122010200341a0026a41106a28020022154105746a2109201021024100210802400240024003400240200920026b41e0004b0d0020022009470d02410021160c040b200341d0006a2002460d0220082002200341d0006a412010d00422074100476a21082007450d02200241206a2207200341d0006a460d0220082007200341d0006a412010d00422074100476a21082007450d02200241c0006a2207200341d0006a460d0220082007200341d0006a412010d00422074100476a21082007450d02200241e0006a2207200341d0006a460d0220024180016a210220082007200341d0006a412010d00422074100476a210820070d000c020b0b201020154105746a21090340200341d0006a2002460d0120082002200341d0006a412010d00422074100476a21082007450d01410021162009200241206a2202470d000c020b0b410121160b2014200f4105746a210a201421024100210702400240024003400240200a20026b41e0004b0d002002200a470d02410021090c040b200341d0006a2002460d0220072002200341d0006a412010d00422094100476a21072009450d02200241206a2209200341d0006a460d0220072009200341d0006a412010d00422094100476a21072009450d02200241c0006a2209200341d0006a460d0220072009200341d0006a412010d00422094100476a21072009450d02200241e0006a2209200341d0006a460d0220024180016a210220072009200341d0006a412010d00422094100476a210720090d000c020b0b0340200341d0006a2002460d0120072002200341d0006a412010d00422094100476a21072009450d0141002109200a200241206a2202470d000c020b0b410121090b024002400240024002400240024002400240200e41ff01710d002009450d010c080b20160d07200341a0026a41186a2208200341d0006a41186a290300370300200341a0026a41106a220a200341d0006a41106a290300370300200341a0026a41086a2213200341d0006a41086a290300370300200320032903503703a0020240200b2015460d00200b21160c020b200b41016a2202200b490d0b200b4101742216200220022016491b221641ffffff3f712016470d0b201641057422024100480d0b02400240200b0d002002102721100c010b2010200b4105742002102821100b20100d0120024101102a000b200341a0026a41186a2209200341d0006a41186a290300370300200341a0026a41106a220a200341d0006a41106a290300370300200341a0026a41086a2213200341d0006a41086a290300370300200320032903503703a002024002402011200f460d00201121070c010b201141016a22022011490d0b20114101742207200220022007491b220741ffffff3f712007470d0b200741057422024100480d0b0240024020110d002002102721140c010b201420114105742002102821140b20140d0020024101102a000b2014200f4105746a220220032903a002370000200241186a2009290300370000200241106a200a290300370000200241086a2013290300370000200f41016a210f024002402016450d00201520084d0d0120102015417f6a22154105746a22022900002118200229000821192002290010211a201020084105746a220841186a200241186a2900003700002008201a37001020082019370008200820183700000b200b2116200721110c020b418ce6c200200820151037000b201020154105746a220220032903a002370000200241186a2008290300370000200241106a200a290300370000200241086a2013290300370000201541016a21152009450d00200f20074d0d012014200f417f6a220f4105746a22022900002118200229000821192002290010211a201420074105746a220741186a200241186a2900003700002007201a37001020072019370008200720183700000b200341c5026a2003290330370000200341ad026a200341d0006a41086a290300370000200341b5026a200341d0006a41106a290300370000200341bd026a200341d0006a41186a290300370000200341cd026a200341306a41086a290300370000200341d5026a200341306a41106a290300370000200341dd026a200341306a41186a290300370000200341013a00a402200341063a00a002200320032903503700a502200341ec026a200f360200200341e8026a2015360200200341e5026a200e3a000041b8d6c5004100200341a0026a108801200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a1005210720032802a0022208417f460d022007450d02200320083602fc01200320073602f801200341a0026a200341f8016a102d20032802a002220a450d01200341a8026a280200210220032802a402210902402008450d00200710290b2009450d03200a10290c030b418ce6c2002007200f1037000b418f89c3004133104e000b410021020b024002400240024002400240024002400240024002400240201520124f22070d0041002002200f6b2208200820024b1b2012490d00200341bc026a200f360200200341a0026a41186a2011360200200341a0026a41106a2015360200200341ac026a2016360200200320143602b402200320103602a802200320123602a402200320173602a002411a10272202450d01200241186a41002f00cfce423b0000200241106a41002900c7ce42370000200241086a41002900bfce42370000200241002900b7ce423700002002411a413a10282202450d022002200329033037001a200241326a200341306a41186a2903003700002002412a6a200341306a41106a290300370000200241226a200341306a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a22094200370300200342003703f8012002413a200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a2009290300370300200320032903f8013703a803200341203602742003200341a8036a360270200341a0026a200341f0006a10db022002102902402016450d00201010290b20110d060c070b024020070d00200341ad026a200341386a290300370000200341b5026a200341c0006a290300370000200341bd026a200341c8006a290300370000200341033a00a402200341063a00a002200320032903303700a50241b8d6c5004100200341a0026a1088010c050b200341ad026a200341306a41086a290300370000200341b5026a200341306a41106a290300370000200341bd026a200341c8006a290300370000200341023a00a402200341063a00a002200320032903303700a50241b8d6c5004100200341a0026a108801411e10272207450d02200741166a4100290096e542370000200741106a4100290090e542370000200741086a4100290088e54237000020074100290080e5423700002007411e413e10282207450d032007200329033037001e200741366a200341306a41186a220b2903003700002007412e6a200341306a41106a220f290300370000200741266a200341306a41086a2215290300370000200341f8016a41186a22094200370300200341f8016a41106a220a4200370300200341f8016a41086a22084200370300200342003703f8012007413e200341f8016a1000200341a8036a41186a2009290300370300200341a8036a41106a200a290300370300200341a8036a41086a2008290300370300200320032903f8013703a803200341a0026a200341a8036a10fa02024020032802a00222094112470d00200710290c050b200341f0006a200341a0026a410472220a41840110ce041a20071029200320093602a002200a200341f0006a41840110ce041a20034184026a200236020020082012360200200341003a00fc01200341013a00f801200341286a200341a0026a200341f8016a10ad0220032802282102200341ad026a2015290300370000200341b5026a200f290300370000200341bd026a200b290300370000200341c5026a2002453a0000200341043a00a402200341063a00a002200320032903303700a50241b8d6c5004100200341a0026a1088010c040b411a4101102a000b413a4101102a000b411e4101102a000b413e4101102a000b411a10272202450d03200241186a41002f00cfce423b0000200241106a41002900c7ce42370000200241086a41002900bfce42370000200241002900b7ce423700002002411a413a10282202450d042002200329033037001a200241326a200341306a41186a2903003700002002412a6a200341306a41106a290300370000200241226a200341306a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a22094200370300200342003703f8012002413a200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a2009290300370300200320032903f8013703a803200341a8036a4120100c20021029200341a0026a41086a22024200370300200342003703a002419acec200411d200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a100521020240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022208450d0720032902a402211802402007450d00200210290b200320183702fc01200320083602f8010c010b2003410036028002200342013703f8010b200341f8016a200341306a1036200341a0026a41086a22024200370300200342003703a002419acec200411d200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a802200342013703a00220032802f8012117200320032802800222023602a803200341a8036a200341a0026a10300240024020020d0020032802a802210720032802a402210a20032802a002210b0c010b2002410574210f410020032802a80222076b210920032802a002210b20032802a402210a2017210203400240200a20096a411f4b0d00200741206a22082007490d0d200a4101742215200820082015491b22084100480d0d02400240200a0d0020081027210b0c010b200b200a20081028210b0b200b450d052008210a0b200b20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200941606a2109200741206a2107200241206a2102200f41606a220f0d000b2003200a3602a402200320073602a8022003200b3602a0020b200341f0006a4110200b200710030240200a450d00200b10290b024020032802fc01450d00201710290b02402016450d00201010290b2011450d010b201410290b410021070c060b20084101102a000b411a4101102a000b413a4101102a000b418f89c3004133104e000b41f4e5c2002107411621080b0240200b450d00201010290b2011450d00201410290b4101210a4101210b410121090c0e0b200141086a2802002109200141046a280200210e2002411a6a2901002118200241196a2d00002110200241186a2d00002114200241166a2f01002111200241156a2d00002115200241146a2d00002116200241126a2f01002117200241116a2d00002112200241106a2d000021132002410e6a2f010021062002410d6a2d0000210d200241046a2d0000210c200241026a2f01002105412a210841d588c30021070240024020022d0000450d004101210a4100210b4100210f0c010b4101210a4100210b4100210f20022d00014101470d002002410c6a2d0000210b2002410a6a2f0100210f200241096a2d00002108200241066a2f0100410874200241056a2d000072200241086a2d00004118747221074100210a0b200f41ffff0371410874200b41187472200841ff0171722108200a0d0820032018370348200320103a0047200320143a0046200320113b0144200320153a0043200320163a0042200320173b0140200320123a003f200320133a003e200320063b013c2003200d3a003b20032008360037200320073600332003200c3a0032200320053b0130200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a10052102024002400240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022208450d02200341a8026a280200210a20032802a402210b02402007450d00200210290b2008200a200341306a10f90221020240200b450d00200810290b2002450d010c030b41014100200341306a10f9020d020b41cce4c2002107411521080c0a0b418f89c3004133104e000b200341003602a802200342013703a0022009200341a0026a103220032802a402210720032802a802210820032802a0022102200341f8016a41186a220a4200370300200341f8016a41106a220b4200370300200341f8016a41086a220f4200370300200342003703f80120022008200341f8016a1000200341d0006a41186a2208200a290300370300200341d0006a41106a220a200b290300370300200341d0006a41086a220b200f290300370300200320032903f80137035002402007450d00200210290b200341a0026a41186a2008290300370300200341a0026a41106a200a290300370300200341a0026a41086a200b290300370300200320032903503703a002024002400240024002400240024002400240411e10272202450d00200241166a4100290096e542370000200241106a4100290090e542370000200241086a4100290088e54237000020024100290080e5423700002002411e413e10282202450d01200220032903a00237001e200241366a200341a0026a41186a2903003700002002412e6a200341a0026a41106a290300370000200241266a200341a0026a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a220a4200370300200342003703f8012002413e200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a200a290300370300200320032903f8013703a803200341a8036a412041b8d6c50041004100100b2107200210292007417f470d020240200e4102490d00200341206a419ee5c200412110b5012003280224211520032802202116200341186a419ee5c200412110b50120032802182107200328021c2108200341a0026a41086a22024200370300200342003703a002419ee5c2004121200341a0026a1004200341f0006a41086a220a2002290300370300200320032903a0023703702003200841016a410120071b3602a002200341f0006a4110200341a0026a4104100320024200370300200342003703a002419acec200411d200341a0026a1004200a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a1005210220032802a0022207417f460d052002450d05200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022211450d0420032902a402211802402007450d00200210290b200341a0026a41186a200341d0006a41186a290300370300200341a0026a41106a200341d0006a41106a290300370300200341a0026a41086a200341d0006a41086a290300370300200320032903503703a002200341a0026a21072018a72018422088a72202470d080c070b200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a00237037041002102200341003602a002200341f0006a4110200341a0026a10052108024020032802a0022207417f460d00200320073602fc01200320083602f801200341a0026a200341f8016a102d20032802a002220b450d06200341a8026a280200210220032802a402210a02402007450d00200810290b200a450d00200b10290b200341a0026a200941880110ce041a200341fc006a2002360200200341f0006a41086a4101360200200341003a0074200341013a0070200341106a200341a0026a200341f0006a10ad0220032802102102200341ad026a200341d0006a41086a290300370000200341b5026a200341e0006a290300370000200341bd026a200341e8006a290300370000200341c5026a2002453a0000200341043a00a402200341063a00a002200320032903503700a502200341a0026a21020c080b411e4101102a000b413e4101102a000b41e1e4c2002107411f21080c0e0b418f89c3004133104e000b200341a0026a41186a200341d0006a41186a290300370300200341a0026a41106a200341d0006a41106a290300370300200341a0026a41086a200341d0006a41086a290300370300200320032903503703a002420021184101211141002102200341a0026a21070c010b418f89c3004133104e000b200241016a22082002490d022002410174220a20082008200a491b220841ffffff3f712008470d022008410574220a4100480d020240024020020d00200a102721110c010b20112002410574200a102821110b2011450d032018422088a721022008ad21180b20112002410574220b6a22082007290000370000200841186a200741186a290000370000200841106a200741106a290000370000200841086a200741086a290000370000200341a0026a41086a22074200370300200342003703a002419acec200411d200341a0026a1004200341f0006a41086a2007290300370300200320032903a002370370200341003602a802200342013703a0022003200241016a22073602f801200341f8016a200341a0026a103002400240200720024f0d0020032802a802210720032802a402210b20032802a002210f0c010b410020032802a80222076b210a200b41206a211020032802a002210f20032802a402210b2011210203400240200b200a6a411f4b0d00200741206a22082007490d04200b4101742214200820082014491b22084100480d0402400240200b0d0020081027210f0c010b200f200b20081028210f0b200f450d0b2008210b0b200f20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200a41606a210a200741206a2107200241206a2102201041606a22100d000b2003200b3602a402200320073602a8022003200f3602a0020b200341f0006a4110200f200710030240200b450d00200f10290b02402018a7450d00201110290b200341f0006a41186a200341d0006a41186a290300370300200341f0006a41106a200341d0006a41106a290300370300200341f0006a41086a200341d0006a41086a29030037030020032003290350370370200341a0026a200941880110ce041a411e10272202450d03200241166a4100290096e542370000200241106a4100290090e542370000200241086a4100290088e54237000020024100290080e5423700002002411e413e10282202450d042002200329037037001e200241366a200341f0006a41186a2903003700002002412e6a200341f0006a41106a290300370000200241266a200341f0006a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a220a4200370300200342003703f8012002413e200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a200a290300370300200320032903f8013703a8032003410036028002200342013703f801200341a0026a200341f8016a103220032802fc012107200341a8036a412020032802f8012208200328028002100302402007450d00200810290b20021029200341a0026a103d412010272202450d0520022003290330370000200241186a200341306a41186a290300370000200241106a200341306a41106a290300370000200241086a200341306a41086a290300370000200341f0006a41186a200341d0006a41186a290300370300200341f0006a41106a200341d0006a41106a290300370300200341f0006a41086a200341d0006a41086a29030037030020032003290350370370200341bc026a4100360200200341ac026a428180808010370200200342013702b402200320023602a8022003200e3602a40220032015410020161b22083602a002411a10272207450d06200741186a41002f00cfce423b0000200741106a41002900c7ce42370000200741086a41002900bfce42370000200741002900b7ce423700002007411a413a10282207450d072007200329037037001a200741326a200341f0006a41186a2903003700002007412a6a200341f0006a41106a290300370000200741226a200341f0006a41086a290300370000200341f8016a41186a220a4200370300200341f8016a41106a220b4200370300200341f8016a41086a220f4200370300200342003703f8012007413a200341f8016a1000200341a8036a41186a200a290300370300200341a8036a41106a200b290300370300200341a8036a41086a200f290300370300200320032903f8013703a803200341203602fc012003200341a8036a3602f801200341a0026a200341f8016a10db022007102920021029200341ad026a200341306a41086a290300370000200341b5026a200341306a41106a290300370000200341bd026a200341306a41186a290300370000200341c5026a2003290350370000200341cd026a200341d0006a41086a290300370000200341d5026a200341d0006a41106a290300370000200341dd026a200341d0006a41186a290300370000200341ec026a200e360200200341e8026a2008360200200341003a00a402200341063a00a002200320032903303700a502200341a0026a21020b4100210b41b8d6c50041002002108801200910294101210a0c0a0b102b000b200a4101102a000b411e4101102a000b413e4101102a000b41204101102a000b411a4101102a000b413a4101102a000b20084101102a000b2009103d200910294100210b4101210a410121090c040b200141046a280200210941d588c3002107412a210820022d00000d0120022d00014101470d01200241196a2d00002107200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210f200241126a2f01002110200241116a2d00002114200241106a2d000021112002410e6a2f010021152002410d6a2d000021162002410c6a2d000021172002410a6a2f01002112200241096a2d00002113200241086a2d00002106200241066a2f0100210d200241056a2d0000210c200241046a2d00002105200241026a2f0100210e20032002411a6a290100370368200320073a0067200320083a00662003200a3b01642003200b3a00632003200f3a0062200320103b0160200320143a005f200320113a005e200320153b015c200320163a005b200320053a00522003200e3b0150200320132012410874201741187472723600572003200c200d41087472200641187472360053200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a10052107024002400240024020032802a0022202417f460d00200320023602fc01200320073602f801200341a0026a200341f8016a102d20032802a0022208450d02200341a8026a280200210a20032802a402210b02402002450d00200710290b2008200a200341d0006a10f90221020240200b450d00200810290b2002450d010c030b41014100200341d0006a10f9020d020b41cce4c2002107411521080c030b418f89c3004133104e000b4100210a200341003602a802200342013703a0022009200341a0026a103220032802a402210720032802a802210820032802a0022102200341f8016a41186a220b4200370300200341f8016a41106a220f4200370300200341f8016a41086a22104200370300200342003703f80120022008200341f8016a1000200341a8036a41186a2208200b290300370300200341a8036a41106a2214200f290300370300200341a8036a41086a220f2010290300370300200320032903f8013703a80302402007450d00200210290b200341a0026a200941880110ce041a200341f0006a410d6a200341d0006a41086a290300370000200341f0006a41156a200341d0006a41106a290300370000200341f0006a411d6a200341d0006a41186a2903003700004101210b200341013a007420032003290350370075200341013a0070200341086a200341a0026a200341f0006a10ad0220032802082102200341a0026a410d6a200f290300370000200341a0026a41156a2014290300370000200341a0026a411d6a2008290300370000200341c5026a2002453a0000200341053a00a402200341063a00a002200320032903a8033700a50241b8d6c5004100200341a0026a108801200910290b41012109410021070c020b2009103d200910294101210b4100210a410121090c010b410021094101210b410021070b02402004410771417f6a220241024b0d0002400240024020020e03000102000b2009450d02200141086a280200450d02200141046a28020010290c020b200a450d01200141046a2802002202103d200210290c010b200b450d00200141086a2802002202103d200210290b2000200836020420002007360200200341d0036a24000b9a6f03197f077e017f23002203210420034180046b4160712205240002400240024002400240024002400240024002400240024002400240024002400240024020012d000022060e0500010d0302000b200541d4026a4101360200200542013702c402200541ccfdc4003602c0022005410236028401200541c4fdc40036028001200520054180016a3602d002200541c0026a41bce4c2001057000b200141086a2802002107200141046a2802002108024020022d000120022d000072450d0041ad88c3002103412821094100210a4101210b02402007450d00200810290b4101210c0c100b2001410c6a280200210d20054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a100521020240024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d200528028001220e450d0220054188016a280200210b200528028401210f2003450d01200210290c010b4101210e4100210b4100210f0b200e200b1094022008200d109402200e4100200b1b210a20084100200d1b2109200e41206a200e200b1b2103200841206a2008200d1b21022008200d4105746a2110200e200b4105746a211141002112410021134100211441012115410021164100211741012118034002400240024002400240024002400240024002400240024002400240200a450d0003402009450d020240200a2009460d00200a2009412010d004220b0d040b410020032003201146220b1b210a410020022002201046220c1b21092003200341206a200b1b21032002200241206a200c1b2102200a0d000b0b4100210a20090d0b201341ffffff3f712013470d0220134105742202417f4c0d020240024020020d00410121090c010b200210272209450d040b410021034100210202402013450d00416020156b210a2009210220152103034020022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200241206a2102200341206a2103201241606a22120d000b201520134105746a200a6a41057641016a2102201321030b20052002360248200520033602442005200936024020092002410041202002676b10e00120054180016a41086a22024200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a10052102024002402005280280012209417f460d002002450d002005200936029c02200520023602980220054180016a20054198026a102d2005280280012219450d0620054188016a2802002103200528028401211a2009450d01200210290c010b41012119410021034100211a0b024020034105742210450d00200541c0026a4114722112200541c0026a410872211b201921030340200541e0006a41186a2211200341186a290000370300200541e0006a41106a2216200341106a290000370300200541e0006a41086a2213200341086a2900003703002005200329000037036020054180016a200541e0006a10fb02200541003602c802200529039801211c200520052903d802221d37039801200529039001211e200520052903d002221f370390012005290380012120200520052903c002370380012005290388012121200520052903c802222237038801201f422088a7210c2022422088a7210a201da7210b2022a7210902402021a72202450d00200520203703c002200520213703c8022005201e3703d0022005201c3703d80220052002201ea74105746a3602a402200520023602a00220052021422088a736029c0220052002360298022005200541c0006a3602a802200541d8036a20054198026a104b201b41086a200541d8036a41086a2223280200360200201b20052903d8033702002005201e422088a72202201c422088a74105746a3602a402200520023602a0022005201ca736029c0220052002360298022005200541c0006a3602a802200541d8036a20054198026a104b201241086a2023280200360200201220052903d80337020020052903c802212120052903c002211e20052903d802212220052903d002211c02402009450d000240200a450d00200910290b200b450d00200c10290b2005201e3703800120052021370388012021422088a7210a2005201c37039001201c422088a7210c20052022370398012021a721092022a7210b0b411a102721020240024020090d002002450d09200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d0a2002200529036037001a200241326a20112903003700002002412a6a2016290300370000200241226a201329030037000020054198026a41186a2209420037030020054198026a41106a220a420037030020054198026a41086a220b420037030020054200370398022002413a20054198026a1000200541d8036a41186a2009290300370300200541d8036a41106a200a290300370300200541d8036a41086a200b29030037030020052005290398023703d803200541d8036a4120100c200210290c010b2002450d0a200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d0b2002200529036037001a200241326a20112903003700002002412a6a2016290300370000200241226a201329030037000020054198026a41186a2211420037030020054198026a41106a2216420037030020054198026a41086a2213420037030020054200370398022002413a20054198026a1000200541d8036a41186a2011290300370300200541d8036a41106a2016290300370300200541d8036a41086a201329030037030020052005290398023703d803200541203602c4022005200541d8036a3602c00220054180016a200541c0026a10db02200210290240200a450d00200910290b200b450d00200c10290b200341206a2103201041606a22100d000b0b0240201a450d00201910290b200541003602c802200542013703c0022005200d3602800120054180016a200541c0026a10300240024002400240200d0d0020052802c802210320052802c402210b20052802c002210c0c010b200d4105742110410020052802c80222036b210a20052802c002210c20052802c402210b2008210203400240200b200a6a411f4b0d00200341206a22092003490d16200b4101742211200920092011491b22094100480d1602400240200b0d0020091027210c0c010b200c200b20091028210c0b200c450d032009210b0b200c20036a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200a41606a210a200341206a2103200241206a2102201041606a22100d000b2005200b3602c402200520033602c8022005200c3602c0020b20054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c002200541c0026a4110200c200310030240200b450d00200c10290b02402005280244450d00200528024010290b02402014450d00201510290b02402017450d00201810290b02402007450d00200810290b4101210b200f0d010c1f0b20094101102a000b200e10290c1d0b200541c0026a41186a220b200a41186a290000370300200541c0026a41106a220c200a41106a290000370300200541c0026a41086a221b200a41086a2900003703002005200a2900003703c002024020142013470d00201341016a22092013490d112013410174220a20092009200a491b221441ffffff3f712014470d11201441057422094100480d110240024020130d002009102721150c010b201520134105742009102821150b2015450d090b201520134105746a220920052903c002370000200941186a200b290300370000200941106a200c290300370000200941086a201b2903003700002003200341206a2003201146220a1b210b4100210941002003200a1b210a0c0b0b200b417f4a0d09200541c0026a41186a220b200a41186a290000370300200541c0026a41106a220c200a41106a290000370300200541c0026a41086a221b200a41086a2900003703002005200a2900003703c002024020142013470d00201341016a220a2013490d1020134101742214200a200a2014491b221441ffffff3f712014470d102014410574220a4100480d100240024020130d00200a102721150c010b20152013410574200a102821150b2015450d090b201520134105746a220a20052903c002370000200a41186a200b290300370000200a41106a200c290300370000200a41086a201b2903003700002003200341206a2003201146220a1b210b41002003200a1b210a0c0a0b1039000b20024101102a000b418f89c3004133104e000b411a4101102a000b413a4101102a000b411a4101102a000b413a4101102a000b20094101102a000b200a4101102a000b200541c0026a41186a220b200941186a290000370300200541c0026a41106a220c200941106a290000370300200541c0026a41086a221b200941086a290000370300200520092900003703c0020240024020172016470d00201641016a22092016490d0720164101742217200920092017491b221741ffffff3f712017470d07201741057422094100480d070240024020160d002009102721180c010b201820164105742009102821180b2018450d010b201820164105746a220920052903c002370000200941186a200b290300370000200941106a200c290300370000200941086a201b290300370000410020022002201046220b1b2109201641016a21162002200241206a200b1b21020c020b20094101102a000b201241206a2112201341016a2113200b21030c000b0b418f89c3004133104e000b200141216a2d0000210e200141246a280200210d200541c0006a41186a200141196a290000370300200541c0006a41106a200141116a290000370300200541c0006a41086a200141096a290000370300200520012900013703402002411a6a2901002121200241196a2d00002110200241186a2d00002111200241166a2f01002116200241156a2d00002113200241146a2d00002117200241126a2f01002118200241116a2d00002112200241106a2d0000211b2002410e6a2f010021142002410d6a2d00002115200241046a2d00002123200241026a2f0100210841d588c3002103412a21090240024020022d0000450d004101210a4100210b4100210c0c010b4101210a4100210b4100210c20022d00014101470d002002410c6a2d0000210c2002410a6a2f0100210b200241096a2d00002109200241066a2f0100410874200241056a2d000072200241086a2d00004118747221034100210a0b200b41ffff0371410874200941ff017172200c4118747221090240200a0d0020052021370378200520103a0077200520113a0076200520163b0174200520133a0073200520173a0072200520183b0170200520123a006f2005201b3a006e200520143b016c200520153a006b2005200936006720052003360063200520233a0062200520083b016020054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a1005210202400240024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d2005280280012209450d0220054188016a280200210a200528028401210b02402003450d00200210290b2009200a200541e0006a10f90221020240200b450d00200910290b2002450d010c030b41014100200541e0006a10f9020d020b41d2e5c2002103411221090c020b418f89c3004133104e000b200541c0026a200541c0006a10fb02024020052802c80222110d0041bfe5c2002103411321090c010b200541d8026a2802002113200541d4026a28020021164110210920052802cc02210c41e4e5c20021030240200d20052802c0022212470d00200541dc026a280200211020052802c402211b2011200541c0026a41106a28020022174105746a210a201121024100210902400240024003400240200a20026b41e0004b0d002002200a470d02410021180c040b200541e0006a2002460d0220092002200541e0006a412010d00422034100476a21092003450d02200241206a2203200541e0006a460d0220092003200541e0006a412010d00422034100476a21092003450d02200241c0006a2203200541e0006a460d0220092003200541e0006a412010d00422034100476a21092003450d02200241e0006a2203200541e0006a460d0220024180016a210220092003200541e0006a412010d00422034100476a210920030d000c020b0b201120174105746a210a0340200541e0006a2002460d0120092002200541e0006a412010d00422034100476a21092003450d0141002118200a200241206a2202470d000c020b0b410121180b201620104105746a210b201621024100210302400240024003400240200b20026b41e0004b0d002002200b470d024100210a0c040b200541e0006a2002460d0220032002200541e0006a412010d004220a4100476a2103200a450d02200241206a220a200541e0006a460d022003200a200541e0006a412010d004220a4100476a2103200a450d02200241c0006a220a200541e0006a460d022003200a200541e0006a412010d004220a4100476a2103200a450d02200241e0006a220a200541e0006a460d0220024180016a21022003200a200541e0006a412010d004220a4100476a2103200a0d000c020b0b0340200541e0006a2002460d0120032002200541e0006a412010d004220a4100476a2103200a450d014100210a200b200241206a2202470d000c020b0b4101210a0b024002400240024002400240024002400240200e41ff01710d00200a450d010c080b20180d07200541c0026a41186a2209200541e0006a41186a290300370300200541c0026a41106a220b200541e0006a41106a290300370300200541c0026a41086a2214200541e0006a41086a290300370300200520052903603703c0020240200c2017460d00200c21180c020b200c41016a2202200c490d0b200c4101742218200220022018491b221841ffffff3f712018470d0b201841057422024100480d0b02400240200c0d002002102721110c010b2011200c4105742002102821110b20110d0120024101102a000b200541c0026a41186a220a200541e0006a41186a290300370300200541c0026a41106a220b200541e0006a41106a290300370300200541c0026a41086a2214200541e0006a41086a290300370300200520052903603703c0020240024020132010460d00201321030c010b201341016a22022013490d0b20134101742203200220022003491b220341ffffff3f712003470d0b200341057422024100480d0b0240024020130d002002102721160c010b201620134105742002102821160b20160d0020024101102a000b201620104105746a220220052903c002370000200241186a200a290300370000200241106a200b290300370000200241086a2014290300370000201041016a2110024002402018450d00201720094d0d0120112017417f6a22174105746a22022900002121200229000821222002290010211c201120094105746a220941186a200241186a2900003700002009201c37001020092022370008200920213700000b200c2118200321130c020b418ce6c200200920171037000b201120174105746a220220052903c002370000200241186a2009290300370000200241106a200b290300370000200241086a2014290300370000201741016a2117200a450d00201020034d0d0120162010417f6a22104105746a22022900002121200229000821222002290010211c201620034105746a220341186a200241186a2900003700002003201c37001020032022370008200320213700000b200541e5026a2005290340370000200541cd026a200541e0006a41086a290300370000200541d5026a200541e0006a41106a290300370000200541dd026a200541e0006a41186a290300370000200541ed026a200541c0006a41086a290300370000200541f5026a200541c0006a41106a290300370000200541fd026a200541c0006a41186a290300370000200541013a00c402200541073a00c002200520052903603700c5022005418c036a201036020020054188036a201736020020054185036a200e3a000041b8d6c5004100200541c0026a10880120054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a100521032005280280012209417f460d022003450d022005200936029c02200520033602980220054180016a20054198026a102d200528028001220b450d0120054188016a2802002102200528028401210a02402009450d00200310290b200a450d03200b10290c030b418ce6c200200320101037000b418f89c3004133104e000b410021020b0240024002400240024002400240024002400240024002402017201b4f22030d004100200220106b2209200920024b1b201b490d00200541dc026a2010360200200541c0026a41186a2013360200200541c0026a41106a2017360200200541cc026a2018360200200520163602d402200520113602c8022005201b3602c402200520123602c002411a10272202450d01200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d022002200529034037001a200241326a200541c0006a41186a2903003700002002412a6a200541c0006a41106a290300370000200241226a200541c0006a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220a420037030020054200370398022002413a20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200a29030037030020052005290398023703d80320054120360284012005200541d8036a36028001200541c0026a20054180016a10db022002102902402018450d00201110290b20130d060c070b024020030d00200541cd026a200541c8006a290300370000200541d5026a200541d0006a290300370000200541dd026a200541d8006a290300370000200541033a00c402200541073a00c002200520052903403700c50241b8d6c5004100200541c0026a1088010c050b200541cd026a200541c0006a41086a290300370000200541d5026a200541c0006a41106a290300370000200541dd026a200541d8006a290300370000200541023a00c402200541073a00c002200520052903403700c50241b8d6c5004100200541c0026a108801411e10272203450d02200341166a41002900b5e742370000200341106a41002900afe742370000200341086a41002900a7e7423700002003410029009fe7423700002003411e413e10282203450d032003200529034037001e200341366a200541c0006a41186a220c2903003700002003412e6a200541c0006a41106a2210290300370000200341266a200541c0006a41086a221729030037000020054198026a41186a220a420037030020054198026a41106a220b420037030020054198026a41086a2209420037030020054200370398022003413e20054198026a1000200541d8036a41186a200a290300370300200541d8036a41106a200b290300370300200541d8036a41086a200929030037030020052005290398023703d803200541c0026a200541d8036a10fa02024020052802c002220a4112470d00200310290c050b20054180016a200541c0026a410472220b41840110ce041a200310292005200a3602c002200b20054180016a41840110ce041a200541a4026a20023602002009201b360200200541003a009c02200541023a009802200541386a200541c0026a20054198026a10ad0220052802382102200541cd026a2017290300370000200541d5026a2010290300370000200541dd026a200c290300370000200541e5026a2002453a0000200541043a00c402200541073a00c002200520052903403700c50241b8d6c5004100200541c0026a1088010c040b411a4101102a000b413a4101102a000b411e4101102a000b413e4101102a000b411a10272202450d03200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d042002200529034037001a200241326a200541c0006a41186a2903003700002002412a6a200541c0006a41106a290300370000200241226a200541c0006a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220a420037030020054200370398022002413a20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200a29030037030020052005290398023703d803200541d8036a4120100c2002102920054180016a41086a22024200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a10052102024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d2005280280012209450d07200529028401212102402003450d00200210290b2005202137029c0220052009360298020c010b200541003602a00220054201370398020b20054198026a200541c0006a103620054180016a41086a22024200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200229030037030020052005290380013703c002200541003602880120054201370380012005280298022112200520052802a00222023602d803200541d8036a20054180016a10300240024020020d002005280288012103200528028401210b200528028001210c0c010b20024105742110410020052802880122036b210a200528028001210c200528028401210b2012210203400240200b200a6a411f4b0d00200341206a22092003490d0d200b4101742217200920092017491b22094100480d0d02400240200b0d0020091027210c0c010b200c200b20091028210c0b200c450d052009210b0b200c20036a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200a41606a210a200341206a2103200241206a2102201041606a22100d000b2005200b3602840120052003360288012005200c360280010b200541c0026a4110200c200310030240200b450d00200c10290b0240200528029c02450d00201210290b02402018450d00201110290b2013450d010b201610290b410021030c060b20094101102a000b411a4101102a000b413a4101102a000b418f89c3004133104e000b41f4e5c2002103411621090b0240200c450d00201110290b2013450d00201610290b4101210b4101210c4101210a0c0e0b200141086a280200210a200141046a280200210e2002411a6a2901002121200241196a2d00002111200241186a2d00002116200241166a2f01002113200241156a2d00002117200241146a2d00002118200241126a2f01002112200241116a2d0000211b200241106a2d000021142002410e6a2f010021152002410d6a2d00002123200241046a2d00002108200241026a2f0100210d41d588c3002103412a21090240024020022d0000450d004101210b4100210c410021100c010b4101210b4100210c4100211020022d00014101470d002002410c6a2d000021102002410a6a2f0100210c200241096a2d00002109200241066a2f0100410874200241056a2d000072200241086a2d00004118747221034100210b0b200c41ffff0371410874200941ff0171722010411874722109200b0d0820052021370358200520113a0057200520163a0056200520133b0154200520173a0053200520183a0052200520123b01502005201b3a004f200520143a004e200520153b014c200520233a004b2005200936004720052003360043200520083a00422005200d3b014020054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a1005210202400240024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d2005280280012209450d0220054188016a280200210b200528028401210c02402003450d00200210290b2009200b200541c0006a10f90221020240200c450d00200910290b2002450d010c030b41014100200541c0006a10f9020d020b41cce4c2002103411521090c0a0b418f89c3004133104e000b200541003602c802200542013703c002200a200541c0026a103220052802c402210320052802c802210920052802c002210220054198026a41186a220b420037030020054198026a41106a220c420037030020054198026a41086a2210420037030020054200370398022002200920054198026a1000200541e0006a41186a2209200b290300370300200541e0006a41106a220b200c290300370300200541e0006a41086a220c2010290300370300200520052903980237036002402003450d00200210290b200541c0026a41186a2009290300370300200541c0026a41106a200b290300370300200541c0026a41086a200c290300370300200520052903603703c002024002400240024002400240024002400240411e10272202450d00200241166a41002900b5e742370000200241106a41002900afe742370000200241086a41002900a7e7423700002002410029009fe7423700002002411e413e10282202450d01200220052903c00237001e200241366a200541c0026a41186a2903003700002002412e6a200541c0026a41106a290300370000200241266a200541c0026a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220b420037030020054200370398022002413e20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200b29030037030020052005290398023703d803200541d8036a412041b8d6c50041004100100b2103200210292003417f470d020240200e4102490d00200541306a41bde7c200412110b5012005280234211720052802302118200541286a41bde7c200412110b50120052802282103200528022c210920054180016a41086a22024200370300200542003703800141bde7c200412120054180016a1004200541c0026a41086a220b200229030037030020052005290380013703c0022005200941016a410120031b36028001200541c0026a411020054180016a4104100320024200370300200542003703800141e8e6c200411d20054180016a1004200b200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a100521022005280280012203417f460d052002450d052005200336029c02200520023602980220054180016a20054198026a102d2005280280012213450d04200529028401212102402003450d00200210290b200541c0026a41186a200541e0006a41186a290300370300200541c0026a41106a200541e0006a41106a290300370300200541c0026a41086a200541e0006a41086a290300370300200520052903603703c002200541c0026a21032021a72021422088a72202470d080c070b20054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c002410021022005410036028001200541c0026a411020054180016a1005210902402005280280012203417f460d002005200336029c02200520093602980220054180016a20054198026a102d200528028001220c450d0620054188016a2802002102200528028401210b02402003450d00200910290b200b450d00200c10290b200541c0026a200a41880110ce041a2005418c016a200236020020054180016a41086a4101360200200541003a008401200541023a008001200541206a200541c0026a20054180016a10ad0220052802202102200541cd026a200541e0006a41086a290300370000200541d5026a200541f0006a290300370000200541dd026a200541f8006a290300370000200541e5026a2002453a0000200541043a00c402200541073a00c002200520052903603700c502200541c0026a21020c080b411e4101102a000b413e4101102a000b41e1e4c2002103411f21090c0e0b418f89c3004133104e000b200541c0026a41186a200541e0006a41186a290300370300200541c0026a41106a200541e0006a41106a290300370300200541c0026a41086a200541e0006a41086a290300370300200520052903603703c002420021214101211341002102200541c0026a21030c010b418f89c3004133104e000b200241016a22092002490d022002410174220b20092009200b491b220941ffffff3f712009470d022009410574220b4100480d020240024020020d00200b102721130c010b20132002410574200b102821130b2013450d032021422088a721022009ad21210b20132002410574220c6a22092003290000370000200941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020054180016a41086a22034200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200329030037030020052005290380013703c002200541003602880120054201370380012005200241016a22033602980220054198026a20054180016a103002400240200320024f0d002005280288012103200528028401210c20052802800121100c010b410020052802880122036b210b200c41206a21112005280280012110200528028401210c2013210203400240200c200b6a411f4b0d00200341206a22092003490d04200c4101742216200920092016491b22094100480d0402400240200c0d002009102721100c010b2010200c2009102821100b2010450d0b2009210c0b201020036a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200b41606a210b200341206a2103200241206a2102201141606a22110d000b2005200c36028401200520033602880120052010360280010b200541c0026a41102010200310030240200c450d00201010290b02402021a7450d00201310290b20054180016a41186a200541e0006a41186a29030037030020054180016a41106a200541e0006a41106a29030037030020054180016a41086a200541e0006a41086a2903003703002005200529036037038001200541c0026a200a41880110ce041a411e10272202450d03200241166a41002900b5e742370000200241106a41002900afe742370000200241086a41002900a7e7423700002002410029009fe7423700002002411e413e10282202450d04200220052903800137001e200241366a20054180016a41186a2903003700002002412e6a20054180016a41106a290300370000200241266a20054180016a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220b420037030020054200370398022002413e20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200b29030037030020052005290398023703d803200541003602a0022005420137039802200541c0026a20054198026a1032200528029c022103200541d8036a4120200528029802220920052802a002100302402003450d00200910290b20021029200541c0026a103d412010272202450d0520022005290340370000200241186a200541c0006a41186a290300370000200241106a200541c0006a41106a290300370000200241086a200541c0006a41086a29030037000020054180016a41186a200541e0006a41186a29030037030020054180016a41106a200541e0006a41106a29030037030020054180016a41086a200541e0006a41086a2903003703002005200529036037038001200541dc026a4100360200200541cc026a428180808010370200200542013702d402200520023602c8022005200e3602c40220052017410020181b22093602c002411a10272203450d06200341186a41002f009de7423b0000200341106a4100290095e742370000200341086a410029008de74237000020034100290085e7423700002003411a413a10282203450d07200320052903800137001a200341326a20054180016a41186a2903003700002003412a6a20054180016a41106a290300370000200341226a20054180016a41086a29030037000020054198026a41186a220b420037030020054198026a41106a220c420037030020054198026a41086a2210420037030020054200370398022003413a20054198026a1000200541d8036a41186a200b290300370300200541d8036a41106a200c290300370300200541d8036a41086a201029030037030020052005290398023703d8032005412036029c022005200541d8036a36029802200541c0026a20054198026a10db022003102920021029200541cd026a200541c0006a41086a290300370000200541d5026a200541c0006a41106a290300370000200541dd026a200541c0006a41186a290300370000200541e5026a2005290360370000200541ed026a200541e0006a41086a290300370000200541f5026a200541e0006a41106a290300370000200541fd026a200541e0006a41186a2903003700002005418c036a200e36020020054188036a2009360200200541003a00c402200541073a00c002200520052903403700c502200541c0026a21020b4100210c41b8d6c50041002002108801200a10294101210b0c0a0b102b000b200b4101102a000b411e4101102a000b413e4101102a000b41204101102a000b411a4101102a000b413a4101102a000b20094101102a000b200a103d200a10294100210c4101210b4101210a0c040b200141046a280200210a41d588c3002103412a210920022d00000d0120022d00014101470d01200241196a2d00002103200241186a2d00002109200241166a2f0100210b200241156a2d0000210c200241146a2d00002110200241126a2f01002111200241116a2d00002116200241106a2d000021132002410e6a2f010021172002410d6a2d000021182002410c6a2d000021122002410a6a2f0100211b200241096a2d00002114200241086a2d00002115200241066a2f01002123200241056a2d00002108200241046a2d0000210d200241026a2f0100210e20052002411a6a290100370378200520033a0077200520093a00762005200b3b01742005200c3a0073200520103a0072200520113b0170200520163a006f200520133a006e200520173b016c200520183a006b2005200d3a00622005200e3b016020052014201b410874201241187472723600672005200820234108747220154118747236006320054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a1005210302400240024002402005280280012202417f460d002005200236029c02200520033602980220054180016a20054198026a102d2005280280012209450d0220054188016a280200210b200528028401210c02402002450d00200310290b2009200b200541e0006a10f90221020240200c450d00200910290b2002450d010c030b41014100200541e0006a10f9020d020b41cce4c2002103411521090c030b418f89c3004133104e000b4100210b200541003602c802200542013703c002200a200541c0026a103220052802c402210320052802c802210920052802c002210220054198026a41186a220c420037030020054198026a41106a2210420037030020054198026a41086a2211420037030020054200370398022002200920054198026a1000200541d8036a41186a2209200c290300370300200541d8036a41106a22162010290300370300200541d8036a41086a2210201129030037030020052005290398023703d80302402003450d00200210290b200541c0026a200a41880110ce041a20054180016a410d6a200541e0006a41086a29030037000020054180016a41156a200541e0006a41106a29030037000020054180016a411d6a200541e0006a41186a2903003700004101210c200541013a0084012005200529036037008501200541023a008001200541186a200541c0026a20054180016a10ad0220052802182102200541c0026a410d6a2010290300370000200541c0026a41156a2016290300370000200541c0026a411d6a2009290300370000200541e5026a2002453a0000200541053a00c402200541073a00c002200520052903d8033700c50241b8d6c5004100200541c0026a108801200a10290b4101210a410021030c020b200a103d200a10294101210c4100210b4101210a0c010b4100210a4101210c410021030b02402006410771417f6a220241024b0d0002400240024020020e03000102000b200a450d02200141086a280200450d02200141046a28020010290c020b200b450d01200141046a2802002202103d200210290c010b200c450d00200141086a2802002202103d200210290b2000200936020420002003360200200424000bc08c0108077f027e0e7f027e027f017e0d7f0b7e230041e00a6b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0700010203040506000b200341e4046a4101360200200342013702d404200341ccfdc4003602d004200341023602b409200341c4fdc4003602b0092003200341b0096a3602e004200341d0046a41ece1c2001057000b200141e0006a2802002104200341b0096a200141086a41d80010ce041a20034188086a41186a200141fc006a28020036020020034188086a41106a200141f4006a29020037030020034188086a41086a200141ec006a2902003703002003200141e4006a29020037038808024020022d000120022d000072450d0041ad88c3002105412821020c220b200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a100420034190046a41086a2002290300370300200320032903b8073703900441002102200341003602d00420034190046a4110200341d0046a10052106024020032802d0042205417f460d002003200536029c062003200636029806200341d0046a20034198066a10f10220032d00c0054102460d0620032802a80521022005450d00200610290b024020022004490d0041fce1c2002105413521020c220b200341dc046a2004360200200341d0046a41086a41033a00002003410b3a00d0044100210541b8d6c5004100200341d0046a108801200341d0046a200341b0096a41d80010ce041a200341b4056a20034188086a41086a290300370200200341bc056a20034188086a41106a290300370200200341c4056a20034188086a41186a280200360200200320043602a80520032003290388083702ac05200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a100420034190046a41086a2002290300370300200320032903b80737039004200341003602a0062003420137039806200341d0046a20034198066a109302200328029c06210220034190046a4110200328029806220420032802a00610032002450d20200410290c200b2001410c6a2802002107200141086a2802002108200141046a2802002109200141106a290300210a2002411a6a290100210b200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d00002115200241046a2d00002116200241026a2f01002117412a210441d588c30021050240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201941ffff0371410874201841187472200441ff017172210220060d1e2003200b3703b0062003200c3a00af062003200d3a00ae062003200e3b01ac062003200f3a00ab06200320103a00aa06200320113b01a806200320123a00a706200320133a00a606200320143b01a406200320153a00a3062003200236009f062003200536009b06200320163a009a06200320173b019806200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a100420034190046a41086a2002290300370300200320032903b80737039004200341003602d00420034190046a4110200341d0046a1005210220032802d0042205417f460d062002450d06200320053602bc07200320023602b807200341d0046a200341b8076a10f10220032d00c00522044102460d0520034188086a200341d0046a41f00010ce041a2003200341d0046a41f4006a28000036009309200320032800c1053602900902402005450d00200210290b200341b0096a20034188086a41f00010ce041a200341b0096a41f4006a200328009309360000200320043a00a00a20032003280290093600a10a0c150b200141c0006a290300211a200141386a290300211b2002411a6a290100210b200241196a2d0000210d200241186a2d0000210f200241166a2f01002110200241156a2d00002111200241146a2d00002112200241126a2f01002113200241116a2d00002114200241106a2d000021152002410e6a2f010021162002410d6a2d00002117200241046a2d00002107200241026a2f0100211c200141306a280200211d2001412c6a2802002108200141286a280200210e2001411d6a290000211e2001411c6a2d0000211f2001411b6a2d00002120200141196a2f00002121200141186a2d00002122200141176a2d00002123200141156a2f00002124200141146a2d00002125200141136a2d00002126200141116a2f00002127200141106a2d000021282001410c6a2802002129200141086a2802002109200141076a2d0000212a200141056a2f0000212b200141046a2d0000210c200141c8006a290300210a412a210441d588c30021050240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201941ffff0371410874201841187472200441ff017172210220060d130240200c41ff01714101470d00200341d0046a200941067610cc0120032802d00421060240024020032802d8042009413f7122044b0d00410021040c010b200620044105746a2204290018211e20042d0017211f20042d0016212020042f0014212120042d0013212220042d0012212320042f0010212420042d000f212520042d000e212620042f000c212720042d000b2128200428000721292004280003210920042d0002212a20042f0000212b410121040b024020032802d404450d00200610290b20040d004184efc2002105411521020c140b2003200b3703c8042003200d3a00c7042003200f3a00c604200320103b01c404200320113a00c304200320123a00c204200320133b01c004200320143a00bf04200320153a00be04200320163b01bc04200320173a00bb04200320023600b704200320053600b304200320073a00b2042003201c3b01b004200341e0016a41e887c500411110940102404280ade20420032903e8017d4280ade20420032802e0011b200a5a0d0041dbeac2002105411b21020c140b200341c8016a41b793c20041111086014200212c0240024020032903d001420120032802c80122021b220b200341d8016a290300420020021b222d8450450d004200212e0c010b200341a8016a202d4200200a420010d304200341b8016a200b4200200a420010d30420034198016a42004200200b420010d304024020032903b00120032903a00184420052200341c0016a290300222c20032903a8012003290398017c7c222e202c5472450d0041f6eac2002105412721020c150b20032903b801212c0b200341d0046a200341b0046a202c202e4108109001024020032802d0044101470d0020032802d804210220032802d40421050c140b200341d0046a41106a290300212e20032903d804212c20034198076a41186a202d3703002003200b3703a8072003200a3703a0072003200a37039807200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a1004200341b0096a41086a2002290300370300200320032903b8073703b009200341003602d004200341b0096a4110200341d0046a1005210220032802d004220f417f460d072002450d072003200f36028c082003200236028808200341d0046a20034188086a10f10220032d00c00522054102460d0620032802bc05210420032802b805210620032802b405211820032802b005211920032802ac05210c20032802a805210d20032903a005210a200329039805210b200329039005212d200329038805212f200329038005213020032903f804213120032903f004213220032903e804213320032903e004213420032903d804213520032903d0042136200320032800c105360298062003200341c4056a28000036009b060240200f450d00200210290b2003200328029806360288082003200328009b0636008b080c120b200141386a290300211e200141306a290300211a200141c0006a290300210a200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f0032002411a6a290100210b200241196a2d00002108200241186a2d00002109200241166a2f0100210c200241156a2d0000210e200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d00002115200241046a2d00002116200241026a2f010021172001412c6a2802002107200141286a280200210d200141246a280200210f41d588c3002105412a21040240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021192002410a6a2f01002118200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201841ffff0371410874200441ff017172201941187472210202402006450d00200d0d100c110b2003200b3703c804200320083a00c704200320093a00c6042003200c3b01c4042003200e3a00c304200320103a00c204200320113b01c004200320123a00bf04200320133a00be04200320143b01bc04200320153a00bb04200320023600b704200320053600b304200320163a00b204200320173b01b004200341e0026a41e887c500411110940102404280ade20420032903e8027d4280ade20420032802e0021b200a5a0d0041dbeac2002105411b21020c0f0b200341c8026a41b793c20041111086014200211b0240024020032903d002420120032802c80222021b220b200341d8026a290300420020021b222c8450450d004200212d0c010b200341a8026a202c4200200a420010d304200341b8026a200b4200200a420010d30420034198026a42004200200b420010d304024020032903b00220032903a00284420052200341c0026a290300221b20032903a8022003290398027c7c222d201b5472450d0041f6eac2002105412721020c100b20032903b802211b0b200341d0046a200341b0046a201b202d4108109001024020032802d0044101470d0020032802d804210220032802d40421050c0f0b200341d0046a41106a290300212d20032903d804211b20034198076a41186a202c3703002003200b3703a8072003200a3703a0072003200a37039807200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a1004200341b0096a41086a2002290300370300200320032903b8073703b009200341003602d004200341b0096a4110200341d0046a1005210220032802d004220c417f460d082002450d082003200c36028c082003200236028808200341d0046a20034188086a10f10220032d00c00522054102460d0720032802bc05210420032802b805210620032802b405211820032802b005211920032802ac05210820032802a805210920032903a005210a200329039805210b200329039005212c200329038805212e200329038005212f20032903f804213020032903f004213120032903e804213220032903e004213320032903d804213420032903d0042135200320032800c105360298062003200341c4056a28000036009b060240200c450d00200210290b2003200328029806360288082003200328009b0636008b080c0d0b20034198066a41186a200141196a29000037030020034198066a41106a200141116a29000037030020034198066a41086a200141096a290000370300200320012900013703980620034188086a41206a200141c1006a2d00003a000020034188086a41186a200141396a29000037030020034188086a41106a200141316a29000037030020034188086a41086a200141296a2900003703002003200141216a29000037038808200341d0046a41086a2205200241096a290000370300200341d0046a41106a2204200241116a290000370300200341d0046a41186a2206200241196a290000370300200341d0046a41206a2218200241216a2d00003a0000200341bc076a2219200241266a2f01003b0100200320022900013703d0042003200241226a2801003602b807024020022d00002202450d00200341b0096a41266a20032802b807360100200341bd096a2005290300370000200341c5096a2004290300370000200341cd096a2006290300370000200341d5096a20182d00003a0000200341da096a20192f01003b0100200320023a00b409200320032903d0043700b509200341013a00b00941b1e2c200210541e90021020c1e0b200341b0096a41216a20182d00003a0000200341b0096a41196a2006290300370000200341b0096a41116a2004290300370000200341b0096a41096a2005290300370000200320032903d004220a3700b109200341003a00b00941b1e2c200210541e9002102200aa741ff0171417f6a220441014b0d1d02400240024020040e020100010b20032d0088084101470d1f20034188086a41017221044200210a0c010b20032d0088084101460d1e200341b0096a41027221044202210a0b41002105200341d0046a20034198066a200a410010a00120032d00d0042102024020032d00d8040d002003418c056a280200450d0020034188056a28020010290b200241ff01714101470d1c200341d0046a20044296014200109f01024020032802d0044101470d0020032802d804210220032802d40421050c1e0b200341d0046a41106a290300210b20032903d804211e200341f0026a41b18ac0004116108601200341f0026a41106a290300210a20032903f802211a20032802f0022102200341b8076a41086a22044200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2004290300370300200320032903b807370390042003427f200b200a420020021b220a7c201e201a420020021b220b7c221e200b542202ad7c220b2002200b200a54200b200a511b22021b3703c0072003427f201e20021b3703b80720034190046a4110200341b8076a411010030c1c0b200141d8006a290300210b200141d0006a290300211e200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f003200341b0046a41186a200141396a290000370300200341b0046a41106a200141316a290000370300200341b0046a41086a200141296a2900003703002003200141216a2900003703b004200141c4006a2802002109200141c8006a2802002108200141cc006a28020021072002411a6a290100210a200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d00002115200241046a2d00002116200241026a2f0100211741d588c3002105412a21040240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021192002410a6a2f01002118200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201841ffff0371410874200441ff017172201941187472210220060d092003200a3703b0072003200c3a00af072003200d3a00ae072003200e3b01ac072003200f3a00ab07200320103a00aa07200320113b01a807200320123a00a707200320133a00a607200320143b01a407200320153a00a3072003200236009f072003200536009b07200320163a009a07200320173b019807200341d0046a20034198076a108c010240024020032d00d00422054102470d0041012105413421024202210a0c010b20034190096a41086a2204200341e4046a29020037030020034190096a41106a2206200341ec046a28020036020020034188086a41086a2218200341d0046a41306a29030037030020034188086a41106a221920034188056a29030037030020034188086a41186a220c20034190056a29030037030020034188086a41206a220d20034198056a29030037030020034188086a41286a220e200341a0056a29030037030020034188086a41306a220f200341a8056a2903003703002003200341dc046a290200370390092003200341d0046a41286a29030037038808200341d0046a41086a28020021024202210a4202211a024020050d00200341d0046a41206a290300211a20034190046a41106a200628020036020020034190046a41086a200429030037030020034198066a41086a201829030037030020034198066a41106a201929030037030020034198066a41186a200c29030037030020034198066a41206a200d29030037030020034198066a41286a200e29030037030020034198066a41306a200f2903003703002003200329039009370390042003200329038808370398060b0240201a4202520d0041012105413421020c010b20034188086a41106a20034190046a41106a28020036020020034188086a41086a20034190046a41086a290300370300200341d0046a41086a20034198066a41086a290300370300200341d0046a41106a20034198066a41106a290300370300200341d0046a41186a20034198066a41186a290300370300200341d0046a41206a20034198066a41206a290300370300200341d0046a41286a20034198066a41286a290300370300200341d0046a41306a20034198066a41306a29030037030020032003290390043703880820032003290398063703d00441002105201a210a0b200341f0076a41086a220420034188086a41086a290300370300200341f0076a41106a220620034188086a41106a280200360200200341b8076a41086a2218200341d0046a41086a290300370300200341b8076a41106a2219200341d0046a41106a290300370300200341b8076a41186a220c200341d0046a41186a290300370300200341b8076a41206a220d200341d0046a41206a290300370300200341b8076a41286a220e200341d0046a41286a290300370300200341b8076a41306a220f200341d0046a41306a29030037030020032003290388083703f007200320032903d0043703b80702402005450d00419ae3c20021050c0a0b200341b0096a41206a220520032903b807370300200341bc096a2004290300370200200341c4096a2006280200360200200341b0096a41286a2018290300370300200341b0096a41306a2019290300370300200341e8096a200c290300370300200341f0096a200d290300370300200341f8096a200e290300370300200341800a6a200f290300370300200320023602b009200320032903f0073702b4092003200a3703c809200341e0036a41888dc300410d10940120032903e803420020032802e0031b211a200aa74101470d072005290300201a520d0741cee3c2002105412a21020c080b418f89c3004133104e000b418f89c3004133104e000b200341003602880a200341003a00a00a200342908080808080103702940a200342848080808080c00037028c0a200342013703800a200342013703f809200342af013703f00920034287013703e809200342013703e009200342013703d809200342013703d009200342013703c809200342013703c009200342013703b809200342013703b0092003412036029c0a0c0e0b418f89c3004133104e000b4100210d428701212f42af01212d4201210a4104210c41808004211941102118418080012106412021044201210b42012130420121314201213242012133420121344201213542012136410021050c0a0b418f89c3004133104e000b4100210941202104418080012106411021184180800421194104210842af01212c428701212e4201213542012134420121334201213242012131420121304201212f4201210b4201210a410021050c040b200341d0046a200341f0036a108c010240024020032d00d00422024102460d0020020d0120034184056a280200450d0020034180056a28020010290b418ee4c2002105412e21020c010b200320032902d40437009309200320032d00d3043a009209200320032f00d1043b0190092003200341e9046a2900003703a8092003200341e5046a2800003602a4092003200341dd046a29000037029c092003200341dc046a2d00003a009b0920032903c809210a20032903d009211b200320093602b8072003200920074105746a3602bc072003200341b0096a3602c00720034188086a200341b8076a102502400240024002400240024002400240024002400240024002402003280288080d004104210441002105410021060c010b200341d0046a41086a220220034188086a41086a29030037030020032003290388083703d004411010272204450d01200420032903d004370200200441086a200229030037020020034198066a41086a200341b8076a41086a280200360200200320032903b8073703980620034188086a20034198066a102502402003280288080d0041012105410121060c010b41012102410121060340200341d0046a41086a221820034188086a41086a29030037030020032003290388083703d0040240024020062002460d00200241016a21050c010b200241016a22052002490d1820024101742206200520052006491b220641ffffffff00712006470d18200641047422194100480d180240024020020d002019102721040c010b200420024104742019102821040b2004450d040b200420024104746a220220032903d004370200200241086a201829030037020020034188086a20034198066a1025200521022003280288080d000b0b200341e0096a280200210220032802d8092118200341003602d00420182002200341d0046a100f210d20032802d0042218417f460d0220034188086a41186a200341b0046a41186a29030037030020034188086a41106a200341b0046a41106a29030037030020034188086a41086a200341b0046a41086a290300370300200320032903b00437038808200341003602d804200342013703d004200320183602b807200341b8076a200341d0046a10300240024020032802d404220c20032802d80422026b2018490d0020032802d00421190c010b200220186a22192002490d16200c410174220e20192019200e491b220e4100480d1602400240200c0d00200e102721190c010b20032802d004200c200e102821190b2019450d042003200e3602d404200320193602d004200e210c0b201920026a200d201810ce041a02400240200220186a22020d004101210e0c010b20024100480d1620021027220e450d09200e2019200210ce041a0b0240200c450d00201910290b20024101742219200241206a220c200c2019491b220f4100480d150240024020020d00200f102721190c010b200e2002200f102821190b024020190d00200f4101102a000b201920026a2202200329038808370000200241186a20034188086a41186a290300370000200241106a20034188086a41106a290300370000200241086a20034188086a41086a290300370000200341d0046a41186a22024200370300200341d0046a41106a220e4200370300200341d0046a41086a220f4200370300200342003703d0042019200c200341d0046a100020034198066a41186a200229030037030020034198066a41106a200e29030037030020034198066a41086a200f290300370300200320032903d004370398062019102902402018450d00200d10290b024020034198066a20034190096a412010d0040d000240024020050d00410021180c010b200541047421192004410c6a2102410021180340200228020020186a2118200241106a2102201941706a22190d000b0b200320032802e40920186b3602e409411710272202450d052002410f6a41002900af9342370000200241086a41002900a89342370000200241002900a0934237000020024117413710282202450d0620022003290398073700172002412f6a20034198076a41186a290300370000200241276a20034198076a41106a2903003700002002411f6a20034198076a41086a290300370000200341d0046a41186a22184200370300200341d0046a41106a22194200370300200341d0046a41086a220c4200370300200342003703d00420024137200341d0046a1000200341b8076a41186a2018290300370300200341b8076a41106a2019290300370300200341b8076a41086a200c290300370300200320032903d0043703b807200341b8076a4120100c200210292019200b370300200341f8046a201a201b20071b370300200341d0046a41206a4201200a20071b3703002018201a3703002003418c056a20032802e40936020020034190056a20032903b00437030020034198056a200341b0046a41086a290300370300200341a0056a200341b0046a41106a290300370300200341a8056a200341b0046a41186a29030037030020034180056a200341d8096a220229030037030020034188056a200241086a2802003602002003201e3703d804200341003a00d004200341f0036a200341d0046a10d801411410272202450d07200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d0820022003290398073700142002412c6a200341b0076a290300370000200241246a20034198076a41106a2903003700002002411c6a20034198076a41086a290300370000200341c8036a20024134108401200341c8036a41106a290300210a20032903d003210b20032802c803211820021029200341d0046a20034198076a4200420010850120032903d004211a200341b0036a41b18ac0004116108601200a420020181b211b200b420020181b212c200341b0036a41106a290300420020032802b00322021b210a20032903b803420020021b210b200341d0046a41106a290300212d20032903d804211e02400240201a4200520d00200341b8076a41086a22024200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2002290300370300200320032903b807370390042003427f200a202d7c200b201e7c221e200b542202ad7c220b2002200b200a54200b200a511b22021b370390082003427f201e20021b3703880820034188086a21020c010b200341b8076a41086a22024200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2002290300370300200320032903b8073703900420034200200a202d7d200b201e54ad7d221a200b201e7d221e200b56201a200a56201a200a511b22021b3703900820034200201e20021b3703880820034188086a21020b20034190046a4110200241101003200341a0036a200341f0036a202c201b108301200341a0036a41086a290300210b20032903a003211e20034188036a41b18ac000411610860120034188036a41106a290300210a200329039003211a2003280288032102200341b8076a41086a22184200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2018290300370300200320032903b807370390042003427f200b200a420020021b220a7c201e201a420020021b220b7c221e200b542202ad7c220b2002200b200a54200b200a511b22021b3703d8042003427f201e20021b3703d00420034190046a4110200341d0046a4110100302402005450d0020054104742105200441046a210203400240200241046a280200450d00200228020010290b200241106a2102200541706a22050d000b0b02402006450d00200410290b4100210502402008450d00200910290b0c0e0b200420054104746a2112024020050d00200421020c0a0b2004210203400240200228020022180d00200241106a21020c0b0b200241046a2802002105200241086a28020021192002410c6a280200210c20032802e009210d20032802d809210e200341d0046a41186a220f4200370300200341d0046a41106a22104200370300200341d0046a41086a22114200370300200342003703d00420184120200341d0046a100020034190046a41186a200f29030037030020034190046a41106a201029030037030020034190046a41086a2011290300370300200320032903d00437039004200e200d20034190046a41202005200c101102402019450d00200510290b200241106a22022012470d000c0b0b0b41104104102a000b20194104102a000b41b0cfc5004138104e000b200e4101102a000b41174101102a000b41374101102a000b41144101102a000b41344101102a000b20024101102a000b20022012460d0003402002280200450d010240200241086a280200450d00200241046a28020010290b200241106a22022012470d000b0b02402006450d00200410290b41f8e3c2002105411621020b200341dc096a280200450d0020032802d80910290b2008450d00200910290b410021084101210641012118410121190c130b200320053a00c005200320043602bc05200320063602b805200320183602b405200320193602b005200320083602ac05200320093602a8052003200a3703a0052003200b370398052003202c370390052003202e370388052003202f37038005200320303703f804200320313703f004200320323703e804200320333703e004200320343703d804200320353703d004200341d0056a420037030020034180066a4200370300200341f0056a4200370300200341e0056a4200370300200341d0046a41f4006a200328008b0836000020034280888080808010370388062003428080e983b1de163703c80520034280a094a58d1d3703f80520034280a094a58d1d3703e80520034280a094a58d1d3703d80520032003280288083600c1052003200341d0046a360294062003200341d0046a3602f00720034188026a41ceecc200410d109401200329039002210a2003280288022102200341f8016a41888dc300410d109401200341e4066a4100360200200341d4066a4200370200200341c8066a41e48cc300360200200341c4066a41b8d6c500360200200341bc066a22044200370200200341b8066a418883c000360200200341fc066a200341b0046a41086a29030037020020034184076a200341c0046a29030037020020034198066a41f4006a200341b0046a41186a290300370200200342083702dc062003428080808080013702cc06200341003602b406200341003602a806200320032903b0043702f40620032802f8012105200329038002210b2003200341f0076a3602f006200320034194066a3602ec062003200341d0046a3602e8062003200b420020051b3703a0062003200a420020021b37039806200341b0096a20034198066a201a201e20034198076a200341f0036a200f200710da0141012112200341b0096a41086a22062802002102024020032802b409410020032d00b0094101461b22050d002006200429020037030020034188086a41086a200341bc096a280200360200200320032902b4063703b009200320032902b40937038808200341d80a6a20034188086a10d40120032802d006220e20032802d806220641e8006c6a210920032802d4062110200e2104024002402006450d00200341b9096a210c200e21040240034020042d0000210620034188086a200441016a41d70010ce041a20064106460d01200441d8006a2800002118200441dc006a2800002119200441e0006a2800002108200320063a00b8092003410b3a00b009200c20034188086a41d70010ce041a20182008200341b0096a10880102402019450d00201810290b200441e8006a22042009470d000c030b0b200441e8006a21040b20042009460d00034020042d000022064106460d01200441286a2800002118200441246a28000021190240200441dc006a280000450d00200441d8006a28000010290b024020064105490d002018450d00201910290b200441e8006a22042009470d000b0b410021122010450d00200e10290b200341b0046a20032903980720032903a00720032903a80720034198076a41186a290300201b202d10f80220032802dc06221120032802e406220641a8016c6a210e20032802e00621132011210402402006450d00200341b9096a2106200341b8076a4102722118200341b0096a4104722110201121040240034020034190046a41186a2208200441186a29030037030020034190046a41106a2209200441106a29030037030020034190046a41086a220c200441086a2903003703002003200429030037039004200441206a280200211920034188086a200441246a41840110ce041a20194112460d01200320193602b009201020034188086a41840110ce041a2018200329039004370000201841086a200c290300370000201841106a2009290300370000201841186a200829030037000020034180023b01b807200341f0016a200341b0096a200341b8076a10ad0220032802f00121192006200329039004370000200641086a200c290300370000200641106a2009290300370000200641186a2008290300370000200341043a00b8092003410b3a00b00920032019453a00d90941b8d6c5004100200341b0096a108801200441a8016a2204200e470d000b200e21040c010b200441a8016a21040b02402004200e460d00200341b0096a41206a210c200341b0096a41246a21100340200341b8076a41186a2218200441186a290300370300200341b8076a41106a2219200441106a290300370300200341b8076a41086a2208200441086a290300370300200320042903003703b807200441206a2802002106200341b0096a200441246a41840110ce041a20064112460d0120034190096a41186a2209201829030037030020034190096a41106a2218201929030037030020034190096a41086a22192008290300370300200320032903b8073703900920034188086a200341b0096a41840110ce041a200341b0096a41186a2009290300370300200341b0096a41106a2018290300370300200341b0096a41086a201929030037030020032003290390093703b009200320063602d009201020034188086a41840110ce041a200c103d200441a8016a2204200e470d000b0b02402013450d00201110290b024020032802a8062204450d00200341ac066a280200450d00200410290b2012450d00200341b8066a280200210420032802c00621080240024020032802bc0622180d00200421060c010b2018211920042106034020062802880b21062019417f6a22190d000b0340200420042f01064102746a41880b6a28020021042018417f6a22180d000b0b200341cc096a20042f0106360200200341c8096a4100360200200341c4096a2004360200200320083602d009200341003602c009200342003703b809200320063602b409200341003602b009200341b0096a10d901024020032802d8062206450d0020032802d0062104200641e8006c210603400240200441dc006a280200450d00200441d8006a28020010290b024020042d00004105490d00200441286a280200450d00200441246a28020010290b200441e8006a2104200641987f6a22060d000b0b20032802d406450d0020032802d00610290b200d450d010b200f10290b410021194101210641012118410121080c0f0b200320053a00c005200320043602bc05200320063602b805200320183602b405200320193602b0052003200c3602ac052003200d3602a8052003200a3703a0052003200b370398052003202d370390052003202f370388052003203037038005200320313703f804200320323703f004200320333703e804200320343703e004200320353703d804200320363703d004200341d0056a420037030020034180066a4200370300200341f0056a4200370300200341e0056a4200370300200341d0046a41f4006a200328008b0836000020034280888080808010370388062003428080e983b1de163703c80520034280a094a58d1d3703f80520034280a094a58d1d3703e80520034280a094a58d1d3703d80520032003280288083600c1052003200341d0046a3602f0072003200341d0046a3602f00320034188016a41ceecc200410d109401200329039001210a2003280288012102200341f8006a41888dc300410d109401200341e4066a4100360200200341d4066a4200370200200341c8066a41e48cc300360200200341c4066a41b8d6c500360200200341bc066a4200370200200341b8066a418883c000360200200341fc066a200341b0046a41086a29030037020020034184076a200341c0046a29030037020020034198066a41f4006a200341c8046a290300370200200342083702dc062003428080808080013702cc06200341003602b406200341003602a806200320032903b0043702f40620032802782105200329038001210b2003200341f0036a3602f0062003200341f0076a3602ec062003200341d0046a3602e8062003200b420020051b3703a0062003200a420020021b370398062003201e3703c8092003201f3a00c709200320203a00c609200320213b01c409200320223a00c309200320233a00c209200320243b01c009200320253a00bf09200320263a00be09200320273b01bc09200320283a00bb09200320293600b709200320093600b3092003202a3a00b2092003202b3b01b009200341003602c007200342013703b80720034188086a20034198066a200341b0096a201b201a20034198076a200e201d200341b8076a10e1014101211220034188086a41086a2802002102200328028c08210502402003280288084101460d0002402002450d00200510290b200341b0096a41086a200341bc066a29020037030020034188086a41086a200341bc096a280200360200200320032902b4063703b009200320032902b40937038808200341d80a6a20034188086a10d40120032802d006220d20032802d806220441e8006c6a210920032802d406210f200d2105024002402004450d00200341b9096a210c200d21050240034020052d0000210420034188086a200541016a41d70010ce041a20044106460d01200541d8006a2800002106200541dc006a2800002118200541e0006a2800002119200320043a00b8092003410b3a00b009200c20034188086a41d70010ce041a20062019200341b0096a10880102402018450d00200610290b200541e8006a22052009470d000c030b0b200541e8006a21050b20052009460d00034020052d000022044106460d01200541286a2800002106200541246a28000021180240200541dc006a280000450d00200541d8006a28000010290b024020044105490d002006450d00201810290b200541e8006a22052009470d000b0b0240200f450d00200d10290b41002105410021120b200341b0046a20032903980720032903a00720032903a80720034198076a41186a290300202c202e10f80220032802dc06221120032802e406220641a8016c6a210f20032802e00621132011210402402006450d00200341b9096a2106200341b8076a4102722118200341b0096a4104722110201121040240034020034190046a41186a2209200441186a29030037030020034190046a41106a220c200441106a29030037030020034190046a41086a220d200441086a2903003703002003200429030037039004200441206a280200211920034188086a200441246a41840110ce041a20194112460d01200320193602b009201020034188086a41840110ce041a2018200329039004370000201841086a200d290300370000201841106a200c290300370000201841186a200929030037000020034180023b01b807200341f0006a200341b0096a200341b8076a10ad02200328027021192006200329039004370000200641086a200d290300370000200641106a200c290300370000200641186a2009290300370000200341043a00b8092003410b3a00b00920032019453a00d90941b8d6c5004100200341b0096a108801200441a8016a2204200f470d000b200f21040c010b200441a8016a21040b02402004200f460d00200341b0096a41206a210d200341b0096a41246a21100340200341b8076a41186a2218200441186a290300370300200341b8076a41106a2219200441106a290300370300200341b8076a41086a2209200441086a290300370300200320042903003703b807200441206a2802002106200341b0096a200441246a41840110ce041a20064112460d0120034190096a41186a220c201829030037030020034190096a41106a2218201929030037030020034190096a41086a22192009290300370300200320032903b8073703900920034188086a200341b0096a41840110ce041a200341b0096a41186a200c290300370300200341b0096a41106a2018290300370300200341b0096a41086a201929030037030020032003290390093703b009200320063602d009201020034188086a41840110ce041a200d103d200441a8016a2204200f470d000b0b02402013450d00201110290b024020032802a8062204450d00200341ac066a280200450d00200410290b2012450d00200341b8066a280200210420032802c00621090240024020032802bc0622180d00200421060c010b2018211920042106034020062802880b21062019417f6a22190d000b0340200420042f01064102746a41880b6a28020021042018417f6a22180d000b0b200341cc096a20042f0106360200200341c8096a4100360200200341c4096a2004360200200320093602d009200341003602c009200342003703b809200320063602b409200341003602b009200341b0096a10d901024020032802d8062206450d0020032802d0062104200641e8006c210603400240200441dc006a280200450d00200441d8006a28020010290b024020042d00004105490d00200441286a280200450d00200441246a28020010290b200441e8006a2104200641987f6a22060d000b0b20032802d406450d0020032802d00610290b41002118410121062008450d0c200e10290c0c0b200341e0006a41e887c500411110940102404280ade20420032903687d4280ade20420032802601b200a5a0d0041dbeac2002105411b21020c090b200341c8006a41b793c20041111086014200211e0240024020032903504201200328024822021b220b200341d8006a290300420020021b221a8450450d004200211b0c010b200341286a201a4200200a420010d304200341386a200b4200200a420010d304200341186a42004200200b420010d30402402003290330200329032084420052200341c0006a290300221e200329032820032903187c7c221b201e5472450d0041f6eac2002105412721020c0a0b2003290338211e0b200341d0046a20034198066a201e201b4108109001024020032802d0044101470d0020032802d804210220032802d40421050c090b200341086a20032903b00942002007ad420010d3044200200a427f200329030820032903104200521b7d221e201e200a5622021b212c200341e0046a290300211b20032903d804211e02402002450d0041cde1c1002105412c21020c070b200341d0046a20092007200341b0096a108502024020032802d0044101470d00200341d8046a280200210220032802d40421050c070b20034190096a41186a2205200341d0046a410472220241186a28020036020020034190096a41106a2204200241106a29020037030020034190096a41086a2218200241086a2902003703002003200229020037039009200341d0046a41186a22024200370300200341d0046a41106a4200370300200341d0046a41086a4200370300200342003703d00420092007200341d0046a1000200341f0036a41026a20032d00d20422193a0000200341b0046a41086a220c200341e3046a290000370300200341b0046a410d6a220d2002290000370000200320032f01d004220e3b01f003200320032900db04222d3703b00420032800d304210620032800d704210220034190046a41026a20193a000020034198076a41086a200c29030037030020034198076a410d6a200d2900003700002003200e3b0190042003202d37039807200341b8076a41186a2005280200360200200341b8076a41106a2004290300370300200341b8076a41086a201829030037030020032003290390093703b807411410272205450d01200541106a410028009c9342360000200541086a410029009493423700002005410029008c934237000020054114413410282205450d02200520032f0190043b00142005200236001b20052006360017200520032903980737001f200541166a20034190046a41026a22042d00003a0000200541276a20034198076a41086a2903003700002005412c6a20034198076a410d6a290000370000200341d0046a41186a22184200370300200341d0046a41106a22194200370300200341d0046a41086a220c4200370300200342003703d00420054134200341d0046a100020034188086a41186a201829030037030020034188086a41106a201929030037030020034188086a41086a200c290300370300200320032903d00437038808200341203602d404200320034188086a3602d004200341b8076a200341d0046a105b200510290240200341b8076a41106a280200450d0020032802c40710290b2004200341f0036a41026a2d00003a0000200341b8076a41086a200341b0046a41086a290300370300200341b8076a410d6a200341b0046a410d6a290000370000200320032f01f0033b019004200320032903b0043703b807411510272205450d032005410d6a41002900ce9242370000200541086a41002900c99242370000200541002900c1924237000020054115413510282205450d04200520032f0190043b00152005200236001c20052006360018200520032903b807370020200541176a20034192046a2d00003a0000200541286a200341b8076a41086a2903003700002005412d6a200341b8076a410d6a290000370000200341d0046a41186a22044200370300200341d0046a41106a22184200370300200341d0046a41086a22194200370300200342003703d00420054135200341d0046a100020034188086a41186a200429030037030020034188086a41106a201829030037030020034188086a41086a2019290300370300200320032903d00437038808200341003602d804200342013703d004200320073602980720034198076a200341d0046a10300240024020032802d404221920032802d80422186b2007490d0020032802d00421040c010b201820076a22042018490d012019410174220c20042004200c491b220c4100480d010240024020190d00200c102721040c010b20032802d0042019200c102821040b2004450d062003200c3602d404200320043602d004200c21190b200420186a2009200710ce041a20034188086a41202004201820076a100302402019450d00200410290b2005102902402008450d00200910290b20034198076a41026a2205200341f0036a41026a2d00003a000020034188086a41086a2204200341b0046a41086a29030037030020034188086a410d6a2218200341b0046a410d6a290000370000200320032f01f0033b019807200320032903b00437038808200341d0046a41086a41023a0000200341e0046a2002360200200341dc046a20063602002003410b3a00d004200341d9046a20032f0198073b0000200341d0046a410b6a20052d00003a0000200341e4046a200329038808370200200341ec046a2004290300370200200341f1046a20182900003700004100210541b8d6c5004100200341d0046a10880120034198066a200a202c200b201a201e201b10f8020c070b102b000b41144101102a000b41344101102a000b41154101102a000b41354101102a000b200c4101102a000b02402008450d00200910290b20034198066a200a202c200b201a201e201b10f8020b41012118410021060c030b41012118410021062008450d02200910290c020b0b41012106410121180b41012119410121080b02400240024020012d0000220441064b0d00024002400240024020040e0706060001020603060b2006450d05200141086a280200450d05200141046a28020010290c050b2018450d042001412c6a280200450d04200141286a28020010290c040b2019450d03200141286a280200450d03200141246a28020010290c030b20080d010c020b200141c8006a280200450d01200141c4006a28020010290c010b200141c8006a280200450d00200141c4006a28020010290b2000200236020420002005360200200341e00a6a24000b3400200041d0f4c10036020420004100360200200041146a4101360200200041106a4180f9c100360200200041086a42043702000b130020004102360204200041dcf4c1003602000b950101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102722060d0041204101102a000b20062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000bb014030c7f017e017f230041e0006b2201240020014100360208200142043703000240024002400240024002400240024002400240024002400240024002400240200041106a28020041246c22020d004104210341002104410021050c010b20002802082106410421034100210441002107410021050340024020062d00004101470d00200641106a2802002208417f4c0d03200641016a28000021090240024020080d004101210a0c010b200641086a280200210b20081027220a450d05200a200b200810ce041a0b200141c0006a41086a220c200141206a41086a29020037030020012001290220370340024020052007470d00024020042007460d00200421070c010b200441016a220b2004490d1020044101742207200b200b2007491b2207ad42247e220d422088a70d10200da7220b4100480d100240024020040d00200b102721030c010b2003200441246c200b102821030b2003450d062001200736020420012003360200200721040b2003200541246c6a220b2008360210200b200836020c200b200a360208200b2009360001200b41013a0000200b2001290340370214200b411c6a200c2903003702002001200541016a22053602080b200641246a21062002415c6a22020d000b0b2001410036024041ff88c3004110200141c0006a41041003200141c0006a41086a220642003703002001420037034041888dc300410d200141c0006a1004200141206a41086a220b20062903003703002001200129034037032020012000290300220d370340200141206a4110200141c0006a41081003200642003703002001420037034041aa8dc300410d200141c0006a1004200b200629030037030020012001290340370320200141103602442001200141206a3602402001200141c0006a105c200642003703002001420037034041d18fc3004111200141c0006a1004200b200629030037030020012001290340370320200141206a4110200041146a220241201003411010272206450d03200641086a41002900bf8d43370000200641002900b78d433700002006411041201028220b450d04200b200d427f7c370010200141c0006a41186a22084200370300200141c0006a41106a220a4200370300200141c0006a41086a2206420037030020014200370340200b4118200141c0006a1000200141206a41186a2008290300370300200141206a41106a200a290300370300200141206a41086a2208200629030037030020012001290340370320200141206a4120200241201003200b1029200642003703002001420037034041958dc3004115200141c0006a10042008200629030037030020012001290340370320200141206a4110200041d4006a41201003200642003703002001420037034041e28fc3004115200141c0006a10042008200629030037030020012001290340370320200141106a200141206a10ba020240200128021422060d002001410136020c4100210b4100210e410021080c070b2001200636020c20012c001021082001280218210e2001411c6a280200220b41d100490d06200141c0006a41186a220a2000412c6a290000370300200141c0006a41106a2207200041246a290000370300200141c0006a41086a22092000411c6a29000037030020012000290014370340200b20084d0d05200620084105746a22022001290340370000200241186a200a290300370000200241106a2007290300370000200241086a2009290300370000200841187441808080086a41187541d1006f21080c070b1039000b20084101102a000b200b4104102a000b41104101102a000b41204101102a000b41f88fc3002008200b1037000b200141d8006a2000412c6a290000370300200141d0006a200041246a290000370300200141c8006a2000411c6a2900003703002001200029001437034002400240200b200e460d00200128020c21060c010b200b41016a2206200b490d06200b4101742202200620062002491b220e41ffffff3f71200e470d06200e41057422024100480d0602400240200b0d002002102721060c010b200128020c200b4105742002102821060b2006450d022001200636020c0b2006200b4105746a22022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a290300370000200b41016a210b0b200141c0006a41086a220242003703002001420037034041e28fc3004115200141c0006a1004200141206a41086a2002290300370300200120012903403703202001410036024820014201370340410110272202450d01200220083a00002001428180808010370244200120023602402001200b360210200b4105742109200141106a200141c0006a103041002001280248220b6b2102200128024021072001280244210a03400240200a20026a411f4b0d00200b41206a2208200b490d06200a410174220c20082008200c491b22084100480d0602400240200a0d002008102721070c010b2007200a2008102821070b2007450d072008210a0b2007200b6a22082006290000370000200841186a200641186a290000370000200841106a200641106a290000370000200841086a200641086a290000370000200241606a2102200b41206a210b200641206a2106200941606a22090d000b200141206a41102007200b10030240200a450d00200710290b0240200e450d00200128020c10290b200141c0006a41086a2206420037030020014200370340418890c300410d200141c0006a1004200141206a41086a2208200629030037030020012001290340370320200141206a4110100c20064200370300200142003703404187cec5004111200141c0006a10042008200629030037030020012001290340370320200141206a4110100c41121027220b450d02200b41106a41002f00a590433b0000200b41086a410029009d9043370000200b41002900959043370000200141c0006a41186a22024200370300200141c0006a41106a220a42003703002006420037030020014200370340200b4112200141c0006a1000200141206a41186a22072002290300370300200141206a41106a200a2903003703002008200629030037030020012001290340370320412010272206450d0320062001290320370000200641186a2007290300370000200641106a200141206a41106a290300370000200641086a200141206a41086a290300370000200b102920064120100e20061029200029030010bb0202402005450d00200541246c210b2003210603400240024020062d0000220841034b0d0002400240024020080e0404000102040b2006410c6a280200450d03200641086a28020010290c030b2006410c6a280200450d02200641086a28020010290c020b2006410c6a280200450d01200641086a28020010290c010b200641086a280200450d00200641046a28020010290b200641246a2106200b415c6a220b0d000b0b02402004450d00200310290b200141e0006a24000f0b20024101102a000b41014101102a000b41124101102a000b41204101102a000b102b000b20084101102a000b9d0202057f017e230041306b220224002002410036022020014110200241206a100521010240024002400240024020022802202203417f460d0020010d010b200041003602040c010b2002200136021020022003360214200241003a0020200241206a20012003410047220410ce041a20032004490d012002200320046b3602142002200120046a3602102003450d0220022d00202103200241206a200241106a102d20022802202204450d022002410c6a41026a2002411d6a41026a2d000022053a0000200220022f001d22063b010c20022902242107200020033a0000200020063b0001200041036a20053a00002000200737020820002004360204200110290b200241306a24000f0b20042003103e000b418f89c3004133104e000b93b10108047f017e207f017e057f037e127f0c7e230041c00c6b2201240020014198056a41086a22024200370300200142003703980541aa8dc300410d20014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200141003602980b200141d8076a4110200141980b6a100521020240024002400240024002400240024002400240024020012802980b2203417f460d002002450d00200120033602bc06200120023602b806200141980b6a200141b8066a104320012802980b2204450d02200129029c0b210502402003450d00200210290b20042005422088a7220641246c22076a2103200421020240200741ed00490d00200141980b6a41086a2108200421020340024020022d00004101470d00200241016a2800002107200241086a28020021092001200241106a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b0240200241246a2d00004101470d00200241256a28000021072002412c6a28020021092001200241346a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b0240200241c8006a2d00004101470d00200241c9006a2800002107200241d0006a28020021092001200241d8006a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b0240200241ec006a2d00004101470d00200241ed006a2800002107200241f4006a28020021092001200241fc006a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b200320024190016a22026b41ec004b0d000b0b20022003460d012004200641246c6a2103200141980b6a41086a21060340024020022d00004101470d00200241016a2800002107200241086a28020021092001200241106a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200641f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c050b2003200241246a2202470d000c020b0b42002105410421040b02402005422088a72202450d00200241246c21032004210203400240024020022d0000220741034d0d00200241086a280200450d01200241046a28020010290c010b02400240024020070e0403000102030b2002410c6a280200450d02200241086a28020010290c020b2002410c6a280200450d01200241086a28020010290c010b2002410c6a280200450d00200241086a28020010290b200241246a21022003415c6a22030d000b0b2005a70d020c030b418f89c3004133104e000b20022d002f210720022d002e210920022d002d210620022d002c210820022d002b210a20022d002a210b20022d0029210c20022d0028210d20022d0027210e20022d0026210f20022d0025211020022d0024211120022d0023211220022d0022211320022d0021211420022d0020211520022d001f211620022d001e211720022d001d211820022d001c211920022d001b211a20022d001a211b20022d0019211c20022d0018211d20022d0017211e20022d0016211f20022d0015212020022d0014212120022d0013212220022d0012212320022d0011212420022d0010212520022903002126200141b8046a41e2c5c50041131094010240024020012903c004500d0020012802b8040d010b20014198056a41086a22024200370300200142003703980541e2c5c500411320014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200120263703980b200141d8076a4110200141980b6a410810030b20014198056a41086a22024200370300200142003703980541f5c5c500411020014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200120263703980b200141d8076a4110200141980b6a4108100320024200370300200142003703980541a7c6c500411620014198056a1004200141b8066a41086a200229030037030020012001290398053703b806200141003602980b200141b8066a4110200141980b6a100521020240024020012802980b2203417f460d002002450d00200141980b6a2003412020034120491b22276a41004100412020276b2027411f4b1b10cd041a200141980b6a2002202710ce041a2003411f4d0d04200141d8076a41186a2203200141980b6a41186a2227290000370300200141d8076a41106a2228200141980b6a41106a2229290000370300200141d8076a41086a222a200141980b6a41086a222b290000370300200120012900980b3703d8072002102920272003290300222637030020292028290300222c370300202b202a290300222d370300200120012903d807222e3703980b2026a72102202ca72103202da72127202ea7212820012d00af0b212920012d00ae0b212a20012d00ad0b212b20012d00ac0b212f20012d00ab0b213020012d00aa0b213120012d00a90b213220012d00a70b213320012d00a60b213420012d00a50b213520012d00a40b213620012d00a30b213720012d00a20b213820012d00a10b213920012d009f0b213a20012d009e0b213b20012d009d0b213c20012d009c0b213d20012d009b0b213e20012d009a0b213f20012d00990b21400c010b200141a00b6a4200370300200141a80b6a4200370300200141b00b6a4200370300200142003703980b41002102410021294100212a4100212b4100212f4100213041002131410021324100210341002133410021344100213541002136410021374100213841002139410021274100213a4100213b4100213c4100213d4100213e4100213f41002140410021280b20012002200d733a00b00b20012029200e733a00af0b2001202a200f733a00ae0b2001202b2010733a00ad0b2001202f2011733a00ac0b200120302012733a00ab0b200120312013733a00aa0b200120322014733a00a90b200120032015733a00a80b200120332016733a00a70b200120342017733a00a60b200120352018733a00a50b200120362019733a00a40b20012037201a733a00a30b20012038201b733a00a20b20012039201c733a00a10b20012027201d733a00a00b2001203a201e733a009f0b2001203b201f733a009e0b2001203c2020733a009d0b2001203d2021733a009c0b2001203e2022733a009b0b2001203f2023733a009a0b200120402024733a00990b200120282025733a00980b200120012d00b10b200c733a00b10b200120012d00b20b200b733a00b20b200120012d00b30b200a733a00b30b200120012d00b40b2008733a00b40b200120012d00b50b2006733a00b50b200120012d00b60b2009733a00b60b200120012d00b70b2007733a00b70b20014198056a41086a22024200370300200142003703980541a7c6c500411620014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200141d8076a4110200141980b6a4120100302402005422088a72202450d00200241246c21032004210203400240024020022d0000220741034b0d0002400240024020070e0404000102040b2002410c6a280200450d03200241086a28020010290c030b2002410c6a280200450d02200241086a28020010290c020b2002410c6a280200450d01200241086a28020010290c010b200241086a280200450d00200241046a28020010290b200241246a21022003415c6a22030d000b0b2005a7450d010b200410290b20014198056a41086a220242003703002001420037039805418bf4c200411120014198056a100420014188066a41086a2002290300370300200120012903980537038806200141003602980b20014188066a4110200141980b6a100521020240024020012802980b2203417f460d002002450d00200120033602dc07200120023602d807200141980b6a200141d8076a104620012802980b2204450d03200129029c0b21052003450d01200210290c010b41082104420021050b20042005422088a7220641c8006c22026a21090240200241d9014f0d0041002102200421030c040b200441e0016a21034100210203400240200341a07e6a22072d00004101460d00200341a87e6a29030020005a0d060b0240200741c8006a2d00004101460d00200341f07e6a2903002000540d00200241016a21020c060b024020074190016a2d00004101460d00200341b87f6a2903002000540d00200241026a21020c060b02400240200741d8016a2d00004101460d00200329030020005a0d010b200341a0026a2103200241046a21022009200741a0026a6b41d8014d0d040c010b0b200241036a21020c040b418f89c3004133104e000b418f89c3004133104e000b200341a07e6a21030b20032009460d002004200641c8006c6a21070340024020032d00004101460d00200341086a29030020005a0d020b200241016a21022007200341c8006a2203470d000b0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200220064b0d000240200620026b2203450d002002450d0020042004200241c8006c6a200341c8006c10cf041a0b200141003a00980b20014198056a41086a22024200370300200142003703980541fcc7c500411720014198056a100420014188066a41086a200229030037030020012001290398053703880620014188066a4110200141980b6a41011003200141d8076a109801200141980b6a41186a200141d8076a41186a290300370300200141980b6a41106a200141d8076a41106a290300370300200141980b6a41086a2202200141d8076a41086a290300370300200120012903d8073703980b200141980b6a411410960302402005a7450d00200410290b20024200370300200142003703980b41f5c5c5004110200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a1005210202400240024020012802980b2203417f470d00420021050c010b024020020d00420021050c010b200142003703980b200141980b6a20022003410820034108491b10ce041a200341074d0d0120012903980b2105200210290b42002126200141980b6a41086a22024200370300200142003703980b41e2c5c5004113200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a100521020240024020012802980b2203417f460d002002450d00200142003703980b200141980b6a20022003410820034108491b10ce041a200341074d0d0120012903980b2126200210290b4200200520267d222620262005561b42eb02540d07200141b0046a4193c8c500411410b50120012802b404211c20012802b004211d200141980b6a41086a22024200370300200142003703980b41b6c8c5004115200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a10052102024002400240024020012802980b2203417f470d00410221190c010b024020020d00410221190c010b200141003a00980b200141980b6a20022003410047220710ce041a20032007490d022003450d0120012d00980b2119200210290b41a7c8c500410f108a02211f200141980b6a41086a22024200370300200142003703980b4190e1c1004112200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a1005211a0240024002400240024002400240024002400240024002400240024020012802980b221b417f460d00201a450d002001201b3602dc052001201a3602d805200141a8046a200141d8056a102e20012802a804450d2b0240024020012802ac042218412a2018412a491b22170d004101210e0c010b201741e0006c22021027220e450d0e0b02402018450d00200141980b6a41206a2102200141b8066a41206a210920012802d805210420012802dc0521074100210b4100210a410021080340200141f8046a2007412020074120491b22036a41004100412020036b2003411f4b1b10cd041a200141f8046a2004200310ce041a2001200420036a22063602d805200720036b21040240024002402007411f4b0d00200120043602dc050c010b200141d8046a41186a2210200141f8046a41186a220c290000370300200141d8046a41106a2211200141f8046a41106a220d290000370300200141d8046a41086a2212200141f8046a41086a220f290000370300200120012900f8043703d804200141f8046a2004412020044120491b22036a41004100412020036b2003411f4b1b10cd041a200141f8046a2006200310ce041a2001200620036a22073602d805200420036b210602402004411f4b0d00200120063602dc050c010b20014198056a41086a2213200f29000037030020014198056a41106a2214200d29000037030020014198056a41186a2215200c290000370300200120012900f80422053703b8052001200537039805200141f8046a2006412020064120491b22036a41004100412020036b2003411f4b1b10cd041a200141f8046a2007200310ce041a2001200720036a22043602d805200620036b21072006411f4b0d01200120073602dc050b2017450d2e200e10290c2e0b200841016a2103200141f8086a41086a2206200f290000370300200141f8086a41106a220f200d290000370300200141f8086a41186a220d200c290000370300200141b8066a41186a220c2015290300370300200141b8066a41106a22152014290300370300200141b8066a41086a22142013290300370300200120012900f80422053703b805200120053703f80820012001290398053703b806200920012903f808370000200941086a2006290300370000200941106a200f290300370000200941186a200d290300370000200141800a6a41386a2206200141b8066a41386a290300370300200141800a6a41306a220d200141b8066a41306a290300370300200141800a6a41286a220f200141b8066a41286a290300370300200141800a6a41206a22132009290300370300200141800a6a41186a2216200c290300370300200141800a6a41106a220c2015290300370300200141800a6a41086a22152014290300370300200120012903b8063703800a200141980b6a41186a2010290300370300200141980b6a41106a2011290300370300200141980b6a41086a2012290300370300200120012903d8043703980b200220012903800a370000200241086a2015290300370000200241106a200c290300370000200241186a2016290300370000200241206a2013290300370000200241286a200f290300370000200241306a200d290300370000200241386a2006290300370000200141d8076a200141980b6a41e00010ce041a024020082017470d00200b20032003200b491b2217ad42e0007e2205422088a70d2d2005a722064100480d2d0240024020080d0020061027210e0c010b200e200a20061028210e0b200e450d050b200e200a6a200141d8076a41e00010ce041a200b41026a210b200a41e0006a210a2003210820182003470d000b200120073602dc050b200e450d2b201b450d01201a10290c010b4101210e41002118410021170b4100210702400240201841e0006c22020d004101211b4100211e0c010b200241e0006e221e41057422031027221b450d0b0b0240200e200e20026a22164622140d00201841e0006c210941002107201b2102200e2103034020022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200741016a2107200241206a2102200341e0006a2103200941a07f6a22090d000b0b200141980b6a41086a22024200370300200142003703980b41abccc1004112200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602a00b200142013703980b200120073602d807200141d8076a200141980b6a10300240024020070d0020012802a00b2103200128029c0b210420012802980b21060c010b20074105742108410020012802a00b22036b210920012802980b2106200128029c0b2104201b210203400240200420096a411f4b0d00200341206a22072003490d2b2004410174220a20072007200a491b22074100480d2b0240024020040d002007102721060c010b200620042007102821060b2006450d04200721040b200620036a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200941606a2109200341206a2103200241206a2102200841606a22080d000b2001200436029c0b200120033602a00b200120063602980b0b201c4100201d1b2102200141e8056a411020062003100302402004450d00200610290b200141c8046a200241026a10a4030240024020012802c804221a0d00200141980b6a41086a22034200370300200142003703980b41abccc1004112200141980b6a1004200141e8056a41086a2003290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a100521070240024020012802980b2209417f460d002007450d00200120093602dc07200120073602d807200141980b6a200141d8076a102d20012802980b220f450d0d200141a00b6a2802002103200128029c0b21102009450d01200710290c010b4101210f41002103410021100b201f201f41ff01714102477121114100211c0c010b200141d0046a28020021034101211c20012802cc042110201a210f410121110b200141980b6a41086a22074200370300200142003703980b4193c8c5004114200141980b6a1004200141e8056a41086a2007290300370300200120012903980b3703e805410121122001200241016a22133602980b200141e8056a4110200141980b6a410410034100210b02400240200341057422020d004100211d0c010b2002410575221dad42e0007e2205422088a70d292005a722074100480d29200710272212450d090b0240200f20026a200f460d0020034105742104200141d8076a4101722107200141980b6a41206a21024100210b20122106200f21030340200341086a2900002105200341106a29000021262003290000212c200141b8066a41186a2208200341186a290000370300200141b8066a41106a220a2026370300200141b8066a41086a220c20053703002001202c3703b806200141f8086a200141b8066a108d01200141d8076a20012802f808220d200128028009108e0141002109024020012d00d8074101470d00200141800a6a41386a200741386a290000370300200141800a6a41306a200741306a290000370300200141800a6a41286a200741286a290000370300200141800a6a41206a200741206a290000370300200141800a6a41186a200741186a290000370300200141800a6a41106a200741106a290000370300200141800a6a41086a200741086a290000370300200120072900003703800a410121090b024020012802fc08450d00200d10290b0240024020090d00200141d8076a41386a4200370300200141d8076a41306a4200370300200141d8076a41286a4200370300200141d8076a41206a4200370300200141d8076a41186a4200370300200141d8076a41106a4200370300200141d8076a41086a4200370300200142003703d8070c010b200141d8076a41386a200141800a6a41386a290300370300200141d8076a41306a200141800a6a41306a290300370300200141d8076a41286a200141800a6a41286a290300370300200141d8076a41206a200141800a6a41206a290300370300200141d8076a41186a200141800a6a41186a290300370300200141d8076a41106a200141800a6a41106a290300370300200141d8076a41086a200141800a6a41086a290300370300200120012903800a3703d8070b200341206a2103200220012903d807370000200141980b6a41086a200c290300370300200141980b6a41106a200a290300370300200141980b6a41186a2008290300370300200241086a200141d8076a41086a290300370000200241106a200141d8076a41106a290300370000200241186a200141d8076a41186a290300370000200241206a200141d8076a41206a290300370000200241286a200141d8076a41286a290300370000200241306a200141d8076a41306a290300370000200241386a200141d8076a41386a290300370000200120012903b8063703980b200b41016a210b2006200141980b6a41e00010ce0441e0006a2106200441606a22040d000b0b02402010450d00200f10290b200bad42e0007e2205422088a70d072005a72202417f4c0d070240024020020d004101210c0c010b20021027220c450d070b410021090240200b450d002012200b41e0006c6a2106200141980b6a41c0006a2103200141980b6a41206a210741002109200c2104201221020340200141980b6a41186a200241186a290000370300200141980b6a41106a200241106a290000370300200141980b6a41086a200241086a290000370300200120022900003703980b2007200241206a290000370000200741086a200241286a290000370000200741106a200241306a290000370000200741186a200241386a2900003700002003200241c0006a290000370000200341086a200241c8006a290000370000200341106a200241d0006a290000370000200341186a200241d8006a290000370000200941016a21092004200141980b6a41e00010ce0441e0006a2104200241e0006a22022006470d000b0b200141980b6a41086a22024200370300200142003703980b4190e1c1004112200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602a00b200142013703980b200120093602d807200141d8076a200141980b6a10300240024020090d0020012802a00b2102200128029c0b210320012802980b21070c010b200c200941e0006c6a210d410020012802a00b22066b210420012802980b2107200128029c0b2103410021090340200620096a210a0240024002400240200320046a411f4b0d00200a41206a2202200a490d2e20034101742208200220022008491b22024100480d2e0240024020030d002002102721070c010b200720032002102821070b2007450d01200221030b200720066a20096a2208200c20096a2202290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200320046a41606a411f4b0d02200a41206a220f41206a2208200f490d2d2003410174220f20082008200f491b220841004e0d010c2d0b20024101102a000b0240024020030d002008102721070c010b200720032008102821070b2007450d05200821030b200720066a20096a220841386a200241386a290000370000200841306a200241306a290000370000200841286a200241286a290000370000200841206a200241206a2900003700000240200320046a41406a411f4b0d00200a41c0006a220a41206a2208200a490d2b2003410174220a20082008200a491b22084100480d2b0240024020030d002008102721070c010b200720032008102821070b2007450d06200821030b200720066a20096a220841d8006a200241d8006a290000370000200841d0006a200241d0006a290000370000200841c8006a200241c8006a290000370000200841c0006a200241c0006a290000370000200441a07f6a2104200941e0006a2109200241e0006a200d470d000b2001200336029c0b200120073602980b2001200620096a22023602a00b0b200141e8056a411020072002100302402003450d00200710290b0240200b450d00200c10290b200120113a00d807200141980b6a41086a22024200370300200142003703980b41b6c8c5004115200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141e8056a4110200141d8076a410110032001201336029c0b200141043a00980b41b8d6c5004100200141980b6a108801410810272203450d05200320163602042003200e3602002019201941ff017141024771450d110240024020140d002003200e41e0006a360200200141980b6a41186a2202200e41386a290000370300200141980b6a41106a2207200e41306a290000370300200141980b6a41086a2209200e41286a2900003703002001200e290020220537039805200120053703980b200e0d010b2003102941002102410821044108210f410021070c140b200141d8076a41186a2002290300370300200141d8076a41106a2007290300370300200141d8076a41086a2009290300370300200120012903980b3703d807200328020420032802006b41e0006e41016a2202ad42287e2205422088a70d072005a7220710272204450d04200420012903d80737030020044201370320200441186a200141d8076a41186a2213290300370300200441106a200141d8076a41106a2214290300370300200441086a200141d8076a41086a22152903003703000240200328020022072003280204470d00410121072004210f0c130b2003200741e0006a36020020014198056a41086a2218200741286a2900002205370300200141980b6a41186a2206200741386a290000370300200141980b6a41106a2208200741306a290000370300200141980b6a41086a220a200537030020012007290020220537039805200120053703980b4102210741c800210903402013200629030022053703002014200829030022263703002015200a290300222c370300200120012903980b222d3703d807200141f8046a41186a220c2005370300200141f8046a41106a220d2026370300200141f8046a41086a220f202c3703002001202d3703f80402400240024002402007417f6a2002460d00200221100c010b200328020420032802006b41e0006e20026a41016a22102002490d2c20024101742211201020102011491b2210ad42287e2205422088a70d2c2005a722114100480d2c0240024020020d002011102721040c010b2004200241286c2011102821040b2004450d010b200420096a221141606a220220012903f804370300200f2903002105200d2903002126200c290300212c20114201370300200241186a202c370300200241106a2026370300200241086a2005370300200328020022022003280204470d012004210f201021020c150b20114108102a000b2003200241e0006a3602002018200241286a29000022053703002006200241386a2900003703002008200241306a290000370300200a200537030020012002290020220537039805200120053703980b200941286a2109200741016a2107201021020c000b0b20064101102a000b20074101102a000b20084101102a000b20084101102a000b20074108102a000b41084104102a000b20024101102a000b1039000b20074101102a000b418f89c3004133104e000b20034101102a000b20024101102a000b418f89c3004133104e000b20072003103e000b418f89c3004133104e000b418f89c3004133104e000b419cb1c5001058000b200310290c020b200310290b200141b8056a41086a22034200370300200142003703b80541c6c4c500411b200141b8056a1004200141980b6a41086a2003290300370300200120012903b8053703980b200141003602d807200141980b6a4110200141d8076a100521030240024020012802d8072206417f460d002003450d00200120063602bc06200120033602b806200141d8076a200141b8066a104120012802d807220d450d14200141e0076a280200210920012802dc0721102006450d01200310290c010b4108210d41002109410021100b0240024020072009470d00200f200d460d01200741286c41286e22032007200720034b1b210c417f2106200f2103200d21090340200641016a2206200c4f0d02024020032009460d0020032009412010d0040d020b200941206a2108200341206a210a200341286a2103200941286a2109200a2903002008290300510d000b0b200141b8056a41086a22034200370300200142003703b8054199a7c1004117200141b8056a1004200141980b6a41086a2003290300370300200120012903b8053703980b200141003602d807200141980b6a4110200141d8076a1005210302400240024020012802d8072209417f460d002003450d00200142003703d807200141d8076a200320094108200941084922061b220410ce041a024020060d0020012903d8072105200142003703d807200141d8076a200320046a200920046b2209410820094108491b10ce041a200941074b0d020b418f89c3004133104e000b200120073602a00b2001200236029c0b200120043602980b200141980b6a42004200200510f6010c010b20012903d807212620031029200141980b6a4110100c200120073602a00b2001200236029c0b2001200f3602980b200141980b6a20054201202610f6010b2010450d01200d10290c010b02402010450d00200d10290b2002450d00200410290b410810272202450d10200220163602042002200e360200410810272203450d0f20032012200b41e0006c6a220f3602042003201236020020014198046a41c3c5c500410f10940120012903a00442002001280298041b220542017c222d2005540d0e200141b8056a41086a22074200370300200142003703b80541c3c5c500410f200141b8056a1004200141b8066a41086a22092007290300370300200120012903b8053703b8062001202d3703980b200141b8066a4110200141980b6a4108100320014184cac10036029c0b200120023602980b2001200141800a6a3602a00b200141d8056a200141980b6a104c200141980b6a41086a200141d8056a41086a280200360200200120012903d8053703980b20074200370300200142003703b80541d2c5c5004110200141b8056a100420092007290300370300200120012903b8053703b806200141103602dc072001200141b8066a3602d807200141980b6a200141d8076a102f0240200128029c0b450d0020012802980b10290b20014188046a41f5c5c500411010940120012903900421052001280288042102200141f8036a41e2c5c5004113109401024042002005420020021b2226200129038004420020012802f8031b22057d222c202c2026561b42eb02540d00034042002026427f200542eb027c222c202c2005541b22057d222c202c2026561b42ea02560d000b0b200141b8056a41086a22024200370300200142003703b80541e2c5c5004113200141b8056a1004200141b8066a41086a2002290300370300200120012903b8053703b806200120053703980b200141b8066a4110200141980b6a41081003202d42017c2205202d540d0d20024200370300200142003703b8054194c6c5004113200141b8056a100420014188066a41086a2002290300370300200120012903b80537038806200141003602980b20014188066a4110200141980b6a100521020240024020012802980b2207417f460d002002450d00200141f8086a2007412020074120491b22096a41004100412020096b2009411f4b1b10cd041a200141f8086a2002200910ce041a2007411f4d0d0e20014198056a41186a2207200141f8086a41186a29030037030020014198056a41106a2209200141f8086a41106a29030037030020014198056a41086a2204200141f8086a41086a290300370300200120012903f8083703980520021029200141d8076a41186a2007290300370300200141d8076a41106a2009290300370300200141d8076a41086a200429030037030020012001290398053703d8070c010b200141e0076a4200370300200141e8076a4200370300200141f0076a4200370300200142003703d8070b200141d8046a41186a200141d8076a41186a290300370300200141d8046a41106a200141d8076a41106a290300370300200141d8046a41086a200141d8076a41086a290300370300200120012903d8073703d804200141b8056a41086a22024200370300200142003703b80541a7c6c5004116200141b8056a100420014198056a41086a2002290300370300200120012903b80537039805200141003602980b20014198056a4110200141980b6a100521020240024020012802980b2207417f460d002002450d0020014188066a2007412020074120491b22096a41004100412020096b2009411f4b1b10cd041a20014188066a2002200910ce041a2007411f4d0d0d200141b8056a41186a220720014188066a41186a290300370300200141b8056a41106a220920014188066a41106a290300370300200141b8056a41086a220420014188066a41086a29030037030020012001290388063703b80520021029200141f8046a41186a2007290300370300200141f8046a41106a2009290300370300200141f8046a41086a2004290300370300200120012903b8053703f8040c010b20014180056a420037030020014188056a420037030020014190056a4200370300200142003703f8040b200141980b6a41186a200141d8046a41186a290300370300200141980b6a41106a200141d8046a41106a290300370300200141980b6a41086a2209200141d8046a41086a290300370300200141c80b6a200141f8046a41086a290300370300200141d00b6a200141f8046a41106a290300370300200141d80b6a200141f8046a41186a290300370300200120012903d8043703980b200120053703b80b200120012903f8043703c00b200141b8056a41186a22074200370300200141b8056a41106a22044200370300200141b8056a41086a22024200370300200142003703b805200141980b6a41c800200141b8056a1000200141f8086a41186a2007290300370300200141f8086a41106a2004290300370300200141f8086a41086a2002290300370300200120012903b8053703f80820024200370300200142003703b80541a7c6c5004116200141b8056a1004200141b8066a41086a22072002290300370300200120012903b8053703b806200141b8066a411041b3b4c3004120100320024200370300200142003703b8054194c6c5004113200141b8056a100420072002290300370300200120012903b8053703b806200141b8066a4110200141f8086a41201003200141e8056a41186a200141d8076a41186a2903002226370300200141e8056a41106a200141d8076a41106a290300222c370300200141e8056a41086a200141d8076a41086a290300222d370300200120012903d807222e3703e80520014188066a41186a202637030020014188066a41106a202c37030020014188066a41086a202d3703002001202e3703880620024200370300200142003703b8054185c6c500410f200141b8056a100420072002290300370300200120012903b8053703b806200141b8066a411020014188066a4120100320014184cac10036029c0b200120033602980b2001200141800a6a3602a00b200141800a6a200141980b6a104c200141e8036a41e2c5c500411310940120012903f003212620012802e803210420024200370300200142003703b8054194c6c5004113200141b8056a100420092002290300370300200120012903b8053703980b200141003602d807200141980b6a4110200141d8076a100521020240024020012802d8072203417f460d002002450d0020014198056a2003412020034120491b22076a41004100412020076b2007411f4b1b10cd041a20014198056a2002200710ce041a2003411f4d0d0c200141f8046a41186a220320014198056a41186a290300370300200141f8046a41106a220720014198056a41106a290300370300200141f8046a41086a220920014198056a41086a29030037030020012001290398053703f80420021029200141f8086a41186a2003290300370300200141f8086a41106a2007290300370300200141f8086a41086a2009290300370300200120012903f8043703f8080c010b20014180096a420037030020014188096a420037030020014190096a4200370300200142003703f8080b200141d8076a41086a200141f8086a41086a290300370300200141d8076a41106a200141f8086a41106a290300370300200141d8076a41186a200141f8086a41186a290300370300200120012903f8083703d80720012802800a210c20012802840a211020012802880a2107200141003602a00b200142013703980b410110272202450d09200142818080801037029c0b200120023602980b200241013a000020024101410910282202450d0820014289808080900137029c0b200120023602980b200220053700010240200128029c0b220920012802a00b22036b41074b0d00200341086a22062003490d1420094101742208200620062008491b22064100480d140240024020090d002006102721020c010b200220092006102821020b2002450d082001200636029c0b200120023602980b0b2001200341086a3602a00b200220036a427f2026420020041b220542eb027c222620262005541b3700000240200128029c0b220920012802a00b22036b41074b0d00200341086a22042003490d1420094101742206200420042006491b22044100480d140240024020090d002004102721020c010b200220092004102821020b2002450d072001200436029c0b200120023602980b0b2001200341086a3602a00b200220036a42eb02370000200120073602b806200141b8066a200141980b6a10300240024020070d00200128029c0b210920012802a00b21020c010b200c200741286c6a210d410020012802a00b220a6b2104200128029c0b2109410021020340200a20026a210602400240200920046a4120490d0020012802980b21070c010b200641206a22032006490d1620094101742207200320032007491b22034100480d160240024020090d002003102721070c010b20012802980b20092003102821070b2007450d082001200336029c0b200120073602980b200321090b2007200a6a20026a220841186a200c20026a220341186a290000370000200841106a200341106a290000370000200841086a200341086a2900003700002001200641206a220b3602a00b20082003290000370000200341206a29030021050240200920046a41606a41074b0d00200b41086a2208200b490d162009410174220b20082008200b491b22084100480d160240024020090d002008102721070c010b200720092008102821070b2007450d072001200836029c0b200120073602980b200821090b2001200641286a3602a00b2007200a6a20026a41206a2005370000200441586a2104200241286a2102200d200341286a470d000b200a20026a21020b02400240200920026b4120490d0020012802980b21030c010b200241206a22032002490d1420094101742207200320032007491b22074100480d140240024020090d002007102721030c010b20012802980b20092007102821030b2003450d042001200736029c0b200120033602980b0b200320026a220341086a200141d8076a41086a2903003700002001200241206a3602a00b200320012903d807370000200341106a200141d8076a41106a290300370000200341186a200141d8076a41186a290300370000200141c3066a20012802a00b360000200120012903980b3700bb06200141a40b6a200141bf066a290000370000200141c28289aa043600990b200141023a00980b200120012900b80637009d0b200141980b6a10970302402010450d00200c10290b410810272203450d02200320163602042003200e360200410810272207450d012007200f36020420072012360200200141d8036a41888dc300410d10940120012903e003210520012802d8032102200141b8056a41086a22094200370300200142003703b80541d9b0c0004111200141b8056a1004200141980b6a41086a2009290300370300200120012903b8053703980b20012005420020021b3703d807200141980b6a4110200141d8076a41081003200141d0036a4193c8c500411410b50120012802d403210220012802d0032109200141c8036a41d685c500411810b5012002410020091b21020240024020012802c8030d00200141b8056a41086a22094200370300200142003703b80541d685c5004118200141b8056a1004200141980b6a41086a2009290300370300200120012903b8053703980b200120023602d807200141980b6a4110200141d8076a410410030c010b200220012802cc036b4107490d00200141b8056a41086a22094200370300200142003703b80541d685c5004118200141b8056a1004200141980b6a41086a2009290300370300200120012903b8053703980b200120023602d807200141980b6a4110200141d8076a41041003200141c0036a4193c8c500411410b50120012802c403210220012802c0032109200141b8036a41d685c500411810b5012002410020091b2109024020012802b8030d002009109e010c010b20012802bc03220220094f0d0003402002109e012009200241016a2202470d000b0b20071029200310290240201d450d00201210290b0240201a45201c720d0020012802cc04450d00201a10290b0240201e450d00201b10290b2017450d00200e10290b024020004280ce18824200520d000240024041f586c500411f108a02220241ff01714102460d0020024101710d010b200010a503450d01200010a6031a0c010b200010a603450d00200010a5031a0b200141b0036a41e286c500411310b50120012802b403210220012802b0032103200141a8036a41c986c500411910b501024002400240024002402002410020031b220220012802ac03410020012802a8031b22034f0d00200141a40b6a210902400340200141980b6a200210a70320012802a00b22074112470d012003200241016a2202470d000c020b0b20012903980b2105200141b8066a200941940110ce041a200141800a6a200141b8066a41940110ce041a200141a80b6a22092007360200200120053703a00b200120023602980b200141ac0b6a200141800a6a41940110ce04210420052000510d012009103d0b4100212941082128410021070c010b200141f8086a41086a2209200141980b6a41086a290300370300200120012903980b3703f808200141d8076a200441940110ce041a200141b8066a41086a22042009290300370300200120012903f8083703b806200141980b6a200141d8076a41940110ce041a41a80110272228450d02202820012903b80637030020282007360210202841086a2004290300370300202841146a200141980b6a41940110ce041a0240200241016a22022003490d0041012107410121290c010b200141980b6a41106a210c200141980b6a41146a2106200141a40b6a210841012129410121070340200141980b6a200210a703024020012802a00b22094112470d002003200241016a2202470d010c020b20012903980b2105200141b8066a200841940110ce041a200141800a6a200141b8066a41940110ce041a200120093602a80b200120053703a00b200120023602980b2006200141800a6a41940110ce042104024020052000510d00200c103d0c020b20014188066a41086a220a200141980b6a41086a290300370300200120012903980b37038806200141d8076a200441940110ce041a20014198056a41086a220b200a290300370300200120012903880637039805200141980b6a200141d8076a41940110ce041a024020292007470d00202941016a22042029490d172029410174220a20042004200a491b2204ad42a8017e2205422088a70d172005a7220a4100480d170240024020290d00200a102721280c010b2028202941a8016c200a102821280b2028450d03200421290b2028200741a8016c6a2204200129039805370300200441086a200b290300370300200441106a2009360200200441146a200141980b6a41940110ce041a200741016a2107200241016a22022003490d000b0b2028200741a8016c6a2123024020070d002028211e0c140b200141b8066a41086a2127200141980b6a41086a2111200141980b6a4104722102200141c4066a21252028211e0340201e41106a2802002103201e2902082105201e2802002109200141980b6a201e41146a41940110ce041a201e41a8016a211e20034112460d14200141800a6a200141980b6a41940110ce041a200120033602c006200120053703b8062025200141800a6a41940110ce041a200141d8076a200910a80320012802d80721080240024020012802e00722030d00420021414200214242002143420021444200212e420021450c010b200341057421044200212e200821034200214542002143420021444200214142002142034020014198036a200310950120014198036a41086a2903002126200129039803210520022003290000370000200241086a200341086a290000370000200241106a200341106a290000370000200241186a200341186a290000370000200120093602980b20014190036a200141980b6a10a90320012d00900341017121070240024020012d00910322060d00200141d0026a20052026420a420010d40420012903d002222c2105200141d0026a41086a290300222d21260c010b200141f0026a202642002006ad222c420010d30420014180036a20054200202c420010d304200141e0026a420042002005420010d304427f20014180036a41086a290300222c20012903f00220012903e0027c7c222d20012903f80220012903e80284420052202d202c547222061b212d427f20012903800320061b212c0b200341206a21034200202d20071b20447c4200202c20071b224620437c2243204654ad7c2144202d420020071b20427c202c420020071b222c20417c2241202c54ad7c2142202620457c2005202e7c222e200554ad7c2145200441606a22040d000b0b024020012802dc07450d00200810290b200141d8076a200910a80320012802d807210c0240024020012802e00722030d00420021464200214742002148420021494200212d4200214a0c010b200341057421044200212d200c21034200214a42002148420021494200214642002147034020022003290000370000200241086a200341086a2207290000370000200241106a200341106a2206290000370000200241186a200341186a2208290000370000200120093602980b200141c8026a200141980b6a10a90320012d00c802210a20012d00c902210b200141980b6a41186a2008290000370300200141980b6a41106a200629000037030020112007290000370300200120032900003703980b200141a8026a2009200141980b6a200b411010aa03200141a8026a41186a290300204a7c20012903b8022205202d7c222d200554ad7c214a4200200141a8026a41086a2903002205200a41017122071b20497c420020012903a802222620071b222c20487c2248202c54ad7c21492005420020071b20477c2026420020071b220520467c2246200554ad7c2147200341206a2103200441606a22040d000b0b024020012802dc07450d00200c10290b20014198056a41086a22214200370300200142003703980541b18ac000411620014198056a1004200141b8056a41086a2210202129030037030020012001290398053703b805200141003602980b200141b8056a4110200141980b6a100521030240024020012802980b2207417f460d002003450d00200142003703a00b200142003703980b200141980b6a20032007411020074110491b10ce041a02402007410f4d0d002011290300210520012903980b2126200310290c020b418f89c3004133104e000b42002126420021050b02400240202d202e7c222c420288204a20457c202c202d54ad7c222d423e8684222e202c85202d4202882245202d8584500d00202e204584500d00410021030240034020014198026a202c202d200341046a41fe007110d204200341026a2103200129039802222e202c8520014198026a41086a2903002245202d8584500d01202e2045844200520d000b0b20014188026a202c202d200341fe007110d20420012903880220014188026a41086a29030084212e42002145024020030d00202e420052ad212e0c020b202e420052ad212e0340200141e8016a202c202d41002003417e6a2207200720034b1b220341ff007110d204200141f8016a202e420186224b420184224a2045420186202e423f88842245204a204510d304204b204a20012903f80120012903e80156200141f8016a41086a290300222e200141e8016a41086a290300224c56202e204c511b1b212e20030d000c020b0b42002145202c202d84420052ad212e0b0240024020264202882005423e8684222c2026852005420288222d20058584500d00202c202d84500d004100210302400340200141d8016a20262005200341046a41fe007110d204200341026a210320012903d801222c202685200141d8016a41086a290300222d20058584500d01202c202d844200520d000b0b200141c8016a20262005200341fe007110d20420012903c801200141c8016a41086a29030084212c4200212d024020030d00202c420052ad212c0c020b202c420052ad212c0340200141a8016a2026200541002003417e6a2207200720034b1b220341ff007110d204200141b8016a202c420186224b420184224a202d420186202c423f8884222d204a202d10d304204b204a20012903b80120012903a80156200141b8016a41086a290300222c200141a8016a41086a290300224c56202c204c511b1b212c20030d000c020b0b4200212d2026200584420052ad212c0b02400240024002400240202e20458450450d004100210c0c010b204920447c204820437c2226204854ad7c2148204720427c204620417c2205204654ad7c214602400240024020012d00d0070e03010200010b2005202656204620485620462048511b210c0c020b0340200141d8006a20262048202e204510d404202c2241202d2242844200510d04200141d8006a41086a290300212c2001290358212d200141c8006a200520462041204210d4044101210c202d2001290348224354202c200141c8006a41086a290300224a54202c204a5122031b0d0202402043202d54204a202c5420031b450d004100210c0c030b200141386a202d202c202e204510d304200141286a2043204a2041204210d304024020052001290328222c7d222d2046200141286a41086a2903007d2005202c54ad7d224a84500d002048200141386a41086a2903007d2143202620012903382205542103202620057d212c202e210520452146202d212e204a21452041212620422148202c20432003ad7d222d84500d030c010b0b4100210c0c010b03402045214a202e2141202c202d844200510d0220014188016a200520462041204a10d40420014198016a20262048202c202d10d4044101210c200129039801224220012903880122435420014198016a41086a290300222e20014188016a41086a290300224554202e20455122031b0d01024020432042542045202e5420031b450d004100210c0c020b200141f8006a2042202e202c202d10d304200141e8006a204320452041204a10d304024020052001290368222e7d22452046200141e8006a41086a2903007d2005202e54ad7d22428450450d004100210c0c020b2048200141f8006a41086a2903007d2143202620012903782205542103202620057d212e202c2105202d21462045212c2042212d20412126204a2148202e20432003ad7d2245844200520d000b0b200141980b6a200910a80320012802980b2122200128029c0b212420012802a00b2203450d022022200341057422156a2120202221030340200141f8086a41186a2216200341186a22072900002205370300200141f8086a41106a2217200341106a22042900002226370300200141f8086a41086a2218200341086a2206290000222c37030020012003290000222d3703f808200141d8076a41086a2208202c370300200141d8076a41106a220a2026370300200141d8076a41186a220b2005370300200141b8056a41186a22192007290000370300200141b8056a41106a221a2004290000370300201020062900003703002001202d3703d807200120032900003703b80520032900002105200241186a221b200729000037000020022005370000200241086a221c2006290000370000200241106a221d2004290000370000200120093602980b200141206a200141980b6a10a903410221070240200c20012d0020410171220445734101470d0020012d0021211f20014188066a41186a200b29030037030020014188066a41106a200a29030037030020014188066a41086a2008290300370300200120012903d80737038806200421070b200141e8056a41086a221220014188066a41086a220d290300370300200141e8056a41106a221320014188066a41106a220e290300370300200141e8056a41186a221420014188066a41186a220f29030037030020012001290388063703e8050240024020074102460d00200341206a21030c010b200341206a2103201541606a22150d010c040b0b0340200141f8046a41086a20122903002205370300200141f8046a41106a20132903002226370300200141f8046a41186a2014290300222c370300200120012903e805222d3703f804200141980b6a41186a202c370300200141980b6a41106a2026370300201120053703002001202d3703980b200142e4cab5fbb6ccdcb0e3003703d804200141d8046a200141980b6a201f411874411875410274419886c5006a3502004280af1a7e20007c10a60120032020460d0303402016200341186a220729000022053703002017200341106a220429000022263703002018200341086a2206290000222c37030020012003290000222d3703f80820192007290000370300201a2004290000370300201020062900003703002003290000212e2008202c370300200a2026370300200b20053703002001202e3703b8052001202d3703d807200120093602980b20062900002105200429000021262003290000212c201b2007290000370000201d2026370000201c20053700002002202c370000200141186a200141980b6a10a903410221070240200c20012d0018410171220445734101470d0020012d0019211f200f200b290300370300200e200a290300370300200d2008290300370300200120012903d80737038806200421070b2012200d2903003703002013200e2903003703002014200f29030037030020012001290388063703e805024020074102470d002020200341206a2203470d010c050b0b200341206a21030c000b0b41c4a7c1001058000b41c4a7c1001058000b02402024450d00202210290b200910ab0302400240200c0d00200141053a00a00b200141053a00980b200120093602a40b41b8d6c5004100200141980b6a10880120214200370300200142003703980541e286c500411320014198056a10042010202129030037030020012001290398053703b8052001200941016a3602980b200141b8056a4110200141980b6a410410032027103d0c010b200120093602a40b200141043a00a00b200141053a00980b41b8d6c5004100200141980b6a108801024020012903c8072205500d00200141d8076a200141b8066a41a00110ce041a20014188066a200520007c220510ac03200141980b6a200141d8076a41a00110ce041a200141f8086a201141880110ce041a02400240024002400240200128028c0622062001280290062203460d0020012802880621040c010b200341016a22072003490d1b20034101742204200720072004491b2206ad4290017e2226422088a70d1b2026a722074100480d1b0240024020030d002007102721040c010b20012802880620034190016c2007102821040b2004450d012001200636028c0620012004360288060b200420034190016c220c6a200141f8086a41880110ce044188016a20093602002001200341016a220736029006411710272203450d012003410f6a41002900ffd143370000200341086a41002900f8d143370000200341002900f0d14337000020034117412e10282203450d0220032005370017200141f8086a41186a22084200370300200141f8086a41106a220a4200370300200141f8086a41086a220b4200370300200142003703f8082003411f200141f8086a1000200141b8056a41186a2008290300370300200141b8056a41106a200a2903003703002010200b290300370300200120012903f8083703b8052001412036029c0b2001200141b8056a3602980b20014188066a200141980b6a10312003102902402007450d00200c4190016a2107200421030340024020032802004112460d002003103d0b20034190016a2103200741f07e6a22070d000b0b02402006450d00200410290b20214200370300200142003703980541e286c500411320014198056a10042010202129030037030020012001290398053703b8052001200941016a3602980b200141b8056a4110200141980b6a410410030c040b20074108102a000b41174101102a000b412e4101102a000b200141980b6a202741880110ce041a200141003b01d807200141106a200141980b6a200141d8076a10ad0220012001280210453a00a10b200141073a00a00b200141053a00980b200120093602a40b41b8d6c5004100200141980b6a10880120214200370300200142003703980541e286c500411320014198056a10042010202129030037030020012001290398053703b8052001200941016a3602980b200141b8056a4110200141980b6a410410030b201e2023470d000b2023211e0c130b200a4108102a000b41a8014108102a000b41084104102a000b41084104102a000b20074101102a000b20084101102a000b20034101102a000b20044101102a000b20064101102a000b41094101102a000b41014101102a000b418f89c3004133104e000b418f89c3004133104e000b418f89c3004133104e000b41eab3c30041c900104e000b41eab3c30041c900104e000b41084104102a000b41084104102a000b418f89c3004133104e000b0240201e2023460d00200141980b6a41106a2109200141980b6a41146a21040340200141b8056a41086a2203201e41086a2903003703002001201e2903003703b805201e41106a2802002102200141980b6a201e41146a41940110ce041a20024112460d01200141b8066a41086a22072003290300370300200120012903b8053703b806200141d8076a200141980b6a41940110ce041a200141980b6a41086a2007290300370300200120012903b8063703980b200120023602a80b2004200141d8076a41940110ce041a2009103d201e41a8016a221e2023470d000b0b02402029450d00202810290b02400240411710272202450d002002410f6a41002900ffd143370000200241086a41002900f8d143370000200241002900f0d143370000024020024117412e10282202450d0020022000370017200141f8086a41186a22034200370300200141f8086a41106a22074200370300200141f8086a41086a22094200370300200142003703f8082002411f200141f8086a1000200141b8056a41186a2003290300370300200141b8056a41106a2007290300370300200141b8056a41086a2009290300370300200120012903f8083703b805200141003602980b200141b8056a4120200141980b6a1005210702400240024020012802980b2203417f460d00200120033602dc07200120073602d807200141980b6a200141d8076a103b20012802980b22080d01418f89c3004133104e000b4100210a41082108410021030c010b200129029c0b210502402003450d00200710290b200141b8056a4120100c2005422088a721032005a7210a0b20021029200820034190016c22026a2109024020030d00200821020c030b200241f07e6a2107200141980b6a410472210620082102034020022802002103200141d8076a200241046a41840110ce041a0240024020034113460d00200141980b6a200141d8076a41840110ce041a024020034112470d0020070d02200921020c060b20024188016a2802002104200141b8066a200141980b6a41840110ce041a200120033602980b2006200141b8066a41840110ce041a200141003b01d807200141086a200141980b6a200141d8076a10ad0220012802082103200120043602a40b20012003453a00a10b200141073a00a00b200141053a00980b41b8d6c5004100200141980b6a10880120070d01200921020c050b20024190016a21020c040b20024190016a2102200741f07e6a21070c000b0b412e4101102a000b41174101102a000b024020022009460d00200141980b6a4104722107034020022802002103200141980b6a200241046a418c0110ce041a20034113460d01200141d8076a200141980b6a418c0110ce041a200120033602980b2007200141d8076a418c0110ce041a024020034112460d00200141980b6a103d0b20024190016a22022009470d000b0b0240200a450d00200810290b200010b401200141c00c6a24000f0b102b000b418f89c3004133104e000bf31605027f017e067f037e017f230041c0086b22042400200441c0056a200141a00210ce041a200441e0036a200441c0056a1086024101210502400240024002400240024002400240024002400240024002400240024020042802e0034101460d00200441e0036a41086a290300210620044190026a200441e0036a41106a41d00110ce041a20042006370338200441386a41086a20044190026a41d00110ce041a024020032802002201450d00200341086a28020021072003280204210841002109200441003602c00541ff88c3004110200441c0056a10052105024020042802c005220a417f460d002005450d00200441003602c005200441c0056a2005200a4104200a4104491b10ce041a200a41034d0d0520042802c0052109200510290b411410272205450d05200541106a4100280083ce45360000200541086a41002900fbcd45370000200541002900f3cd453700002005411441281028220a450d06200a2009360014200441e0036a41186a22054200370300200441e0036a41106a22094200370300200441e0036a41086a220b4200370300200442003703e003200a4118200441e0036a100020044190026a41186a200529030037030020044190026a41106a200929030037030020044190026a41086a200b290300370300200420042903e00337039002200441003602c805200442013703c005200420073602e003200441e0036a200441c0056a10300240024020042802c405220b20042802c80522096b2007490d0020042802c00521050c010b200920076a22052009490d09200b410174220c20052005200c491b220c4100480d0902400240200b0d00200c102721050c010b20042802c005200b200c102821050b2005450d082004200c3602c405200420053602c005200c210b0b200520096a2001200710ce041a20044190026a41202005200920076a10030240200b450d00200510290b200a1029410021052008450d00200110290b200441306a200441386a41d0006a10ac0220042d003421092004280230210a200441c0056a200441386a41d80110ce041a41002107024002400240024002400240024002400240024020042903e0054202510d00200441a0086a41186a200441c0056a41186a290300370300200441a0086a41106a200441c0056a41106a290300370300200441a0086a41086a200441c0056a41086a290300370300200420042903c0053703a00820044188066a290300210d20044180066a290300210e200441f8056a2903002106411310272207450d122007410f6a41002800d68d43360000200741086a41002900cf8d43370000200741002900c78d4337000020074113413310282207450d13200720042903a0083700132007412b6a200441b8086a290300370000200741236a200441b0086a2903003700002007411b6a200441a8086a290300370000200441206a200741331089022004290328210f2004280220210b20071029200f4200200b1b220f2006520d04411310272207450d142007410f6a41002800d68d43360000200741086a41002900cf8d43370000200741002900c78d4337000020074113413310282207450d15200720042903a0083700132007412b6a200441a0086a41186a290300370000200741236a200441a0086a41106a2903003700002007411b6a200441a0086a41086a290300370000200441e0036a41186a220b4200370300200441e0036a41106a22084200370300200441e0036a41086a220c4200370300200442003703e00320074133200441e0036a100020044190026a41186a200b29030037030020044190026a41106a200829030037030020044190026a41086a200c290300370300200420042903e003370390022004200642017c3703e00320044190026a4120200441e0036a4108100320071029200441186a41c1cdc500411710b501417f200428021c410020042802181b220720026a220b200b2007491b220b418080c002418080f001200941017122071b4b0d02200441e0036a41086a22094200370300200442003703e00341c1cdc5004117200441e0036a100420044190026a41086a22102009290300370300200420042903e003370390022004200b3602e00320044190026a4110200441e0036a41041003200441106a41a7cdc500411a10b501417f2004280214410020042802101b2208418094ebdc034180afd0e50220071b220b200a200b200a491b6a220c200c2008491b2208200b4b0d0220094200370300200442003703e00341a7cdc500411a200441e0036a100420102009290300370300200420042903e00337039002200420083602e00320044190026a4110200441e0036a41041003200441e0036a200e200d200441a0086a200a2007200210960120042d00e0034101460d012004418c046a280200210920044188046a280200210820044184046a280200210b200441fc036a280200210c200441f8036a2802002102024020044180046a2802002207450d002007410c6c210a2002210703400240200741046a280200450d00200728020010290b2007410c6a2107200a41746a220a0d000b0b0240200c450d00200210290b02402009450d002009410c6c210a200b210703400240200741046a280200450d00200728020010290b2007410c6a2107200a41746a220a0d000b0b02402008450d00200b10290b200441e0076a41086a200441a0086a41086a290300370300200441e0076a41106a200441a0086a41106a290300370300200441e0076a41186a200441a0086a41186a290300370300200420042903a0083703e007410121070b200441e0036a200441c0056a41d0006a41880110ce041a200441a0086a41186a2209200441e0076a41186a290300370300200441a0086a41106a220b200441e0076a41106a290300370300200441a0086a41086a2202200441e0076a41086a290300370300200420042903e0073703a0084102210a02402007450d0020044180086a41186a200929030037030020044180086a41106a200b29030037030020044180086a41086a2002290300370300200420042903a008370380084101210a0b2004419a026a20044180086a41086a290300370100200441a2026a20044180086a41106a290300370100200441aa026a20044180086a41186a2903003701002004200a3a009102200420042903800837019202200441003a009002200441086a200441e0036a20044190026a10ad02200428020c21092004200428020822074100473a00c105200441003a00c00541b8d6c5004100200441c0056a108801200441003602c00541ff88c3004110200441c0056a1005210b20042802c005220a417f470d074101210a0c080b20042d00e103210a20044190066a103d410321070240200a0e0706020606040500060b410021070c050b20044190066a103d0b410421070c030b20044190066a103d200f2006580d010b410121070c010b410221070b20002007360204200041013602002000410c6a4100360200200041086a41b8d6c50036020020054521000c030b200441003602c005200441c0056a200b200a4104200a4104491b10ce041a200a41034d0d0d20042802c005210a200b1029200a41016a210a0b2004200a3602c00541ff88c3004110200441c0056a410410030240024020070d004100210720004100360204200041086a20093602000c010b02402009411b470d000240200741dbeac200460d00200741dbeac200411b10d0040d010b20004104360204410121070c010b20002007360204200041086a2009360200410021070b200020073602002001450d0e20050d020c0e0b200041086a20042902e4033702002000420137020020032802002101410021000b20000d0c20010d0b0c0c0b200341046a280200450d0b200110290c0b0b418f89c3004133104e000b41144101102a000b41284101102a000b200c4101102a000b102b000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b418f89c3004133104e000b200341046a280200450d00200110290b200441c0086a24000b950901087f230041106b2202240020024100360208200242013703002002410436020c2002410c6a20021030024002400240024002400240024002400240024020022802042203200228020822046b4104490d00200441046a2105200228020021030c010b200441046a22052004490d0820034101742206200520052006491b22064100480d080240024020030d002006102721030c010b200228020020032006102821030b2003450d0120022006360204200220033602000b20022005360208200320046a41eede91ab063600002002410e36020c2002410c6a200210300240024020022802042203200228020822066b410e490d002006410e6a2105200228020021040c010b2006410e6a22052006490d0820034101742204200520052004491b22074100480d080240024020030d002007102721040c010b200228020020032007102821040b2004450d022002200736020420022004360200200721030b20022005360208200420066a220641002900a8fb41370000200641066a41002900aefb413700000240200320056b41034b0d00200541046a22062005490d0820034101742207200620062007491b22064100480d080240024020030d002006102721040c010b200420032006102821040b2004450d0320022006360204200220043602000b2002200541046a360208200420056a410a360000024020022802042203200228020822056b41034b0d00200541046a22062005490d0820034101742207200620062007491b22064100480d080240024020030d002006102721040c010b200420032006102821040b2004450d0420022006360204200220043602000b2002200541046a360208200420056a41fb003600000240024020022802042205200228020822046b4104490d00200228020021050c010b200441046a22032004490d0820054101742206200320032006491b22034100480d080240024020050d002003102721050c010b200228020020052003102821050b2005450d0520022003360204200220053602000b2002200441046a360208200520046a41fd003600002002410836020c2002410c6a2002103041b8fbc10021072002280204210320022802082106034002400240200320066b4108490d00200641086a2104200228020021050c010b200641086a22042006490d0920034101742205200420042005491b22084100480d090240024020030d002008102721050c010b200228020020032008102821050b2005450d072002200836020420022005360200200821030b20022004360208200520066a2007290000370000200741086a28020021080240200320046b41034b0d00200441046a22062004490d0920034101742209200620062009491b22064100480d090240024020030d002006102721050c010b200520032006102821050b2005450d082002200636020420022005360200200621030b2002200441046a2206360208200520046a20083600002007410c6a22074198fcc100470d000b200241106a24002006ad4220862005ad840f0b20064101102a000b20074101102a000b20064101102a000b20064101102a000b20034101102a000b20084101102a000b20064101102a000b102b000bc91b05017f017e037f017e057f230041800a6b22022400024002402001450d00200220003602100c010b200241b8d6c5003602100b20022001360214200241e0076a200241106a108e02200241f0076a280200210120022903e007210320022802e807210420022802ec072105200241b0046a200241f4076a41e40010ce041a024002402004450d0020024180036a200241b0046a41e40010ce041a200241e0076a200241106a104820022802e00722000d0102402001450d00200141246c21002004210103400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b2005450d00200410290b200241f4076a4101360200200242013702e407200241cc81c2003602e007200241023602b404200241c481c2003602b0042002200241b0046a3602f007200241e0076a41d481c2001057000b20022902e40721072002411c6a20024180036a41e40010ce041a20024190016a20013602002002418c016a20053602002002200436028801200220033703800120024194016a2002411c6a41e40010ce042101200241fc016a2007370200200220003602f80120024180016a10b902024002400240024002400240024002402002290380012203500d00200241e0076a2003427f7c108702200241e0076a2001412010d0040d004100210820022802f80121000240024020024180026a280200220141a0026c0d00410421094100210a0c010b2001410c6c220610272209450d042001210a0b02402001450d00200141a0026c2106200141057441606a2104200921010340200220003602b004200241e0076a200241b0046a10bf02200141086a200241e0076a41086a280200360200200120022903e0073702002001410c6a2101200041a0026a2100200641e07d6a22060d000b200441057641016a21080b41002106024002402008410c6c22010d004104210b4100210c0c010b2001410c6e220c41037422004100480d0220001027220b450d030b0240200920016a22052009460d0041002106200b210120092100034020002802002104200141046a200041086a28020036020020012004360200200141086a2101200641016a21062000410c6a22002005470d000b0b200241e0076a200b200610c0020240200c450d00200b10290b02402008450d002008410c6c21002009210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b0240200a450d00200910290b0240200241d4016a2201200241e0076a412010d004450d004198cec500410e1010200141201016200241e0076a412010160b02402001200241e0076a412010d0040d0020022802fc01210920022802f8012105200228028002210620024188026a20024180016a41f80010ce041a2005200641a0026c6a210020022903880221072005210102402006450d00200241b0046a41f0006a210420052101024002400340200241f8066a200141e80010ce041a200141e8006a290300210320024180036a200141f0006a41b00110ce041a20034203510d02200241b0046a200241f8066a41e80010ce041a2002200337039805200420024180036a41b00110ce041a2002200241b0046a3602d006200241e0076a200241d0066a10bf0220022802e8072106024020022802e407450d0020022802e00710290b200241e0076a200241b0046a41a00210ce041a200241003602e006200241d0066a200241e0076a2006200241e0066a10bc0220022802d0064101460d01024020022802d4062206450d00200620022802d80610100b200141a0026a22012000470d000b200021010c020b024020022802d4060e050a00000b090a0b4190fdc1001058000b200141a0026a21010b20012000460d05200241f8086a2106200241e0076a41f0006a2104034020024180036a200141e80010ce041a200141e8006a2903002103200241e0076a200141f0006a41b00110ce041a20034203510d06200241f8066a20024180036a41e80010ce041a200241b0046a200241e0076a41b00110ce041a200241e0076a200241f8066a41e80010ce041a200220033703c8082004200241b0046a41b00110ce041a2006103d200141a0026a22012000470d000c060b0b41b0fcc1001058000b4198fcc1001058000b102b000b20004104102a000b20064104102a000b02402009450d00200510290b200241086a41ff88c300411010c102200228020c210120022802082100200241e0076a41086a22064200370300200242003703e0074192cdc5004115200241e0076a1004200241b0046a41086a2006290300370300200220022903e0073703b00420022001410020001b3602e007200241b0046a4110200241e0076a41041003200710c202200241e0076a10c302200220024188026a41106a28020022093602f00620022802900221042002200241e0076a41106a28020022013602f406024020092001470d0002402009450d0020022802e807210541002106034002400240024002400240024002400240200420066a22012d00002208200520066a22002d0000470d000240024002400240024020080e050400010203040b024020042005460d00200141016a280000200041016a280000470d050b200141106a2802002208200041106a280200470d04200141086a280200220b200041086a280200220a460d09200b200a200810d0040d040c090b024020042005460d00200141016a280000200041016a280000470d040b200141106a2802002208200041106a280200470d03200141086a280200220b200041086a280200220a460d07200b200a200810d0040d030c070b024020042005460d00200141016a280000200041016a280000470d030b200141106a2802002208200041106a280200470d02200141086a280200220b200041086a280200220a460d05200b200a200810d0040d020c050b2001410c6a28020022082000410c6a280200470d01200141046a280200220b200041046a280200220a460d03200b200a200810d0040d010c030b20042005460d07200141016a200041016a412010d004450d010b41a481c00041141010200241b0046a2001104f20022802b004220820022802b8041016024020022802b404450d00200810290b200241b0046a2000104f20022802b004220820022802b8041016024020022802b404450d00200810290b20012d000020002d00002208470d05024020080e050005040302000b20042005460d060b200141016a200041016a412010d0040d040c050b2001410c6a28020022082000410c6a280200470d03200141046a2802002201200041046a2802002200460d0420012000200810d004450d040c030b024020042005460d00200141016a280000200041016a280000470d030b200141106a2802002208200041106a280200470d02200141086a2802002201200041086a2802002200460d0320012000200810d0040d020c030b024020042005460d00200141016a280000200041016a280000470d020b200141106a2802002208200041106a280200470d01200141086a2802002201200041086a2802002200460d0220012000200810d0040d010c020b024020042005460d00200141016a280000200041016a280000470d010b200141106a2802002208200041106a280200470d00200141086a2802002201200041086a2802002200460d0120012000200810d004450d010b41c0fdc1001058000b200641246a21062009417f6a22090d000b0b024020024188026a41346a2201200241e0076a41346a2200412010d004450d004198cec500410e10102001412010162000412010160b024020012000412010d004450d0041d8fdc1001058000b024020022802f0072200450d0020022802e8072101200041246c210003400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200241ec076a280200450d0020022802e80710290b02402002280298022200450d002002280290022101200041246c210003400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b024020024194026a280200450d0020022802900210290b200241800a6a240042010f0b20024180036a41146a41033602002002418c036a411d360200200241f8066a41146a41033602002002200241f0066a3602e0062002200241f4066a3602d006200241b0046a41146a4100360200200242033702fc0620024190d1c5003602f8062002411d36028403200241b8d6c5003602c004200242013702b404200241a8fdc1003602b004200220024180036a360288072002200241b0046a360290032002200241d0066a360288032002200241e0066a36028003200241f8066a41b0fdc1001057000b41f8fcc1001058000b41e0fcc1001058000b41c8fcc1001058000bb51003067f027e067f230041206b2202240002400240024002400240024002400240024002400240024002400240024041a20210272203450d00200242a20237020420022003360200200341003b000020024102360208200228020021042002280204210502400240200128020022032903684202520d00024020054102470d0020044102410410282204450d0420024104360204200220043602000b200441023a00022002200228020841016a3602080c010b024020054102470d0020044102410410282204450d0420024104360204200220043602000b20044182013a00022002200228020841016a3602082003200210510240024020022802042206200228020822046b41c000490d00200441c0006a2101200228020021050c010b200441c0006a22012004490d1020064101742205200120012005491b22074100480d100240024020060d002007102721050c010b200228020020062007102821050b2005450d052002200736020420022005360200200721060b20022001360208200520046a22042003290024370000200441386a200341dc006a290000370000200441306a200341d4006a290000370000200441286a200341cc006a290000370000200441206a200341c4006a290000370000200441186a2003413c6a290000370000200441106a200341346a290000370000200441086a2003412c6a2900003700000240024020032903684201510d00024020062001470d00200141016a22042001490d1220014101742206200420042006491b22044100480d120240024020010d002004102721050c010b200520012004102821050b2005450d0820022004360204200220053602000b2002200141016a360208200520016a41003a00000c010b200341f8006a29030020032903702208420c882209420120094201561b8021090240200620016b41014b0d00200141026a22042001490d1120064101742207200420042007491b22044100480d110240024020060d002004102721050c010b200520062004102821050b2005450d0820022004360204200220053602000b2002200141026a360208200520016a2009a741047420087aa7417f6a22044101200441014b1b2204410f2004410f491b723b00000b20034180016a20021054200220034188016a360210200241106a200210590b20034198016a2002103220022802082103200241003602182002420137031020022003417e6a36021c2002411c6a200241106a10302002280208220441014d0d0620022802182105200228021021062002280214210a20024100360208200228020021030240024002402004417e6a2207450d004102210b2005450d0e200320062d00003a00004101210c2002200228020841016a36020820054101460d0e200620056a210d200320062d00013a00012002200228020841016a3602084102210b200641026a21014100210e2005417e6a2203450d0c2002280204220b20046b2003490d01200228020021040c020b0240024002402002280204220420054f0d0020044101742201200520052001491b22014100480d130240024020040d002001102721030c010b200320042001102821030b2003450d0c20022001360204200220033602002002280208210b0c010b4100210b2005450d010b2003200b6a220420062d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2101200641016a2103200441016a21040340200420032d00003a0000200441016a2104200341016a21032001417f6a22010d000b200b20056a210b0b2002200b3602084102210b0c0c0b200420036a220c2004490d0f200b4101742204200c200c2004491b220c4100480d0f02400240200b0d00200c102721040c010b2002280200200b200c102821040b2004450d092002200c360204200220043602000b200420056a200441026a200710cf041a024020052002280208220b460d002002280200200b6a2104200521030340024020034102470d002005210b0c0d0b200420012d00003a00002002200228020841016a360208200441016a2104200141016a2101200b2003417f6a2203470d000b200d20016b22030d004101210c2005210b0c0a0b20034100480d0e024020031027220c450d002005210b2003210e0c0a0b20034101102a000b41a2024101102a000b41044101102a000b41044101102a000b20074101102a000b20044101102a000b20044101102a000b419cb1c5001058000b20014101102a000b200c4101102a000b0240200d2001460d00200c20012d00003a00004101210f0240200141016a2203200d460d00200c41016a2104200520016b21010340200420032d00003a0000200441016a2104200d200341016a2203470d000b200620016a220f450d010b200c200f6a21050240024020022802042203200b20076a22046b200f490d00200228020021030c010b2004200f6a22012004490d0620034101742204200120012004491b22044100480d060240024020030d002004102721030c010b200228020020032004102821030b2003450d0520022004360204200220033602000b2003200f200b6a220d6a2003200b6a200710cf041a0240200d20022802082203460d00200228020020036a2104200f200b6a20036b2101200c2103034020052003460d01200420032d00003a00002002200228020841016a360208200341016a2103200441016a21042001417f6a22010d000b0b200d210b0b200e450d00200c10290b2007450d010b0240200b20022802082203460d002002280200220420036a2004200b6a200710cf041a0b2002200320076a3602080b0240200a450d00200610290b20002002290300370200200041086a200241086a280200360200200241206a24000f0b20044101102a000b102b000bd203010b7f230041206b22032400024002400240024020020d00410421040c010b2002410274220510272204450d010b0240200120024103746a22062001470d004101210741002108410021090c020b2002410374210a200141046a21052004210b0340200b2005280200360200200541086a2105200b41046a210b200a41786a220a0d000b200620016b41786a41037641016a210841012107410021094100210503402001280200210c02400240200920056b200141046a280200220b490d00200b20056a210a0c010b02402005200b6a220a2005490d002009410174220d200a200a200d491b220d4100480d000240024020090d00200d102721070c010b20072009200d102821070b02402007450d00200d21090c020b200d4101102a000b102b000b200720056a200c200b10ce041a200a2105200141086a22012006460d020c000b0b20054104102a000b200341186a22054200370300200341106a22014200370300200341086a220b42003703002003420037030020072004200820031021200041186a2005290300370000200041106a2001290300370000200041086a200b2903003700002000200329030037000002402009450d00200710290b02402002450d00200410290b200341206a24000b940101047f230041106b22032400410021042003410036020c200120022003410c6a10052105024002400240200328020c2206417f470d000c010b20034100360208200341086a20052006410420064104491b10ce041a200641034d0d01200328020821062005102920012002100c410121040b2000200436020020002006360204200341106a24000f0b418f89c3004133104e000bb15108067f027e027f017e077f027e027f037e230041a0046b2201240020014190036a41086a22024200370300200142003703900341e887c500411120014190036a1004200141b0036a41086a200229030037030020012001290390033703b003200141b0036a4110100c0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200042c0f000824200520d00200141b0036a109701411410272203450d09200341106a41002800bb8c40360000200341086a41002900b38c40370000200341002900ab8c4037000020034114413410282203450d08200320012903b0033700142003412c6a200141c8036a2204290300370000200341246a200141b0036a41106a22052903003700002003411c6a200141b0036a41086a220629030037000020014188016a2003413410840120014188016a41106a2903002107200129039001210820012802880121092003102920012007420020091b22073703a80120012008420020091b22083703a0012004200737030020052008370300200641013a00002001410a3a00b00341b8d6c5004100200141b0036a108801200141003a00b701200142003703c001200142003703b801200141b0026a41086a22034200370300200142003703b002418486c5004112200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602b00320014190036a4110200141b0036a100521030240024020012802b0032209417f460d002003450d00200120093602cc01200120033602c801200141b0036a200141c8016a104520012802b003220a450d0920012902b403210b2009450d01200310290c010b4104210a4200210b0b4100210c0240200b422088a72209450d00200141b9036a210d200141f0026a210e200141b0026a41206a210f200141c8016a41086a2110200141e8036a2111410021124100210c41002103024003400240024002400240200c450d00200a20034102746a2104200a200320126a4102746a21050340200320094f0d02200141c8016a2004280200220610f20120012903c8014201520d04200141b0026a201041e00010ce041a20012903a001221320012903b002221454200141a0016a41086a2903002208200141b0026a41086a29030022075420082007511b450d03200141013a00b7010240201220036a220620094f0d0020052004280200360200200441046a2104200541046a2105200341016a22032009490d010c070b0b419481c000200620091037000b200a20034102746a21040340200320094f0d01200141c8016a2004280200220610f20120012903c8014201520d03200141b0026a201041e00010ce041a20012903a001221320012903b00222145a200141a0016a41086a2903002208200141b0026a41086a29030022075a20082007511b0d02200441046a2104200141013a00b701200341016a22032009490d000b4100210c0c050b41b880c000200320091037000b2001201320147d3703a0012001200820077d2013201454ad7d3703a801411210272204450d05200441106a41002f00c0a7413b0000200441086a41002900b8a741370000200441002900b0a74137000020044112412410282204450d0620042006360012200141b0036a41186a22054200370300200141b0036a41106a22154200370300200141b0036a41086a22164200370300200142003703b00320044116200141b0036a100020014190036a41186a200529030037030020014190036a41106a201529030037030020014190036a41086a2016290300370300200120012903b0033703900320014190036a4120100c20041029200f20012903c002200141b0026a41186a29030010ad01200141f8006a200e20142007108301200141b8016a41086a2204427f20042903002208200141f8006a41086a2903007c20012903b801221320012903787c22172013542204ad7c22132004201320085420132008511b22041b3703002001427f201720041b3703b80120112007370300200d200e290000370000200d41086a200e41086a290000370000200d41106a200e41106a290000370000200d41186a200e41186a290000370000200120143703e003200141023a00b8032001410a3a00b003200120063602dc0341b8d6c5004100200141b0036a1088010b2012417f6a2112200c41016a210c200341016a22032009490d000b0b200c450d00200320094f0d00200a20034102746a2204200c4102746b2004200920036b41027410cf041a0b200141b0026a41086a22034200370300200142003703b002418486c5004112200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602b803200142013703b00320012009200c6b22033602c801200141c8016a200141b0036a10300240024020030d0020012802b803210920012802b403210620012802b00321040c010b2009410274200c4102746b211020012802b403210620012802b8032103200a210503402005280200210c02400240200620036b4104490d00200341046a210920012802b00321040c010b200341046a22092003490d1820064101742204200920092004491b22124100480d180240024020060d002012102721040c010b20012802b00320062012102821040b2004450d06200120123602b403200120043602b003201221060b200541046a2105200120093602b803200420036a200c360000200921032010417c6a22100d000b0b20014190036a411020042009100302402006450d00200410290b0240200ba7450d00200a10290b024020012d00b7010d0042002107200141e8006a20012903a0012208200141a0016a41086a2203290300221442c0843d420010d404200141d8006a20012903682213200141e8006a41086a290300220b42c0fb42427f10d304200141c8006a2013200b42a0c21e420010d304200320142014200141c8006a41086a29030020012903482213200820012903587c42018842ffffffff0f837c220b201354ad7c2213200b200856201320145620132014511b22091b22137d20082008200b20091b221454ad7d3703002001200820147d3703a001200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602b00320014190036a4110200141b0036a100521030240024020012802b0032209417f470d0042002107420021080c010b024020030d00420021080c010b200142003703b803200142003703b003200141b0036a20032009411020094110491b10ce041a2009410f4d0d06200141b8036a290300210820012903b0032107200310290b200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200120073703b003200120083703b80320014190036a4110200141b0036a41101003200141b8016a41086a2203427f2003290300220b20082013200720147d200756200820137d2007201454ad7d221720085620172008511b22031b7c20012903b80122082007201420031b7c22172008542203ad7c220720032007200b542007200b511b22031b3703002001427f201720031b3703b801200141c8036a2013370300200141b0036a41106a2014370300200141b0036a41086a41033a00002001410a3a00b00341b8d6c5004100200141b0036a1088010b200141b0036a109701200141c8016a200141b0036a20012903b8012207200141b8016a41086a29030022084102109001024002400240024020012802c8010d00200141c8016a41106a290300211320012903d0012114200141306a41b18ac0004116108601200820137d2007201454ad7d201320087d2014200754ad7d20142007582013200858201320085122031b22091b2118200720147d201420077d20091b2119200141306a41106a2903004200200128023022091b210b2001290338420020091b21172014200756201320085620031b0d01200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b002370390032001427f200b20187c201720197c22082017542203ad7c220720032007200b542007200b511b22031b3703b8022001427f200820031b3703b002200141b0026a21030c020b41f3c8c10041ca00101042002113200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602c80120014190036a4110200141c8016a100521030240024020012802c8012209417f470d0042002113420021140c010b024020030d00420021140c010b200142003703d001200142003703c801200141c8016a20032009411020094110491b10ce041a2009410f4d0d09200141d0016a290300211420012903c8012113200310290b200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b002370390032001427f201420087c201320077c22082013542203ad7c22072003200720145420072014511b22031b3703d0012001427f200820031b3703c80120014190036a4110200141c8016a411010030c020b200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b0023703900320014200200b20187d2017201954ad7d2207201720197d22082017562007200b562007200b511b22031b3703b80220014200200820031b3703b002200141b0026a21030b20014190036a41102003411010030b20012903a0012107200141c8036a200141a0016a41086a290300370300200141c0036a2007370300200141b0036a41086a41043a00002001410a3a00b00341b8d6c5004100200141b0036a1088010b20024200370300200142003703900341c1c8c100411d20014190036a1004200141b0026a41086a200229030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a1005210920012802b0032203417f460d0c2009450d0c200120093602c801200120033602cc01200142003703b003200141b0036a20092003410820034108491b220510ce041a2001200320056b22043602cc012001200920056a22053602c8010240200341074d0d0020012903b003210b200142003703b003200141b0036a20052004410820044108491b220310ce041a2001200420036b3602cc012001200520036a3602c801200441074d0d0020012903b0032117200141b0036a200141c8016a104120012802b0032203450d0020012902b4032108200141003a00b003200141b0036a20012802c801220620012802cc012204410047220510ce041a20042005490d062001200420056b22103602cc012001200620056a22053602c8012004450d0a20012d00b0034101470d0a42002107200142003703b003200141b0036a200520104108201041084922061b220410ce041a2001201020046b3602cc012001200520046a3602c80120060d0b20012903b0032119420121070c0c0b418f89c3004133104e000b41124101102a000b41244101102a000b20124101102a000b418f89c3004133104e000b418f89c3004133104e000b20052004103e000b418f89c3004133104e000b41344101102a000b41144101102a000b420021070b0b20091029200141ec016a2008370200200141e0016a2019370300200120033602e801200120073703d801200120173703d0012001200b3703c8010240200b2000520d002008422088a72106024020074200520d002006ad42287e2207422088a70d032007a72209417f4c0d030240024020090d00410821100c010b200910272210450d050b0240024020060d00410021040c010b200641286c210541002104201021090340200341086a2903002107200341106a2903002108200341186a290300211420032903002113200941206a200341206a290300370300200941186a2014370300200941106a2008370300200941086a200737030020092013370300200941286a2109200441016a2104200341286a2103200541586a22050d000b0b200141c8036a2004360200200141c4036a2006360200200141c0036a2010360200200120173703b803200142003703b003200141b0026a200141b0036a105d2001419b036a200141b8026a280200360000200120012903b00237009303200141bc026a20014197036a290000370000200141c6a4b9da043600b102200141023a00b00220012001290090033700b502200141b0026a1097032006450d01201010290c010b2006ad42287e2207422088a70d022007a72209417f4c0d020240024020090d00410821100c010b200910272210450d050b0240024020060d00410021040c010b200641286c210541002104201021090340200341086a2903002107200341106a2903002108200341186a290300211420032903002113200941206a200341206a290300370300200941186a2014370300200941106a2008370300200941086a200737030020092013370300200941286a2109200441016a2104200341286a2103200541586a22050d000b0b200141d0036a2004360200200141cc036a2006360200200141c8036a2010360200200141c0036a2017370300200120193703b803200142013703b003200141b0026a200141b0036a105d2001419b036a200141b8026a280200360000200120012903b00237009303200141bc026a20014197036a290000370000200141c6a4b9da043600b102200141023a00b00220012001290090033700b502200141b0026a1097032006450d00201010290b02402017200b7c2000520d0020014190036a41086a22034200370300200142003703900341c6c4c500411b20014190036a1004200141b0026a41086a2204200329030037030020012001290390033703b002200141103602b4032001200141b0026a3602b003200141e8016a2209200141b0036a102f200141b0036a41086a2009290000370300200141b0036a41106a200941086a280000360200200141003602b403200141093a00b00341b8d6c5004100200141b0036a10880120034200370300200142003703900341c1c8c100411d20014190036a10042004200329030037030020012001290390033703b002200141b0026a4110100c0c010b20012802ec01450d0020012802e80110290b20014190036a41086a22034200370300200142003703900341dec8c100411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a1005210320012802b0032209417f460d062003450d06200141003a00b003200141b0036a20032009410047220410ce041a20092004490d03024002402009450d0020012d00b003220541034b0d00200920046b2109200320046a21040240024020050e0403000301030b200142003703b003200141b0036a20042009410820094108491b220510ce041a200941074d0d0120012903b0032107200142003703b003200141b0036a200420056a200920056b2209410820094108491b10ce041a200941074b0d080c010b200142003703b003200141b0036a20042009410820094108491b220510ce041a200941074d0d0020012903b0032107200142003703b003200141b0036a200420056a200920056b2209410820094108491b10ce041a200941074b0d060b418f89c3004133104e000b200310290c060b1039000b20094108102a000b20094108102a000b20042009103e000b20012903b003210820031029024020072000520d00200142043703b003200120083703b803200141c8016a200141b0036a105d2001419b036a200141d0016a280200360000200120012903c80137009303200141d4016a20014197036a290000370000200141c6a4b9da043600c901200141023a00c80120012001290090033700cd01200141c8016a1097030b200820077c2000520d01200142003703b00320014190036a41086a22034200370300200142003703900341dec8c100411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141c8016a200141b0036a10e701200141b0026a411020012802c801220320012802d0011003024020012802cc01450d00200310290b200141023602b403200141093a00b00341b8d6c5004100200141b0036a1088010c010b20012903b003210820031029024020072000520d00200142033703b003200120083703b803200141c8016a200141b0036a105d2001419b036a200141d0016a280200360000200120012903c80137009303200141d4016a20014197036a290000370000200141c6a4b9da043600c901200141023a00c80120012001290090033700cd01200141c8016a1097030b200820077c2000520d00200142023703b00320014190036a41086a22034200370300200142003703900341dec8c100411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141c8016a200141b0036a10e701200141b0026a411020012802c801220320012802d0011003024020012802cc01450d00200310290b200141013602b403200141093a00b00341b8d6c5004100200141b0036a1088010b20014190036a41086a22034200370300200142003703900341a18ac000411020014190036a1004200141b0026a41086a2209200329030037030020012001290390033703b002200141206a200141b0026a109f03200129032821002001280220211020034200370300200142003703900341e1c4c500411520014190036a10042009200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a100521030240024002400240024002400240024002400240024002400240024020012802b0032209417f460d002003450d00200141003a00b003200141b0036a20032009410047220410ce041a20092004490d022009450d0c20012d00b00321092003102920094102460d0020094101710d010b410810272209450d022009420037030020014190036a41086a22034200370300200142003703900341c78ac000411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b803200142013703b003200141013602c801200141c8016a200141b0036a1030200929030021070240024020012802b403220520012802b80322046b4108490d0020012802b00321030c010b200441086a22032004490d0e20054101742206200320032006491b22064100480d0e0240024020050d002006102721030c010b20012802b00320052006102821030b2003450d04200120063602b403200120033602b003200621050b2001200441086a22063602b803200320046a2007370000200141b0026a411020032006100302402005450d00200310290b20091029410810272209450d042009420037030020014190036a41086a2203420037030020014200370390034188b7c000411620014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b803200142013703b003200141013602c801200141c8016a200141b0036a1030200929030021070240024020012802b403220520012802b80322046b4108490d0020012802b00321030c010b200441086a22032004490d0e20054101742206200320032006491b22064100480d0e0240024020050d002006102721030c010b20012802b00320052006102821030b2003450d06200120063602b403200120033602b003200621050b2001200441086a22063602b803200320046a2007370000200141b0026a411020032006100302402005450d00200310290b2009102920014190036a41086a220342003703002001420037039003419eb7c000411020014190036a1004200141b0026a41086a2209200329030037030020012001290390033703b002200142003703b003200141b0026a4110200141b0036a41081003200141013a00b00320034200370300200142003703900341e1c4c500411520014190036a10042009200329030037030020012001290390033703b002200141b0026a4110200141b0036a410110030b20014190036a41086a22034200370300200142003703900341c78ac000411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a100521030240024020012802b0032209417f460d002003450d00200120093602cc01200120033602c801200141b0036a200141c8016a104020012802b0032202450d0720012902b403210b2009450d01200310290c010b410821024200210b0b20014190036a41086a2203420037030020014200370390034188b7c000411620014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a100521030240024020012802b0032209417f460d002003450d00200120093602cc01200120033602c801200141b0036a200141c8016a104020012802b0032206450d0820012902b403211402402009450d00200310290b2014422088a721030c010b4108210641002103420021140b200b422088a7210a024020100d00200a417f6a2209200a4b0d082009200a4f0d08200220094103746a2209450d08200929030021000b4100200a419c7f6a22092009200a41016a4b1b220e200a4b0d082002200e4103746a210c200e450d0b2003ad21082002211203402012290300210741002103024002400240024002402008a7221041014b0d0020100e020201020b20102109034020032009410176220420036a22052007200620054103746a290300541b2103200920046b220941014b0d000b0b20072006200341037422096a2903002213510d02200320072013566a21030c010b410021030b200120033602b00341d4b7c000412e200141b0036a4184b8c00010a201000b20082003ad580d0a200620096a2209200941086a2003417f7320106a41037410cf041a201442ffffffff0f832010417f6a2203ad422086842114201241086a2212200c460d0c2008427f7c21080c000b0b20042009103e000b41084108102a000b20064101102a000b41084108102a000b20064101102a000b418f89c3004133104e000b418f89c3004133104e000b41aeb7c0004126104e000b419cb1c5001058000b418080c0001058000b418f89c3004133104e000b200b42ffffffff0f8321080240200a200e6b2209450d000240200e450d002002200c200941037410cf041a2014422088a721030b2009ad42208620088421080b41002109024002400240200341014b0d00024020030e020002000b20144220882207a72103410021090c020b034020092003410176220420096a22052000200620054103746a290300541b2109200320046b220341014b0d000b0b02402000200620094103746a2903002207510d00200920002007566a21090b200920144220882207a722034d0d0041d0b1c5001058000b024002400240024002400240024002400240024020032014a7470d00200341016a22042003490d0a2007a722104101742205200420042005491b220441ffffffff01712004470d0a200441037422054100480d0a0240024020030d002005102721060c010b200620104103742005102821060b2006450d012004ad21140b200620094103746a220441086a2004200320096b41037410cf041a2004200037030002402008a72008422088220ba72203470d00200341016a22092003490d0a20034101742204200920092004491b220941ffffffff01712009470d0a200941037422044100480d0a0240024020030d002004102721020c010b200220034103742004102821020b2002450d022009ad21080b200220034103746a200037030002402007a7220d41016a220a200d4f0d004194b8c0001058000b200a4101762203200a4f0d02200620034103746a29030021130240200a4101710d002003417f6a2203200a4f0d04200620034103746a29030020137c42018821130b20014190036a41086a22034200370300200142003703900341c78ac000411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b803200142013703b0032001200b42017ca7220e3602c801200141c8016a200141b0036a103002400240200e0d0020012802b803211220012802b403211020012802b00321090c010b200e410374210c410020012802b80322036b210420012802b40321102002210503402005290300210702400240201020046a4108490d0020012802b00321090c010b200341086a22092003490d0c20104101742212200920092012491b22124100480d0c0240024020100d002012102721090c010b20012802b00320102012102821090b2009450d07200120123602b403200120093602b003201221100b200541086a21052001200341086a22123602b803200920036a2007370000200441786a210420122103200c41786a220c0d000b0b200141b0026a411020092012100302402010450d00200910290b02402008a7450d00200210290b20014190036a41086a2203420037030020014200370390034188b7c000411620014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200142013703b003200141003602b8032001200a3602c801200d41037441086a2112200141c8016a200141b0036a1030410020012802b80322036b210420012802b40321102006210503402005290300210702400240201020046a4108490d0020012802b00321090c010b200341086a22092003490d0b2010410174220c20092009200c491b220c4100480d0b0240024020100d00200c102721090c010b20012802b0032010200c102821090b2009450d072001200c3602b403200120093602b003200c21100b200541086a21052001200341086a220c3602b803200920036a2007370000200441786a2104200c2103201241786a22120d000b200141b0026a41102009200c100302402010450d00200910290b02402014a7450d00200610290b20014190036a41086a220342003703002001420037039003419eb7c000411020014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200120133703b003200141b0026a4110200141b0036a410810030240200e41e500470d00200141106a41888dc300410d1094012013429a087c2001290318420020012802101b560d0020014190036a41086a2209420037030020014200370390034199a7c100411720014190036a1004200141b0026a41086a200929030037030020012001290390033703b002410810272209450d07200942e40037000020094108411010282209450d0820092013370008200141b0026a4110200941101003200910290b20034200370300200142003703900341cfa2c400411720014190036a1004200141b0036a41086a200329030037030020012001290390033703b0030240200141b0036a411041b8d6c50041004100100b417f470d00200141ceecc200410d109401200129030821072001280200210320014190036a41086a22094200370300200142003703900341cfa2c400411720014190036a1004200141b0036a41086a200929030037030020012001290390033703b00320012007420020031b3703c801200141b0036a4110200141c8016a410810030b20014190036a41086a22034200370300200142003703900341dbecc200411120014190036a1004200141b0036a41086a2209200329030037030020012001290390033703b003200141b0036a4110100c20034200370300200142003703900341fcc7c500411720014190036a10042009200329030037030020012001290390033703b003200141b0036a4110100c41bdcbc5004113108a02220341ff01714102460d082003410171450d08200141a0046a24000f0b20054108102a000b20044108102a000b41acb8c0002003200a1037000b41acb8c0002003200a1037000b20124101102a000b200c4101102a000b41084101102a000b41104101102a000b41d4e9c2001058000b102b000bd91a08017f017e047f027e047f017e037f017e23004190026b2201240042002102200141d0016a41086a22034200370300200142003703d0014192cdc5004115200141d0016a100420014190016a41086a2003290300370300200120012903d0013703900120014190016a4110100c200141286a41a7cdc500411a10b501200128022c21042001280228210520034200370300200142003703d00141d8cdc500411b200141d0016a1004200141f0016a41086a2003290300370300200120012903d0013703f001200141003602d001200141f0016a4110200141d0016a10052103024002400240024002400240024002400240024020012802d0012206417f460d002003450d00200142003703d001200141d0016a20032006410820064108491b10ce041a200641074d0d0120012903d0012102200310290b200141186a4180e59af7002004410020051b220320034180e59af7004922061b20034180e59af70020061b6b2206ad220742002007420010d304200742a8c30180210742ffffffffffffffffff00428080808080808080807f20061b2001290318220820012903202008423f87521b42808090bbbad6adf00d7f210802400240200341ffe49af7004b0d0042ffffffffffffffffff00428080808080808080807f2002200720087d22087d22074200531b20072002427f5522032008427f554720032007427f5547711b22024280ec94a37c20024280ec94a37c551b21020c010b42ffffffffffffffffff00428080808080808080807f2002200720087c22087c22074200531b20072002427f5522032008427f554620032007427f5547711b21020b200141d0016a41086a22034200370300200142003703d00141d8cdc500411b200141d0016a100420014190016a41086a22062003290300370300200120012903d00137039001410810272204450d012004200237000020014190016a41102004410810032004102920034200370300200142003703d00141a7cdc500411a200141d0016a100420062003290300370300200120012903d0013703900120014190016a4110100c20034200370300200142003703d00141c1cdc5004117200141d0016a100420062003290300370300200120012903d0013703900120014190016a4110100c20034200370300200142003703d00141888dc300410d200141d0016a100420062003290300370300200120012903d00137039001200141086a20014190016a109f03200129031021022001280208210920034200370300200142003703d00141d18fc3004111200141d0016a100420062003290300370300200120012903d00137039001200141003602f00120014190016a4110200141f0016a100521030240024020012802f0012206417f460d002003450d00200141f0016a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200141f0016a2003200410ce041a2006411f4d0d04200141d0016a41186a2206200141f0016a41186a2204290000370300200141d0016a41106a2205200141f0016a41106a220a290000370300200141d0016a41086a220b200141f0016a41086a220c290000370300200120012900f0013703d00120031029200141b0016a41186a22032006290300370300200141b0016a41106a22062005290300370300200141b0016a41086a2205200b290300370300200120012903d0013703b00120014190016a4110100c200420032903002207370300200a20062903002208370300200c2005290300220d370300200141306a41086a200d370300200141306a41106a2008370300200141306a41186a2007370300200120012903b00122073703f001200120073703300c010b200141f0016a41186a200141b0016a41186a290300370300200141f0016a41106a200141b0016a41106a290300370300200141f0016a41086a200141b0016a41086a290300370300200141306a41086a4200370300200141306a41106a4200370300200141306a41186a4200370300200120012903b0013703f001200142003703300b200141d0016a41086a22034200370300200142003703d00141aa8dc300410d200141d0016a1004200141f0016a41086a2003290300370300200120012903d0013703f001200141003602d001200141f0016a4110200141d0016a100521030240024020012802d0012206417f460d002003450d00200120063602b401200120033602b001200141d0016a200141b0016a104320012802d001220a450d0520012902d401210702402006450d00200310290b200141f0016a4110100c2007422088a721032007a7210b0c010b4104210a410021034100210b0b200141d0016a41086a22064200370300200142003703d00141958dc3004115200141d0016a100420014190016a41086a2006290300370300200120012903d00137039001200141003602d00120014190016a4110200141d0016a100521050240024020012802d0012206417f460d00200141f0016a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200141f0016a2005200410ce041a2006411f4d0d06200141d0016a41186a2206200141f0016a41186a2204290000370300200141d0016a41106a220c200141f0016a41106a220e290000370300200141d0016a41086a220f200141f0016a41086a2210290000370300200120012900f0013703d00120051029200141b0016a41186a22052006290300370300200141b0016a41106a2206200c290300370300200141b0016a41086a220c200f290300370300200120012903d0013703b00120014190016a4110100c200420052903002207370300200e200629030022083703002010200c290300220d370300200141d0006a41086a200d370300200141d0006a41106a2008370300200141d0006a41186a2007370300200120012903b00122073703f001200120073703500c010b200141f0016a41086a200141b0016a41086a290300370300200141f0016a41106a200141b0016a41106a290300370300200141f0016a41186a200141b0016a41186a290300370300200141d0006a41086a4200370300200141d0006a41106a4200370300200141d0006a41186a4200370300200120012903b0013703f001200142003703500b02402002420020091b220242fb01540d00200242857e7c2207500d00411010272206450d06200641086a41002900bf8d43370000200641002900b78d4337000020064110412010282206450d0720062007370010200141b0016a41186a22044200370300200141b0016a41106a22054200370300200141b0016a41086a22094200370300200142003703b00120064118200141b0016a1000200141f0016a41186a2004290300370300200141f0016a41106a2005290300370300200141f0016a41086a2009290300370300200120012903b0013703f001200141f0016a4120100c200610290b200141b0016a41186a22064200370300200141b0016a41106a22044200370300200141b0016a41086a22054200370300200142003703b001200141b0016a101e200141f0006a41186a2006290300370300200141f0006a41106a2004290300370300200141f0006a41086a2005290300370300200120012903b001370370200141f0016a41186a2209200141306a41186a290300370300200141f0016a41106a220c200141306a41106a290300370300200141f0016a41086a220e200141306a41086a290300370300200120012903303703f001200642003703002004420037030020054200370300200142003703b0010240200141f0016a4120200141b0016a101f450d0020014190016a41086a2005290300220737030020014190016a41106a2004290300220837030020014190016a41186a2006290300220d370300200120012903b001221137039001200e2007370300200c20083703002009200d370300200120113703f00102402003200b470d00200341016a22062003490d0a20034101742204200620062004491b220bad42247e2207422088a70d0a2007a722064100480d0a0240024020030d0020061027210a0c010b200a200341246c20061028210a0b200a450d090b200a200341246c6a220641003a0000200620012903f001370001200641096a200141f8016a290300370000200641116a20014180026a290300370000200641196a20014188026a290300370000200620012f00d0013b0021200641236a200141d2016a2d00003a0000200341016a21030b2000200129033037001420002002370300200020012903703700342000412c6a200141306a41186a290300370000200041246a200141306a41106a2903003700002000411c6a200141306a41086a2903003700002000413c6a200141f0006a41086a290300370000200041c4006a200141f0006a41106a290300370000200041cc006a200141f0006a41186a290300370000200041106a20033602002000410c6a200b3602002000200a360208200041ec006a200141d0006a41186a290300370000200041e4006a200141d0006a41106a290300370000200041dc006a200141d0006a41086a2903003700002000200129035037005420014190026a24000f0b418f89c3004133104e000b41084101102a000b418f89c3004133104e000b418f89c3004133104e000b418f89c3004133104e000b41104101102a000b41204101102a000b20064104102a000b102b000bf90201027f23004180026b22022400024002402001450d00200220003602000c010b200241b8d6c5003602000b2002200136020420024180016a2002108e020240200228028801450d00200241086a20024180016a41f80010ce041a200241086a10b9020240200241186a2802002200450d0020022802102101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200241146a280200450d00200228021010290b20024180026a240042010f0b2002411c6a41013602002002420137020c200241cc81c200360208200241023602fc01200241d082c2003602f8012002200241f8016a360218200241086a41d481c2001057000be40b01087f230041206b2202240020024100360218200242013703100240024002400240024002400240024002400240410410272203450d0020024284808080c00037021420022003360210200341edcad18b0636000002400240200228021420022802182203460d00200228021021040c010b200341016a22042003490d0a20034101742205200420042005491b22054100480d0a0240024020030d002005102721040c010b200228021020032005102821040b2004450d0220022005360214200220043602100b2002200341016a360218200420036a41073a00004112200241106a10c60241002103034020034184e7c1006a28020020034188e7c1006a280200200241106a10c702024002402003418ce7c1006a22052802004102470d0002400240200228021420022802182204460d00200228021021050c010b200441016a22052004490d0d20044101742206200520052006491b22064100480d0d0240024020040d002006102721050c010b200228021020042006102821050b2005450d0620022006360214200220053602100b2002200441016a360218200520046a41003a00000c010b02400240200228021420022802182204460d00200228021021060c010b200441016a22062004490d0c20044101742207200620062007491b22074100480d0c0240024020040d002007102721060c010b200228021020042007102821060b2006450d0620022007360214200220063602100b2002200441016a360218200620046a41013a00002005200241106a10c8020b02400240200341ace7c1006a22052802004102470d0002400240200228021420022802182204460d00200228021021050c010b200441016a22052004490d0d20044101742206200520052006491b22064100480d0d0240024020040d002006102721050c010b200228021020042006102821050b2005450d0820022006360214200220053602100b2002200441016a360218200520046a41003a00000c010b02400240200228021420022802182204460d00200228021021060c010b200441016a22062004490d0c20044101742207200620062007491b22074100480d0c0240024020040d002007102721060c010b200228021020042007102821060b2006450d0820022007360214200220063602100b2002200441016a360218200620046a41013a00002005200241106a10c9020b02400240200341bce7c1006a22052802004102470d0002400240200228021420022802182204460d00200228021021050c010b200441016a22052004490d0d20044101742206200520052006491b22064100480d0d0240024020040d002006102721050c010b200228021020042006102821050b2005450d0a20022006360214200220053602100b2002200441016a360218200520046a41003a00000c010b02400240200228021420022802182204460d00200228021021060c010b200441016a22062004490d0c20044101742207200620062007491b22074100480d0c0240024020040d002007102721060c010b200228021020042007102821060b2006450d0a20022007360214200220063602100b2002200441016a360218200620046a41013a00002005200241106a10ca020b200341cce7c1006a200241106a10cb02200341dc006a220341f80c470d000b20022802142107200228021021062002280218210320024100360218200242013703102002200336020c2002410c6a200241106a10300240024020022802142205200228021822046b2003490d00200228021021050c010b200420036a22082004490d0a20054101742209200820082009491b22084100480d0a0240024020050d002008102721050c010b200228021020052008102821050b2005450d0920022008360214200220053602100b200520046a2006200310ce041a200420036a210302402007450d00200610290b200241206a24002003ad4220862005ad840f0b41044101102a000b20054101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b20084101102a000b102b000b920701037f0240024002400240024002402000413f4b0d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0620024101742204200320032004491b22044100480d060240024020020d002004102721030c010b200128020020022004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000f0b200041808001490d032000418080808004490d020c010b20044101102a000b0240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0520024101742204200320032004491b22044100480d050240024020020d002004102721030c010b200128020020022004102821030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a000002400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d0520034101742202200420042002491b22024100480d050240024020030d002002102721030c010b200128020020032002102821030b2003450d0220012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b20044101102a000b20024101102a000b024002400240200141046a2802002203200141086a28020022026b4104490d00200128020021030c010b200241046a22042002490d0320034101742202200420042002491b22024100480d030240024020030d002002102721030c010b200128020020032002102821030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b20024101102a000b024002400240200141046a2802002203200141086a28020022026b4102490d00200128020021030c010b200241026a22042002490d0220034101742202200420042002491b22024100480d020240024020030d002002102721030c010b200128020020032002102821030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20024101102a000b102b000bc60801037f0240024002400240024002400240024002402001413f4b0d0002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0920034101742205200420042005491b22054100480d090240024020030d002005102721040c010b200228020020032005102821040b2004450d0220022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000c050b200141808001490d032001418080808004490d020c010b20054101102a000b0240024002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0820034101742205200420042005491b22054100480d080240024020030d002005102721040c010b200228020020032005102821040b2004450d0120022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a000002400240200241046a2802002204200528020022036b4104490d00200228020021040c010b200341046a22052003490d0820044101742203200520052003491b22034100480d080240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c040b20054101102a000b20034101102a000b024002400240200241046a2802002204200241086a28020022036b4104490d00200228020021040c010b200341046a22052003490d0620044101742203200520052003491b22034100480d060240024020040d002003102721040c010b200228020020042003102821040b2004450d0120022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c020b20034101102a000b02400240200241046a2802002204200241086a28020022036b4102490d00200228020021040c010b200341026a22052003490d0420044101742203200520052003491b22034100480d040240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000b02400240200241046a2802002204200241086a28020022036b2001490d00200228020021040c010b200320016a22052003490d0320044101742203200520052003491b22034100480d030240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a2000200110ce041a0f0b20034101102a000b20034101102a000b102b000b860201037f230041206b220224000240024020002802004101460d00200220002802041101002002280204200241086a280200200110c7022002410c6a200110b004200228020c450d01200241106a28020021030240200241186a2802002200450d00200041d8006c21044100210103400240200320016a220041346a280200450d002000413c6a280200450d00200041386a28020010290b0240200041c4006a280200450d00200041cc006a280200450d00200041c8006a28020010290b2004200141d8006a2201470d000b0b200241146a280200450d01200310290c010b200041086a2802002000410c6a280200200110c702200041106a200110b0040b200241206a24000bae0201047f230041106b220224000240024020002802004101460d00200241086a200028020411010020022802082103200228020c2200200110c6022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c7022000410c6a200110af04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000c020b0b200028020421032000410c6a2802002200200110c6022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c7022000410c6a200110af04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000b0b200241106a24000be60201047f230041106b220224000240024020002802004101460d00200241086a200028020411010020022802082103200228020c2200200110c6022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a28020020032005411841142000410c6a2802004101461b6a6a280200200110ad04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000c020b0b200028020421032000410c6a2802002200200110c6022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a28020020032005411841142000410c6a2802004101461b6a6a280200200110ad04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000b0b200241106a24000b880401057f230041206b220224000240024020002802004101460d00200241086a200028020411010020022802082103200228020c2200200110c6022000450d01200041386c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a280200200041146a280200200110c70202400240200041186a2802004101460d00200241106a2000411c6a280200200041206a28020028020c110000200228021022062002280218200110c7022002280214450d01200610290c010b2000411c6a280200200041246a280200200110c7020b2000412c6a2802002003200541344130200041286a2802004101461b6a6a280200200110ad042004200541386a2205470d000c020b0b200028020421032000410c6a2802002200200110c6022000450d00200041386c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a280200200041146a280200200110c70202400240200041186a2802004101460d00200241106a2000411c6a280200200041206a28020028020c110000200228021022062002280218200110c7022002280214450d01200610290c010b2000411c6a280200200041246a280200200110c7020b2000412c6a2802002003200541344130200041286a2802004101461b6a6a280200200110ad042004200541386a2205470d000b0b200241206a24000ba80301027f230041a0076b22022400024002402001450d00200220003602080c010b200241b8d6c5003602080b2002200136020c200241f0046a200241086a104902400240024020022903d8054203510d00200241106a200241f0046a41a00210ce041a200241b0026a200241106a41a00210ce041a2002200241b0026a3602f004200241d0046a200241f0046a10bf0220022802d8042101200241f0046a200241b0026a41a00210ce041a20024198076a20022802d804360200200220022903d00437039007200241e0046a200241f0046a200120024190076a10bc02410121000240024020022802e0044101460d004100210020022802e40441004721030c010b4280828898f01f20022802e404410374ad88a721030b410110272201450d01200120003a000020014101410210282201450d02200120033a0001200241a0076a24002001ad428080808020840f0b200241c4026a4101360200200242013702b402200241cc81c2003602b00220024102360214200241e882c2003602102002200241106a3602c002200241b0026a41d481c2001057000b41014101102a000b41024101102a000bee1003097f017e037f230041e0016b22022400200241206a41ff88c300411010c1022002280224210320022802202104200241a0016a41086a22054200370300200242003703a0014192cdc5004115200241a0016a1004200241286a41086a2005290300370300200220022903a0013703284100210620022003410020041b3602c00141042107200241286a4110200241c0016a41041003200241106a41888dc300410d1094012002290318420020022802101b10c202200241086a4192cdc500411510b5014104210841002109024002400240200228020c410020022802081b220a450d00200aad420c7e220b422088a70d01200ba722034100480d01200310272208450d02200821034100210c034002400240024002400240411410272204450d00200441106a4100280083ce45360000200441086a41002900fbcd45370000200441002900f3cd4537000020044114412810282205450d012005200c360014200241286a41186a22044200370300200241286a41106a220d4200370300200241286a41086a220942003703002002420037032820054118200241286a1000200241c0016a41186a2004290300370300200241c0016a41106a200d290300370300200241c0016a41086a2009290300370300200220022903283703c00120024100360228200241c0016a4120200241286a1005210d20022802282209417f460d03200d450d03200220093602b4012002200d3602b001200241286a200241b0016a104420022802282204450d02200229022c210b02402009450d00200d10290b200241c0016a4120100c0c040b41144101102a000b41284101102a000b418f89c3004133104e000b410021040b2005102920032004410120041b360200200341046a200ba7410020041b360200200341086a200b422088a7410020041b3602002003410c6a2103200a200c41016a220c470d000b200a21090b0240024002400240024002402009410c6c2203450d002003410c6e220641037422044100480d06200410272207450d010b410021050240200820036a220d2008460d00200721032008210403402004280200210c200341046a200441086a2802003602002003200c360200200341086a2103200541016a21052004410c6a2204200d470d000b0b200241c0016a2007200510c00202402006450d00200710290b02402009450d002009410c6c21042008210303400240200341046a280200450d00200328020010290b2003410c6a2103200441746a22040d000b0b0240200a450d00200810290b200241286a41186a200241c0016a41186a290300370300200241286a41106a200241c0016a41106a290300370300200241286a41086a200241c0016a41086a290300370300200220022903c001370328200241a0016a41086a22034200370300200242003703a00141958dc3004115200241a0016a1004200241b0016a41086a2003290300370300200220022903a0013703b001200241b0016a4110200241286a41201003200241286a10c302200241003602b801200242013703b001412010272203450d01200242a080808080043702b401200220033602b0012003200229023c370000200341086a200241c4006a290200370000200341106a200241cc006a290200370000200341186a200241d4006a290200370000200241286a200241b0016a10540240024020022802b401220520022802b801220c6b4120490d00200c41206a210320022802b00121040c010b200c41206a2203200c490d0620054101742204200320032004491b220d4100480d060240024020050d00200d102721040c010b20022802b0012005200d102821040b2004450d032002200d3602b401200220043602b001200d21050b200220033602b8012004200c6a220c200229025c370000200c41086a200241e4006a290200370000200c41106a200241ec006a290200370000200c41186a200241f4006a2902003700000240200520036b411f4b0d00200341206a220c2003490d062005410174220d200c200c200d491b220c4100480d060240024020050d00200c102721040c010b20042005200c102821040b2004450d042002200c3602b401200220043602b0010b200420036a220441086a20024184016a290200370000200441106a2002418c016a290200370000200441186a20024194016a2902003700002002200341206a3602b8012004200229027c3700002002280230210e2002200241286a41106a28020022063602c001200241c0016a200241b0016a10300240024020060d0020022802b801210420022802b00121050c010b200641246c210820022802b401210920022802b8012103200e210c0340200241c0016a200c104f20022802c001210a02400240200920036b20022802c801220d490d002003200d6a210420022802b00121050c010b2003200d6a22042003490d0820094101742205200420042005491b22074100480d080240024020090d002007102721050c010b20022802b00120092007102821050b2005450d07200220073602b401200220053602b001200721090b200220043602b801200520036a200a200d10ce041a024020022802c401450d00200a10290b200c41246a210c200421032008415c6a22080d000b2006450d00200641246c210c200e210303400240024020032d0000220d41034b0d00024002400240200d0e0404000102040b2003410c6a280200450d03200341086a28020010290c030b2003410c6a280200450d02200341086a28020010290c020b2003410c6a280200450d01200341086a28020010290c010b200341086a280200450d00200341046a28020010290b200341246a2103200c415c6a220c0d000b0b0240200241346a280200450d00200e10290b200241e0016a24002004ad4220862005ad840f0b20044104102a000b41204101102a000b200d4101102a000b200c4101102a000b20074101102a000b102b000b20034104102a000b900c03017f027e097f230041b0026b22022400024002402001450d00200220003602100c010b200241b8d6c5003602100b20022001360214200241286a200241106a10fb010240024020022802282201450d002002200229022c37021c20022001360218200241286a200241186a10cf02024020022802284101470d002002200229022c3703c80141beefc2004128200241c8016a4188eec20010a201000b200241286a41086a2903002103200241ceecc200410d109401200229030821042002280200210141a002102722050d0141a0024108102a000b2002413c6a41013602002002420137022c200241cc81c200360228200241023602cc012002418083c2003602c8012002200241c8016a360238200241286a41d481c2001057000b2005200241c8016a41e80010ce04220642023703682006410236029801200620022903a001370370200641f8006a200241a0016a41086a29030037030020064180016a200241b0016a29030037030020064188016a200241b8016a29030037030020064190016a200241c0016a29030037030020062003200442b9067c42b90620011b220420042003541b3703a001200641a8016a200241286a41f80010ce041a200241186a2101200228021c21070240024003402001280200220841086a210020082f0106220941037421014100210a0240024003402001450d0141c8e2c1002000410810d004220b450d02200141786a2101200a41016a210a200041086a2100200b417f4a0d000b200a417f6a21090b024020070d0041d0e2c1002101412821000c030b2007417f6a2107200820094102746a41e4016a21010c010b0b2008200a410c6c6a220141e0006a2802002100200141e8006a280200210120024200370328200241286a20002001410820014108491b10ce041a200141074b0d0141fec4c5002101412921000b2002200036022c2002200136022841f88cc000412b200241286a41e88cc00010a201000b20022903282103200241286a41086a220142003703002002420037032841c78ac0004115200241286a1004200241c8016a41086a2001290300370300200220022903283703c8014100210120024100360228200241c8016a4110200241286a1005210a02400240024002400240024020022802282200417f460d00200220003602a4012002200a3602a001200241286a200241a0016a10402002280228220b450d02200241306a2802002101200228022c21082000450d01200a10290c010b4108210b410021080b4100210002402001417f6a220a20014b0d00200a20014f0d00200b200a4103746a2201450d00200129030020035221000b02402008450d00200b10290b0240024020000d004101210c0c010b200641a00241c00410282205450d02200541a0026a200241c8016a41e80010ce041a2005420237038803200520033703c0032005410c3602b803200520022903a0013703900320054198036a200241a8016a290300370300200541a0036a200241b0016a290300370300200541a8036a200241b8016a290300370300200541b0036a200241c0016a290300370300200541c8036a200241286a41f80010ce041a4102210c0b2002280218200228021c200228022010fc01200241003602d001200242013703c8012002200c360228200c41a0026c210d200241286a200241c8016a103020022802cc01210820022802d00121014100210a034020022005200a6a3602a001200241286a200241a0016a10bf022002280228210702400240200820016b20022802302206490d00200120066a210020022802c801210b0c010b200120066a22002001490d052008410174220b20002000200b491b22094100480d050240024020080d0020091027210b0c010b20022802c801200820091028210b0b200b450d04200220093602cc012002200b3602c801200921080b200220003602d001200b20016a2007200610ce041a0240200228022c450d00200710290b20002101200d200a41a0026a220a470d000b200c41a0026c210a410021010340200520016a4198016a103d200a200141a0026a2201470d000b20051029200241b0026a24002000ad422086200bad840f0b418f89c3004133104e000b41c0044108102a000b20094101102a000b102b000bad0201077f230041106b2202240020012802042103024002400240024003402001280200220441086a210520042f01062206410374210141002107024003402001450d0141e4cac5002005410810d0042208450d03200141786a2101200741016a2107200541086a21052008417f4a0d000b2007417f6a21060b02402003450d002003417f6a2103200420064102746a41e4016a21010c010b0b200041eccac500360204200041086a41283602000c010b20042007410c6c6a220141e0006a2802002105200141e8006a280200210120024200370308200241086a20052001410820014108491b10ce041a200141074b0d0120004194cbc500360204200041086a41293602000b410121010c010b200041086a2002290308370300410021010b20002001360200200241106a24000bb91e08067f017e057f017e047f027e027f017e230041b0026b22022400024002402001450d00200220003602100c010b200241b8d6c5003602100b20022001360214200241c8006a200241106a108e020240024020022802502203450d00200241d8006a280200210420022802542105200241c8006a200241106a1048200228024822060d0102402004450d00200441246c21002003210103400240024020012d0000220741034b0d0002400240024020070e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b2005450d00200310290b200241dc006a41013602002002420137024c200241cc81c200360248200241023602d4012002419c83c2003602d0012002200241d0016a360258200241c8006a41d481c2001057000b200229024c2108200241c8006a200241106a10fb01024020022802482201450d002002200229024c37021c20022001360218200241013b01342002420037022c2002418883c000360228200241286a41086a21090240024002400240024002402008422088a7220a450d002006200a41a0026c6a210b200241d0016a410272210c2006210d0340200d41e8006a2903004202520d010240024002400240024002400240024002400240024002400240200d2802980122014102470d00200d2903a001210e200241186a2101200228021c210f024002400240024003402001280200221041086a210020102f010622114103742101410021070240024003402001450d0141f6c4c5002000410810d0042212450d02200141786a2101200741016a2107200041086a21002012417f4a0d000b2007417f6a21110b200f450d02200f417f6a210f201020114102746a41e4016a21010c010b0b20102007410c6c6a220141e0006a2802002100200141e8006a280200210120024200370348200241c8006a20002001410820014108491b10ce041a0240200141074b0d00201342808080807083422984210e41fec4c50021110c020b200e42f20c8020022903482213510d0341a08fc30021114131210f0c020b201342808080807083421c84210e41a7c5c50021110b200ea7210f0b024002400240024020022d0035450d00413121014195fac10021000c010b2002280228200228022c200228023010fc012002420037022c2002418883c000360228200242e2c289abb68edbb7f400370338200241d0016a410272410041da0010cd041a200241c8006a410041840110cd041a41e40110272212450d0520124100360200201241046a200241d0016a41dc0010ce041a201241e0006a200241c8006a41840110ce041a2002410036022c2002201236022820122f0106220d4103742110417f210041002101024002400340024020102001470d00200d21000c020b200241386a201220016a41086a410810d0042207450d02200141086a2101200041016a2100200741004e0d000b0b200242e2c289abb68edbb7f40037025c20022009360258200220003602542002201236024c200241003602482002200241286a360250200241003602d801200242013703d0012002200f360238200241386a200241d0016a103020022802d401220020022802d80122016b200f490d0220022802d00121000c030b412d210141c6fac10021000b2002200136024c2002200036024841f3fac1004122200241c8006a4198fbc10010a201000b2001200f6a22072001490d1220004101742212200720072012491b22074100480d120240024020000d002007102721000c010b20022802d00120002007102821000b2000450d04200220073602d401200220003602d0010b20022001200f6a3602d801200020016a2011200f10ce041a200241386a41086a20022802d801360200200220022903d001370338200241c8006a200241386a10fd0120024180023b0134200241d0016a41086a200241286a41086a290300370300200220022903283703d0010c100b200d2802980121010b20014102470d0b200d2903a0012114200241c8006a200241186a10cf020240024020022802484101470d002002350250210e200228024c2115410121160c010b2002290350210e200241ceecc200410d10940102402014200e423c7c560d00410021162014200229030842b9067c42b90620022802001b220e540d010c0d0b201742808080807083422584210e410121164199efc20021150b024020022d0035450d00413121014195fac10021000c050b02402016450d002002280228200228022c200228023010fc012002420037022c2002418883c000360228200242f4d2b59bc7ae98b8303703380c030b20022802282112200242f4d2b59bc7ae98b8303703382012418883c000460d02200228022c210f0c030b41e4014104102a000b20074101102a000b200c410041da0010cd041a200241c8006a410041840110cd041a41e40110272212450d034100210f20124100360200201241046a200241d0016a41dc0010ce041a201241e0006a200241c8006a41840110ce041a2002410036022c200220123602280b034020122f010622114103742110417f210041002101024002400340024020102001470d00201121000c020b200241386a201220016a41086a410810d0042207450d02200141086a2101200041016a21002007417f4a0d000b0b200f450d03200f417f6a210f201220004102746a41e4016a28020021120c010b0b412d210141c6fac10021000b2002200136024c2002200036024841f3fac1004122200241c8006a4198fbc10010a201000b200242f4d2b59bc7ae98b83037025c20022009360258200220003602542002201236024c200241003602482002200241286a360250200241003602d801200242013703d0014101102721010240024020160d002001450d03200141003a000020024281808080103702d401200220013602d00120014101410910282201450d042001200e3700012002428980808090013702d401200220013602d0010c010b2001450d04200141013a000020024281808080103702d401200220013602d0012002200ea72201360238200241386a200241d0016a10300240024020022802d401220720022802d80122006b2001490d0020022802d00121070c010b200020016a22122000490d0b20074101742210201220122010491b22124100480d0b0240024020070d002012102721070c010b20022802d00120072012102821070b2007450d06200220123602d401200220073602d0010b2002200020016a3602d801200720006a2015200110ce041a0b200241386a41086a200241d0016a41086a280200360200200220022903d001370338200241c8006a200241386a10fd01200220163a0035200241003a0034200e21172016450d05200241d0016a41086a200241286a41086a290300370300200220022903283703d0010c080b41e4014104102a000b41014101102a000b41094101102a000b41014101102a000b20124101102a000b200d41a0026a220d200b470d000b0b200241d0016a41086a2009290300370300200220022903283703d0010b2002280218200228021c200228022010fc0102402004450d00200441246c21002003210103400240024020012d0000220741034b0d0002400240024020070e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b02402005450d00200310290b2008a721070240200a450d00200a41a0026c210020064198016a210103402001103d200141a0026a2101200041e07d6a22000d000b0b02402007450d00200610290b2002410036025020024201370348410110272201450d03200242818080801037024c20022001360248200120022d00dc013a000020014101410210282201450d02200242828080802037024c20022001360248200120022d00dd013a000120022802d801210d20014102410610282212450d0120024286808080e00037024c200220123602482012200d36000220022802d00122072100024020022802d4012210450d002010210120072100034020002802e40121002001417f6a22010d000b0b0240024002400240200d0d004280808080e000210e0c010b41062110200241d0016a210b4106210f41002111034002400240201120002f01064f0d0020002011410c6c6a41e0006a2101200020114103746a41086a2107201141016a21110c010b02400240200028020022010d00201742808080807083200bad84211741002107410021010c010b2000330104422086200bad842117410121070b201721142017210e02402017422088a7220020012f0106490d000340200e221442ffffffff0f83210e200741016a210720012f01042200200128020022012f01064f0d000b0b20012000410c6c6a2111200120004103746a2116200041027420016a41e8016a28020021002014a7210b02402007417f6a2201450d00034020002802e40121002001417f6a22010d000b0b201141e0006a2101201641086a2107410021110b02402010200f6b41074b0d00200f41086a2216200f490d0520104101742204201620162004491b22164100480d050240024020100d002016102721120c010b201220102016102821120b2012450d032002201636024c200220123602480b2002200f41086a3602502012200f6a200729000037000020012802002116200220012802082201360228200241286a200241c8006a103002400240200228024c2210200228025022076b2001490d00200228024821120c010b200720016a22122007490d052010410174220f20122012200f491b220f4100480d050240024020100d00200f102721120c010b20022802482010200f102821120b2012450d042002200f36024c20022012360248200f21100b2002200720016a220f360250201220076a2016200110ce041a200d417f6a220d0d000b200fad422086210e20022802d401211020022802d00121070b2007201020022802d80110fc01200241b0026a2400200e2012ad840f0b20164101102a000b200f4101102a000b102b000b41064101102a000b41024101102a000b41014101102a000b200241dc006a41013602002002420137024c200241cc81c200360248200241023602d4012002419c83c2003602d0012002200241d0016a360258200241c8006a41d481c2001057000b7701027f230041206b22022400200241b8d6c500410010db0102404120102722030d0041204101102a000b20032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840bcf4c040b7f027e127f067e230041c00a6b22022400024002402001450d00200220003602400c010b200241b8d6c5003602400b20022001360244200241e8066a200241c0006a104902400240024002400240024002400240024002400240024002400240024002400240024020022903d0074203510d00200241c8006a200241e8066a41a00210ce041a200241e8026a200241c8006a41a00210ce041a2002200241e8026a36028805200241e8066a20024188056a10bf0220022802f0062100024020022802ec06450d0020022802e80610290b200241e8066a200241e8026a41a00210ce041a20024188056a200241e8066a10860202402002280288054101470d00200228029005416b6a220141054b0d10200228028c05210002400240024020010e06001313131301000b4102210341f601210120004184efc200460d0120004184efc200411510d004450d010c120b410021010240200041a981c200470d00410021030c130b41002103200041a981c200411a10d0040d110b0c110b200241e8066a20024190056a41d80110ce041a200241386a200241b8076a220410ac020240024002402002290388074202520d0041c00110272201450d04200141013a00b801200142003703b00120014280808080c0003703a801200142043703a0012001427f3703980120014200370390012001420137038801200142003703800120014280808080c000370378200142043703702001427f37036820014200370360200142013703582001420037035020014280808080c000370348200142043703402001427f37033820014200370330200142013703282001420037032020014280808080c000370318200142043703102001427f37030820014200370300200141bc016a20024188056a41036a28000036000020012002280088053600b9012002200141c0016a36028c0a200220013602880a200241043602840a200220013602800a200241900a6a41206a22054200370300200241900a6a41186a22064280808080c000370300200241013a00b80a200242043703a00a2002427f3703980a200242003703900a200241c8096a41086a22072001290308370300200241c8096a41106a22082001290310370300200241c8096a41186a22032001290318370300200241c8096a41206a22092001290320370300200220012903003703c809200220012800293602f80920022001412c6a2800003600fb09200141306a210020012d0028220a4102460d1020024188096a41286a220b200241900a6a41286a220c29030037030020024188096a41206a200529030037030020024188096a41186a200629030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a3703880920024188056a41206a200929030037030020024188056a41186a200329030037030020024188056a41106a200829030037030020024188056a41086a2007290300370300200220022903c809370388052002200a3a00b005200241b1056a220a20022802f809360000200a41036a20022800fb09360000200241900a6a20024188096a20024188056a10d3022007200041086a2903003703002008200041106a2903003703002003200041186a2903003703002009200041206a290300370300200220002903003703c809200220012800593602f8092002200141dc006a2800003600fb09200141e0006a210020012d005822074102470d010c100b20022d003c21032002280238210841c00110272205450d0420022903a007210d411310272201450d052001410f6a41002800d68d43360000200141086a41002900cf8d43370000200141002900c78d4337000020014113413310282201450d06200120022903e8063700132001412b6a20024180076a290300370000200141236a200241f8066a2903003700002001411b6a200241e8066a41086a290300370000200241286a200141331089022002290330210e20022802282106200110290240024002400240200e420020061b220e200d560d00410c10272206450d0b412010272201450d0c200120022903e806370000200141186a200241e8066a41186a290300370000200141106a200241e8066a41106a290300370000200141086a200241e8066a41086a2903003700002001412041c00010282201450d0d2001200d37002041042107200641046a42c0808080800537020020062001360200410021010240200e200d5a0d00410c10272207450d0f412010272201450d10200120022903e806370000200141186a200241e8066a41186a290300370000200141106a200241e8066a41106a290300370000200141086a200241e8066a41086a2903003700002001412041c00010282201450d112001200d427f7c370020200742c0808080800537020420072001360200410121010b20022002280088053602800a20022002418b056a220b2800003600830a200220022802800a3602f809200220022800830a3600fb09200241206a41c1cdc500411710b501417f2002280224410020022802201b220920006a220a200a2009491b418080c002418080f001200341017122031b4b0d01200241186a41a7cdc500411a10b501417f200228021c410020022802181b220a418094ebdc034180afd0e50220031b2209200820092008491b6a220c200c200a491b20094b0d0120022002280088053602900a20022002418b056a2800003600930a200220022802900a3602c809200220022800930a3600cb0920024188056a20022903a807200241b0076a290300200241e8066a20082003200010960120022d0088054101460d02200541013a005820054281808080103703502005200636024c2005200136024820052001360244200520073602402005427f37033820052008ad220d370330200542013703282005420037032020054280808080c000370318200542043703102005427f37030820054200370300200520022802f809360059200541dc006a220f20022800fb09360000200541013a008801200542003703800120054280808080c000370378200542043703702005427f3703682005427f200d20031b370360200520022802c809360089012005418c016a20022800cb0936000020052002290390053703900120054198016a20024188056a41106a2200290300370300200541a0016a20024188056a41186a2206290300370300200541a8016a20024188056a41206a2207290300370300200541b0016a20024188056a41286a2208290300370300200541b8016a20024188056a41306a2903003703002002200541c0016a36028c0a200220053602880a200241043602840a200220053602800a200241900a6a41206a22034200370300200241900a6a41186a22094280808080c000370300200241013a00b80a200242043703a00a2002427f3703980a200242003703900a200241c8096a41086a220a2005290308370300200241c8096a41106a220b2005290310370300200241c8096a41186a220c2005290318370300200241c8096a41206a22102005290320370300200220052903003703c809200220052800293602f80920022005412c6a2800003600fb09200541306a210120052d002822114102460d1120024188096a41286a200241900a6a41286a29030037030020024188096a41206a200329030037030020024188096a41186a200929030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a37038809200720102903003703002006200c2903003703002000200b29030037030020024188056a41086a200a290300370300200220022903c80937038805200220113a00b005200241b1056a221120022802f809360000201141036a221220022800fb09360000200241900a6a20024188096a20024188056a10d302200a200141086a290300370300200b200141106a290300370300200c200141186a2903003703002010200141206a290300370300200220012903003703c809200220052800593602f8092002200f2800003600fb09200541e0006a210120052d0058220a4102470d050c110b20022002280088053602800a20022002418b056a2800003600830a20024181083b0188092005102941012101410421080c020b20022002280088053602900a2002200b2800003600930a20024181023b01880902402001450d002001410c6c21002007210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b200710290b0240200641046a280200450d00200628020010290b200610292005102941012108410121010c100b200220022d00890522083a008909200241013a00880902402001450d002001410c6c21002007210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b200710290b0240200641046a280200450d00200628020010290b2006102920051029410121010b0c0e0b200b200c29030037030020024188096a41206a220c200241900a6a41206a221029030037030020024188096a41186a2211200241900a6a41186a220f29030037030020024188096a41106a2212200241900a6a41106a221329030037030020024188096a41086a2214200241900a6a41086a2215290300370300200220022903900a3703880920024188056a41206a2216200241c8096a41206a220829030037030020024188056a41186a2217200241c8096a41186a220329030037030020024188056a41106a2218200241c8096a41106a220929030037030020024188056a41086a2219200241c8096a41086a220b290300370300200220022903c80937038805200220073a00b005200a20022802f809360000200a41036a220720022800fb09360000200241900a6a20024188096a20024188056a10d302200b200041086a2903003703002009200041106a2903003703002003200041186a2903003703002008200041206a290300370300200220002903003703c80920022001280089013602f80920022001418c016a2800003600fb0920014190016a210020012d008801221a4102460d0e20024188096a41286a221b200241900a6a41286a221c290300370300200c20102903003703002011200f2903003703002012201329030037030020142015290300370300200220022903900a370388092016200829030037030020172003290300370300201820092903003703002019200b290300370300200220022903c809370388052002201a3a00b005200a20022802f809360000200720022800fb09360000200241900a6a20024188096a20024188056a10d302200b200041086a2903003703002009200041106a2903003703002003200041186a2903003703002008200041206a290300370300200220002903003703c809200220012800b9013602f8092002200141bc016a2800003600fb09200141c0016a210020012d00b80122014102460d0e201b201c29030037030020024188096a41206a200241900a6a41206a29030037030020024188096a41186a200241900a6a41186a29030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a3703880920024188056a41206a200241c8096a41206a29030037030020024188056a41186a200241c8096a41186a29030037030020024188056a41106a200241c8096a41106a29030037030020024188056a41086a200241c8096a41086a290300370300200220022903c80937038805200220013a00b005200a20022802f809360000200a41036a20022800fb09360000200241900a6a20024188096a20024188056a10d3020c0e0b20024188096a41286a2213200241900a6a41286a221429030037030020024188096a41206a2215200241900a6a41206a221629030037030020024188096a41186a2217200241900a6a41186a221829030037030020024188096a41106a2219200241900a6a41106a221a29030037030020024188096a41086a221b200241900a6a41086a221c290300370300200220022903900a3703880920024188056a41206a221d200241c8096a41206a220b29030037030020024188056a41186a221e200241c8096a41186a220c29030037030020024188056a41106a221f200241c8096a41106a221029030037030020024188056a41086a2220200241c8096a41086a220f290300370300200220022903c809370388052002200a3a00b005201120022802f809360000201220022800fb09360000200241900a6a20024188096a20024188056a10d302200f200141086a2903003703002010200141106a290300370300200c200141186a290300370300200b200141206a290300370300200220012903003703c80920022005280089013602f80920022005418c016a2800003600fb0920054190016a210120052d008801220a4102460d0b2013201429030037030020152016290300370300201720182903003703002019201a290300370300201b201c290300370300200220022903900a37038809201d200b290300370300201e200c290300370300201f20102903003703002020200f290300370300200220022903c809370388052002200a3a00b005201120022802f809360000201141036a220a20022800fb09360000200241900a6a20024188096a20024188056a10d302200f200141086a2903003703002010200141106a290300370300200c200141186a290300370300200b200141206a290300370300200220012903003703c809200220052800b9013602f8092002200541bc016a2800003600fb09200541c0016a210120052d00b80122054102460d0b20024188096a41286a200241900a6a41286a29030037030020024188096a41206a200241900a6a41206a29030037030020024188096a41186a200241900a6a41186a29030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a3703880920024188056a41206a200241c8096a41206a29030037030020024188056a41186a200241c8096a41186a29030037030020024188056a41106a200241c8096a41106a29030037030020024188056a41086a200241c8096a41086a290300370300200220022903c80937038805200220053a00b005201120022802f809360000200a20022800fb09360000200241900a6a20024188096a20024188056a10d3020c0b0b200241fc026a4101360200200242013702ec02200241cc81c2003602e8022002410236024c200241b483c2003602482002200241c8006a3602f802200241e8026a41d481c2001057000b41c0014108102a000b41c0014108102a000b41134101102a000b41334101102a000b410c4104102a000b41204101102a000b41c0004101102a000b410c4104102a000b41204101102a000b41c0004101102a000b20024188056a41086a2205200241900a6a41086a2903003703002000200241900a6a41106a29030037030020062009290300370300200720032903003703002008200241900a6a41286a290300370300200220013602880a200220022903900a37038805200241800a6a103a20024188096a41086a200229038805222137030020024188096a41106a2005290300220e37030020024188096a41186a2000290300220d37030020024188096a41206a200629030037030020024188096a41286a200729030037030020024188096a41306a200829030037030041002101200241003a008809200da7210c20022d00890921080b200241b8096a2d0000210f200241b4096a2802002109200241b0096a2802002110200241ac096a280200210b200241a8096a280200210a200241a4096a2802002111024020010d00410121030c020b42bcf7ea858cf8afdfbd7f2008410473ad42078342038688a72101410021030c010b20024188056a41086a2201200241900a6a41086a29030037030020024188056a41106a2207200241900a6a41106a29030037030020024188056a41186a2208200629030037030020024188056a41206a2206200529030037030020024188056a41286a2205200241900a6a41286a290300370300200220003602880a200220022903900a37038805200241800a6a103a20024188096a41106a2001290300220d37030020024188096a41186a2201200729030037030020024188096a41206a2200200829030037030020024188096a41286a2208200629030037030020024188096a41306a220620052903003703002002200229038805220e37039009200241003a008809200241800a6a41086a200d3703002002200e3703800a20024188096a412c6a28020021072008280200210b200241ac096a280200210920002802002108200241a4096a280200210c2001280200210a024002400240024002400240024020022802b8074111470d002006290300210d20024188056a41086a22014200370300200242003703880541d2c5c500411020024188056a1004200241900a6a41086a200129030037030020022002290388053703900a2002410036028805200241900a6a411020024188056a10052101024002402002280288052200417f460d002001450d00200220003602cc09200220013602c80920024188056a200241c8096a10412002280288052210450d0320024190056a2802002111200228028c05210f2000450d01200110290c010b41082110410021114100210f0b200241e4076a21002010201141286c6a210320102101024003400240200320016b41f8004b0d00024020032001460d002010201141286c6a2103200241e4076a210503404101210620052001460d0420012000412010d004450d042003200141286a2201470d000b0b410021060c020b4101210620012000460d0120012000412010d004450d01200141286a22052000460d0120052000412010d004450d01200141d0006a22052000460d0120052000412010d004450d01200141f8006a22052000460d01200141a0016a210120052000412010d0040d000b0b0240200f450d00201010290b2006450d00200241106a4193c8c500411410b50120024188056a2002280214410020022802101b200010b201200228028805220520022802900541b8d6c50041004100100b21010240200228028c05450d00200510290b2001417f470d0020024190086a28020041c000470d00200228028808220141086a290000210e200141106a2900002121200141186a2900002122200141206a2900002123200141286a2900002124200141306a29000021252001290000212620024188056a41386a200141386a29000037030020024188056a41306a202537030020024188056a41286a202437030020024188056a41206a202337030020024188056a41186a202237030020024188056a41106a202137030020024188056a41086a200e3703002002202637038805200241003602980a200242013703900a20022903c007210e410810272201450d022001200e3700002002428880808080013702940a200220013602900a200241c8076a200241900a6a1061200241e0076a28020021100240024020022802940a220520022802980a22066b4104490d0020022802900a21010c010b200641046a22012006490d0b20054101742203200120012003491b22034100480d0b0240024020050d002003102721010c010b20022802900a20052003102821010b2001450d04200220033602940a200220013602900a200321050b2002200641046a22033602980a200120066a201036000002400240200520036b411f4d0d00200521100c010b200341206a22102003490d0b20054101742211201020102011491b22104100480d0b0240024020050d002010102721010c010b200120052010102821010b2001450d05200220103602940a200220013602900a0b200120036a22052000290000370000200541186a200041186a290000370000200541106a200041106a290000370000200541086a200041086a29000037000002402001200641246a220520024188056a200010140d00200241086a4193c8c500411410b50120022802e007200228020c410020022802081b490d00410c102722000d06410c4104102a000b2010450d00200110290b02402008450d002008410c6c2100200a210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b0240200c450d00200a10290b02402007450d002007410c6c21002009210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b42002121427f210e4104210c0240200b450d00200910290b4100210a4101210f410121094101211041002111410021030c050b418f89c3004133104e000b41084101102a000b20034101102a000b20104101102a000b200020053602082000201036020420002001360200200220022802f8093602c009200220022800fb093600c309200241900a6a41206a428180808010370300200241900a6a41186a4100360200200241bc0a6a20022800c30936000041012103200241013a00b80a200220003602ac0a200242043703a00a2002427f3703980a200242003703900a200220022802c0093600b90a20024188056a41246a200736020020024188056a41206a200b36020020024188056a41186a200836020020024188056a41146a200c36020020024188056a41086a200241800a6a41086a2903003703002002200d3703b005200220093602a4052002200a36029805200220022903800a37038805200241c8096a200241900a6a20024188056a10d302200241c8096a41146a2802002111200241c8096a41186a280200210a200241c8096a41206a2802002110200241c8096a41246a280200210920022903c809212120022903d009210e20022802d809210c20022802e409210b20022d00f009210f0b410021010b2004103d0c010b4100210341810121010b200241003602f0064201210d200242013703e806024002400240024002400240024002400240024002400240200341024d0d004200210e0c010b024002400240024020030e03000102000b410110272200450d04200241013602ec06200220022802f006220541016a3602f006200220003602e806200020056a41003a00000240024020022802ec0620022802f0062200460d0020022802e80621050c010b200041016a22052000490d0f20004101742204200520052004491b22044100480d0f0240024020000d002004102721050c010b20022802e80620002004102821050b2005450d06200220043602ec06200220053602e80620022802f00621000b2002200041016a3602f006200520006a20013a00000c020b410110272201450d05200241013602ec06200220022802f006220041016a3602f006200220013602e806200120006a41013a00000240024020022802ec06220020022802f00622016b4108490d0020022802e80621000c010b200141086a22052001490d0e20004101742201200520052001491b22014100480d0e0240024020000d002001102721000c010b20022802e80620002001102821000b2000450d07200220013602ec06200220003602e80620022802f00621010b2002200141086a3602f006200020016a20213700002002200a3602e802200241e8026a200241e8066a10300240200a450d00200c200a410c6c6a2108200c21050340200528020021062002200541086a28020022013602e802200241e8026a200241e8066a10300240024020022802ec06220420022802f00622006b2001490d0020022802e80621040c010b200020016a22072000490d1020044101742200200720072000491b22004100480d100240024020040d002000102721040c010b20022802e80620042000102821040b2004450d0a200220003602ec06200220043602e80620022802f00621000b2002200020016a3602f006200420006a2006200110ce041a2005410c6a22052008470d000b0b200220093602e802200241e8026a200241e8066a103002402009450d00200b2009410c6c6a2108200b21050340200528020021062002200541086a28020022013602e802200241e8026a200241e8066a10300240024020022802ec06220420022802f00622006b2001490d0020022802e80621040c010b200020016a22072000490d1020044101742200200720072000491b22004100480d100240024020040d002000102721040c010b20022802e80620042000102821040b2004450d0b200220003602ec06200220043602e80620022802f00621000b2002200020016a3602f006200420006a2006200110ce041a2005410c6a22052008470d000b0b0240024020022802ec06220020022802f00622016b4108490d0020022802e80621000c010b200141086a22052001490d0e20004101742201200520052001491b22014100480d0e0240024020000d002001102721000c010b20022802e80620002001102821000b2000450d0a200220013602ec06200220003602e80620022802f00621010b2002200141086a3602f006200020016a200e3700000240024020022802ec0620022802f0062201460d0020022802e80621000c010b200141016a22002001490d0e20014101742205200020002005491b22054100480d0e0240024020010d002005102721000c010b20022802e80620012005102821000b2000450d0b200220053602ec06200220003602e80620022802f00621010b2002200141016a3602f006200020016a200f3a00000c010b410110272200450d0a200241013602ec06200220022802f006220541016a3602f006200220003602e806200020056a41023a00000240024020022802ec0620022802f0062200460d0020022802e80621050c010b200041016a22052000490d0d20004101742204200520052004491b22044100480d0d0240024020000d002004102721050c010b20022802e80620002004102821050b2005450d0c200220043602ec06200220053602e80620022802f00621000b2002200041016a3602f006200520006a20013a00000b20023502f006422086210e20023502e806210d0b024020034101470d000240200a450d00200a410c6c2100200c210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b02402011450d00200c10290b02402009450d002009410c6c2100200b210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b2010450d00200b10290b200241c00a6a2400200e200d840f0b41014101102a000b20044101102a000b41014101102a000b20014101102a000b20004101102a000b20004101102a000b20014101102a000b20054101102a000b41014101102a000b20044101102a000b102b000b980505017f027e077f017e017f230041106b220324002002290300210420012903002105200141106a21062002280210210702400240024002400240200141146a2802002208200141186a28020022096b200241186a280200220a490d00200628020021080c010b2009200a6a220b2009490d032008410174220c200b200b200c491b220bad420c7e220d422088a70d03200da7220c4100480d030240024020080d00200c102721080c010b20062802002008410c6c200c102821080b2008450d0120012008360210200141146a200b3602000b20082009410c6c6a2007200a410c6c10ce041a200141186a2009200a6a36020020024100360218200341086a200641086a280200360200200320062902003703002001411c6a2106200228021c210b02400240200141206a2802002208200141246a28020022096b200241246a280200220a490d00200628020021080c010b2009200a6a220c2009490d032008410174220e200c200c200e491b220cad420c7e220d422088a70d03200da7220e4100480d030240024020080d00200e102721080c010b20062802002008410c6c200e102821080b2008450d022001200836021c200141206a200c3602000b20082009410c6c6a200b200a410c6c10ce041a200141246a2009200a6a360200200241003602242000427f200520047c220420042005541b37030020002003290300370210200041186a200341086a2802003602002000200629020037021c200041246a200641086a280200360200200020022d0028410020012d00281b3a00282000200229030822052001290308220420042005561b3703080240200241146a280200450d00200710290b0240200241206a280200450d00200b10290b200341106a24000f0b200c4104102a000b200e4104102a000b102b000be41807017f027e027f017e017f017e0e7f23004180046b2202240020024200370368200241e8006a200041b8d6c50020011b2001410820014108491b10ce041a0240024002400240024002400240024002400240024002400240024002400240024002400240200141074d0d0020022903682103200241186a41d9b0c0004111109401200229032021042002280218210041002105200241003602684101210641014185b1c000411c200241e8006a101721012004420020001b2107024002400240024020022802682200417f470d0041012100410121060c010b2000ad2204422086200484210420014521002001450d00200241003a0068200241e8006a20012004422088a72206410047220510ce041a20062005490d042006450d0120022d0068210820024200370368200241e8006a200120056a200620056b2206410820064108491b10ce041a200641074d0d01200229036822092007542009200354200841ff01711b2106200121050b0240200720035a0d0020060d020b20002004a745720d14200510290c140b02402004a7450d00200110290b41b284c500412d10100c130b410110272201450d02200141003a000020014101410910282201450d032001200337000141014185b1c000411c4100200520001b22062004422088a7417f20061b200141091018210620011029024020002004a745720d00200510290b20060d12200241003602484201200241c8006a1019210020022802482201417f460d1220022000360288032002200136028c03200241003a0068200241e8006a20002001410047220610ce041a20012006490d042002200120066b36028c032002200020066a360288032001450d124100210a0240024020022d0068450d000c010b200241e8006a20024188036a10440240200228026822010d000c010b200229026c21042001210a0b20001029200a450d1241002106200241e8006a2004422088a72200412020004120491b22016a41004100412020016b2001411f4b1b10cd041a200241e8006a200a200110ce041a2004a7210b2000411f4d0d11200241306a200241f1006a290000370300200241386a200241f9006a2900003703002002413f6a20024180016a2900003700002002200229006937032820022d0068210c20024100360248200241c8006a101a210020022802482201417f460d1020022000360288032002200136028c03200241003a0068200241e8006a20002001410047220610ce041a20012006490d052002200120066b36028c032002200020066a3602880302400240024002402001450d0020022d0068220641014b0d004100210d024020060e020003000b200241e8006a20024188036a10442002280268220d450d00200229026c2109200241106a20024188036a102e2009a7210e02402002280210450d00024002402002280214220f41d502200f41d502491b22100d00410421110c010b2010410c6c220610272211450d0c0b0240200f450d004100211241002106410021080340200241e8006a20024188036a10440240200228026822130d0002402008450d002011210503400240200541046a280200450d00200528020010290b2005410c6a2105200641746a22060d000b0b2010450d03201110290c030b200841016a2105200229026c2104024020082010470d002012200520052012491b2210ad420c7e2207422088a70d152007a722144100480d150240024020080d002014102721110c010b201120062014102821110b2011450d0f0b201120066a22082013360200200841046a2004370200201241026a21122006410c6a210620052108200f2005470d000b0b20110d020b200e450d00200d10290b4100210d0c020b200fad4220862010ad8421042009422088a7210f0b2004422088a721142004a721150b02402001450d00200010290b200d450d10200241086a4193c8c500411410b501200241c8006a41086a200241286a41086a290300370300200241c8006a41106a200241286a41106a290300370300200241c8006a41176a200241286a41176a29000037000020022002290328370348200228020c2116200228020821172002420137036820024100360270410810272201450d0820024288808080800137026c20022001360268200120033700002002200f3602880320024188036a200241e8006a103002400240200228026c2200200228027022016b200f490d00200228026821000c010b2001200f6a22062001490d0e20004101742205200620062005491b22064100480d0e0240024020000d002006102721000c010b200228026820002006102821000b2000450d0a2002200636026c200220003602680b20022001200f6a360270200020016a200d200f10ce041a200220143602880320024188036a200241e8006a10300240024020140d00200228026c2105200228027021130c010b20112014410c6c6a2110201121000340200028020021122002200041086a28020022013602880320024188036a200241e8006a103002400240200228026c2205200228027022066b2001490d00200228026821080c010b200620016a22082006490d1020054101742213200820082013491b22134100480d100240024020050d002013102721080c010b200228026820052013102821080b2008450d0d2002201336026c20022008360268201321050b2002200620016a2213360270200820066a2012200110ce041a2000410c6a22002010470d000b0b02400240200520136b4104490d00200228026821010c010b201341046a22012013490d0e20054101742200200120012000491b22004100480d0e0240024020050d002000102721010c010b200228026820052000102821010b2001450d0c2002200036026c20022001360268200021050b2002201341046a2200360270200120136a2016410020171b220836000002400240200520006b411f4d0d00200521060c010b200041206a22062000490d0e20054101742212200620062012491b22064100480d0e0240024020050d002006102721010c010b200120052006102821010b2001450d0d2002200636026c200220013602680b200120006a2200200c3a000020002002290348370001200041096a200241d0006a290300370000200041116a200241d8006a290300370000200041186a200241df006a2900003700002002410036026842012001201341246a200241e8006a101b2100024002400240024020022802682205417f470d0020060d010c020b02402000450d0002402006450d00200110290b200241e8006a2002418e036a41e80010ce041a200241ac026a200c3a0000200241a8026a2008360200200241a4026a2014360200200241a0026a20153602002002419c026a201136020020024198026a200f36020020024194026a200e36020020024190026a200d36020020024188026a2003370300200241b5026a200241d0006a290300370000200241bd026a200241d8006a290300370000200241c4026a200241df006a2900003700002002411136028002200242023703d001200220022903483700ad02200241d8026a2005360200200241d4026a2005360200200241d0026a20003602002002200241e8006a3602fc0320024188036a200241fc036a10bf022002280288032200200228029003101c21010240200228028c03450d00200010290b2001450d0320024180026a103d410521060c150b2006450d010b200110290b0240200e450d00200d10290b02402014450d002014410c6c21002011210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b410321062015450d12201110290c120b410110272201450d0e200141013a000020014101410910282201450d0f2001200337000141014185b1c000411c20014109101d2001102920024180026a103d200b450d12200a10290c120b200241fc006a41013602002002420137026c200241cc81c2003602682002410236028c03200241d083c20036028803200220024188036a360278200241e8006a41d481c2001057000b20052006103e000b41014101102a000b41094101102a000b20062001103e000b20062001103e000b20064104102a000b20144104102a000b41084101102a000b20064101102a000b20134101102a000b20004101102a000b20064101102a000b102b000b41014101102a000b41094101102a000b410421060b0240200b450d00200a10290b02400240024002400240024020060e06010203040500010b41d883c500412e10100c050b418684c500412c10100c040b41b284c500412d10100c030b41df84c500412a10100c020b418985c500411f10100c010b41a885c500412e10100b20024180046a240042010be60905027f027e027f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241b8d6c5003602080b2002200136020c200241206a200241086a1043024002400240024002400240024020022802202203450d002002200229022422043702142002200336021020024101360248200241d6a1c10036024c200241206a200241106a200241c8006a105f02400240200229032022054205510d00200241386a2802002101200241306a280200210620022802342107024020054200520d0020022903282108200621090c020b2005a7220041014b0d000240024020000e020001000b2007450d01200610290c010b200228023c450d00200110290b41002106410021090b200241003602282002420137032041011027210a0240024020090d00200a450d0320024281808080103702242002200a360220200a41003a000042808080801021050c010b200a450d0320024281808080103702242002200a360220200a41013a000020022001360248200241c8006a200241206a10300240024020010d002002280224210b200228022821000c010b2009200141286c6a210c2002280224210b2002280228210020092101034002400240200b20006b4120490d00200041206a210d2002280220210a0c010b200041206a220d2000490d0a200b410174220a200d200d200a491b220e4100480d0a02400240200b0d00200e1027210a0c010b2002280220200b200e1028210a0b200a450d072002200e3602242002200a360220200e210b0b200a20006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002002200d36022820002001290000370000200141206a290300210502400240200b200d6b4108490d00200d41086a21000c010b200d41086a2200200d490d0a200b410174220e20002000200e491b220e4100480d0a02400240200b0d00200e1027210a0c010b200a200b200e1028210a0b200a450d082002200e3602242002200a360220200e210b0b20022000360228200a200d6a2005370000200c200141286a2201470d000b0b02400240200b20006b4108490d002002280220210a0c010b200041086a22012000490d08200b410174220d20012001200d491b22014100480d0802400240200b0d0020011027210a0c010b2002280220200b20011028210a0b200a450d07200220013602242002200a3602200b2002200041086a2201360228200a20006a20083700002001ad42208621052009450d002007450d00200610290b2004a7210b02402004422088a72201450d00200141246c21002003210103400240024020012d0000220d41034b0d00024002400240200d0e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200b450d00200310290b200241d0006a24002005200aad840f0b200241346a410136020020024201370224200241cc81c20036022020024102360214200241e883c2003602102002200241106a360230200241206a41d481c2001057000b41014101102a000b41014101102a000b200e4101102a000b200e4101102a000b20014101102a000b102b000ba90a03027f047e077f230041d0006b22022400024002402001450d00200220003602080c010b200241b8d6c5003602080b2002200136020c200241206a200241086a10430240024002400240024002400240024020022802202203450d002002200229022422043702142002200336021020024101360248200241d6a1c10036024c200241206a200241106a200241c8006a105f42002105024002400240200229032022064205520d0042002107410021080c010b200241386a2802002108200241306a2802002100200228023c210920022802342101024020064201520d002001ad42208621052000ad2107200241c0006a280200210020022903282106200821010c020b02402006a7220a41014b0d0002400240200a0e020001000b2001450d01200010290c010b2009450d00200810290b41002108420021070b410021010b200241003602282002420137032041011027210b0240024020010d00200b450d034101210c200241013602242002200b360220200b41003a00000c010b200b450d0320024281808080103702242002200b360220200b41013a0000200b410141091028220a450d042002428980808090013702242002200a360220200a200637000120022000360248200241c8006a200241206a10300240024020000d002002280224210b2002280228210c0c010b2001200041286c6a210d2002280224210b2002280228210c034002400240200b200c6b4120490d00200c41206a21002002280220210a0c010b200c41206a2200200c490d0b200b410174220a20002000200a491b220e4100480d0b02400240200b0d00200e1027210a0c010b2002280220200b200e1028210a0b200a450d082002200e3602242002200a360220200e210b0b200a200c6a220c41186a200141186a290000370000200c41106a200141106a290000370000200c41086a200141086a29000037000020022000360228200c2001290000370000200141206a29030021060240200b20006b41074b0d00200041086a220c2000490d0b200b410174220e200c200c200e491b220c4100480d0b02400240200b0d00200c1027210a0c010b200a200b200c1028210a0b200a450d092002200c3602242002200a360220200c210b0b2002200041086a220c360228200a20006a2006370000200d200141286a2201470d000b0b02400240200b200c6b4108490d002002280220210b0c010b200c41086a2201200c490d09200b4101742200200120012000491b22014100480d0902400240200b0d0020011027210b0c010b2002280220200b20011028210b0b200b450d08200220013602242002200b3602200b200b200c6a2005200784370000200c41086a210c2009450d00200810290b2004a7210e02402004422088a72201450d00200141246c21002003210103400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200e450d00200310290b200241d0006a2400200cad422086200bad840f0b200241346a410136020020024201370224200241cc81c200360220200241023602142002418884c2003602102002200241106a360230200241206a41d481c2001057000b41014101102a000b41014101102a000b41094101102a000b200e4101102a000b200c4101102a000b20014101102a000b102b000bb405020a7f017e230041306b2202240041082103200241186a41086a220442003703002002420037031841c6c4c500411b200241186a1004200241086a41086a2004290300370300200220022903183703084100210520024100360218200241086a4110200241186a100521060240024020022802182207417f460d002002200736022c20022006360228200241186a200241286a1041024020022802182203450d00200241206a2802002104200228021c21052007450d02200610290c020b418f89c3004133104e000b410021040b200241003602202002420137031820022004360208200241086a200241186a10300240024002400240024020040d0020022802202107200228021821080c010b2003200441286c6a2109200228021c210a2002280220210720032104034002400240200a20076b4120490d00200741206a2106200228021821080c010b200741206a22062007490d05200a4101742208200620062008491b220b4100480d0502400240200a0d00200b102721080c010b2002280218200a200b102821080b2008450d032002200b36021c20022008360218200b210a0b200820076a220741186a200441186a290000370000200741106a200441106a290000370000200741086a200441086a2900003700002002200636022020072004290000370000200441206a290300210c02400240200a20066b4108490d00200641086a21070c010b200641086a22072006490d05200a410174220b20072007200b491b220b4100480d0502400240200a0d00200b102721080c010b2008200a200b102821080b2008450d042002200b36021c20022008360218200b210a0b20022007360220200820066a200c3700002009200441286a2204470d000b0b02402005450d00200310290b200241306a24002007ad4220862008ad840f0b200b4101102a000b200b4101102a000b102b000b7101017f024002400240410810272202450d00200242f20c37000020024108411010282202450d01200242960237000820024110412010282202450d02200242e807370018200242e8073700102002ad42808080808004840f0b41084101102a000b41104101102a000b41204101102a000b870d05017f017e067f017e077f230041f0006b22022400200241106a41e2c5c50041131094012002290318210320022802102104200241d0006a41086a220542003703002002420037035041d2c5c5004110200241d0006a1004200241206a41086a2005290300370300200220022903503703204100210620024100360250200241206a4110200241d0006a100521050240024020022802502207417f460d002005450d002002200736023420022005360230200241d0006a200241306a1041024020022802502206450d00200241d8006a2802002108200228025421092007450d02200510290c020b418f89c3004133104e000b0b200241c3c5c500410f1094012002290308210a2002280200210b200241d0006a41086a22054200370300200242003703504185c6c500410f200241d0006a1004200241206a41086a20052903003703002002200229035037032020024100360250200241206a4110200241d0006a10052105024002400240024002400240024002400240024020022802502207417f460d002005450d00200241d0006a2007412020074120491b220c6a410041004120200c6b200c411f4b1b10cd041a200241d0006a2005200c10ce041a2007411f4d0d02200241306a41186a2207200241d0006a41186a220c290000370300200241306a41106a220d200241d0006a41106a220e290000370300200241306a41086a220f200241d0006a41086a22102900003703002002200229005037033020051029200c2007290300370300200e200d2903003703002010200f290300370300200220022903303703500c010b200241d8006a4200370300200241e0006a4200370300200241e8006a4200370300200242003703500b200241306a41186a200241d0006a41186a290300370300200241306a41106a200241d0006a41106a290300370300200241306a41086a200241d0006a41086a290300370300200220022903503703302002410036025820024201370350410810272205450d01200242888080808001370254200220053602502005200a4200200b1b37000020054108411010282205450d0220024290808080800237025420052003420020041b3700082002200536025002404110200228025822076b41074b0d00200741086a22042007490d084110410174220b20042004200b491b22044100480d080240024041100d002004102721050c010b200541102004102821050b2005450d0420022004360254200220053602500b2006410820061b21102002200741086a360258200520076a42eb0237000020022008410020061b2205360220200241206a200241d0006a1030200228025421082002280258210e02402005450d002010200541286c6a21114100200e6b210b410021050340200e20056a210c024002402008200b6a4120490d00200228025021040c010b200c41206a2207200c490d0a20084101742204200720072004491b22074100480d0a0240024020080d002007102721040c010b200228025020082007102821040b2004450d072002200736025420022004360250200721080b2004200e6a20056a220d41186a201020056a220741186a290000370000200d41106a200741106a290000370000200d41086a200741086a2900003700002002200c41206a220f360258200d2007290000370000200741206a290300210302402008200b6a41606a41074b0d00200f41086a220d200f490d0a2008410174220f200d200d200f491b220d4100480d0a0240024020080d00200d102721040c010b20042008200d102821040b2004450d082002200d36025420022004360250200d21080b2002200c41286a3602582004200e6a20056a41206a2003370000200b41586a210b200541286a21052011200741286a470d000b200e20056a210e0b024002402008200e6b4120490d00200228025021050c010b200e41206a2205200e490d0820084101742207200520052007491b22074100480d080240024020080d002007102721050c010b200228025020082007102821050b2005450d0720022007360254200220053602500b2005200e6a22072002290330370000200741186a200241306a41186a290300370000200741106a200241306a41106a290300370000200741086a200241306a41086a290300370000200e41206a210702402006450d002009450d00201010290b200241f0006a24002007ad4220862005ad840f0b418f89c3004133104e000b41084101102a000b41104101102a000b20044101102a000b20074101102a000b200d4101102a000b20074101102a000b102b000b800603097f037e027f230041306b22022400200241186a41086a220342003703002002420037031841d2c5c5004110200241186a1004200241086a41086a2003290300370300200220022903183703084100210420024100360218200241086a4110200241186a100521050240024002400240024020022802182206417f460d002002200636022c20022005360228200241186a200241286a104120022802182207450d01200241206a2802002103200228021c210802402006450d00200510290b410021040240200341286c22060d00410121094100210a0c030b200641286d220a41ffffff3f71200a470d04200a41057422064100480d042006102722090d0220064101102a000b410121094100210a0c020b418f89c3004133104e000b02402003450d00200341286c21054100210420092103200721060340200641086a290000210b200641106a290000210c2006290000210d200341186a200641186a290000370000200341106a200c370000200341086a200b3700002003200d370000200441016a2104200341206a2103200641286a2106200541586a22050d000b0b2008450d00200710290b200241003602202002420137031820022004360208200241086a200241186a103002400240024020040d0020022802202106200228021821080c010b2004410574210e4100200228022022066b210520022802182108200228021c21072009210303400240200720056a411f4b0d00200641206a22042006490d042007410174220f20042004200f491b22044100480d040240024020070d002004102721080c010b200820072004102821080b2008450d03200421070b200820066a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200541606a2105200641206a2106200341206a2103200e41606a220e0d000b2002200736021c20022006360220200220083602180b0240200a450d00200910290b200241306a24002006ad4220862008ad840f0b20044101102a000b102b000b860601087f230041106b2202240020024100360208200242013703002000280200210302400240024002400240410410272204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810282204450d012002428880808080013702042004200336000420022004360200200028020821042002200041106a280200220336020c2002410c6a2002103002402003450d00200341057421052002280204210620022802082103034002400240200620036b4120490d00200341206a2107200228020021080c010b200341206a22072003490d0720064101742208200720072008491b22094100480d070240024020060d002009102721080c010b200228020020062009102821080b2008450d052002200936020420022008360200200921060b200820036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a290000370000200220073602082003200429000037000020072103200441206a2104200541606a22050d000b0b2000280214210420022000411c6a280200220336020c2002410c6a200210300240024020030d002002280208210320022802042105200228020021080c010b200341057421094100200228020822036b210620022802042105034002400240200520066a4120490d00200228020021080c010b200341206a22072003490d0720054101742208200720072008491b22074100480d070240024020050d002007102721080c010b200228020020052007102821080b2008450d062002200736020420022008360200200721050b200820036a220741086a200441086a290000370000200741106a200441106a290000370000200741186a200441186a2900003700002002200341206a220336020820072004290000370000200641606a2106200441206a2104200941606a22090d000b0b2001280200200128020420082003100302402005450d00200810290b200241106a24000f0b41044101102a000b41084101102a000b20094101102a000b20074101102a000b102b000bb60201037f230041106b22022400200241003602082002420137030020002d000021034101102721040240024002400240024020034101460d002004450d02200441003a0000200242818080801037020420022004360200200041086a200210dd02200228020445210020022802082103200228020021040c010b2004450d02200441013a00002002428180808010370204200220043602004121210320044101412110282204450d0320042000290001370001200441096a200041096a290000370000200441116a200041116a290000370000200441196a200041196a290000370000200242a1808080900437020420022004360200410021000b20012802002001280204200420031003024020000d00200410290b200241106a24000f0b41014101102a000b41014101102a000b41214101102a000bfd0b02067f027e230041106b22022400200028022821032002200041306a280200220436020c2002410c6a2001103002400240024002400240024002400240024002400240200141046a2802002205200141086a28020022066b2004490d00200128020021050c010b200620046a22072006490d0920054101742206200720072006491b22064100480d090240024020050d002006102721050c010b200128020020052006102821050b2005450d0120012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a2003200410ce041a2000280234210502400240200141046a2802002206200728020022046b4104490d00200128020021060c010b200441046a22032004490d0920064101742204200320032004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0220012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a200536000002400240200141046a2802002206200328020022046b4120490d00200128020021060c010b200441206a22052004490d0920064101742204200520052004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0320012006360200200141046a2004360200200141086a28020021040b200141086a2205200441206a360200200620046a220441186a200041d0006a290000370000200441106a200041c8006a290000370000200441086a200041c0006a29000037000020042000290038370000200041086a29030021082000290300210902400240200141046a2802002206200528020022046b4110490d00200128020021060c010b200441106a22052004490d0920064101742204200520052004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0420012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000290310210802400240200141046a2802002206200528020022046b4108490d00200128020021060c010b200441086a22052004490d0920064101742204200520052004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0520012006360200200141046a2004360200200141086a28020021040b200141086a2205200441086a360200200620046a20083700000240024020002903184201510d0002400240200141046a28020020052802002200460d00200128020021040c010b200041016a22042000490d0b20004101742206200420042006491b22064100480d0b0240024020000d002006102721040c010b200128020020002006102821040b2004450d0820012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a00000c010b02400240200141046a28020020052802002204460d00200128020021060c010b200441016a22062004490d0a20044101742205200620062005491b22054100480d0a0240024020040d002005102721060c010b200128020020042005102821060b2006450d0820012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a00002000290320210802400240200141046a2802002204200528020022006b4108490d00200128020021040c010b200041086a22062000490d0a20044101742200200620062000491b22004100480d0a0240024020040d002000102721040c010b200128020020042000102821040b2004450d0920012004360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200420006a20083700000b200241106a24000f0b20064101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20064101102a000b20054101102a000b20004101102a000b102b000b130020004106360204200041a894c2003602000b3400200041e087c20036020420004100360200200041146a4107360200200041106a418cacc200360200200041086a42083702000b02000b3701017f02404110102722020d0041104101102a000b2002420037000820024201370000200042908080808002370204200020023602000b5d01027f230041106b22022400200241003602082002420137030002404101102722030d0041014101102a000b200341003a0000200041086a4101360200200241013602042002200336020020002002290300370200200241106a24000bc70101017f23004190016b22022400200241003a00782002428080848080023703682002420137035820024201370350200242af0137034820024287013703402002420137033820024201370330200242013703282002420137032020024201370318200242013703102002420137030820024280808080c00037036020024280808180800437037020024100360288012002420137038001200241086a20024180016a109302200041086a200228028801360200200020022903800137020020024190016a24000b130020004110360204200041c4b5c2003602000b3301017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280ade2043700000b3201017f02404104102722020d0041044101102a000b20004284808080c000370204200020023602002002418080013600000b3101017f02404104102722020d0041044101102a000b20004284808080c0003702042000200236020020024180083600000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242e8073700000b3c01017f02404110102722020d0041104101102a000b2002420037000820024280a094a58d1d370000200042908080808002370204200020023602000b3b01017f02404110102722020d0041104101102a000b2002420037000820024280c8afa025370000200042908080808002370204200020023602000b3801017f02404110102722020d0041104101102a000b200242003700082002429601370000200042908080808002370204200020023602000b3801017f02404110102722020d0041104101102a000b20024200370008200242e807370000200042908080808002370204200020023602000b3701017f02404110102722020d0041104101102a000b2002420037000820024204370000200042908080808002370204200020023602000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241083600000b3701017f02404110102722020d0041104101102a000b2002420037000820024210370000200042908080808002370204200020023602000b3001017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242023700000be80c03067f0b7e047f230041106b2202240020024100360208200241086a2001280200220320012802042204410420044104491b220510ce041a2001200420056b22063602042001200320056a220536020002400240200441034b0d00200041023a00700c010b2002280208210720024200370308200241086a20052006410820064108491b220410ce041a2001200620046b22033602042001200520046a22043602000240200641074b0d00200041023a00700c010b2002290308210820024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210920024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308210a20024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210b20024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308210c20024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210d20024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308210e20024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210f20024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308211020024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308211120024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308211220024100360208200241086a20042003410420034104491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341034b0d00200041023a00700c010b2002280208211320024100360208200241086a20042006410420064104491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641034b0d00200041023a00700c010b2002280208211420024100360208200241086a20042003410420034104491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341034b0d00200041023a00700c010b2002280208211520024100360208200241086a20042006410420064104491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641034b0d00200041023a00700c010b20022802082116200241003a0008200241086a20042003410047220510ce041a024020032005490d002001200320056b22063602042001200420056a2204360200024020030d00200041023a00700c020b20022d0008210320024100360208200241086a20042006410420064104491b220510ce041a2001200620056b3602042001200420056a3602000240200641034b0d00200041023a00700c020b20022802082101200020033a00702000200136026c2000201636026820002015360264200020143602602000201336025c200020073602582000201237035020002011370348200020103703402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a370310200020093703082000200837030020002002280008360071200041f4006a200241086a41036a2800003600000c010b20052003103e000b200241106a24000b970402067f017e230041e0006b2202240002400240024002400240411a10272203450d00200341186a41002f00cfce423b0000200341106a41002900c7ce42370000200341086a41002900bfce42370000200341002900b7ce423700002003411a413a10282203450d012003200129000037001a200341326a200141186a2900003700002003412a6a200141106a290000370000200341226a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003413a200241c0006a1000200241186a41186a2001290300370300200241186a41106a2004290300370300200241186a41086a20052903003703002002200229034037031820024100360240200241186a4120200241c0006a1005210420022802402201417f460d032002200136023c20022004360238200241c0006a200241386a10f30220022802482205450d02200241086a2206200241c0006a41146a290200370300200241106a2207200241c0006a411c6a2802003602002002200229024c3703002002290340210802402001450d00200410290b20002005360208200020083702002000200229030037020c200041146a20062903003702002000411c6a20072802003602000c040b411a4101102a000b413a4101102a000b418f89c3004133104e000b200041003602080b20031029200241e0006a24000bc60202067f017e230041106b220224002002410036020020022001280200220320012802042204410420044104491b220510ce0421022001200420056b22063602042001200320056a220536020002400240200441034b0d00200041003602080c010b2002280200210720024100360200200220052006410420064104491b220310ce0421042001200620036b3602042001200520036a3602000240200641034b0d00200041003602080c010b2004280200210620042001102d0240200428020022050d00200041003602080c010b2004290204210820042001102d2008a721010240200428020022030d00200041003602082001450d01200510290c010b200041186a2004290204370200200041146a2003360200200041106a20084220883e02002000200136020c2000200536020820002006360204200020073602000b200241106a24000b130020004104360204200041d4cec2003602000b3400200041cad6c20036020420004100360200200041146a4105360200200041106a41e0d6c200360200200041086a42133702000b340020004194ddc20036020420004100360200200041146a4105360200200041106a41a8ddc200360200200041086a42133702000bf02105027f017e027f017e067f230041f0016b22012400024002400240024002400240024041880110272202450d000240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002802000e12000102030405060708090a0b0c0d0e0f1011000b200141e8006a200041086a10960220024100360200200241106a200141e8006a41086a290300370300200220012903683703080c110b109702000b200041086a290300210320024102360200200220033703080c0f0b200141e8006a200041046a1038200241033602002002410c6a200141f0006a280200360200200220012903683702040c0e0b109802000b0240024002400240200041086a280200417f6a220441014b0d0020040e020102010b41e4bdc0001058000b41012104024002402000410c6a22052d00004101460d00200141026a200541036a2d00003a0000200141f0006a2000411c6a290200370300200141e8006a41106a200041246a29020037030020014180016a2000412c6a2d00003a0000200120052f00013b01002001200041146a290200370368200041106a2802002105410021040c010b200041106a28020021050b200141246a41026a200141026a2d00003a0000200141286a41086a200141e8006a41086a290300370300200141286a41106a200141e8006a41106a290300370300200141286a41186a200141e8006a41186a280200360200200120012f01003b012420012001290368370328200041386a29030021032000290330210641012107200141106a21000c010b41012104024002402000410c6a22052d00004101460d00200141ee016a200541036a2d00003a0000200141f0006a2000411c6a290200370300200141e8006a41106a200041246a29020037030020014180016a2000412c6a2d00003a0000200120052f00013b01ec012001200041146a290200370368200041106a2802002105410021040c010b200041106a28020021050b41022107200141246a41026a200141ec016a41026a2d00003a0000200141286a41086a200141e8006a41086a290300370300200141286a41106a200141e8006a41106a290300370300200141286a41186a200141e8006a41186a280200360200200120012f01ec013b012420012001290368370328200120002903303703102001200041386a290300370318200041c8006a290300210320002903402106200121000b2000200637030020002003370308200220043a000c20022007360208200220012f01243b000d2002410f6a200141266a2d00003a000020022005360210200220012903283702142002411c6a200141286a41086a290300370200200241246a200141386a2903003702002002412c6a200141c0006a280200360200200241386a200141106a41086a2903003703002002200129031037033020022001290300370340200241c8006a200141086a290300370300200241053602000c0c0b200141e8006a200041086a10990220024106360200200241386a200141e8006a41306a290300370300200241306a200141e8006a41286a290300370300200241286a200141e8006a41206a290300370300200241206a200141e8006a41186a290300370300200241186a200141e8006a41106a290300370300200241106a200141e8006a41086a290300370300200220012903683703080c0b0b200141e8006a41186a200041286a290000370300200141e8006a41106a200041206a290000370300200141f0006a200041186a290000370300200141e8006a41286a200041386a290000370300200141e8006a41306a200041c0006a290000370300200141e8006a41386a200041c8006a2900003703002001200041106a2900003703682001200041306a290000370388012000410c6a2802002204417f4c0d0c0240024020040d00410121000c010b20002802042105200410272200450d0e20002005200410ce041a0b200141286a41386a2205200141e8006a41386a290300370300200141286a41306a2207200141e8006a41306a290300370300200141286a41286a2208200141e8006a41286a290300370300200141286a41206a2209200141e8006a41206a290300370300200141286a41186a220a200141e8006a41186a290300370300200141286a41106a220b200141e8006a41106a290300370300200141286a41086a220c200141e8006a41086a290300370300200120012903683703282002200436020c200220043602082002200036020420022001290328370210200241186a200c290300370200200241206a200b290300370200200241286a200a290300370200200241306a2009290300370200200241386a2008290300370200200241c0006a2007290300370200200241c8006a2005290300370200200241073602000c0a0b200141e8006a200041086a109a0220024108360200200241386a200141e8006a41306a290300370300200241306a200141e8006a41286a290300370300200241286a200141e8006a41206a290300370300200241206a200141e8006a41186a290300370300200241186a200141e8006a41106a290300370300200241106a200141e8006a41086a290300370300200220012903683703080c090b02400240024002400240024020002d0004417f6a220441034b0d0020040e0401020304010b41c893c2001058000b200041106a280200220741ffffff3f712007470d0e20074105742204417f4c0d0e200041086a2802002109410121004101210802402004450d00200410272208450d110b024020070d0041002104410021070c040b20074105742105416020096b210a2008210020092104034020002004290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a290000370000200041206a2100200441206a2104200541606a22050d000b41012100200920074105746a200a6a41057641016a21040c030b200041086a10f7022108410221000c020b200041086a28020021082000410c6a10f7022107410321000c010b2001412a6a200041046a220441036a2d00003a0000200141e8006a41086a2000411c6a290000370300200141e8006a41106a200041246a2d00003a0000200120042f00013b01282001200041146a29000037036820002d00254100472109200041286a2802002105200041106a28000021042000410c6a2800002107200041086a2800002108410421000b200220003a0004200220012f01283b0005200220043602102002200736020c200220083602082002200129036837021420022005360228200220093a002520024109360200200241076a2001412a6a2d00003a00002002411c6a200141f0006a290300370200200241246a200141f8006a2d00003a00000c080b02400240024002400240024020002d0004417f6a220441034b0d0020040e0401020304010b41c893c2001058000b200041106a280200220741ffffff3f712007470d0d20074105742204417f4c0d0d200041086a2802002109410121004101210802402004450d00200410272208450d110b024020070d0041002104410021070c040b20074105742105416020096b210a2008210020092104034020002004290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a290000370000200041206a2100200441206a2104200541606a22050d000b41012100200920074105746a200a6a41057641016a21040c030b200041086a10f7022108410221000c020b200041086a28020021082000410c6a10f7022107410321000c010b2001412a6a200041046a220441036a2d00003a0000200141e8006a41086a2000411c6a290000370300200141e8006a41106a200041246a2d00003a0000200120042f00013b01282001200041146a29000037036820002d00254100472109200041286a2802002105200041106a28000021042000410c6a2800002107200041086a2800002108410421000b200220003a0004200220012f01283b0005200220043602102002200736020c200220083602082002200129036837021420022005360228200220093a00252002410a360200200241076a2001412a6a2d00003a00002002411c6a200141f0006a290300370200200241246a200141f8006a2d00003a00000c070b200141e8006a200041086a10c8012002410b360200200241c0006a200141e8006a41386a290300370300200241386a200141e8006a41306a290300370300200241306a200141e8006a41286a290300370300200241286a200141e8006a41206a290300370300200241206a200141e8006a41186a290300370300200241186a200141e8006a41106a290300370300200241106a200141e8006a41086a290300370300200220012903683703080c060b200041086a29030021032002410c360200200220033703080c050b2000410c6a2802002204417f4c0d060240024020040d00410121000c010b20002802042105200410272200450d0b20002005200410ce041a0b2002200436020c20022004360208200220003602042002410d3602000c040b024002400240024002400240200041086a280200417f6a220441024b0d0020040e03010203010b4190a9c1001058000b200041386a2903002103200041306a290300210641012104024002402000410c6a2d00004101460d00200141f0006a2000411c6a290200370300200141e8006a41106a200041246a29020037030020014180016a2000412c6a2d00003a00002001200041146a29020037036820002f000d2000410f6a2d0000411074722105200041106a2802002100410021040c010b200041106a28020021000b200141286a41186a200141e8006a41186a280200360200200141286a41106a200141e8006a41106a290300370300200141286a41086a200141e8006a41086a29030037030020012001290368370328410121070c030b2000410c6a28020022044108762105410221070c010b2000410c6a28020022044108762105410321070b0b200220063703302002200036021020022007360208200220012903283702142002410e360200200241386a200337030020022005410874200441ff01717236020c2002411c6a200141286a41086a290300370200200241246a200141386a2903003702002002412c6a200141c0006a2802003602000c030b200141e8006a200041086a109c02200241086a200141e8006a41800110ce041a2002410f3602000c020b02400240024002402000280204417f6a220441014b0d0020040e020102010b41f8e2c1001058000b41880110272204450d0a2004200041086a280200109502410121000c010b4101210402400240200041086a2d00004101460d00200141e8006a41086a200041186a290200370300200141e8006a41106a200041206a290200370300200141e8006a41186a200041286a2d00003a00002001200041106a29020037036820002f00092000410b6a2d00004110747221072000410c6a2802002105410021040c010b2000410c6a28020021050b200141286a41186a200141e8006a41186a280200360200200141286a41106a200141e8006a41106a290300370300200141286a41086a200141e8006a41086a2903003703002001200129036837032820042007410874722104410221000b2002200536020c20022004360208200220003602042002200129032837021020024110360200200241186a200141306a290300370200200241206a200141286a41106a290300370200200241286a200141286a41186a2802003602000c010b200141e8006a200041086a10b101200241086a200141e8006a41d80010ce041a200241113602000b200141f0016a240020020f0b4188014108102a000b1039000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b4188014108102a000bc50401047f230041f0006b22072400200741086a200242002003200410d304200741c0006a41e887c50041111094012007290348210320072802402108200741e0006a41086a220942003703002007420037036041e887c5004111200741e0006a1004200741d0006a41086a220a2009290300370300200720072903603703502007200120027d2003420020081b7c370360200741d0006a4110200741e0006a41081003200741306a20002007290308200741086a41086a290300108301200741306a41086a290300210120072903302102200741186a41b18ac0004116108601200520027d200220057d2002200558200120065820012006511b22001b2103200620017d2005200254ad7d200120067d2002200554ad7d20001b2106200741186a41106a2903004200200728021822081b21052007290320420020081b2102024002402000450d00200942003703002007420037036041b18ac0004116200741e0006a1004200a20092903003703002007200729036037035020074200200520067d2002200354ad7d2206200220037d2201200256200620055620062005511b22091b37036820074200200120091b370360200741e0006a21090c010b200942003703002007420037036041b18ac0004116200741e0006a1004200a2009290300370300200720072903603703502007427f200520067c200220037c22062002542209ad7c22022009200220055420022005511b22091b3703682007427f200620091b370360200741e0006a21090b200741d0006a4110200941101003200741f0006a24000bcd0101047f200020014105746a210320002104024003400240200320046b41e0004b0d00024020042003460d00200020014105746a210503404101210620022004460d0420042002412010d004450d042005200441206a2204470d000b0b41000f0b4101210620042002460d0120042002412010d004450d01200441206a22052002460d0120052002412010d004450d01200441c0006a22052002460d0120052002412010d004450d01200441e0006a22052002460d0120044180016a210420052002412010d0040d000b0b20060bbd0101047f230041a0026b2202240020024100360290012001412020024190016a100521030240024002402002280290012204417f470d00411221050c010b2002200436029c02200220033602980220024190016a20024198026a103c20022802900122054112460d012002410c6a20024190016a41047241840110ce041a02402004450d00200310290b20014120100c0b20002005360200200041046a2002410c6a41840110ce041a200241a0026a24000f0b418f89c3004133104e000b970402067f017e230041e0006b2202240002400240024002400240411a10272203450d00200341186a41002f009de7423b0000200341106a4100290095e742370000200341086a410029008de74237000020034100290085e7423700002003411a413a10282203450d012003200129000037001a200341326a200141186a2900003700002003412a6a200141106a290000370000200341226a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003413a200241c0006a1000200241186a41186a2001290300370300200241186a41106a2004290300370300200241186a41086a20052903003703002002200229034037031820024100360240200241186a4120200241c0006a1005210420022802402201417f460d032002200136023c20022004360238200241c0006a200241386a10f30220022802482205450d02200241086a2206200241c0006a41146a290200370300200241106a2207200241c0006a411c6a2802003602002002200229024c3703002002290340210802402001450d00200410290b20002005360208200020083702002000200229030037020c200041146a20062903003702002000411c6a20072802003602000c040b411a4101102a000b413a4101102a000b418f89c3004133104e000b200041003602080b20031029200241e0006a24000ba40b03087f017e017f23004180026b22022400200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e001200241e0016a2001280200220620012802042207412020074120491b220810ce041a2001200720086b22093602042001200620086a22083602000240024002400240024002402007411f4d0d00200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e001200241e0016a20082009410047220710ce041a20092007490d022001200920076b22063602042001200820076a22073602002009450d0020022d00e00122034106490d010b200041023a00210c040b200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e001200241e0016a20072006410047220810ce041a20062008490d012001200620086b22093602042001200720086a220736020002402006450d0020022d00e001220841014b0d00410021060240024020080e020100010b200241e0016a2009412020094120491b22086a41004100412020086b2008411f4b1b10cd041a200241e0016a2007200810ce041a2001200920086b22043602042001200720086a22073602002009411f4d0d01200241a0016a41086a200241e0016a41086a290000220a37030020024180016a41186a200241e0016a41186a29000037030020024180016a41106a200241e0016a41106a29000037030020024180016a41086a200a370300200220022900e001220a3703a0012002200a3703800141012106200421090b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e001200241e0016a20072009410047220810ce041a20092008490d032001200920086b22043602042001200720086a22073602002009450d0020022d00e001220841014b0d00410021090240024020080e020100010b200241e0016a2004412020044120491b22086a41004100412020086b2008411f4b1b10cd041a200241e0016a2007200810ce041a2001200420086b3602042001200720086a3602002004411f4d0d01200241a0016a41086a200241e0016a41086a290000220a37030020024180016a41186a200241e0016a41186a29000037030020024180016a41106a200241e0016a41106a29000037030020024180016a41086a200a370300200220022900e001220a3703a0012002200a37038001410121090b200241206a41186a220120024180016a41186a290300370300200241206a41106a220720024180016a41106a290300370300200241206a41086a220820024180016a41086a290300370300200241c0006a41086a2204200241e0006a41086a290300370300200241c0006a41106a2205200241e0006a41106a290300370300200241c0006a41186a220b200241e0006a41186a290300370300200220022903800137032020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200020063a0021200020033a0020200041c2006a20093a0000200020022903403700222000412a6a2004290300370000200041326a20052903003700002000413a6a200b290300370000200041c3006a2002290320370000200041cb006a2008290300370000200041d3006a2007290300370000200041db006a20012903003700000c040b200041023a00210c030b20072009103e000b20082006103e000b20082009103e000b20024180026a24000b3400200041e6efc20036020420004100360200200041146a4102360200200041106a41f0efc200360200200041086a42073702000bd60401097f230041d0006b220224000240410f10272203450d00200341076a41002900f3ec42370000200341002900ecec4237000002402003410f411e10282204450d002004200036000f200241306a41186a22034200370300200241306a41106a22004200370300200241306a41086a220542003703002002420037033020044113200241306a1000200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a20052903003703002002200229033037030820024100360238200242013703302001280200210620022001280208220336022c2002412c6a200241306a10300240024020030d002002280238210520022802342107200228023021080c010b2003410574210920022802302108200228023421072002280238210020062103034002400240200720006b4120490d00200041206a21050c010b0240200041206a22052000490d002007410174220a20052005200a491b220a4100480d000240024020070d00200a102721080c010b20082007200a102821080b02402008450d00200a21070c020b200a4101102a000b102b000b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b2002200736023420022005360238200220083602300b200241086a412020082005100302402007450d00200810290b200410290240200141046a280200450d00200610290b200241d0006a24000f0b411e4101102a000b410f4101102a000bd06704167f017e087f017e23004180036b2204240041002105200441003602f002200420023602ec02200420013602e8020240024002400240024002400240200241034b0d0041012106200441013a00d002200441ec016a4101360200200442013702dc0120044180c0c5003602d8012004411f3602b4022004200441b0026a3602e8012004200441d0026a3602b00220044180016a200441d8016a10e6032004280280012107200428028401210820042802880121094105210a4100210b0c010b200441043602f002024020012800004180c2cdeb06460d004101210a410121060c010b024002402002417c714104460d00200241074b0d0141082002107f000b41012106200441013a00d002200441ec016a4101360200200442013702dc0120044180c0c5003602d8012004411f3602b4022004200441b0026a3602e8012004200441d0026a3602b00220044180016a200441d8016a10e6032004280280012107200428028401210820042802880121094105210a410021054100210b0c010b200441083602f002410121060240200128000422074101460d004102210a0c010b200441d8016a200441e8026a10f20302400240024020042802d8014101470d00410421084100210c410021090c010b200441d8016a410572210d410421084128210a410021054100210c410021094100210b02400340200441d0026a41026a2201200d41026a2d00003a00002004200d2f00003b01d002200428028402210e200428028002210f20042802fc01211020042802f801211120042802f401211220042802f001211320042802ec01211420042802e801211520042802e401211620042802e0012117024020042d00dc012206417e6a41ff0171410a4b0d004100211802400240024002400240024002400240024002400240024020060e0f0b0b000102030405060708090a0b0b0b0b410121180c0a0b410221180c090b410321180c080b410421180c070b410521180c060b410621180c050b410721180c040b410821180c030b410921180c020b410a21180c010b410b21180b0240200b41ff0171221920184d0d004113210a0c030b4100211802400240024002400240024002400240024002400240024020060e0f0b0b000102030405060708090a0b0b0b0b410121180c0a0b410221180c090b410321180c080b410421180c070b410521180c060b410621180c050b410721180c040b410821180c030b410921180c020b410a21180c010b410b21180b024020192018470d004114210a0c030b4100210b0240024002400240024002400240024002400240024020060e0f0b0b000102030405060708090a0b0b0b0b4101210b0c0a0b4102210b0c090b4103210b0c080b4104210b0c070b4105210b0c060b4106210b0c050b4107210b0c040b4108210b0c030b4109210b0c020b410a210b0c010b410b210b0b20044180016a41026a221820012d00003a0000200420042f01d0023b01800102400240200c2009470d00200c41016a2201200c490d072005200120012005491b2209ad422c7e221a422088a70d07201aa722014100480d0702400240200c0d002001102721080c010b2008200a41586a2001102821080b2008450d010b2008200a6a220141586a20063a00002001200e3602002001417c6a200f360200200141786a2010360200200141746a2011360200200141706a20123602002001416c6a2013360200200141686a2014360200200141646a2015360200200141606a20163602002001415c6a2017360200200141596a220120042f0180013b0000200141026a20182d00003a0000200541026a2105200a412c6a210a200c41016a210c200441d8016a200441e8026a10f20320042802d8014101460d030c010b0b20014104102a000b024002402006410d4b0d00024002400240024002400240024002400240024002400240024020060e0e0001020304050607080e090a0b0c000b2016450d0d201710290c0d0b02402016450d00201710290b2013450d0c201410290c0c0b02402015450d00201541047421062017210103400240200141046a280200450d00200128020010290b200141106a2101200641706a22060d000b0b2016450d0b201710290c0b0b02402015450d00201541286c21062017210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200641586a22060d000b0b2016450d0a201710290c0a0b2016450d09201710290c090b2016450d08201710290c080b2016450d07201710290c070b02402015450d00201720154104746a210d201721050340024020052802082206450d0020052802002101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b200541106a21010240200541046a280200450d00200528020010290b200121052001200d470d000b0b2016450d06201710290c060b02402015450d00201541146c21062017210103400240200141046a280200450d00200128020010290b200141146a21012006416c6a22060d000b0b2016450d05201710290c050b02402015450d0020172015411c6c6a210d20172105034002402005410c6a2802002206450d0020052802042101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200d470d000b0b2016450d04201710290c040b02402015450d002017201541186c6a210d2017210503400240200541046a280200450d00200528020010290b0240200541146a2802002206450d00200528020c2101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b200541186a21010240200541106a280200450d00200528020c10290b200121052001200d470d000b0b2016450d03201710290c030b02402015450d0020172015411c6c6a210d20172105034002402005410c6a2802002206450d0020052802042101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200d470d000b0b2016450d02201710290c020b0240201741ff0171220141024b0d0002400240024020010e03000102000b2015450d04201610290c040b02402013450d002013410c6c2106201521010340024020012802002205450d00200141046a280200450d00200510290b2001410c6a2101200641746a22060d000b0b2014450d03201510290c030b02402013450d00201520134104746a21162015211703402017220d41106a21170240200d2802042201450d000240200d410c6a2802002206450d002006410c6c21060340024020012802002205450d00200141046a280200450d00200510290b2001410c6a2101200641746a22060d000b0b200d41086a280200450d00200d28020410290b20172016470d000b0b2014450d02201510290c020b2015450d01201610290c010b02402016450d00201710290b02402013450d002012450d00201310290b200f450d00201010290b0c010b024020042d00dc010d00200c412c6c210641002105410021010240034020062001460d01200820016a210a2001412c6a220b2101200a2d0000410b470d000b2008200b6a41606a28020021050b200c412c6c21064100210d410021010240034020062001460d01200820016a210a2001412c6a220b2101200a2d00004104470d000b200441f8006a2008200b6a41586a108003200428027c210d0b02402005200d470d004100210a4101210741e100210b41f3da012105410021060c030b0240200c450d00200c412c6c210a20082101034020011088032001412c6a2101200a41546a220a0d000b0b410121064119210a024020090d000c030b200810290c020b20042802dc01220a4110762105200a410876210b200441d8016a41106a280200210d200441e4016a2802002117200441d8016a41086a28020021070b0240200c450d00200c412c6c210620082101034020011088032001412c6a2101200641546a22060d000b0b4101210602402009450d00200810290b200d2109201721080b02402006450d00200821060c040b20042802f0022002470d022005411074200b41ff017141087472200a41ff017172211b2008200c412c6c6a210a20082101024002400340200a2001460d0120012d000021022001412c6a2206210120024102470d000b200441f0006a200641586a1080034104211c200428027021024100211002400240024002400240200428027422010d004100211d0c010b2001410474220a4100480d06200a1027221c450d012001211d0b02402001450d002001410474210641002110201c21010340200241086a280200220a417f4c0d032002410c6a2d0000210b2002280200210502400240200a0d004101210d0c010b200a1027220d450d050b200d2005200a10ce0421052001410d6a2002410d6a2d00003a00002001410c6a200b3a0000200141086a200a360200200141046a200a36020020012005360200200141106a2101201041016a2110200241106a2102200641706a22060d000b0b201c450d030c040b200a4104102a000b1039000b200a4101102a000b4100211d4104211c410021100b2008200c412c6c6a210a20082101024003404100210641b8d6c500210b0240200a2001470d00410021010c020b20012d000021022001412c6a2205210120024103470d000b200441e8006a200541586a1080034100210120042802682202450d00200428026c21012002210b0b0240024020010d0041012112410021134100210a4100210e410421154100210b4100211e41042114410421174100210241002105410021164100211f410121190c010b200141286c210d200b411c6a2101410421154100210641002113410121124100210a4100210e4100210b4100211e41042114410421174100210241002105410021164100211f41012119024002400240024002400340024002400240024002402001417c6a2d00000e0400010203000b2001280200210f0240024020052002460d00200521110c010b200241016a22112002490d0c20024101742218201120112018491b221841ffffffff03712018470d0c201841027422114100480d0c0240024020020d002011102721170c010b201720024102742011102821170b2017450d0620022111201821020b201720114102746a200f360200200541016a21050c030b200441d8016a41086a220f200141086a280200360200200420012902003703d8010240200a200e470d00200a41016a220e200a490d0b200a4101742211200e200e2011491b220ead420c7e221a422088a70d0b201aa722114100480d0b02400240200a0d002011102721150c010b2015200a410c6c2011102821150b2015450d060b2015200a410c6c6a221120042903d801370200201141086a200f280200360200200a41016a210a0c020b200441d8016a41086a220f200141086a280200360200200420012902003703d8010240200b201e470d00200b41016a2211200b490d0a200b4101742218201120112018491b221ead420c7e221a422088a70d0a201aa722114100480d0a02400240200b0d002011102721140c010b2014200b410c6c2011102821140b2014450d060b2014200b410c6c6a221120042903d801370200201141086a200f280200360200200b41016a210b0c010b2001417e6a220f2d000021112001417d6a22182d00002120024020062013470d00200641016a22132006490d0920064101742221201320132021491b221320136a22222013490d0920224100480d090240024020060d002022102721120c010b201220212022102821120b2012450d060b201220064101746a222220114101713a0001202220203a0000200f2d0000210f20182d000021110240201f2016470d00201641016a22182016490d0920164101742220201820182020491b221f201f6a2218201f490d0920184100480d090240024020160d002018102721190c010b201920202018102821190b2019450d070b200641016a2106201920164101746a2218200f4101713a0001201820113a0000201641016a21160b200141286a2101200d41586a220d450d060c000b0b20114104102a000b20114104102a000b20114104102a000b20224101102a000b20184101102a000b2008200c412c6c6a210f200821010240024002400240024002400240024002400240024002400240024003400240200f2001470d002002210d0c020b20012d0000210d2001412c6a22112101200d4104470d000b200441e0006a201141586a10800302402004280264220d0d002002210d0c010b20042802602101200d410274210f0340200128020021110240024020052002460d002002210d200521180c010b200241016a220d2002490d1020024101742218200d200d2018491b220d41ffffffff0371200d470d10200d41027422184100480d100240024020020d002018102721170c010b201720024102742018102821170b2017450d0320022118200d21020b200141046a2101201720184102746a2011360200200541016a2105200f417c6a220f0d000b0b2008200c412c6c6a210f20082101024002400340200f2001460d0120012d000021022001412c6a2211210120024105470d000b200441d8006a201141586a108003200428025c410c6c2218450d0020042802582101200a410174210f200a410c6c21020340200141086a2111024002400240200141046a2802004101470d002004201128020022203602c0022001280200222220204b0d010b20044100360280010c010b200441023602ec01200442023702dc01200441dc9cc5003602d801200441013602f402200441013602ec02200420223602d0022004200441e8026a3602e8012004200441d0026a3602f0022004200441c0026a3602e80220044180016a200441d8016a10e603200428028001450d0020044180016a21010c0e0b2001290200211a200441d8016a41086a222020112802003602002004201a3703d8010240200a200e470d00200a41016a220e200a490d11200f200e200e200f491b220ead420c7e221a422088a70d11201aa722114100480d1102400240200a0d002011102721150c010b201520022011102821150b2015450d030b2001410c6a2101201520026a221120042903d801370200201141086a2020280200360200200f41026a210f2002410c6a2102200a41016a210a201841746a22180d000b0b2008200c412c6c6a210f20082101024002400340200f2001460d0120012d000021022001412c6a2211210120024106470d000b200441d0006a201141586a10800320042802542202450d00200428025021012002410c6c2111200b410174210f200b410c6c21020340200441d8016a200110f503024020042802d801450d00200441d8016a21010c0f0b2001290200211a200441d8016a41086a2218200141086a2802003602002004201a3703d8010240200b201e470d00200b41016a221e200b490d12200f201e201e200f491b221ead420c7e221a422088a70d12201aa722204100480d1202400240200b0d002020102721140c010b201420022020102821140b2014450d030b2001410c6a2101201420026a222020042903d801370200202041086a2018280200360200200f41026a210f2002410c6a2102200b41016a210b201141746a22110d000b0b2008200c412c6c6a210f20082101024002400240024002400340200f2001460d0120012d000021022001412c6a2211210120024107470d000b200441c8006a201141586a108003200428024c2202450d002004280248220120024104746a212220064101742102200441d8016a41047221200340200441d8016a20012019201610f60302400240024020042d00d8014101460d00200420042d00d901220f3a00c0020240200f2001410c6a2d00002211470d0020044100360280010c030b200441023602ec01200442023702dc01200441f09dc5003602d801200441203602f402200441203602ec02200420113a00d0022004200441e8026a3602e8012004200441c0026a3602f0022004200441d0026a3602e80220044180016a200441d8016a10e6030c010b20044180016a41086a202041086a28020036020020042020290200370380010b0240200428028001450d0020044180016a21010c140b2001410c6a2d0000210f0b2001410d6a2d00002111024020062013470d00200641016a22132006490d162002201320132002491b221320136a22182013490d1620184100480d160240024020060d002018102721120c010b201220022018102821120b2012450d030b201220026a2218200f3a0000201841016a20114101713a0000200241026a2102200641016a2106200141106a22012022470d000b0b200441b8016a2005360200200441b4016a200d36020020044180016a412c6a2010360200200441a8016a201d360200200441a0016a20063602002004419c016a201336020020044194016a200a36020020044190016a200e360200200420173602b0012004201c3602a40120042012360298012004201536028c012004200b360288012004201e3602840120042014360280012008200c412c6c6a210a20082101024003400240200a2001470d004100210b0c020b20012d000021022001412c6a2206210120024104470d000b200441c0006a200641586a1080032004280244210b0b2004200b3602bc012008200c412c6c6a210a20082101024003400240200a2001470d00410021010c020b20012d000021022001412c6a220621012002410b470d000b200641606a28020021010b200420013602c001200b2001470d0d0240200b450d002008200c412c6c6a210a200821010340200a2001460d0520012d000021022001412c6a2206210120024104470d000b2008200c412c6c6a210b200821010340200b2001460d0420012d000021022001412c6a220a21012002410b470d000b200441386a200641586a108003200428023c2201450d002004280238220d20014102746a2115200a41606a2117200a41586a211620044191026a2111410021050340200420053602c4012017280200210120162802002102200442013702dc01200441f492c5003602d801200441013602d402200441013602ec012004200441d0026a3602e8012004200441c4016a3602d002200441e8026a200441d8016a10e60320042802e802210a20042902ec02211a200120054d0d110240201aa7450d00200a10290b2004200d28020022013602d002024002400240024020042802ac0120014b0d00200441013602ec01200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e60320042902ec02221a422088a7210120042802e802210a201aa721020c010b0240024002402002200541186c6a22022802142210450d0020042802a40120014104746a220a2d000d2113200a280200210e200228020c210120022802002114200a280208220f2106024020022802082212450d002012410374210b200f21022014210a034002402002200a2802006a220620024f0d00024041201027220a0d0041204101102a000b200a41186a41002900b8a345370000200a41106a41002900b0a345370000200a41086a41002900a8a345370000200a41002900a0a3453700000c040b200a41086a210a20062102200b41786a220b0d000b0b0240410810272202450d0020022013ad42ff0183422886370200200441d0026a41026a220a200441e8026a41026a2d00003a0000200420042f00e8023b01d002200420133a00900220044180800136028c022004428180808010370284022004200236028002200442808080808080103703f801200442013703f001200420063602ec01200420123602e801200420143602e4012004200f3602e0012004200e3602dc01200420044180016a3602d801201120042f01d0023b0000201141026a200a2d00003a0000201041047441706a41047641016a210641002102034020042002360298022004200136029c02200441b0026a200441d8016a200110f803024020042802b002450d00200441c0026a41086a200441b0026a41086a280200360200200420042903b0023703c002200441033602e402200442033702d402200441e88ac5003602d002200441213602fc02200441013602f402200441223602ec022004200441e8026a3602e0022004200441c0026a3602f802200420044198026a3602f00220042004419c026a3602e802200441a0026a200441d0026a10e603024020042802c402450d0020042802c00210290b20042802a002220a450d0020042902a402211a024020042802f401450d0020042802f00110290b201a42208821230240200428028402450d0020042802800210290b2023a72101201aa721020c070b200141106a21012006200241016a2202470d000b02402004280288020d00024020042802f401450d0020042802f00110290b200428028402450d0720042802800210290c070b41808bc5001058000b41084104102a000b41201027220a450d01200a41186a41002900de8a45370000200a41106a41002900d68a45370000200a41086a41002900ce8a45370000200a41002900c68a453700000b41202102412021010c010b41204101102a000b200a450d010b2004200a3602d00220042001ad4220862002ad843702d4022004200441d0026a3602c002200441023602ec01200442023702dc01200441fc92c5003602d801200441233602f402200441013602ec022004200441e8026a3602e8012004200441c0026a3602f0022004200441c4016a3602e802200441c8016a200441d8016a10e603024020042802d402450d0020042802d00210290b20042802c801220a450d0020042902cc01211a0c120b200541016a2105200d41046a220d2015470d000b0b2008200c412c6c6a210a2008210102400340200a2001460d0120012d000021022001412c6a2206210120024109470d000b2004200641586a28020022013602b002024020042802b80120014b0d00200441ec016a4101360200200442023702dc01200441d8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441e8026a200441d8016a10e6030c0d0b200420042802b00120014102746a28020022013602d002024020042802ac0120014b0d00200441ec016a4101360200200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c0d0b024020042802a40120014104746a22013502084200520d00200131000d4220864280808080f000834280808080c000510d010b412d1027220a450d02200a41256a41002900b19345370000200a41206a41002900ac9345370000200a41186a41002900a49345370000200a41106a410029009c9345370000200a41086a41002900949345370000200a410029008c934537000042ad808080d005211a0c100b2008200c412c6c6a210a200821010340200a2001460d0b20012d000021022001412c6a2206210120024108470d000b200441306a200641586a2201108003200441d8016a200428023410fb03200441e8026a41086a200441e4016a290200370300200441e8026a41106a200441d8016a41146a280200360200200420042902dc013703e802200441286a2001108003200428022c2201450d0920042802282215200141146c6a210e034020152217450d0a410021022017280208220d210120172802002216210a0240200d4104490d004100210220162101200d210a0340200128000020024105777341b9f3ddf1796c2102200141046a2101200a417c6a220a41034b0d000b200d417c6a22012001417c71220a6b2101200a20166a41046a210a0b02400240200141014b0d00200a21060c010b200a41026a21062001417e6a21012002410577200a2f00007341b9f3ddf1796c21020b02402001450d00200241057720062d00007341b9f3ddf1796c21020b201741146a2115200241057741ff017341b9f3ddf1796c22024119762213410874201372220141107420017221054100210f20042802f002211220042802e802210b20042802ec0221062002210103400240200b200120067122016a2800002214200573220a417f73200a41fffdfb776a7141808182847871220a450d00024003400240200d2012200a6841037620016a2006714103746a221041046a280200470d00201620102802002210460d0220162010200d10d004450d020b200a417f6a200a71220a450d020c000b0b200441ec016a4101360200200442013702dc01200441bc93c5003602d801200441023602b4022004200d3602c402200420163602c0022004200441b0026a3602e8012004200441c0026a3602b002200441d0026a200441d8016a10e6030c0a0b200f41046a220f20016a2101201420144101747141808182847871450d000b024020042802f8020d00200441e8026a10fc0320042802e802210b20042802ec0221060b200620027121024104210103402002220a20016a2006712102200141046a2101200b200a6a280000418081828478712205450d000b0240200b200568410376200a6a20067122016a2c000022024100480d00200b200b280200418081828478716841037622016a2d000021020b200b20016a20133a00002001417c6a200671200b6a41046a20133a000020042802f00220014103746a200dad4220862016ad84370200200420042802f40241016a3602f402200420042802f80220024101716b3602f802024002400240024002400240201728020c0e0400030201000b2004201728021022013602a002024020042802b80120014b0d00200441ec016a4101360200200442023702dc01200441d8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441a0026a3602c002200441d0026a200441d8016a10e6030c0e0b200420042802b00120014102746a28020022013602b00220042802ac0120014b0d03200441013602ec01200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441d0026a200441d8016a10e6030c0d0b2004201728021022013602a002024020042802a00120014b0d00200441ec016a4101360200200442023702dc0120044188a1c5003602d801200441013602c4022004200441c0026a3602e8012004200441a0026a3602c002200441d0026a200441d8016a10e6030c0d0b20042802980120014101746a2d0001450d02200441ec016a4101360200200442023702dc01200441a8a1c5003602d801200441013602c4022004200441c0026a3602e8012004200441a0026a3602c002200441d0026a200441d8016a10e6030c0c0b2004201728021022013602b00220042802880120014b0d01200441013602ec01200442023702dc0120044188a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441d0026a200441d8016a10e60320042802d002220a0d0c0c010b2004201728021022013602b00220042802940120014d0d010b2015200e470d010c0b0b0b200441ec016a4101360200200442023702dc01200441b8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441d0026a200441d8016a10e6030c070b20184101102a000b412d4101102a000b41aa92c50041c800104e000b418c92c500411e104e000b20204104102a000b20114104102a000b20184104102a000b20042802d002210a0b20042902d402211a2006450d060240200641016a220141ffffffff01712001470d00200641086a417c712202200641056a490d00200220014103746a2002491a0b200b10290c060b20042802ec022201450d000240200141016a220241ffffffff01712002470d00200141086a417c71220a200141056a490d00200a20024103746a200a491a0b20042802e80210290b2008200c412c6c6a210a2008210102400340200a2001460d0120012d000021022001412c6a2206210120024103470d000b200441206a200641586a10800320042802242201450d0020042802202106200141286c210b41002101034002400240024002400240200620016a220241186a2d00000e0400030201000b20042002411c6a28020022023602d00220042802ac0120024b0d03200441ec016a4101360200200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c060b2002411a6a2d0000450d022002410c6a2802002101200241146a2802002102200441d8016a41146a4101360200200420023602d402200420013602d002200441023602c402200442013702dc01200441c493c5003602d8012004200441d0026a3602c0022004200441c0026a3602e801200441e8026a200441d8016a10e6030c050b200441d8016a2002411c6a10f50320042802d801220a450d0120042902dc01211a0c080b200241206a2802004101470d002002411c6a280200210a2004200241246a28020022023602b002200a20024d0d00200441023602ec01200442023702dc01200441dc9cc5003602d801200441013602f402200441013602ec022004200a3602c0022004200441e8026a3602e8012004200441c0026a3602f0022004200441b0026a3602e802200441d0026a200441d8016a10e60320042802d002220a0d060b200b200141286a2201470d000b0b024002400240200428029401220141014b0d00200428028801220141014b0d012008200c412c6c6a210a2008210102400240024002400340200a2001460d0120012d000021022001412c6a220621012002410c470d000b200441186a200641586a10800320042802182201200428021c411c6c6a2106034020012006460d012004200128020022023602d002024020042802880120024b0d00200441013602ec01200442023702dc0120044188a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e60320042802e802220a450d0020042902ec02211a0c0d0b200441d8016a200141046a220120042802980120042802a00110f60320042d00d8014101460d02200141186a210120042d00d901450d000b41201027220a450d06200a41186a41002900f49345370000200a41106a41002900ec9345370000200a41086a41002900e49345370000200a41002900dc934537000042a08080808004211a0c0b0b2008200c412c6c6a210a2008210102400340200a2001460d0120012d000021022001412c6a220621012002410a470d000b200441106a200641586a10800320042802142201450d002004280210220b2001411c6c6a21050340200b450d012004200b28020022013602d00220042802940120014d0d03200441d8016a200b41046a20042802980120042802a00110f60320042d00d8014101460d0420042d00d9010d09200441086a200b10fd0302400240200428020c2201450d00200428020821022001410274210a20042802b801210603402004200228020022013602b0020240200620014b0d00200441ec016a4101360200200442023702dc01200441d8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441e8026a200441d8016a10e6030c0c0b200420042802b00120014102746a28020022013602d00220042802ac0120014d0d02200241046a2102200a417c6a220a0d000b0b200b411c6a220b2005460d020c010b0b200441013602ec01200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c070b0240200428028401450d0020042802800110290b0240200428029001450d00200428028c0110290b0240200428029c01450d0020042802980110290b024020042802ac012202450d0020042802a40121012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b024020042802a801450d0020042802a40110290b024020042802b401450d0020042802b00110290b201f450d0d201910290c0d0b200441e0016a290300211a20042802dc01210a0c090b200441ec016a4101360200200442023702dc01200441b8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c040b200441e0016a290300211a20042802dc01210a0c070b200441ec016a4101360200200442013702dc01200441cc93c5003602d801200441013602d402200420013602c0022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10e6030c020b200441ec016a4101360200200442013702dc01200441d493c5003602d801200441013602d402200420013602c0022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10e6030c010b41204101102a000b20042802e802210a20042902ec02211a0c030b024041201027220a450d00200a41186a41002900f49345370000200a41106a41002900ec9345370000200a41086a41002900e49345370000200a41002900dc934537000042a08080808004211a0c030b41204101102a000b200441ec016a4102360200200441f4026a4101360200200442023702dc01200441fc91c5003602d801200441013602ec022004200441e8026a3602e8012004200441c0016a3602f0022004200441bc016a3602e802200441d0026a200441d8016a10e60320042802d002210a0b20042902d402211a0b0240200428028401450d0020042802800110290b0240200428029001450d00200428028c0110290b0240200428029c01450d0020042802980110290b024020042802ac012202450d0020042802a40121012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b024020042802a801450d0020042802a40110290b024020042802b401450d0020042802b00110290b201f450d0120191029200a0d040c020b2001290204211a2001280200210a0240201f450d00201910290b0240201e450d00201410290b0240200e450d00201510290b02402013450d00201210290b02402010450d0020104104742102201c210103400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b0240201d450d00201c10290b200d450d00201710290b200a0d020b2000201b36020420004100360200200041186a2003360200200041146a200c360200200041106a20093602002000410c6a2008360200200041086a20073602000c040b102b000b0240201aa7450d00200a10290b200041f48cc50036020420004101360200200041086a41133602000240200c450d00200c412c6c210220082101034020011088032001412c6a2101200241546a22020d000b0b2009450d02200810290c020b200441003a00d002200441ec016a4101360200200442013702dc0120044180c0c5003602d8012004411f3602b4022004200441b0026a3602e8012004200441d0026a3602b00220044180016a200441d8016a10e603200428028001210720042802840121060240200c450d00200c412c6c210220082101034020011088032001412c6a2101200241546a22020d000b0b4105210a2009450d00200810290b02402006450d00200a41ff01714105470d00200710290b200041de8cc50036020420004101360200200041086a41163602000b20044180036a24000b160020002001280208360204200020012802003602000bd41301177f23004190026b2202240002400240024002400240024020002802002203418883c000460d00200028020421040c010b41002104200241b8016a410041d80010cd041a2002411f6a220542003700002002420037011a41ec0010272203450d0120034100360200200320022902183702042003410b6a2005290000370000200341136a200241b7016a41d90010ce041a20004100360204200020033602000b200141ff01712106024003402003410c6a2107200341086a210820032f010621094100210502400240034020092005460d01200820056a210a200741086a2107200541016a210502404100417f4101200a2d0000220a20064b1b200a2006461b41016a0e03000301000b0b2005417f6a21090b2004450d022004417f6a2104200320094102746a41ec006a28020021030c010b0b200742013702000c030b2000200028020841016a360208024002400240024020032f01062205410b490d00200241276a41016a410041d80010cd041a200241003a001941ec0010272204450d03200441003602002004410036000f20044200370007200420022f01183b0005200441136a200241276a41d90010ce041a2003410e6a2d0000210b2003280248210c2003280244210d200441086a2003410f6a20032f010641796a220510ce042107200441146a200341cc006a200541037410ce042106200341063b0106200420053b010620094107490d0120072009417a6a220a6a2007200941796a22096a2207200541ffff037120096b10cf041a200720013a00002006200a4103746a200620094103746a2207200441066a22052f010020096b41037410cf041a2007410136020020052f010021070c020b200341086a2207200941016a22066a200720096a2207200520096b220a10cf041a200720013a0000200341146a220720064103746a200720094103746a2207200a41037410cf041a200741013602002003200541016a3b01060c050b200341086a2205200941016a22066a200520096a220a200341066a22052f0100220720096b220810cf041a200a20013a0000200341146a220a20064103746a200a20094103746a2209200841037410cf041a200941013602000b2005200741016a3b01002003280200220a450d02200341046a2105200241276a41016a210e200241a8016a210f200241a0016a211020024198016a211120024190016a211220024180016a41086a2113034020052f0100210602400240024002400240200a2f01062205410b490d00200e410041d80010cd041a200241003a0019200220022f01183b0108200241b7016a200241276a41d90010ce041a200f4200370300201042003703002011420037030020124200370300201342003703002002420037038001419c0110272207450d03200741003602002007410036000f20074200370007200720022f01083b0005200741136a200241b7016a41d90010ce041a20074194016a200f2903003702002007418c016a201029030037020020074184016a2011290300370200200741fc006a2012290300370200200741f4006a2013290300370200200720022903800137026c200a41c8006a2802002114200a41c4006a2802002115200a410e6a2d00002116200741086a200a410f6a200a2f0106220341796a220510ce042117200741146a200a41cc006a200541037410ce042118200741ec006a200a4188016a2003417a6a220841027410ce042101200a41063b0106200720053b010602402008450d00410021052001210303402003280200220920053b010420092007360200200341046a21032008200541016a2205470d000b0b20064107490d0120172006417a6a22036a2017200641796a22056a220920072f010620056b10cf041a2009200b3a0000201820034103746a201820054103746a220920072f010620056b41037410cf041a2009200d3602002009200c360204200720072f010641016a22093b01062006410274220b20016a416c6a200120034102746a2208200941ffff0371220620036b41027410cf041a2008200436020020062003490d022007200b6a41d4006a2103034020032802002209200541016a22053b010420092007360200200341046a210320052006490d000c030b0b200a41086a2207200641016a22036a200720066a2207200520066b220910cf041a2007200b3a0000200a41146a220720034103746a200720064103746a2207200941037410cf041a2007200d3602002007200c360204200a200541016a22053b01062006410274200a41ec006a22076a41086a200720034102746a2207200541ffff0371220920036b41027410cf041a20072004360200200620094f0d08200a2003417f6a22054102746a41f0006a2103034020032802002207200541016a22053b01042007200a360200200341046a210320052009490d000c090b0b200a41086a2203200641016a22056a200320066a2203200a2f0106220920066b220810cf041a2003200b3a0000200a41146a220320054103746a200320064103746a2203200841037410cf041a2003200d3602002003200c360204200a200941016a22033b010620064102742201200a41ec006a22096a41086a200920054102746a2208200341ffff0371220920056b41027410cf041a20082004360200200620094f0d00200a20016a41f0006a2105034020052802002203200641016a22063b01042003200a360200200541046a210520092006470d000b0b200a28020022030d01200721042014210c2015210d2016210b0c050b419c014104102a000b200a41046a21052003210a2016210b2015210d2014210c200721040c000b0b41ec004104102a000b41ec004104102a000b200241b7016a41016a410041d80010cd041a2002411f6a220542003700002002420037011a200220022902183703082002200529000037000f200241276a200241b7016a41d90010ce041a200241a8016a22034200370300200241a0016a2207420037030020024180016a41186a2209420037030020024190016a2206420037030020024180016a41086a220a42003703002002420037038001419c0110272205450d0120054100360200200520022903083702042005410b6a200229000f370000200541136a200241276a41d90010ce041a20054194016a20032903003702002005418c016a200729030037020020054184016a2009290300370200200541fc006a2006290300370200200541f4006a200a290300370200200520022903800137026c20052000280200220336026c200020053602002000200028020441016a360204200341003b010420032005360200200520052f010622034103746a220741186a200c360200200741146a200d360200200520036a41086a200b3a0000200541ec006a200341016a22034102746a2004360200200520033b0106200420033b0104200420053602000b20024190026a24000f0b419c014104102a000bd11e01387f23004190016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a280200210320024180016a210420012802082105024002400240200141106a28020022060d00410421014100210741002108410021094100210a4104210b4100210c4100210d4104210e4100210f41002110410421114100211241002113410421144100210641002115410421164100211741002118410421194100211a4100211b4104211c4100211d4100211e4104211f41002120410021210c010b410021224100211f41002123410021244100211c410021254100212641002127410021284100212941002107024003402001212a2007211520052006417f6a2206412c6c6a2201280024211720012800202119200128001821182001280014211420012800102116200128000c210c2001280008210b200128000421094101210741012112024002400240024002400240024020012d0000220a417e6a2208410d4d0d00410121130c010b4101211341012110410121114101210f4101210d4101210e20092101024002400240024002400240024002400240024020080e0e000102030405060f0708090e0e11000b02402029450d000240202b450d00202b41047421072029210103400240200141046a280200450d00200128020010290b200141106a2101200741706a22070d000b0b202c450d00202910290b4101211341002112200c212b200b212c200921290c090b02402028450d000240202d450d00202d41286c21072028210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200741586a22070d000b0b202e450d00202810290b4100211341012112200c212d200b212e200921280c080b0240202f450d002027450d00202710290b20152107202a210120092127200b212f200c21300c0c0b02402031450d002026450d00202610290b20152107202a210120092126200b2131200c21320c0b0b02402033450d002025450d00202510290b20152107202a210120092125200b2133200c21340c0a0b0240201c450d000240201a450d00201c201a4104746a210d201c21080340024020082802082207450d0020082802002101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841106a21010240200841046a280200450d00200828020010290b200121082001200d470d000b0b2035450d00201c10290b4100211041012112200c211a200b21352009211c410121130c050b02402024450d000240201e450d00201e41146c21072024210103400240200141046a280200450d00200128020010290b200141146a21012007416c6a22070d000b0b2036450d00202410290b4100211141012112200c211e200b21362009212441012113410121100c050b02402023450d000240201d450d002023201d411c6c6a210d20232108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200d470d000b0b2037450d00202310290b4100210f41012112200c211d200b2137200921234101211341012110410121110c050b0240201f450d000240201b450d00201f201b41186c6a210d201f210803400240200841046a280200450d00200828020010290b0240200841146a2802002207450d00200828020c2101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841186a21010240200841106a280200450d00200828020c10290b200121082001200d470d000b0b2020450d00201f10290b4100210d41012112200c211b200b21202009211f4101211341012110410121114101210f4101210e0c050b02402022450d0002402038450d0020222038411c6c6a210d20222108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200d470d000b0b2039450d00202210290b4100210e41012112200c2138200b2139200921224101211341012110410121114101210f4101210d0c040b410121100b410121110b4101210f0b4101210d4101210e0b02400240024002400240200a410d4b0d0020152107202a210102400240024002400240024002400240024002400240200a0e0e080900010202020304100506070a080b2012450d0e0240200c450d00200c41047421072009210103400240200141046a280200450d00200128020010290b200141106a2101200741706a22070d000b0b200b450d0e0c0d0b2013450d0d200c450d00200c41286c21072009210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200741586a22070d000b0b200b0d0b0c0c0b2010450d0b0240200c450d002009200c4104746a210a200921080340024020082802082207450d0020082802002101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841106a21010240200841046a280200450d00200828020010290b200121082001200a470d000b0b200b0d0a0c0b0b2011450d0a0240200c450d00200c41146c21072009210103400240200141046a280200450d00200128020010290b200141146a21012007416c6a22070d000b0b200b0d090c0a0b200f450d090240200c450d002009200c411c6c6a210a20092108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200a470d000b0b200b0d080c090b200d450d080240200c450d002009200c41186c6a210a2009210803400240200841046a280200450d00200828020010290b0240200841146a2802002207450d00200828020c2101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841186a21010240200841106a280200450d00200828020c10290b200121082001200a470d000b0b200b0d070c080b200e450d07200c450d002009200c411c6c6a210a20092108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200a470d000b0b200b0d050c060b0240200b450d00200910290b2014450d05201610290c050b0240200941ff0171220141024b0d0002400240024020010e03000102000b200c450d070c050b02402014450d002014410c6c2107200c21010340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200741746a22070d000b0b2016450d060c030b02402014450d00200c20144104746a210b200c210a0340200a220941106a210a024020092802042201450d0002402009410c6a2802002207450d002007410c6c21070340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200741746a22070d000b0b200941086a280200450d00200928020410290b200a200b470d000b0b20160d020c050b200c0d020c040b0240200b450d00200910290b02402014450d002018450d00201410290b2017450d03201910290c030b200c10290c020b200b10290c010b200910290b20152107202a21010b20060d000b410021062001212a200721150b201b4100201f1b210720204100201f1b2108201d410020231b21212037410020231b2120201e410020241b21092036410020241b210a201a4100201c1b211e20354100201c1b211d2034410020251b210c2033410020251b210d2032410020261b211b2031410020261b211a2030410020271b210f202f410020271b2110202d410020281b2118202e410020281b2117202b410020291b2112202c410020291b2113201f4104201f1b21012023410420231b211f2024410420241b210b201c4104201c1b211c2025410420251b210e2026410420261b21192027410420271b21112028410420281b21162029410420291b211420220d010b4104212241002139410021380b200410a4040240200228028401450d0020022802800110290b200241d8006a202a3602002002200636028801200220033602840120022005360280012002203836027c2002203936027820022022360274200220073602702002200836026c2002200136026820022021360264200220203602602002201f36025c20022015360254200220093602502002200a36024c2002200b3602482002201e3602442002201d3602402002201c36023c2002200c3602382002200d3602342002200e3602302002201b36022c2002201a360228200220193602242002200f3602202002201036021c2002201136021820022018360214200220173602102002201636020c20022012360208200220133602042002201436020020002002418c0110ce041a20024190016a24000bc30a01107f230041106b220224000240024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042108200241086a200010800320022802082201200228020c22094104746a210a4100210b20094104490d01200341ff0171210c024002400340024020012d000c200c470d0020012802082004470d002001280200210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d000d2209410446220f200741ff0171220d410446220e470d002009200d460d06200e0d06200f0d060b024002402001411c6a2d0000200c470d00200141186a2802002004470d002001280210210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d001d2209410446220f200741ff0171220d410446220e470d002009200d460d01200e0d01200f0d010b02402001412c6a2d0000200c470d00200141286a2802002004470d002001280220210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d002d2209410446220f200741ff0171220d410446220e470d002009200d460d03200e0d03200f0d030b02402001413c6a2d0000200c470d00200141386a2802002004470d002001280230210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d003d2209410446220f200741ff0171220d410446220e470d002009200d460d04200e0d04200f0d040b200b41046a210b200a200141c0006a22016b41304d0d050c010b0b200b410172210b0c040b200b410272210b0c030b200b410372210b0c020b2001280204210b0c030b2001200a460d0102400240200741ff017122114104460d00200341ff0171210c0c010b200341ff0171210c0340024020012d000c200c470d0020012802082004470d002001280200210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d000d4104460d030b200b41016a210b200141106a2201200a470d000c030b0b0340024020012d000c200c470d0020012802082004470d002001280200210e200421092008210d024003402009450d012009417f6a2109200d2d0000210f200e2d00002110200d41016a210d200e41016a210e2010200f460d000c020b0b20012d000d22092011470d0020094104470d020b200b41016a210b200141106a2201200a460d020c000b0b2005450d01200810290c010b02400240200041046a28020020002802082201460d00200028020021090c010b02400240200141016a22092001490d002001410174220d20092009200d491b220d41ffffffff0071200d470d00200d410474220e4100480d000240024020010d00200e102721090c010b20002802002001410474200e102821090b2009450d0120002009360200200041046a200d360200200028020821010c020b102b000b200e4104102a000b200920014104746a220120063b010e200120073a000d200120033a000c2001200436020820012005360204200120083602002000200028020841016a360208200220001080032002280204417f6a210b0b200241106a2400200b0bcc21032d7f017e017f230041306b2202240020012802042103200128020021044101210502400240024002400240024002400240024002400240024002400240024002400240200128020822060d004104210741002108410121090c010b412c10272207450d01200741023a0000200720022f002d3b00012007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002109410121080b200141106a280200210a200128020c210b02400240200141146a280200220c0d002008210d0c010b2008410174220d200841016a220e200e200d491b220d412c6c210e0240024020080d00200e102721070c010b20072008412c6c200e102821070b2007450d0220072008412c6c6a220e41033a0000200e20022f002d3b0001200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021050b2001411c6a280200210f200128021821104100211102400240200141206a28020022120d00410021130c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22142014200e491b220ead422c7ea722144100480d0e02400240200d0d002014102721070c010b2007200d412c6c2014102821070b2007450d04200e210d0b20072008412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a28020036020041012113200841016a21080b200141286a28020021122001280224211502402001412c6a2802002214450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22112011200e491b220ead422c7ea722114100480d0e02400240200d0d002011102721070c010b2007200d412c6c2011102821070b2007450d05200e210d0b20072008412c6c6a220e41053a0000200e201436000c200e2012360008200e2015360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a28020036020041012111200841016a21080b200141346a28020021142001280230211602400240200141386a28020022170d00410021180c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22192019200e491b220ead422c7ea722194100480d0e02400240200d0d002019102721070c010b2007200d412c6c2019102821070b2007450d06200e210d0b20072008412c6c6a220e41063a0000200e201736000c200e2014360008200e2016360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a28020036020041012118200841016a21080b200141c0006a280200211a200128023c211b4101211702400240200141c4006a280200221c0d004101211d0c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22192019200e491b220ead422c7ea722194100480d0e02400240200d0d002019102721070c010b2007200d412c6c2019102821070b2007450d07200e210d0b20072008412c6c6a220e41073a0000200e201c36000c200e201a360008200e201b360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a21084100211d0b200141cc006a280200211e2001280248211f0240200141d0006a2802002220450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22172017200e491b220ead422c7ea722174100480d0e02400240200d0d002017102721070c010b2007200d412c6c2017102821070b2007450d08200e210d0b20072008412c6c6a220e41083a0000200e202036000c200e201e360008200e201f360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241086a41086a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021170b41012119024020012802544101470d00200141d8006a28020021210240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22222022200e491b220ead422c7ea722224100480d0e02400240200d0d002022102721070c010b2007200d412c6c2022102821070b2007450d09200e210d0b20072008412c6c6a220e41093a0000200e2021360204200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370208200e41106a200241106a290200370200200e41186a200241086a41106a290200370200200e41206a200241086a41186a290200370200200e41286a200241086a41206a280200360200200841016a21080b200141e0006a2802002123200128025c21220240200141e4006a2802002224450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22192019200e491b220ead422c7ea722194100480d0e02400240200d0d002019102721070c010b2007200d412c6c2019102821070b2007450d0a200e210d0b20072008412c6c6a220e410a3a0000200e202436000c200e2023360008200e2022360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021190b200141ec006a2802002125200128026821264101212102400240200141f0006a28020022270d00410121280c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22292029200e491b220ead422c7ea722294100480d0e02400240200d0d002029102721070c010b2007200d412c6c2029102821070b2007450d0b200e210d0b20072008412c6c6a220e410b3a0000200e202736000c200e2025360008200e2026360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021280b200141f8006a280200212a200128027421290240200141fc006a280200222b450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22212021200e491b220ead422c7ea722214100480d0e02400240200d0d002021102721070c010b2007200d412c6c2021102821070b2007450d0c200e210d0b20072008412c6c6a220e410c3a0000200e202b36000c200e202a360008200e2029360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021210b20014184016a280200212c200128028001210e02400240200d20086b20014188016a280200412c6c222d412c6d2201490d00200820016a21010c010b200820016a22012008490d0d200d410174222e20012001202e491b222ead422c7e222f422088a70d0d202fa722304100480d0d02400240200d0d002030102721070c010b2007200d412c6c2030102821070b2007450d0c202e210d0b20072008412c6c6a200e202d10ce041a0240202c450d00200e10290b41c00510272208450d0d2000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200836021020024280c2cdeb16370308200241106a10a404200810292021450d0e0240202b450d002029202b411c6c6a210d20292107034002402007410c6a2802002208450d0020072802042101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b0240200741086a280200450d00200728020410290b2007411c6a21010240200741146a280200450d00200728021010290b200121072001200d470d000b0b202a450d0e202910290c0e0b412c4104102a000b200e4104102a000b20144104102a000b20114104102a000b20194104102a000b20194104102a000b20174104102a000b20224104102a000b20194104102a000b20294104102a000b20214104102a000b20304104102a000b102b000b41c0054104102a000b02402028450d0002402027450d002026202741186c6a210d2026210703400240200741046a280200450d00200728020010290b0240200741146a2802002208450d00200728020c2101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b200741186a21010240200741106a280200450d00200728020c10290b200121072001200d470d000b0b2025450d00202610290b02402019450d0002402024450d0020222024411c6c6a210d20222107034002402007410c6a2802002208450d0020072802042101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b0240200741086a280200450d00200728020410290b2007411c6a21010240200741146a280200450d00200728021010290b200121072001200d470d000b0b2023450d00202210290b02402017450d0002402020450d00202041146c2108201f210103400240200141046a280200450d00200128020010290b200141146a21012008416c6a22080d000b0b201e450d00201f10290b0240201d450d000240201c450d00201b201c4104746a210d201b21070340024020072802082208450d0020072802002101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b200741106a21010240200741046a280200450d00200728020010290b200121072001200d470d000b0b201a450d00201b10290b02402014410047201841017371450d00201610290b02402012410047201141017371450d00201510290b0240200f410047201341017371450d00201010290b02402005450d000240200c450d00200c41286c2108200b210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200841586a22080d000b0b200a450d00200b10290b02402009450d0002402006450d00200641047421082004210103400240200141046a280200450d00200128020010290b200141106a2101200841706a22080d000b0b2003450d00200410290b200241306a24000b860501017f411021010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041ff01710eac010001020202020202020202020202020303030404050506060707080809090a0a0b0b0c0d0d0e0e0f0f1010111213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f2020212122222323242425252627272828292a2a2b2b2c2d2d2e2e2f2f303031313232333434353536363737383839393a3a3b3b3c3c3d3d3e3e3f3f40404141424243434444454546464747484a4a4a4a49494a4a4a4a4a4a4a4a4a4a4a4a4a4a4b4b4b4b000b41110f0b41120f0b410a0f0b41080f0b41080f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41050f0b41130f0b41140f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41000f0b41010f0b41020f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41020f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410e0f0b410e0f0b410f21010b20010bfe0101057f02400240024002400240200041086a28020022032001490d002003200041046a280200460d01200341016a2104200028020021050c020b41d0b1c5001058000b200341016a22042003490d0220034101742205200420042005491b220641ffffffff00712006470d02200641047422074100480d020240024020030d002007102721050c010b200028020020034104742007102821050b2005450d0120002005360200200041046a20063602000b200520014104746a220541106a2005200320016b41047410cf041a200541086a200241086a29030037030020052002290300370300200041086a20043602000f0b20074108102a000b102b000b800502067f017e230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a1083032103024002400240024002402000411c6a280200200041206a2802002204460d00200028021821050c010b200441016a22052004490d0320044101742206200520052006491b220641ffffffff03712006470d03200641027422074100480d030240024020040d002007102721050c010b200028021820044102742007102821050b2005450d01200020053602182000411c6a2006360200200028022021040b200520044102746a20033602002000200028022041016a360220200241186a41106a200241106a290300370300200241186a41086a200241086a2903003703002002200229030037031802400240200041ec006a280200200041f0006a2802002204460d00200028026821050c010b200441016a22052004490d0320044101742203200520052003491b2203ad42187e2208422088a70d032008a722064100480d030240024020040d002006102721050c010b2000280268200441186c2006102821050b2005450d0220002005360268200041ec006a2003360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000f0b20074104102a000b20064104102a000b102b000bcf0d01067f0240024020002d00002201410d4b0d00024002400240024002400240024002400240024002400240024020010e0e0001020304050607080e090a0b0c000b200041086a280200450d0d200041046a28020010290f0b0240200041086a280200450d00200041046a28020010290b200041146a280200450d0c200041106a28020010290f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b200041086a280200450d0b200028020410290f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200241586a22020d000b0b200041086a280200450d0a200028020410290f0b200041086a280200450d09200041046a28020010290f0b200041086a280200450d08200041046a28020010290f0b200041086a280200450d07200041046a28020010290f0b02402000410c6a2802002201450d00200041046a280200220320014104746a21040340024020032802082202450d0020032802002101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200341106a21010240200341046a280200450d00200328020010290b2001210320012004470d000b0b200041086a280200450d06200028020410290f0b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010290b200141146a21012002416c6a22020d000b0b200041086a280200450d05200028020410290f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a2104034002402003410c6a2802002202450d0020032802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200341086a280200450d00200328020410290b2003411c6a21010240200341146a280200450d00200328021010290b2001210320012004470d000b0b200041086a280200450d04200028020410290f0b02402000410c6a2802002201450d00200041046a2802002203200141186c6a210403400240200341046a280200450d00200328020010290b0240200341146a2802002202450d00200328020c2101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200341186a21010240200341106a280200450d00200328020c10290b2001210320012004470d000b0b200041086a280200450d03200028020410290f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a2104034002402003410c6a2802002202450d0020032802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200341086a280200450d00200328020410290b2003411c6a21010240200341146a280200450d00200328021010290b2001210320012004470d000b0b200041086a280200450d02200028020410290f0b0240200041046a2d0000220141024b0d0002400240024020010e03000102000b2000410c6a280200450d04200041086a28020010290f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002203450d00200141046a280200450d00200310290b2001410c6a2101200241746a22020d000b0b200041106a280200450d03200028020c10290f0b0240200041146a2802002201450d002000410c6a280200220520014104746a210603402005220441106a2105024020042802042201450d0002402004410c6a2802002202450d002002410c6c21020340024020012802002203450d00200141046a280200450d00200310290b2001410c6a2101200241746a22020d000b0b200441086a280200450d00200428020410290b20052006470d000b0b200041106a280200450d02200028020c10290c020b2000410c6a280200450d01200041086a28020010290f0b0240200041086a280200450d00200041046a28020010290b0240200041146a2802002201450d00200041186a280200450d00200110290b200041246a280200450d00200041206a28020010290f0b0b907f05087f017e1d7f037e187f23002203210420034180096b41607122032400024002400240024002400240024002400240024002400240024002400240411010272205450d00200541063a0000412010272206450d01200641063a00104100210720064100360204200620032f00f0053b00012006412d3a0000200641036a200341f2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410290b20051029200141106a2802002208412c6c21092001280208210a02400340024020092007470d00411010272205450d0520054180023b010c200542828080802037020420052006360200200520032f01d0033b010e02402001410c6a2802002008470d00200841016a22072008490d0f20084101742209200720072009491b2207ad422c7e220b422088a70d0f200ba722094100480d0f0240024020080d0020091027210a0c010b200a2008412c6c20091028210a0b200a450d072001200a3602082001410c6a20073602000b2001200841016a220c360210200a2008412c6c6a220741073a0000200720032f00e0043b0001200742818080801037000820072005360004200720032902f005370210200741036a200341e2046a2d00003a0000200741186a200341f8056a290200370200200741206a20034180066a290200370200200741286a200341f0056a41186a2802003602004100210d0c020b200a20076a21052007412c6a220e210720052d00004107470d000b200320032f01d0033b01f005200a200e6a220541586a210a024002402005415c6a220c280200200541606a22092802002207460d00200a280200210e0c010b200741016a220e2007490d0d20074101742208200e200e2008491b220841ffffffff00712008470d0d2008410474220d4100480d0d0240024020070d00200d1027210e0c010b200541586a2802002007410474200d1028210e0b200e450d06200c2008360200200541586a200e360200200928020021070b200e20074104746a22074180023b010c200742828080802037020420072006360200200720032f01f0053b010e2009200928020041016a360200200341c0006a200a1080032003280244417f6a210d2001280210210c2001280208210a0b200c412c6c2107200a41586a210502400340410021062007450d01200741546a2107200541286a21092005412c6a220e210520092d00004103470d000b200e41086a2802002207450d00200741286c2105200e28020041186a2107410021060340200620072d0000456a2106200741286a2107200541586a22050d000b0b200c412c6c2107200a41586a210502400340410021092007450d01200741546a2107200541286a210e2005412c6a22082105200e2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b200c412c6c2107200a41606a210502400340024020070d00410021070c020b200741546a2107200541206a210e2005412c6a220a2105200e2d00004104470d000b200a28020021070b200720096a220f41ffffffff0371200f470d0c200f4102742207417f4c0d0c0240024020070d00410421100c010b2007107c2210450d060b024002400240024002400240200f450d002010200f4102746a211141002112201021130340024020122006490d0020012802102214412c6c220921072001280208221541586a220e2105024003404100210a2007450d01200741546a2107200541286a21082005412c6a220c210520082d00004103470d000b200c41086a2802002207450d00200741286c2105200c28020041186a21074100210a0340200a20072d0000456a210a200741286a2107200541586a22050d000b0b2012200a6b220a20124b0d0303402009450d05200941546a2109200e41286a2107200e412c6a2205210e20072d0000410b470d000b200541086a280200200a4d0d052005280200200a41186c6a2802082105200341f0056a200a200110960420032802f405210720032802f0054101460d072013200720056a3602000b201241016a2112201341046a22132011470d000b0b20012802102114200128020821150c0f0b412c10272207450d0a200741286a4100280092ac45360000200741206a410029008aac45370000200741186a4100290082ac45370000200741106a41002900faab45370000200741086a41002900f2ab45370000200741002900eaab4537000042ac808080c005210b0c020b412c10272207450d0a200741286a41002800beac45360000200741206a41002900b6ac45370000200741186a41002900aeac45370000200741106a41002900a6ac45370000200741086a410029009eac4537000020074100290096ac4537000042ac808080c005210b0c010b411e10272207450d0a200741166a41002900d8ac45370000200741106a41002900d2ac45370000200741086a41002900caac45370000200741002900c2ac45370000429e808080e003210b0b201010290c0a0b20032903f805210b2010102920070d09410021100c0a0b41104108102a000b41204108102a000b41104104102a000b20094104102a000b200d4104102a000b20074104102a000b412c4101102a000b412c4101102a000b411e4101102a000b410021100c030b02402014450d0020152014412c6c6a2116200341e0046a41146a2117200341e0076a2118200341f0056a41017221190340024020152d0000410b470d00201528020c2207450d002015280204220a200741186c6a211a03400240200a41146a220c2802002207450d00200a410c6a21124100210e0240024002400240024002400340200e20074f0d014101210702402012280200200e41047422136a22052d0000410b470d002003200541046a22053602c0022010450d04200f200528020022054d0d03201020054102746a2802002209450d00201920032f00e0043b0000201941026a200341e0046a41026a2d00003a0000200341123a00f0052003200d3602d407200341133a00d007200341d7003a00c007200320093602b4072003412d3a00b0072003200d3602a407200341123a00a00720032005360294072003410b3a009007200341063a008007200341003a00f00620034184083b01e006200341373a00d006200320023602c4062003412d3a00c0062003200d3602b406200341123a00b0062003200d3602a406200341133a00a006200341d6003a00900620032009360284062003412d3a0080062003200d3602f405200c2802002211200e4d0d05200c200e360200200a28020c2107200320183602f804200320123602f0042003200720136a220841106a22063602e8042003200e41016a22143602e0042003201120146b221b3602e404200320072014410474221c6a221d3602ec042003200341f0056a3602f40420062107024020082d0000220941ac01460d004100210702400340200820076a21050240200941ff01714109470d00200541086a28020041ffffffff0371450d00200541046a28020010290b2007450d012003200541206a3602e804200741106a2107200541106a2d0000220941ac01470d000b200820076a41106a21070c010b200541106a21070b02402007201d460d00034020032007220541106a22073602e8040240024020052d000022094109460d00200941ac01470d010c030b200541086a28020041ffffffff0371450d00200541046a28020010290b20062007470d000b0b0240024002400240201b450d0002402014200a2802142207470d00200341f0056a2107201821080c030b2013200741047422076b2109200a28020c20076a2105200341f0056a21072018210603400240024020072006470d00410021070c010b2003200741106a3602f4040b200341d0036a2007109c0420032d00d00341ac01460d04200520032903d003370300200541086a200341d0036a41086a290300370300200a200a28021441016a3602142009450d02200541106a2105200941706a210920032802f804210620032802f40421070c000b0b20122017109d040c020b20032802f804210820032802f40421070b0240200820076b2205450d000240024020032802f004220641046a221d280200221320116b20054104762209490d00200628020021050c010b201120096a22052011490d1020134101742211200520052011491b221141ffffffff00712011470d102011410474221e4100480d100240024020130d00201e102721050c010b20062802002013410474201e102821050b2005450d0920062005360200201d20113602000b2005201420096a22134104746a2005201c6a201b41047410cf041a200320133602e004201320062802082205460d00200e20096a410474200541047422056b2109200628020020056a210503400240024020072008470d00410021070c010b2003200741106a3602f4040b200341d0036a2007109c0420032d00d00341ac01460d02200520032903d003370300200541086a200341d0036a41086a2903003703002006200628020841016a3602082009450d01200541106a2105200941706a210920032802f804210820032802f40421070c000b0b200341003602d803200342083703d003200341d0036a2017109d0420032802d003221b20032802d803220541047422086a210620032802d403211c201b210702402005450d000240024020032802f004221341046a221d280200220720032802e404221420032802e00422056a22116b20084104752209490d00201328020021070c010b201120096a221e2011490d1020074101742211201e201e2011491b221141ffffffff00712011470d102011410474221e4100480d100240024020070d00201e102721070c010b20132802002007410474201e102821070b2007450d0a20132007360200201d20113602000b2007200520096a220941047422116a200720054104746a201441047410cf041a200320093602e004201b2107200920132802082205460d002013280200220720116a211d200720054104746a2109201b21050340024020080d00200621070c020b200341d0036a41026a2207200541036a2d00003a0000200320052f00013b01d003024020052d0000221441ac01470d00200541106a21070c020b200541046a290200210b2005410c6a2802002111200920143a00002009410c6a2011360200200941046a200b37020020032f01d0032114200941036a20072d00003a0000200941016a20143b00002013201328020841016a360208200841706a2108200541106a22072105200941106a2209201d470d000b0b024020072006460d0003400240024020072d000022054109460d00200541ac01470d010c030b200741086a28020041ffffffff0371450d00200741046a28020010290b200741106a22072006470d000b0b201c450d00201b10290b024020032802e804220720032802ec042206460d00034020032007220541106a22073602e8040240024020052d000022094109460d00200941ac01470d010c030b200541086a28020041ffffffff0371450d00200541046a28020010290b20062007470d000b0b024020032802e4042207450d00024020032802e004220620032802f004220841086a22092802002205460d002008280200220820054104746a200820064104746a200741047410cf041a0b2009200720056a3602000b024020032d00f0054109470d0020032802f80541ffffffff0371450d0020032802f40510290b024020032d0080064109470d0020032802880641ffffffff0371450d0020032802840610290b024020032d0090064109470d0020032802980641ffffffff0371450d0020032802940610290b024020032d00a0064109470d0020032802a80641ffffffff0371450d0020032802a40610290b024020032d00b0064109470d0020032802b80641ffffffff0371450d0020032802b40610290b024020032d00c0064109470d0020032802c80641ffffffff0371450d0020032802c40610290b024020032d00d0064109470d0020032802d80641ffffffff0371450d0020032802d40610290b024020032d00e0064109470d0020032802e80641ffffffff0371450d0020032802e40610290b024020032d00f0064109470d0020032802f80641ffffffff0371450d0020032802f40610290b024020032d0080074109470d0020032802880741ffffffff0371450d0020032802840710290b024020032d0090074109470d0020032802980741ffffffff0371450d0020032802940710290b024020032d00a0074109470d0020032802a80741ffffffff0371450d0020032802a40710290b024020032d00b0074109470d0020032802b80741ffffffff0371450d0020032802b40710290b024020032d00c0074109470d0020032802c80741ffffffff0371450d0020032802c40710290b024020032d00d0074109470d0020032802d80741ffffffff0371450d0020032802d40710290b410f21070b2007200e6a220e200c2802002207490d000c070b0b41e0acc500200e20071037000b2003410136028406200342013702f405200341f0acc5003602f005200341243602d4032003200341d0036a360280062003200341c0026a3602d003200341e0046a200341f0056a10e60320032802e0042207450d0420032902e404210b0c0b0b419eabc50041cc00104e000b419cb1c5001058000b201e4108102a000b201e4108102a000b200a41186a220a201a470d000b0b2015412c6a22152016470d000b0b200341c8006a41106a200141106a280200221f360200200341c8006a41086a200141086a290200220b37030020032001290200370348201f412c6c2107200ba7222041586a210502400340024020070d00410021090c020b200741546a2107200541286a21092005412c6a220e210520092d00004108470d000b200341386a200e10800320032802382109200328023c21070b2007410020091b2106201f412c6c2107202041586a2105200941b8d6c50020091b210e02400340024020070d00410021090c020b200741546a2107200541286a21092005412c6a220a210520092d0000410a470d000b200341306a200a10800320032802302109200328023421070b2007410020091b2108201f412c6c2107202041586a2105200941b8d6c50020091b211e02400340024020070d00410021210c020b200741546a2107200541286a21092005412c6a220a210520092d00004109470d000b200a2802002105410121210b200342003702742003418883c000360270201e2008411c6c6a2122200e200641146c6a2106200341e0046a410272222341266a2124202341186a2125202341086a21264100211741002127410021284100210c4100211c4104211a410421110240024002400240410041ff01710e03000102000b410021070c020b410221070c010b410121070b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e03000104040b0240201741ff01710e03020300020b20284101470d05410021070c080b2021450d0e41022119410021214100211d200521070c1b0b0340024002400240024002402006200e22076b413c4b0d0020072006470d012007210e0c020b200728020c0d03200741146a210e200741106a28020021070c1e0b200741106a21090340200728020c450d02200941146a2109200741146a22072006470d000b2006210e0b20284101470d05410021070c0a0b200941046a210e200928020021070c1b0b200741206a280200450d19200741346a280200450d18200741d0006a210e200741c8006a280200450d170c000b0b03400240024002402006200e22076b413c4b0d004101211720072006470d012007210e0c1f0b200728020c0d01200741146a210e200741106a28020021070c170b200741106a210902400340200728020c450d01200941146a2109200741146a22072006470d000b2006210e0c1e0b200941046a210e200928020021070c160b200741206a280200450d14200741346a280200450d13200741d0006a210e200741c8006a280200450d120c000b0b0240024002400240201741ff01710e03010200010b20284101470d02410021070c090b0340024002400240024002402006200e22076b413c4b0d0020072006470d012007210e0c020b200728020c0d03200741146a210e200741106a28020021070c160b200741106a21090340200728020c450d02200941146a2109200741146a22072006470d000b2006210e0b20284101470d07410021070c080b200941046a210e200928020021070c130b200741206a280200450d11200741346a280200450d10200741d0006a210e200741c8006a280200450d0f0c000b0b03400240024002402006200e22076b413c4b0d0020072006460d10200741106a21090340200728020c450d02200941146a2109200741146a22072006470d000c110b0b200728020c0d01200741146a210e200741106a28020021070c0e0b200941046a210e200928020021070c0d0b200741206a280200450d0b200741346a280200450d0a200741d0006a210e200741c8006a280200450d090c000b0b410121070c060b410121070c040b410121070c020b410121070b0340024002400240024020070e020001010b20182027470d01410121070c030b201e2022460d0a200341206a201e10fd0320032802202218450d0a201e411c6a211e201820032802244102746a21270c010b2018450d092018280200210741012119410221172005211d201841046a2118410121280c160b410021070c000b0b0340024002400240024020070e020001010b20182027470d014101212820272118410121070c030b41022117201e2022460d17200341186a201e10fd03201e411c6a211e20032802182207450d182007200328021c4102746a2127200721180c010b201841046a2109024020180d004101212841022117200921180c180b201828020021074101212841022117410021192005211d200921180c150b410021070c000b0b0340024002400240024020070e020001010b20182027470d014101212820272118410121070c030b41022117201e2022460d16200341106a201e10fd03201e411c6a211e20032802102207450d17200720032802144102746a2127200721180c010b201841046a2109024020180d004101212841022117200921180c170b201828020021074101212841022117410021192005211d200921180c140b410021070c000b0b0340024002400240024020070e020001010b20182027470d01410121070c030b201e2022460d07200341286a201e10fd0320032802282218450d07201e411c6a211e2018200328022c4102746a21270c010b2018450d062018280200210741012119410221172005211d201841046a2118410121280c130b410021070c000b0b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b410121192005211d410121170c0d0b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360201f412c6c2107202041586a210502400340410021092007450d01200741546a2107200541286a210e2005412c6a220a2105200e2d00004103470d000b200a41086a2802002207450d00200741286c2105200a28020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b201f412c6c2107202041606a210502400340024020070d00410021070c020b200741546a2107200541206a210e2005412c6a220a2105200e2d00004104470d000b200a28020021070b200341f0056a41106a200341c8006a41106a280200360200200341f0056a41086a200341c8006a41086a290300370300200320032903483703f005200341b0016a200341f0056a1082030240200c450d002011200c4102746a2118200720096a211b200341e0076a2112200341e7046a211703402011220741046a21112007280200210a200341e0006a21072003280264210803402007280200220641086a210520062f0106220c4102742107417f210902400340024020070d00200c21090c020b2005280200210e2007417c6a2107200941016a2109200541046a210502404100417f4101200e200a4b1b200e200a461b41016a0e03020001020b0b200641346a20094105746a22132802182105201328021c21072003200d3602d407200341133a00d007200341d7003a00c007200320073602b4072003412d3a00b0072003200d3602a407200341123a00a00720032005360294072003410b3a009007200341063a008007200341003a00f00620034184083b01e006200341373a00d006200320023602c4062003412d3a00c0062003200d3602b406200341123a00b0062003200d3602a406200341133a00a006200341d6003a00900620032007360284062003412d3a0080062003200d3602f405200341123a00f0052013280208220a41106a220e41ffffffff0071200e470d15200e4104742207417f4c0d15201341086a21190240024002400240024020070d004108210c0c010b20071027220c450d012019280200210a0b0240200a0d00410021050c030b4100210941002107034002402007200e470d00200e41016a2205200e490d19200e4101742206200520052006491b220541ffffffff00712005470d19200541047422064100480d1902400240200e0d0020061027210c0c010b200c200e41047420061028210c0b200c450d032005210e0b200c20096a2205410f3a0000200541046a2007360200200541016a20032f01d0033b0000200541036a200341d0036a41026a2d00003a0000200941106a2109200741016a22052107200a2005460d030c000b0b20074108102a000b20064108102a000b02400240024002400240024002400240200e20056b410f4f0d002005410f6a22072005490d1c200e4101742209200720072009491b220741ffffffff00712007470d1c200741047422094100480d1c02400240200e0d0020091027210c0c010b200c200e41047420091028210c0b200c450d012007210e0b200c20054104746a2107200341f0056a2109034020052108024002400240024020092d00002205414f6a41fb004f0d000c010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e312c2c0001022c2c0304052c06072c2c08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292c0b20092d00012106410221050c2b0b20092d00012106410321050c2a0b20092d00012106410421050c290b200941046a280200210a410721050c270b200941046a280200210a410821050c260b2009280208221d41ffffffff0371201d470d44201d4102742205417f4c0d440240024020050d004104210a0c010b20051027220a450d2a0b0240201d450d0020092802042105201d4102742114200a2106034020062005280200360200200641046a2106200541046a21052014417c6a22140d000b0b200935020c422086201dad84210b410921050c250b200941046a280200210a410b21050c240b200941046a280200210a20092d00012106410c21050c240b200941046a280200210a410f21050c220b200941046a280200210a411021050c210b200941046a280200210a411121050c200b200941046a280200210a411221050c1f0b200941046a280200210a411321050c1e0b200941046a280200210a2009350208210b411421050c1d0b200941046a280200210a2009350208210b411521050c1c0b200941046a280200210a2009350208210b411621050c1b0b200941046a280200210a2009350208210b411721050c1a0b200941046a280200210a2009350208210b411821050c190b200941046a280200210a2009350208210b411921050c180b200941046a280200210a2009350208210b411a21050c170b200941046a280200210a2009350208210b411b21050c160b200941046a280200210a2009350208210b411c21050c150b200941046a280200210a2009350208210b411d21050c140b200941046a280200210a2009350208210b411e21050c130b200941046a280200210a2009350208210b411f21050c120b200941046a280200210a2009350208210b412021050c110b200941046a280200210a2009350208210b412121050c100b200941046a280200210a2009350208210b412221050c0f0b200941046a280200210a2009350208210b412321050c0e0b200941046a280200210a2009350208210b412421050c0d0b200941046a280200210a2009350208210b412521050c0c0b200941046a280200210a2009350208210b412621050c0b0b200941046a280200210a2009350208210b412721050c0a0b200941046a280200210a2009350208210b412821050c090b200941046a280200210a2009350208210b412921050c080b200941046a280200210a2009350208210b412a21050c070b20092d00012106412b21050c070b20092d00012106412c21050c060b200941046a280200210a412d21050c040b2009290308210b412e21050c020b200941046a280200210a412f21050c020b2009290308210b413021050b0b0b200720063a0001200720053a0000200741086a200b370300200741046a200a360200200841016a2105200741106a2107200941106a22092012470d000b02400240200e2005460d00200e21090c010b200e41016a2207200e490d1c200e4101742205200720072005491b220941ffffffff00712009470d1c200941047422074100480d1c02400240200e0d0020071027210c0c010b200c200e41047420071028210c0b200c450d03200e21050b200c20054104746a220741063a0000200720032900e004370001200741086a2017290000370000200341e0046a200341b0016a418c0110ce041a411010272205450d03200541063a0000200341d0036a200341e0046a418c0110ce041a20192802002207417f4c0d1c0240024020070d004101210a41014101200710ce041a2007ad210b410021070c010b2013280200210e20071027220a450d05200a200e200710ce04210e20071027220a450d06200a200e200710ce041a200e10292007ad210b0b200341e0046a200341d0036a418c0110ce041a201331000d2129200341d0036a200341e0046a418c0110ce041a200341e0046a200341d0036a418c0110ce041a200341c0026a200341e0046a418c0110ce041a41101027220e450d06200841026a2106202a428080808080804083222a200b842029422886844280808080800c84210b200e41063a0000200e1029200341d0036a200341c0026a418c0110ce041a200341e0046a200341d0036a418c0110ce041a024020052d00004109470d00200528020841ffffffff0371450d00200528020410290b20051029200341c0026a200341e0046a418c0110ce041a200341e0046a200341c0026a418c0110ce041a200341003602fc03200320063602f803200320093602f4032003200c3602f003200341003602ec03200342043702e4032003200b3702dc03200320073602d8032003200a3602d403200341013602d003200341e0046a200341d0036a108703200341b0016a200341e0046a418c0110ce041a201341013602102013201b360214024020032d00f0054109470d0020032802f80541ffffffff0371450d0020032802f40510290b024020032d0080064109470d0020032802880641ffffffff0371450d0020032802840610290b024020032d0090064109470d0020032802980641ffffffff0371450d0020032802940610290b024020032d00a0064109470d0020032802a80641ffffffff0371450d0020032802a40610290b024020032d00b0064109470d0020032802b80641ffffffff0371450d0020032802b40610290b024020032d00c0064109470d0020032802c80641ffffffff0371450d0020032802c40610290b024020032d00d0064109470d0020032802d80641ffffffff0371450d0020032802d40610290b024020032d00e0064109470d0020032802e80641ffffffff0371450d0020032802e40610290b024020032d00f0064109470d0020032802f80641ffffffff0371450d0020032802f40610290b024020032d0080074109470d0020032802880741ffffffff0371450d0020032802840710290b024020032d0090074109470d0020032802980741ffffffff0371450d0020032802940710290b024020032d00a0074109470d0020032802a80741ffffffff0371450d0020032802a40710290b024020032d00b0074109470d0020032802b80741ffffffff0371450d0020032802b40710290b024020032d00c0074109470d0020032802c80741ffffffff0371450d0020032802c40710290b024020032d00d0074109470d0020032802d80741ffffffff0371450d0020032802d40710290b202a4280808080808c0184212a201b41016a211b20112018470d090c0a0b20094108102a000b20054104102a000b20074108102a000b41104108102a000b20074101102a000b20074101102a000b41104108102a000b02402008450d002008417f6a2108200620094102746a4194036a21070c010b0b0b41b0b2c500418001104e000b0240201c450d00201a10290b200341f0056a200341b0016a418c0110ce041a200341e0046a200341f0056a1084030240200341e0046a41106a2802002207450d0020032802e80422192007412c6c6a211d0340024020192d000041786a220741024b0d0002400240024020070e03000102000b201928020c2207450d0220192802042209200741146c6a211203400240200928020c0d002009280210210c2003280264210d200341e0006a210703402007280200220841286a210e200841086a210520082f010622134102742107417f210a02400340024020070d002013210a0c020b200528020021062007417c6a2107200a41016a210a200e41206a210e200541046a210502404100417f41012006200c4b1b2006200c461b41016a0e03020001020b0b0240200e417c6a280200450d002009200e2802003602100c030b41b0b3c5004135104e000b200d450d01200d417f6a210d2008200a4102746a4194036a21070c000b0b200941146a22092012470d000c030b0b201928020421082003280264210c200341e0006a210703402007280200220641286a2109200641086a210520062f0106220d4102742107417f210e02400340024020070d00200d210e0c020b2005280200210a2007417c6a2107200e41016a210e200941206a2109200541046a210502404100417f4101200a20084b1b200a2008461b41016a0e03020001020b0b02402009417c6a280200450d00201920092802003602040c040b41b0b3c5004135104e000b200c450d02200c417f6a210c2006200e4102746a4194036a21070c000b0b201928020c2207450d00201928020422112007411c6c6a211b0340024020112802182207450d002011280210220d20074102746a21140340200d221241046a210d201228020021082003280264210c200341e0006a210703402007280200220641286a2109200641086a210520062f010622134102742107417f210e024002400340024020070d002013210e0c020b2005280200210a2007417c6a2107200e41016a210e200941206a2109200541046a210502404100417f4101200a20084b1b200a2008461b41016a0e03020001020b0b02402009417c6a280200450d00201220092802003602000c020b41b0b3c5004135104e000b200c450d00200c417f6a210c2006200e4102746a4194036a21070c010b0b200d2014470d000b0b2011411c6a2211201b470d000b0b2019412c6a2219201d470d000b0b200341ec046a290200210b20032802e004210720032902e404212a200328026020032802642003280268109f04200041106a200b370200200041086a202a37020020002007360204200041003602002010450d13200f450d1320101029200424000f0b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b41002117410121192005211d0c080b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b41012117410021192005211d0c040b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b410021192005211d410021170b2003200736027c0240024002400240024002400240024002402010450d000240200f20074b0d002003410136028406200342023702f405200341a0b2c5003602f005200341013602d4032003200341d0036a360280062003200341fc006a3602d003200341e0046a200341f0056a10e60320032902e404220b422088a7210920032802e0042113200ba721160c090b201020074102746a2802002205450d0402400240201c200c470d00200c41016a2209200c490d0e200c410174220a20092009200a491b221c41ffffffff0371201c470d0e201c41027422094100480d0e02400240200c0d0020091027211a0c010b201a200c41027420091028211a0b201a450d01201a21110b2011200c4102746a2007360200200341f0056a200328027c2208200341c8006a109b0420032802f805211620032802f4052113024020032802f00522014101470d0020032802fc0521090c0a0b20132802082207417f4c0d0e20132d000c210a02400240024020070d00410121090c010b20132802002112200710272209450d0120092012200710ce041a0b2003200a3a008c0120032007360288012003200736028401200320093602800120132d000d21072003200536029c012003200328027c360298012003410036029001200320073a008d0102400240024020032802702207418883c000460d002003280274211b0c010b20244200370100202341206a420037010020254200370100202341106a42003701002026420037010020234200370100200341f0056a410041e00210cd041a41940310272207450d014100211b20074100360200200720032903e0043702042007410c6a200341e0046a41086a290300370200200741146a200341e0046a41106a2903003702002007411c6a200341e0046a41186a290300370200200741246a200341e0046a41206a2903003702002007412c6a200341e0046a41286a290300370200200741346a200341f0056a41e00210ce041a20034100360274200320073602700b200c41016a210c0340200741146a210920072f010622154102742114417f210a4100210502400340024020142005470d002015210a0c020b200720056a2112200541046a2105200a41016a210a200941206a210902404100417f4101201241086a280200221220084b1b20122008461b41016a0e03020001020b0b2009290200210b2009200329038001370200200941186a200329039801370200200941106a2207290200212a2007200329039001370200200941086a200329038801370200202a42ffffffff0f83420285500d08200b42808080807083500d08200ba710290c080b0240201b450d00201b417f6a211b2007200a4102746a4194036a28020021070c010b0b2003200328027841016a360278200329039801210b200329039001212a2003290388012129200329038001212b20072f01062209410b490d0420244200370100202341206a222c420037010020254200370100202341106a222d42003701002026420037010020234200370100200341f0056a410041e00210cd041a024041940310272205450d0020054100360200200520032903e0043702042005410c6a200341e0046a41086a222e290300370200200541146a200341e0046a41106a222f2903003702002005411c6a200341e0046a41186a2230290300370200200541246a200341e0046a41206a22312903003702002005412c6a200341e0046a41286a2232290300370200200541346a200341f0056a41e00210ce042112200341f0056a41086a221b200741fc016a290200370300200341f0056a41106a221520074184026a290200370300200341f0056a41186a22332007418c026a290200370300200320072902f4013703f00520072802202134200541086a200741246a20072f010641796a220941027410ce042114201220074194026a200941057410ce042112200741063b0106200520093b010620302033290300370300202f2015290300370300202e201b290300370300200320032903f0053703e00402400240200a4107490d002014200a417a6a22354102746a2014200a41796a220a4102746a2214200941ffff0371200a6b41027410cf041a20142008360200201220354105746a2012200a4105746a2209200541066a22122f0100200a6b41057410cf041a200941186a200b3702002009202a370210200920293702082009202b37020020122f010021140c010b200741086a2209200a41016a22354102746a2009200a4102746a2209200741066a22122f01002214200a6b223641027410cf041a20092008360200200741346a220920354105746a2009200a4105746a2209203641057410cf041a200941186a200b3702002009202a370210200920293702082009202b3702000b2012201441016a3b0100200341d0036a41186a22372030290300220b370300200341d0036a41106a2238202f290300222a370300200341d0036a41086a2239202e2903002229370300200341b0016a41186a223a200b370300200341b0016a41106a223b202a370300200341b0016a41086a223c2029370300200320032903e004220b3703d0032003200b3703b0010240200728020022120d00200521090c070b20072f010421352005213d0340200341c0026a41186a223e203a290300370300200341c0026a41106a223f203b290300370300200341c0026a41086a2240203c290300370300200320032903b0013703c002203541ffff037121080240024002400240024020122f01062207410b490d0020244200370100202c420037010020254200370100202d420037010020264200370100202342003701002039202e2903003703002038202f29030037030020372030290300370300200341d0036a41206a22072031290300370300200341d0036a41286a22052032290300370300200320032903e0043703d003200341f0056a410041900310cd041a41c40310272209450d0320094100360200200920032903d0033702042009410c6a2039290300370200200941146a20382903003702002009411c6a2037290300370200200941246a20072903003702002009412c6a2005290300370200200941346a200341f0056a41900310ce042105201241206a280200214120332012418c026a290200370300201520124184026a290200370300201b201241fc016a2902003703002003201241f4016a2902003703f005200941086a201241246a20122f0106220a41796a220741027410ce042142200520124194026a200741057410ce04214320094194036a201241b0036a200a417a6a221441027410ce042136201241063b0106200920073b010602402014450d00410021072036210503402005280200220a20073b0104200a2009360200200541046a21052014200741016a2207470d000b0b20302033290300220b370300202f2015290300222a370300202e201b2903002229370300200320032903f005222b3703e0042033200b3703002015202a370300201b20293703002003202b3703f005203541ffff037122054107490d0120422008417a6a220a41027422146a2042200841796a22074102746a220520092f010620076b41027410cf041a200520343602002043200a4105746a204320074105746a220520092f010620076b41057410cf041a200541186a203e290300370200200541106a203f290300370200200541086a2040290300370200200520032903c002370200200920092f010641016a22053b01062008410274223520366a416c6a203620146a2214200541ffff03712208200a6b41027410cf041a2014203d3602002008200a490d02200920356a41fc026a210503402005280200220a200741016a22073b0104200a2009360200200541046a210520072008490d000c030b0b201241086a2205200841016a2209410274220a6a2005200841027422146a2205200720086b221b41027410cf041a20052034360200201241346a220520094105746a200520084105746a2205201b41057410cf041a200541186a203e290300370200200541106a203f290300370200200541086a2040290300370200200520032903c0023702002012200741016a22073b0106201420124194036a22056a41086a2005200a6a2205200741ffff0371220a20096b41027410cf041a2005203d3602002008200a4f0d0c20122009417f6a22074102746a4198036a2105034020052802002209200741016a22073b010420092012360200200541046a21052007200a490d000c0d0b0b201241086a2207200841016a2214410274220a6a2007200841027422356a220720122f0106223620086b224241027410cf041a20072034360200201241346a220720144105746a200720084105746a2207204241057410cf041a200741186a203e290300370200200741106a203f290300370200200741086a2040290300370200200720032903c0023702002012203641016a22073b0106203520124194036a22366a41086a2036200a6a2236200741ffff0371220a20146b41027410cf041a2036203d3602002005200a4f0d00201220356a4198036a2107034020072802002205200841016a22083b010420052012360200200741046a2107200a2008470d000b0b203a2033290300370300203b2015290300370300203c201b290300370300200320032903f0053703b001201228020022070d01204121340c090b41c4034104102a000b20122f0104213520072112204121342009213d0c000b0b4194034104102a000b4194034104102a000b20074101102a000b20094104102a000b419eabc50041cc00104e000b200741086a2205200a41016a22124102746a2005200a4102746a22052009200a6b221441027410cf041a20052008360200200741346a220520124105746a2005200a4105746a2205201441057410cf041a200541186a200b3702002005202a370210200520293702082005202b3702002007200941016a3b01060c010b20244200370100202c420037010020254200370100202d420037010020264200370100202342003701002039202e2903003703002038202f29030037030020372030290300370300200341d0036a41206a22052031290300370300200341d0036a41286a220a2032290300370300200320032903e0043703d003200341f0056a410041900310cd041a41c40310272207450d0220074100360200200720032903d0033702042007410c6a2039290300370200200741146a20382903003702002007411c6a2037290300370200200741246a20052903003702002007412c6a200a290300370200200741346a200341f0056a41900310ce04210820072003280270220536029403200320073602702003200328027441016a36027420052007360200200541003b0104200820072f0106220a4105746a220520032903b001370200200541186a203a290300370200200541106a203b290300370200200541086a203c2903003702002007200a4102746a41086a203436020020074194036a200a41016a22054102746a2009360200200720053b0106200920053b0104200920073602000b2001450d002016450d00201310290b201d2105201941ff01710e03010205010b41c4034104102a000b410021070c040b410221070c030b200328027020032802742003280278109f040240201c450d00201a10290b0240201f450d00201f412c6c210520202107034020071088032007412c6a2107200541546a22050d000b0b0240200341d4006a280200450d00202010290b2000201336020420004101360200200041086a2009ad4220862016ad843702002010450d06200f450d0620101029200424000f0b2022211e0b410121070c000b0b102b000b1039000b2000200736020420004101360200200041086a200b37020002402010450d00200f450d00201010290b20012802082105024020012802102203450d002003412c6c210720052103034020031088032003412c6a2103200741546a22070d000b0b2001410c6a280200450d00200510290b200424000ba6810204117f017e037f017e230041e0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0f0100021211100f0e0d0c0b0a080706010b200141186a2802002104200141146a2802002105200141106a28020021062001410c6a2802002107200141086a2802002108200141046a28020021090240200241046a280200200241086a280200220a460d002002280200210b0c180b200a41016a220c200a490d14200a410174220d200c200c200d491b220c4100480d1402400240200a0d00200c1027210b0c010b2002280200200a200c1028210b0b200b450d042002200b360200200241046a200c360200200241086a280200210a0c170b2001410c6a280200210c200141086a2802002104200141046a280200210b20012d0001210502400240200241046a280200200241086a280200220a460d002002280200210d0c010b200a41016a220d200a490d14200a4101742206200d200d2006491b22064100480d1402400240200a0d0020061027210d0c010b2002280200200a20061028210d0b200d450d032002200d360200200241046a2006360200200241086a280200210a0b200241086a2206200a41016a360200200d200a6a20053a000002400240200241046a280200220d2006280200220a6b200c490d002002280200210d0c010b200a200c6a2205200a490d14200d410174220a20052005200a491b220a4100480d1402400240200d0d00200a1027210d0c010b2002280200200d200a1028210d0b200d450d022002200d360200200241046a200a360200200241086a280200210a0b200241086a200a200c6a360200200d200a6a200b200c10ce041a4100210c41012107024020040d004101210d0c220b200b10294101210d0c210b2001410c6a2802002106200141086a280200210e200141046a280200210f024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d14200a410174220d200c200c200d491b220d4100480d1402400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41013a0000200f20064104746a21104100210d4100210c41002105410121042006210a024003400240200c2005470d00200d200c41016a220b200b200d491b22054100480d1602400240200d0d002005102721040c010b2004200c2005102821040b2004450d020b2004200c6a200a41807f72200a41ff0071200a410776220b1b3a0000200d41026a210d200c41016a210c200b210a200b0d000b024020060d00200f21080c130b200f210a02400340200a41106a2108200a2d000d22114105460d14200a2d000c210d200a2802082109200a2802042112200a28020021130240024002400240024002402005200c470d00200c41016a220a200c490d1c200c410174220b200a200a200b491b22054100480d1c02400240200c0d002005102721040c010b2004200c2005102821040b2004450d010b2004200c6a200d3a0000200c41016a210a200c410174220c41046a2107200c41026a210d2009210c0340200721060240200a2005470d00200a41016a220b200a490d1d200d200b200b200d491b22054100480d1d02400240200a0d002005102721040c010b2004200a2005102821040b2004450d030b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200641026a2107200d41026a210d200a41016a210a200b210c200b0d000b0240024020090d00200a210c0c010b4100210d0340200a200d6a210c41fc00210b02400240024002402013200d6a2d00000e050200010305020b41fe00210b0c020b41fd00210b0c010b41ff00210b0b0240200c2005470d00200c41016a2205200c490d1e2006200520052006491b22054100480d1e02400240200c0d002005102721040c010b2004200c2005102821040b2004450d050b2004200a6a200d6a200b3a0000200641026a21062009200d41016a220d470d000b200a200d6a210c0b20120d030c040b20054101102a000b20054101102a000b20054101102a000b201310290b4100210a024020114104460d0002402005200c470d00200c41016a220a200c490d18200c410174220d200a200a200d491b22054100480d1802400240200c0d002005102721040c010b2004200c2005102821040b2004450d030b2004200c6a41013a0000200c41016a210c201141077141ff0073210a0b024002402005200c470d00200c41016a220d200c490d18200c410174220b200d200d200b491b22054100480d1802400240200c0d002005102721040c010b2004200c2005102821040b2004450d010b2004200c6a200a3a0000200c41016a210c2008210a20082010470d010c160b0b20054101102a000b20054101102a000b20054101102a000b200d4101102a000b200a4101102a000b20064101102a000b200c4101102a000b200141286a2802002104200141246a2802002111200141206a28020021092001411c6a2802002106200141186a2802002113200141146a28020021082001410c6a2902002114200141086a280200210d200141046a280200210b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d22200a4101742205200c200c2005491b22054100480d2202400240200a0d0020051027210c0c010b2002280200200a20051028210c0b200c450d012002200c360200200241046a2005360200200241086a280200210a0b200241086a200a41016a36020041002105200c200a6a41003a0000200341dc006a41003602002003420137025420032002360250200320143e02482003200d3602442003200b360240200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b41107472210c200341086a41086a2903002114200328020c21044100210d0c1e0b2014422088a7210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d23200a410174220b200d200d200b491b220b4100480d2302400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d032003200b3602582003200d3602540b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b4101211202402008450d00200320063602482003201336024420032008360240200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b41107472210c200341106a2903002114200328020c21044100210d410121050c1f0b410021120b200920044104746a21062004210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d23200a410174220b200d200d200b491b220b4100480d2302400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d042003200b3602582003200d3602540b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024020040d002009210b0c1d0b200441047441706a21072009210d0340200d41106a210b200d410c6a2802002102200d41086a280200210a200d280204210c0240024002400240024002400240024002400240200d2802000e09000102030405060727000b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2c200d4101742205200420042005491b22054100480d2c02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d0e20032005360258200320043602540b2003200d41016a36025c2004200d6a41003a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2d200d4101742205200420042005491b22054100480d2d02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1020032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2d200c4101742204200d200d2004491b22044100480d2d02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d11200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c080b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2b200d4101742205200420042005491b22054100480d2b02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1020032005360258200320043602540b2003200d41016a36025c2004200d6a41013a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2c200d4101742205200420042005491b22054100480d2c02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1220032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2c200c4101742204200d200d2004491b22044100480d2c02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d13200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c070b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2a200d4101742205200420042005491b22054100480d2a02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1220032005360258200320043602540b2003200d41016a36025c2004200d6a41023a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2b200d4101742205200420042005491b22054100480d2b02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1420032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2b200c4101742204200d200d2004491b22044100480d2b02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d15200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c060b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d29200d4101742205200420042005491b22054100480d2902400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1420032005360258200320043602540b2003200d41016a36025c2004200d6a41033a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2a200d4101742205200420042005491b22054100480d2a02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1620032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2a200c4101742204200d200d2004491b22044100480d2a02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d17200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b200341086a2002200341d0006a10e10320032d0008220a411a460d0520032f000920032d000b41107472210c0c220b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d28200d4101742205200420042005491b22054100480d2802400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1620032005360258200320043602540b2003200d41016a36025c2004200d6a41043a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d29200d4101742205200420042005491b22054100480d2902400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1820032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d29200c4101742204200d200d2004491b22044100480d2902400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d19200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b200341086a2002200341d0006a10e10320032d0008220a411a460d0420032f000920032d000b41107472210c0c210b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d27200d4101742205200420042005491b22054100480d2702400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1820032005360258200320043602540b2003200d41016a36025c2004200d6a41053a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d28200d4101742205200420042005491b22054100480d2802400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1a20032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d28200c4101742204200d200d2004491b22044100480d2802400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d1b200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b200341086a2002200341d0006a10e10320032d0008220a411a460d0320032f000920032d000b41107472210c0c200b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d26200d4101742205200420042005491b22054100480d2602400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1a20032005360258200320043602540b2003200d41016a36025c2004200d6a41063a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d27200d4101742205200420042005491b22054100480d2702400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1c20032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d27200c4101742204200d200d2004491b22044100480d2702400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d1d200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c020b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d25200d4101742205200420042005491b22054100480d2502400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1c20032005360258200320043602540b2003200d41016a36025c2004200d6a41073a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d26200d4101742205200420042005491b22054100480d2602400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1e20032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d26200c4101742204200d200d2004491b22044100480d2602400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d1f200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b0b2003411a3a00080b200741706a2107200b210d200b2006470d000b2006210b0c1c0b20054101102a000b200b4101102a000b200b4101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20032903102114200328020c2104024003402007450d01200741706a2107200b280200210d200b41106a210b200d4108470d000b0b02402011450d00200910290b20124521054101210d0c010b024003402006200b460d01200b280200210a200b41106a210b200a4108470d000b0b02402011450d00200910290b20032802582109200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d08200a4101742206200d200d2006491b22064100480d0802400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d07200c410174220a200d200d200a491b220a4100480d0702400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402009450d00200210290b41002110410121072008450d032012450d032013450d03200810290c030b20064101102a000b200a4101102a000b02402003280258450d00200328025410290b02402008452005720d002013450d00200810290b0240200d201145720d00200910290b200a411a470d1141002110410121070b4101210c4101210d4101210b4101210841012109410121044101210541012113410121064101210241012111410121120c350b200141146a280200210f200141106a28020021112001410c6a2802002113200141086a2802002110200141056a2d0000210d200141046a2d00002109024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0c200a410174220b200c200c200b491b220b4100480d0c02400240200a0d00200b1027210c0c010b2002280200200a200b1028210c0b200c450d012002200c360200200241046a200b360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41003a00000240410410272212450d00201241eec2b5ab06360000024020090e0400050403000b410121064100210a4100210c2011210d034002400240200a200c460d00200a21070c010b200a41016a220c200a490d0e200a410174220b200c200c200b491b22074100480d0e02400240200a0d002007102721060c010b2006200a2007102821060b02402006450d00200a210c2007210a0c010b20074101102a000b2006200c6a200d41807f72200d41ff0071200d410776220b1b3a0000200c41016a210c200b210d200b0d000b0240024002402007200c6b20114f0d00200c20116a220a200c490d0f2007410174220d200a200a200d491b220a4100480d0f0240024020070d00200a102721060c010b20062007200a102821060b2006450d01200a21070b2006200c6a2010201110ce041a200c20116a21084101210e20130d010c080b200a4101102a000b201010290c060b41044101102a000b200b4101102a000b410021154101210e20102106201321072011210841012116410121170c040b2003410036024820034201370340410121044100210d4100210a2010210c02400240024002400240024003400240200a200d470d00200d41016a220b200d490d10200d4101742205200b200b2005491b220b4100480d1002400240200d0d00200b102721040c010b2004200d200b102821040b2004450d022003200b36024420032004360240200b210d0b2003200a41016a22053602482004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b2013200f4104746a21060240200f0d002013210b0c040b2013210b2010450d03200641706a21162010210e4100210a2013210803402008210b02400340200b41046a28020022070d01200a41016a210a2006200b41106a220b470d000c070b0b200b41106a2108200a41016a2115200e417f6a210e200b41086a2902002114200b28020021172003280244210d2003280248210c02400240034002400240200c200d460d00200328024021040c010b200d41016a2204200d490d13200d4101742205200420042005491b22054100480d1302400240200d0d002005102721040c010b2003280240200d2005102821040b2004450d0220032005360244200320043602402005210d0b2003200c41016a22053602482004200c6a200a41807f72200a41ff0071200a41077622041b3a00002005210c2004210a20040d000b200320143703102003200736020c20032017360208200341d0006a200341086a200341c0006a10ea0320032d00502204411a460d010c040b20054101102a000b2016200b460d032015210a200e0d000c030b0b200b4101102a000b20032d0053210e20032f0051211720032802542105200329035821140240200641706a200b460d00200b41106a210b0340200b220a41106a210b0240200a2802042207450d00200a28020821080240200a410c6a280200220a450d00200a410c6c210c2007210a03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b2008450d00200710290b200b2006470d000b0b02402011450d00201310290b2004411a460d03200e411074210a02402003280244450d00200328024010290b2017200a72210a02400240200941024b0d000240024020090e03000109000b2013450d080c020b0240200f450d00200f410c6c210d2013210c03400240200c280200220b450d00200c41046a280200450d00200b10290b200c410c6a210c200d41746a220d0d000b0b02402011450d00201310290b2004411a470d074100210541012104410021080c0a0b2013450d060b201010290c050b200b41106a210b0b200b2006460d000340200b220a41106a210b0240200a2802042204450d00200a28020821050240200a410c6a280200220a450d00200a410c6c210c2004210a03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b2005450d00200410290b200b2006470d000b0b2011450d00201310290b2003280248210820032802442107200328024021064102210d410021164101210e41002117410021150c030b4100210e2003410036024820034201370340200341146a200f360200200341086a41086a20113602002003201336020c20032010360208200341d0006a200341086a200341c0006a10ea03024020032d00502204411a460d0020032d0053411074210a20032f0051210c200341d0006a41086a29030021142003280254210502402003280244450d00200328024010290b200c200a72210a0c010b2003280248210820032802442107200328024021064101211641002117410021154101210d0c020b200041086a2014370200200041046a20053602002000200a410874200472360200201210290c030b4100211741012116410121154100210d0b024002400240410110272204450d002004200d3a00004102210d4101210a410121052008210c03400240200a2005470d00200d200a41016a220b200b200d491b22054100480d092004200a200510282204450d030b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200d41026a210d200a41016a210a200b210c200b0d000b02402005200a6b20084f0d00200a20086a220c200a490d082005410174220d200c200c200d491b220c4100480d080240024020050d00200c102721040c010b20042005200c102821040b2004450d03200c21050b2004200a6a2006200810ce041a02402007450d00200610290b2008200a6a21080240200941024b0d00024002400240024020090e03000102000b2015201345720d07201010290c070b200e450d060240200f450d00200f410c6c210c2013210a03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b20110d010c060b2016450d050240200f450d002013200f4104746a21072013210603402006220b41106a21060240200b280204220a450d000240200b410c6a280200220c450d00200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200b41086a280200450d00200b28020410290b20062007470d000b0b2011450d050b201310290c040b2017201345720d03201010290c030b41014101102a000b20054101102a000b200c4101102a000b2003411c6a2008360200200341186a20053602002003200436021420034284808080c00037020c20032012360208200341d0006a200341086a200210f103200320032900513703402003200341d0006a41086a29000037004720032d0050220a411a460d012000200a3a000020002003290340370001200041086a20032900473700000b410021094101210d4101210c4101210b410121044101210541012106410121074101210241012108410121130c1a0b41002112410121074101210c4101210d4101210b41012108410121094101210441012105410121134101210641012102410121110c330b2001410c6a2802002105200141086a2802002113200141046a28020021090240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d15200a410174220d200c200c200d491b220d4100480d1502400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a410b3a0000200341dc006a4100360200200342013702542003200236025020092005411c6c6a21074100210a4100210c2005210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d16200a4101742204200b200b2004491b220b4100480d1602400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b200921042005450d062009210a0340200a411c6a2104200a2802042202450d07200a41186a2802002105200a41146a2802002108200a41086a2902002114200a280200210c200a28021021060340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d17200a410174220b200d200d200b491b220b4100480d1702400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d052003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b2003201437024420032002360240200341086a200341c0006a200341d0006a10de03024020032d0008220d411a470d002005210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d18200a410174220b200d200d200b491b220b4100480d1802400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d072003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024002402003280258220c200328025c220a6b2005490d002003280254210c0c010b200a20056a220d200a490d0b200c410174220a200d200d200a491b220a4100480d0b02400240200c0d00200a1027210c0c010b2003280254200c200a1028210c0b200c450d072003200a3602582003200c360254200328025c210a0b2003200a20056a36025c200c200a6a2006200510ce041a02402008450d00200610290b2004210a20042007470d010c090b0b20032d000b211220032f0009211020032903102114200328020c21112008450d05200610290c050b200d4101102a000b200b4101102a000b200b4101102a000b200b4101102a000b200a4101102a000b024020042007460d0003402004280204220b450d01200441146a2802002105200441086a28020021062004280210210202402004410c6a280200220a450d00200a410474210c200b210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402006450d00200b10290b2004411c6a210402402005450d00200210290b20042007470d000b0b2012411074210a02402013450d00200910290b2010200a72210a02402003280258450d00200328025410290b2000200a3b00012000200d3a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021084101210d4101210c4101210b41012104410121054101210641012107410121020c190b20042007460d0003402004280204220d450d01200441146a280200210b200441086a28020021052004280210210602402004410c6a280200220a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402005450d00200d10290b2004411c6a21040240200b450d00200610290b20042007470d000b0b02402013450d00200910290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d04200a4101742206200d200d2006491b22064100480d0402400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d03200c410174220a200d200d200a491b220a4100480d0302400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002111410121074101210c4101210d4101210b41012108410121094101210441012105410121134101210641012102410121120c340b20064101102a000b200a4101102a000b102b000b2001410c6a2802002105200141086a2802002117200141046a280200210e024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0f200a410174220d200c200c200d491b220d4100480d0f02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a410a3a00002003412c6a41003602002003420137022420032002360220200e200541186c6a210f4100210a4100210c2005210d0240034002400240200a200c460d002003280224210a0c010b200a41016a220b200a490d11200a4101742204200b200b2004491b220b4100480d1102400240200a0d00200b1027210a0c010b2003280224200a200b1028210a0b200a450d022003200b3602282003200a3602240b2003200c41016a36022c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280228210a200328022c210c200d210d0c010b0b200e21092005450d03200341086a4101722102200341086a41026a2107200e210a02400340200a41186a2109200a2802002208450d05200a41146a2802002111200a41106a2802002112200a28020c2113200a29020421144100210c2003410036024c2003420137024420082014422088a7220d4103746a21062003200341206a3602402014a721104100210a024002400240024002400240034002400240200c200a460d002003280244210c0c010b200c41016a220a200c490d19200c410174220b200a200a200b491b220a4100480d1902400240200c0d00200a1027210c0c010b2003280244200c200a1028210c0b200c450d022003200a3602482003200c360244200328024c210a0b2003200a41016a36024c200c200a6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280248210c200328024c210a200d210d0c010b0b0240024020062008470d00200821040c010b2008210a0340200a41086a2104200a2902002214422088a7220a41ff01714104460d01200a41187441187521052014a7210c0340024002402003280248200328024c220a460d002003280244210d0c010b200a41016a220d200a490d1b200a410174220b200d200d200b491b220b4100480d1b02400240200a0d00200b1027210d0c010b2003280244200a200b1028210d0b200d450d052003200b3602482003200d360244200328024c210a0b2003200a41016a36024c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024002402003280248200328024c220a460d002003280244210c0c010b200a41016a220c200a490d1a200a410174220d200c200c200d491b220d4100480d1a02400240200a0d00200d1027210c0c010b2003280244200a200d1028210c0b200c450d052003200d3602482003200c360244200328024c210a0b2003200a41016a36024c200c200a6a2005417f73220a413f7141c00072200a2005417f4a1b3a00002004210a20042006470d000b200621040b0240034020062004460d0120042d0004210a200441086a2104200a4104470d000b0b02402010450d00200810290b20132011410474220a6a210b024020110d002013210a0c050b201341186a210c200a41706a21042013210a0340200a2d0000210d2007200a41036a2d00003a00002003200a41016a2f00003b01080240200d41ac01470d00200a41106a210a0c060b200341306a41026a20072d000022053a0000200320032f010822063b0130200a41046a2902002114200a410c6a2802002108200220063b0000200241026a20053a00002003200d3a0008200320083602142003201437020c200341d0006a200341086a200341c0006a10e80320032d00502205411a46220d450d04200c41106a210c200441706a2104200a41106a220a200b470d000c060b0b200a4101102a000b200b4101102a000b200d4101102a000b20032d0053210820032f00512111200328025421062003290358211402402004450d00034002400240200c41786a220a2d000022044109460d00200441ac01470d010c030b200c28020041ffffffff0371450d00200a41046a28020010290b200c41106a210c200a41106a200b470d000b0b02402012450d00201310290b02402003280248450d00200328024410290b200d450d062009210a2009200f470d020c080b200a200b460d00034002400240200a2d0000220c4109460d00200c41ac01470d010c030b200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a220a200b470d000b0b02402012450d00201310290b20032802482111200328024421132003280240210d200328024c2208210c0240034002400240200d41086a2205280200200d410c6a2204280200220a460d00200d280204210b0c010b200a41016a220b200a490d14200a4101742206200b200b2006491b22064100480d1402400240200a0d0020061027210b0c010b200d280204200a20061028210b0b200b450d02200d200b360204200520063602002004280200210a0b2004200a41016a360200200b200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024002402005280200220c2004280200220a6b2008490d00200d280204210c0c010b200a20086a220b200a490d13200c410174220a200b200b200a491b220a4100480d1302400240200c0d00200a1027210c0c010b200d280204200c200a1028210c0b200c450d03200d200c3602042005200a3602002004280200210a0b2004200a20086a360200200c200a6a2013200810ce041a02402011450d00201310290b2009210a2009200f470d010c070b0b20064101102a000b200a4101102a000b200b4101102a000b200d4101102a000b02402009200f460d0003402009280200220c450d01200941146a280200210a200941106a280200210b200928020c210d02402009280204450d00200c10290b0240200a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200941186a21090240200b450d00200d10290b2009200f470d000b0b2008411074210a02402017450d00200e10290b2011200a72210a02402003280228450d00200328022410290b2000200a3b0001200020053a0000200041036a200a4110763a0000200041086a2014370000200041046a2006360000410021024101210d4101210c4101210b410121044101210541012106410121070c160b2009200f460d0003402009280200220c450d01200941146a280200210a200941106a280200210b200928020c210d02402009280204450d00200c10290b0240200a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200941186a21090240200b450d00200d10290b2009200f470d000b0b02402017450d00200e10290b20032802282108200328022421022003280220220441086a210b200441046a2105200328022c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0e200a4101742206200d200d2006491b22064100480d0e02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d0d200c410174220a200d200d200a491b220a4100480d0d02400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002102410121074101210c4101210d4101210b4101210841012109410121044101210541012113410121060c220b20064101102a000b200a4101102a000b2001410c6a2802002105200141086a2802002113200141046a28020021090240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d12200a410174220d200c200c200d491b220d4100480d1202400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41093a0000200341dc006a4100360200200342013702542003200236025020092005411c6c6a21024100210a4100210c2005210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d13200a4101742204200b200b2004491b220b4100480d1302400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b200921062005450d062009210a0340200a411c6a2106200a2802042205450d07200a41186a2802002104200a41146a2802002108200a41086a2902002114200a2802102107200a280200210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d14200a410174220b200d200d200b491b220b4100480d1402400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d052003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b2003201437024420032005360240200341086a200341c0006a200341d0006a10de03024020032d0008220d411a470d00200720044102746a21052004210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d15200a410174220b200d200d200b491b220b4100480d1502400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d072003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02402004450d002007210403402004280200210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d17200a410174220b200d200d200b491b220b4100480d1702400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d0a2003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b200441046a22042005470d000b0b02402008450d00200710290b2006210a20062002470d010c090b0b20032d000b211220032f0009211020032903102114200328020c21112008450d05200710290c050b200d4101102a000b200b4101102a000b200b4101102a000b200b4101102a000b200b4101102a000b024020062002460d0003402006280204220b450d01200641146a2802002104200641086a28020021052006280210210702402006410c6a280200220a450d00200a410474210c200b210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402005450d00200b10290b2006411c6a210602402004450d00200710290b20062002470d000b0b2012411074210a02402013450d00200910290b2010200a72210a02402003280258450d00200328025410290b2000200a3b00012000200d3a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021074101210d4101210c4101210b4101210441012105410121060c140b20062002460d0003402006280204220d450d01200641146a280200210b200641086a28020021042006280210210502402006410c6a280200220a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402004450d00200d10290b2006411c6a21060240200b450d00200510290b20062002470d000b0b02402013450d00200910290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0d200a4101742206200d200d2006491b22064100480d0d02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d0c200c410174220a200d200d200a491b220a4100480d0c02400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002106410121074101210c4101210d4101210b41012108410121094101210441012105410121130c200b20064101102a000b200a4101102a000b200141046a280200210a0240024002400240024002400240200241046a280200200241086a280200220c460d002002280200210d0c010b200c41016a220d200c490d0e200c410174220b200d200d200b491b220b4100480d0e02400240200c0d00200b1027210d0c010b2002280200200c200b1028210d0b200d450d012002200d360200200241046a200b360200200241086a280200210c0b200241086a200c41016a360200200d200c6a41083a0000410121064100210b4100210c03400240200c200b470d00200b410174220d200b41016a22042004200d491b220d4100480d0f02400240200b0d00200d102721060c010b2006200b200d102821060b2006450d05200d210b0b2006200c6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41016a210c200d210a200d0d000b200c417f6a2109200241086a2105200241046a2107200c210d03400240024020072802002005280200220a460d00200228020021040c010b200a41016a2204200a490d0f200a4101742208200420042008491b22084100480d0f02400240200a0d002008102721040c010b2002280200200a2008102821040b2004450d0320022004360200200720083602002005280200210a0b2005200a41016a3602002004200a6a200d41807f72200d41ff0071200d410776220a1b3a0000200a210d200a0d000b02400240200241046a280200220d200241086a280200220a6b20094d0d002002280200210d0c010b200a200c6a2204200a490d0e200d410174220a20042004200a491b220a4100480d0e02400240200d0d00200a1027210d0c010b2002280200200d200a1028210d0b200d450d032002200d360200200241046a200a360200200241086a280200210a0b200241086a200a200c6a360200200d200a6a2006200c10ce041a41012107200b450d04200610290c040b200b4101102a000b20084101102a000b200a4101102a000b200d4101102a000b4101210c4101210d0c160b2001410c6a2802002109200141086a2802002113200141046a280200210802400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0e200a410174220d200c200c200d491b220d4100480d0e02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41073a0000200341dc006a410036020020034201370254200320023602502008200941146c6a2107410121044100210d4100210a2009210c03400240200a200d470d00200d41016a220b200d490d0f200d4101742205200b200b2005491b220b4100480d0f02400240200d0d00200b102721040c010b2004200d200b102821040b2004450d032003200b36025820032004360254200b210d0b2003200a41016a220536025c2004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b200821062009450d042008210a0340200a41146a2106200a28020c22054104460d05200a41106a280200210c200a29020021142003200a28020836024820032014370340200341086a200341c0006a200341d0006a10ed0320032d0008220a411a470d04024002402003280258220d200328025c220b460d00200328025421040c010b200b41016a220a200b490d0f200b410174220d200a200a200d491b220d4100480d0f02400240200b0d00200d102721040c010b2003280254200b200d102821040b2004450d042003200d360258200320043602540b2003200b41016a220a36025c2004200b6a20053a0000024003400240200a200d470d00200d41016a220b200d490d11200d4101742205200b200b2005491b220b4100480d1102400240200d0d00200b102721040c010b2004200d200b102821040b2004450d02200b210d0b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200a41016a210a200b210c200b0d000b2003200d3602582003200a36025c200320043602542006210a20062007470d010c070b0b200b4101102a000b200d4101102a000b200b4101102a000b200d4101102a000b20032d000b210c20032f0009210d20032903102114200328020c210b024020062007460d0003402006410c6a2802004104460d010240200641046a280200450d00200628020010290b200641146a22062007470d000b0b200c411074210c02402013450d00200810290b200d200c72210c02402003280258450d00200328025410290b2000200c3b00012000200a3a0000200041036a200c4110763a0000200041086a2014370000200041046a200b360000410021064101210d4101210c4101210b41012104410121050c110b20062007460d0003402006410c6a2802004104460d010240200641046a280200450d00200628020010290b200641146a22062007470d000b0b02402013450d00200810290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0b200a4101742206200d200d2006491b22064100480d0b02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d0a200c410174220a200d200d200a491b220a4100480d0a02400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002113410121074101210c4101210d4101210b410121084101210941012104410121050c1d0b20064101102a000b200a4101102a000b2001410c6a2802002109200141086a2802002113200141046a2802002108024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0e200a410174220d200c200c200d491b220d4100480d0e02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41063a0000200341dc006a41003602002003420137025420032002360250200820094104746a21054100210a4100210c2009210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d0f200a4101742204200b200b2004491b220b4100480d0f02400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b2008210d2009450d054100210d0340200341086a41086a220a2008200d6a220c41086a2802003602002003200c2902003703080240200c410d6a2d000022044102470d00200c41106a210d0c070b200341306a41086a200a280200220a360200200320032903082214370330200c410c6a2d00002106200341206a41086a2207200a36020020032014370320024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0f200a4101742202200b200b2002491b22024100480d0f02400240200a0d0020021027210b0c010b2003280254200a20021028210b0b200b450d04200320023602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41fdf9ff77200641037441187141107376413f7141c000723a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0f200a4101742206200b200b2006491b22064100480d0f02400240200a0d0020061027210b0c010b2003280254200a20061028210b0b200b450d05200320063602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a20044100473a0000200341c0006a41086a200728020036020020032003290320370340200341086a200341c0006a200341d0006a10de0320032d0008220b411a470d05200d41106a210d200c41106a2005470d000c070b0b200d4101102a000b200b4101102a000b20024101102a000b20064101102a000b20032d000b210720032f00092102200328020c2111200329031021140240200941047441706a200d460d00200c41106a210d0340200d410d6a2d00004102460d01200d2802042106200d28020021040240200d280208220a450d00200a410474210c2004210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210d02402006450d00200410290b200d2005470d000b0b2007411074210a02402013450d00200810290b2002200a72210a02402003280258450d00200328025410290b2000200a3b00012000200b3a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021054101210d4101210c4101210b410121040c0f0b200d2005460d000340200d410d6a2d00004102460d01200d2802042104200d280200210b0240200d280208220a450d00200a410474210c200b210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210d02402004450d00200b10290b200d2005470d000b0b02402013450d00200810290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0a200a4101742206200d200d2006491b22064100480d0a02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d09200c410174220a200d200d200a491b220a4100480d0902400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002105410121074101210c4101210d4101210b4101210841012109410121040c1b0b20064101102a000b200a4101102a000b2001410c6a2802002107200141086a2802002108200141046a280200210602400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d09200a410174220d200c200c200d491b220d4100480d0902400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41053a0000200341d0006a410c6a4100360200200342013702542003200236025020062007410c6c6a2102410121044100210d4100210a2007210c03400240200a200d470d00200d41016a220b200d490d0a200d4101742205200b200b2005491b220b4100480d0a02400240200d0d00200b102721040c010b2004200d200b102821040b2004450d032003200b36025820032004360254200b210d0b2003200a41016a220536025c2004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b2006210a2007450d022007410c6c210b4100210c034002402006200c6a220a41046a280200220d4102470d00200a410c6a210a0c040b200341086a200a280200200d200a41086a280200200341d0006a10eb03024020032d00082204411a460d0020032f000920032d000b41107472210520032903102114200328020c2107200a410c6a210d200b200c6b41746a210a02400340200a450d01200a41746a210a200d280204210c200d410c6a210d200c4102470d000b0b02402008450d00200610290b02402003280258450d00200328025410290b200020053b0001200020043a0000200041036a20054110763a0000200041086a2014370000200041046a2007360000410021044101210d4101210c4101210b0c100b200b200c410c6a220c470d000b2002210a0c020b200d4101102a000b200b4101102a000b200a410020076b410c6c6a210c024003402006200c460d01200c410c6a210c200a280204210d200a410c6a210a200d4102470d000b0b02402008450d00200610290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d09200a4101742206200d200d2006491b22064100480d0902400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d08200c410174220a200d200d200a491b220a4100480d0802400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002104410121074101210c4101210d4101210b41012108410121090c190b20064101102a000b200a4101102a000b2001410c6a2802002109200141086a2802002113200141046a2802002106024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d09200a410174220d200c200c200d491b220d4100480d0902400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41043a0000200341d0006a410c6a4100360200200342013702542003200236025020062009410c6c6a2111410121044100210d4100210a2009210c03400240200a200d470d00200d41016a220b200d490d0a200d4101742205200b200b2005491b220b4100480d0a02400240200d0d00200b102721040c010b2004200d200b102821040b2004450d032003200b36025820032004360254200b210d0b2003200a41016a220536025c2004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b2006210a2009450d032009410c6c21084100210d034002402006200d6a220c41046a28020022044102470d00200c410c6a210a0c050b200c2802002105200c41086a2802002107024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0a200a4101742202200b200b2002491b22024100480d0a02400240200a0d0020021027210b0c010b2003280254200a20021028210b0b200b450d04200320023602582003200b3602540b2003200a41016a36025c200b200a6a41f0003a0000200341086a200520042007200341d0006a10eb03024020032d0008220b411a460d0020032f000920032d000b41107472210420032903102114200328020c2105200c410c6a210c2008200d6b41746a210a02400340200a450d01200a41746a210a200c280204210d200c410c6a210c200d4102470d000b0b02402013450d00200610290b02402003280258450d00200328025410290b200020043b00012000200b3a0000200041036a20044110763a0000200041086a2014370000200041046a20053600004100210b4101210d4101210c0c0f0b2008200d410c6a220d470d000b2011210a0c030b200d4101102a000b200b4101102a000b20024101102a000b200a410020096b410c6c6a210c024003402006200c460d01200c410c6a210c200a280204210d200a410c6a210a200d4102470d000b0b02402013450d00200610290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d08200a4101742206200d200d2006491b22064100480d0802400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d07200c410174220a200d200d200a491b220a4100480d0702400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002109410121074101210c4101210d4101210b410121080c170b20064101102a000b200a4101102a000b2001410c6a2802002106200141086a2802002109200141046a280200210802400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0a200a410174220d200c200c200d491b220d4100480d0a02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41033a0000200820064102746a21074100210d4100210a41002105410121042006210c03400240200a2005470d00200d200a41016a220b200b200d491b22054100480d0b02400240200d0d002005102721040c010b2004200a2005102821040b2004450d050b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200d41026a210d200a41016a210a200b210c200b0d000b02402006450d00200821060340200a410174210d2006280200210c03400240200a2005470d00200a41016a220b200a490d0d200d200b200b200d491b22054100480d0d02400240200a0d002005102721040c010b2004200a2005102821040b2004450d080b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200d41026a210d200a41016a210a200b210c200b0d000b200641046a22062007470d000b0b02402009450d00200810290b200241086a2106200241046a2107200a210d03400240024020072802002006280200220c460d002002280200210b0c010b200c41016a220b200c490d0b200c4101742208200b200b2008491b22084100480d0b02400240200c0d0020081027210b0c010b2002280200200c20081028210b0b200b450d032002200b360200200720083602002006280200210c0b2006200c41016a360200200b200c6a200d41807f72200d41ff0071200d410776220c1b3a0000200c210d200c0d000b02400240200241046a280200220d200241086a280200220c6b200a490d002002280200210d0c010b200c200a6a220b200c490d0a200d410174220c200b200b200c491b220c4100480d0a02400240200d0d00200c1027210d0c010b2002280200200d200c1028210d0b200d450d032002200d360200200241046a200c360200200241086a280200210c0b200241086a200c200a6a360200200d200c6a2004200a10ce041a41002108410121072005450d05200410290c050b200d4101102a000b20084101102a000b200c4101102a000b20054101102a000b20054101102a000b4101210c4101210d4101210b0c130b2001410c6a2802002106200141086a2802002111200141046a28020021130240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d11200a410174220d200c200c200d491b220d4100480d1102400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41023a0000200341dc006a410036020020034201370254200320023602502013200641286c6a21054100210a4100210c2006210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d12200a4101742204200b200b2004491b220b4100480d1202400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b2013210b2006450d0c2013210b0340200341086a41086a220d200b220a41086a2802003602002003200a290200370308200a41286a210b200a2d001822074104460d0d200a411b6a2d00002108200a41196a2f00002109200a41206a2900002114200a411c6a280000210c200a41146a2802002102200a41106a2802002104200a28020c2106200341206a41086a200d280200220a360200200320032903082218370320200341c0006a41086a200a36020020032018370340200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b41107472210720032903102114200328020c21022004450d0d200610290c0d0b200320023602482003200436024420032006360240200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b411074722107200328020c2102200329031021140c0d0b2014422088a7210a2014a7210d0240024002400240024020070e0400010203000b024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d16200a4101742204200d200d2004491b22044100480d1602400240200a0d0020041027210d0c010b2003280254200a20041028210d0b200d450d08200320043602582003200d3602540b2003200a41016a36025c200d200a6a41003a00000340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d17200a4101742204200d200d2004491b22044100480d1702400240200a0d0020041027210d0c010b2003280254200a20041028210d0b200d450d0a200320043602582003200d3602540b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000c040b0b024002402003280258200328025c2204460d00200328025421060c010b200441016a22062004490d1520044101742207200620062007491b22074100480d150240024020040d002007102721060c010b200328025420042007102821060b2006450d0920032007360258200320063602540b2003200441016a36025c200620046a41013a0000024002402003280258200328025c2204460d00200328025421060c010b200441016a22062004490d1520044101742207200620062007491b22074100480d150240024020040d002007102721060c010b200328025420042007102821060b2006450d0a20032007360258200320063602540b2003200441016a36025c200620046a41f0003a0000200341086a200c200d200a200341d0006a10eb0320032d0008220a411a460d0220032f000920032d000b4110747221070c0e0b024002402003280258200328025c2204460d00200328025421060c010b200441016a22062004490d1420044101742207200620062007491b22074100480d140240024020040d002007102721060c010b200328025420042007102821060b2006450d0a20032007360258200320063602540b2003200441016a36025c200620046a41023a0000200341086a200c200d200a200341d0006a10eb0320032d0008220a411a460d0120032f000920032d000b4110747221070c0d0b024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d13200a410174220d200c200c200d491b220d4100480d1302400240200a0d00200d1027210c0c010b2003280254200a200d1028210c0b200c450d0a2003200d3602582003200c3602540b2003200a41016a36025c200c200a6a41033a0000024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d13200a410174220d200c200c200d491b220d4100480d1302400240200a0d00200d1027210c0c010b2003280254200a200d1028210c0b200c450d0b2003200d3602582003200c3602540b2003200a41016a36025c200c200a6a2009200841107472220c417f73220a413f7141c00072200a200c411874411875417f4a1b3a0000024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d13200a4101742204200d200d2004491b22044100480d1302400240200a0d0020041027210d0c010b2003280254200a20041028210d0b200d450d0c200320043602582003200d3602540b2003200a41016a36025c200d200a6a200c4180fe03714100473a00000b200b2005470d000c0e0b0b200d4101102a000b200b4101102a000b20044101102a000b20044101102a000b20074101102a000b20074101102a000b20074101102a000b200d4101102a000b200d4101102a000b20044101102a000b20032903102114200328020c21020b0240200b2005460d000340200b41186a2d00004104460d01200b41106a280200210c200b410c6a280200210d0240200b41046a280200450d00200b28020010290b0240200c450d00200d10290b200b41286a220b2005470d000b0b02402011450d00201310290b02402003280258450d00200328025410290b200020073b00012000200a3a0000200041036a20074110763a0000200041086a2014370000200041046a20023600004100210c4101210d0c080b200b2005460d000340200b41186a2d00004104460d01200b41106a280200210a200b410c6a280200210c0240200b41046a280200450d00200b28020010290b0240200a450d00200c10290b200b41286a220b2005470d000b0b02402011450d00201310290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d06200a4101742206200d200d2006491b22064100480d0602400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d05200c410174220a200d200d200a491b220a4100480d0502400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b4100210b410121074101210c4101210d0c130b20064101102a000b200a4101102a000b20082010460d0003402008410d6a2d00004105460d010240200841046a280200450d00200828020010290b200841106a22082010470d000b0b0240200e450d00200f10290b200241086a2106200241046a2107200c210d0240024003400240024020072802002006280200220a460d002002280200210b0c010b200a41016a220b200a490d04200a4101742208200b200b2008491b22084100480d0402400240200a0d0020081027210b0c010b2002280200200a20081028210b0b200b450d022002200b360200200720083602002006280200210a0b2006200a41016a360200200b200a6a200d41807f72200d41ff0071200d410776220a1b3a0000200a210d200a0d000b02400240200241046a280200220d200241086a280200220a6b200c490d002002280200210d0c010b200a200c6a220b200a490d03200d410174220a200b200b200a491b220a4100480d0302400240200d0d00200a1027210d0c010b2002280200200d200a1028210d0b200d450d022002200d360200200241046a200a360200200241086a280200210a0b200241086a200a200c6a360200200d200a6a2004200c10ce041a4100210d410121072005450d03200410290c030b20084101102a000b200a4101102a000b102b000b4101210c0c0c0b2000200c3b00012000200a3a0000200041036a200c4110763a0000200041086a2014370000200041046a2004360000410021134101210d4101210c4101210b410121044101210541012106410121074101210241012108410121090c090b4101210c200241086a200a41016a3602004100210d200b200a6a41003a00002003411c6a2004360200200341186a200536020020032006360214200320073602102003200836020c20032009360208200341d0006a200341086a200210f103200320032900513703402003200341d0006a41086a29000037004720032d0050220a411a460d092000200a3a000020002003290340370001200041086a20032900473700000b4101210b0b410121040b410121050b410121060b410121070b410121020b410121080b41012109410121130b20012d0000220a410e4b0d18200a0e0f0a0b0c0d0e0f1011121813141516170a0b4101210c410021074101210d0b4101210b0b410121080b410121090b410121040b410121050b410121130b410121060b410121020b41012111410121120c0f0b200141086a280200450d10200141046a28020010290c100b200d450d0f0240200141086a280200450d00200141046a28020010290b200141146a280200450d0f200141106a28020010290c0f0b02402001410c6a280200220c450d00200141046a280200210a200c410474210c03400240200a41046a280200450d00200a28020010290b200a41106a210a200c41706a220c0d000b0b200141086a280200450d0e200128020410290c0e0b200c450d0d02402001410c6a280200220c450d00200141046a280200210a200c41286c210c03400240200a41046a280200450d00200a28020010290b0240200a41106a280200450d00200a410c6a28020010290b200a41286a210a200c41586a220c0d000b0b200141086a280200450d0d200128020410290c0d0b200141086a280200450d0c200141046a28020010290c0c0b200b450d0b200141086a280200450d0b200141046a28020010290c0b0b2004450d0a200141086a280200450d0a200141046a28020010290c0a0b2005450d0902402001410c6a280200220a450d00200141046a280200220d200a4104746a210b03400240200d280208220c450d00200d280200210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210a0240200d41046a280200450d00200d28020010290b200a210d200a200b470d000b0b200141086a280200450d09200128020410290c090b2006450d0802402001410c6a280200220c450d00200141046a280200210a200c41146c210c03400240200a41046a280200450d00200a28020010290b200a41146a210a200c416c6a220c0d000b0b200141086a280200450d08200128020410290c080b2007450d0702402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d07200128020410290c070b2002450d0602402001410c6a280200220a450d00200141046a280200220d200a41186c6a210b03400240200d41046a280200450d00200d28020010290b0240200d41146a280200220c450d00200d28020c210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41186a210a0240200d41106a280200450d00200d28020c10290b200a210d200a200b470d000b0b200141086a280200450d06200128020410290c060b2008450d0502402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d05200128020410290c050b2009450d040240200141046a2d0000220a41024b0d00024002400240200a0e03000102000b2001410c6a280200450d07200141086a28020010290c070b0240200141146a280200220c450d002001410c6a280200210a200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200141106a280200450d06200128020c10290c060b0240200141146a280200220a450d002001410c6a2802002204200a4104746a210503402004220b41106a21040240200b280204220a450d000240200b410c6a280200220c450d00200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200b41086a280200450d00200b28020410290b20042005470d000b0b200141106a280200450d05200128020c10290c050b2001410c6a280200450d04200141086a28020010290c040b2013450d030240200141086a280200450d00200141046a28020010290b0240200141146a280200220a450d00200141186a280200450d00200a10290b200141246a280200450d03200141206a28020010290c030b20011088030c020b410121100b2000411a3a0000024020012d0000220a410e4b0d0002400240024002400240024002400240024002400240024002400240200a0e0f0001020304050607080e090a0b0c0d000b200c450d0e200141086a280200450d0e200141046a28020010290c0e0b2007450d0d0240200141086a280200450d00200141046a28020010290b200141146a280200450d0d200141106a28020010290c0d0b200d450d0c02402001410c6a280200220c450d00200141046a280200210a200c410474210c03400240200a41046a280200450d00200a28020010290b200a41106a210a200c41706a220c0d000b0b200141086a280200450d0c200128020410290c0c0b200b450d0b02402001410c6a280200220c450d00200141046a280200210a200c41286c210c03400240200a41046a280200450d00200a28020010290b0240200a41106a280200450d00200a410c6a28020010290b200a41286a210a200c41586a220c0d000b0b200141086a280200450d0b200128020410290c0b0b2008450d0a200141086a280200450d0a200141046a28020010290c0a0b2009450d09200141086a280200450d09200141046a28020010290c090b2004450d08200141086a280200450d08200141046a28020010290c080b2005450d0702402001410c6a280200220a450d00200141046a280200220d200a4104746a210b03400240200d280208220c450d00200d280200210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210a0240200d41046a280200450d00200d28020010290b200a210d200a200b470d000b0b200141086a280200450d07200128020410290c070b2013450d0602402001410c6a280200220c450d00200141046a280200210a200c41146c210c03400240200a41046a280200450d00200a28020010290b200a41146a210a200c416c6a220c0d000b0b200141086a280200450d06200128020410290c060b2006450d0502402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d05200128020410290c050b2002450d0402402001410c6a280200220a450d00200141046a280200220d200a41186c6a210b03400240200d41046a280200450d00200d28020010290b0240200d41146a280200220c450d00200d28020c210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41186a210a0240200d41106a280200450d00200d28020c10290b200a210d200a200b470d000b0b200141086a280200450d04200128020410290c040b2011450d0302402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d03200128020410290c030b2012450d020240200141046a2d0000220a41024b0d00024002400240200a0e03000102000b2001410c6a280200450d05200141086a28020010290c050b0240200141146a280200220c450d002001410c6a280200210a200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200141106a280200450d04200128020c10290c040b0240200141146a280200220a450d002001410c6a2802002204200a4104746a210503402004220b41106a21040240200b280204220a450d000240200b410c6a280200220c450d00200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200b41086a280200450d00200b28020410290b20042005470d000b0b200141106a280200450d03200128020c10290c030b2001410c6a280200450d02200141086a28020010290c020b2010450d010240200141086a280200450d00200141046a28020010290b0240200141146a280200220a450d00200141186a280200450d00200a10290b200141246a280200450d01200141206a28020010290c010b20011088030b200341e0006a24000b13002000410136020420004198f8c2003602000b3400200041f7fbc20036020420004100360200200041146a4102360200200041106a4180fcc200360200200041086a42093702000b2f01017f02404101102722020d0041014101102a000b200042818080801037020420002002360200200241003a00000b130020004101360204200041b4fec2003602000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242b9063700000b130020004101360204200041d881c3003602000b3400200041e182c30036020420004100360200200041146a4103360200200041106a41ec82c300360200200041086a420a3702000bb00a02067f017e230041106b220324002003200136020c2003410c6a200210300240024002400240024002400240024002402001450d00200141c8006c2104200241086a2101200241046a210503400240024020002d00004101460d0002400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0c20064101742208200720072008491b22084100480d0c0240024020060d002008102721070c010b200228020020062008102821070b2007450d052002200736020020052008360200200128020021060b2001200641016a360200200720066a41003a0000200041086a29030021090240024020052802002207200128020022066b4108490d00200228020021070c010b200641086a22082006490d0c20074101742206200820082006491b22064100480d0c0240024020070d002006102721070c010b200228020020072006102821070b2007450d062002200736020020052006360200200128020021060b2001200641086a360200200720066a20093700000c010b02400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0b20064101742208200720072008491b22084100480d0b0240024020060d002008102721070c010b200228020020062008102821070b2007450d062002200736020020052008360200200128020021060b2001200641016a360200200720066a41013a00000240024020052802002207200128020022066b4120490d00200228020021070c010b200641206a22082006490d0b20074101742206200820082006491b22064100480d0b0240024020070d002006102721070c010b200228020020072006102821070b2007450d072002200736020020052006360200200128020021060b2001200641206a360200200720066a220641186a200041196a290000370000200641106a200041116a290000370000200641086a200041096a2900003700002006200041016a2900003700000240200041216a2d00004101460d0002400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0c20064101742208200720072008491b22084100480d0c0240024020060d002008102721070c010b200228020020062008102821070b2007450d092002200736020020052008360200200128020021060b2001200641016a360200200720066a41003a00000c010b02400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0b20064101742208200720072008491b22084100480d0b0240024020060d002008102721070c010b200228020020062008102821070b2007450d092002200736020020052008360200200128020021060b2001200641016a360200200720066a41013a00000240024020052802002207200128020022066b4120490d00200228020021070c010b200641206a22082006490d0b20074101742206200820082006491b22064100480d0b0240024020070d002006102721070c010b200228020020072006102821070b2007450d0a2002200736020020052006360200200128020021060b2001200641206a360200200720066a220641186a200041226a220741186a290000370000200641106a200741106a290000370000200641086a200741086a290000370000200620072900003700000b200041c8006a2100200441b87f6a22040d000b0b200341106a24000f0b20084101102a000b20064101102a000b20084101102a000b20064101102a000b20084101102a000b20084101102a000b20064101102a000b102b000bf10703037f047e067f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042005370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a00102402008a741ff01714101460d0020004100360220200324000f0b200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300024002400240411210272204450d00200441106a41002f00f6a2443b0000200441086a41002900eea244370000200441002900e6a24437000020044112413210282204450d0120042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a100020024180016a41186a200a29030037030020024180016a41106a200b29030037030020024180016a41086a200c290300370300200220022903a00137038001200241003602a00120024180016a4120200241a0016a1005210b20022802a001220a417f460d022002200a3602ec012002200b3602e801200241f0016a200241e8016a102d0240024020022802f001220c450d00200241f8016a280200210d20022802f401210e200241206a200241e8016a10940320022d00204102470d01200e450d00200c10290b418f89c3004133104e000b200241a0016a200241206a41017241c10010ce041a200241206a200241a0016a41c30010ce041a0240200a450d00200b10290b200241a0016a200241206a41c30010ce041a200241206a200241a0016a41c10010ce041a200141246a200241e0006a2d00003a00002001411c6a200241d8006a290000370000200141146a200241d0006a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200041286a200d3602002000200e3602242000200c360220200020093a001f20041029200324000f0b41124101102a000b41324101102a000b41b6b7c30041d700104e000be90703067f017e027f230041a0016b22022400200241003a00800120024180016a2001280200220320012802042204410047220510ce041a024002400240024020042005490d002001200420056b22063602042001200320056a22053602000240024002402004450d0020022d008001220441014b0d00410021030240024020040e020100010b20024180016a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a20024180016a2005200410ce041a2001200620046b22073602042001200520046a22053602002006411f4d0d01200241c0006a41086a20024180016a41086a2900002208370300200241206a41186a20024180016a41186a290000370300200241206a41106a20024180016a41106a290000370300200241206a41086a2008370300200220022900800122083703402002200837032041012103200721060b200241186a200241206a41186a290300370300200241106a200241206a41106a290300370300200241086a200241206a41086a29030037030020022002290320370300200241003a00800120024180016a20052006410047220410ce041a20062004490d042001200620046b22073602042001200520046a22043602002006450d0520022d008001220541014b0d054100210620050e020201020b200041023a00000c050b20024180016a2007412020074120491b22056a41004100412020056b2005411f4b1b10cd041a20024180016a2004200510ce041a2001200720056b3602042001200420056a3602002007411f4d0d03200241c0006a41086a20024180016a41086a2900002208370300200241206a41186a20024180016a41186a290000370300200241206a41106a20024180016a41106a290000370300200241206a41086a20083703002002200229008001220837034020022008370320410121060b200241e0006a41186a2201200241206a41186a290300370300200241e0006a41106a2204200241206a41106a290300370300200241e0006a41086a2205200241206a41086a29030037030020024180016a41086a2207200241086a29030037030020024180016a41106a2209200241106a29030037030020024180016a41186a220a200241186a290300370300200220022903203703602002200229030037038001200020033a0000200041216a20063a00002000200229038001370001200041096a2007290300370000200041116a2009290300370000200041196a200a290300370000200041226a20022903603700002000412a6a2005290300370000200041326a20042903003700002000413a6a20012903003700000c030b20052004103e000b20042006103e000b200041023a00000b200241a0016a24000ba72207017f027e077f017e017f017e107f230041d0066b22032400200241d8006a2903002104200241d0006a290300210520022802002106200341c4006a200241046a41cc0010ce041a20034190016a200341c4006a41046a41c80010ce041a2001280200210720034190036a41186a2208200341c8016a29030037030020034190036a41106a2209200341c0016a29030037030020034190036a41086a220a200341b8016a290300370300200320032903b00137039003024002400240024041c80010272202450d002002420037030020022006360220200241186a4200370300200241106a4200370300200241086a42003703002002200341b0016a220b2902003702242002412c6a200b41086a290200370200200241346a200b41106a2902003702002002413c6a200b41186a290200370200200341286a41b18ac0004116108601200341186a2003290330200341286a41106a290300427f420010d404200341086a20052004200329031842002003280228220c1b220d4201200d420156200341186a41086a2903004200200c1b220d420052200d501b220c1b200d4200200c1b10d404200341e0026a41086a200a290300370300200341e0026a41106a2009290300370300200341e0026a41186a200829030037030020032003290390033703e0022003290308210d0240024002400240200741046a28020020072802082208460d00200728020021090c010b200841016a22092008490d012008410174220a20092009200a491b220aad42d0007e2204422088a70d012004a7220c4100480d010240024020080d00200c102721090c010b2007280200200841d0006c200c102821090b2009450d0220072009360200200741046a200a360200200728020821080b2009200841d0006c6a22084200370310200842003703082008200d37030020082002360220200820032903e00237022c200841186a4200370300200841246a428180808010370200200841346a200341e0026a41086a22022903003702002008413c6a200341e0026a41106a220a290300370200200841c4006a200341e0026a41186a22082903003702002007200728020841016a3602082001280208210c200341a0026a41186a200b41186a290000370300200341a0026a41106a200b41106a290000370300200341a0026a41086a200b41086a2900003703002003200b2900003703a002024002400240200c2802002201418883c000460d00200c28020421090c010b4100210920034190036a410041e00210cd041a20034188036a220b410036020020034180036a2207420037030020084200370300200a420037030020024200370300200342003703e00241940310272201450d01200141003b010620014100360200200141086a20034190036a41e00210ce041a20014190036a200b28020036020020014188036a200729030037020020014180036a200341f8026a290300370200200141f8026a200341f0026a290300370200200141f0026a200341e0026a41086a290300370200200120032903e0023702e802200c4100360204200c20013602000b02400340200141086a2108200141066a210e20012f0106220a41057421024100210b0240024003402002450d01200341a0026a2008412010d0042207450d02200241606a2102200b41016a210b200841206a21082007417f4a0d000b200b417f6a210a0b2009450d022009417f6a21092001200a4102746a4194036a28020021010c010b0b2001200b4102746a41e8026a20063602000c060b200341d8016a41186a200341a0026a41186a2202290300220d370300200341d8016a41106a200341a0026a41106a22082903002204370300200341d8016a41086a200341a0026a41086a220b2903002205370300200320032903a002220f3703d801200c200c28020841016a3602082002200d37030020082004370300200b20053703002003200f3703a0020240024002400240200e2f01002209410b490d0020034190036a410041e00210cd041a20034188036a2202410036020020034180036a22084200370300200341e0026a41186a4200370300200341e0026a41106a4200370300200341e0026a41086a4200370300200342003703e00241940310272210450d03201041003b010620104100360200201041086a20034190036a41e00210ce04210b20104190036a200228020036020020104188036a200829030037020020104180036a200341e0026a41186a290300370200201041f8026a200341e0026a41106a290300370200201041f0026a200341e0026a41086a290300370200201020032903e0023702e802200320012f00c8013b01dc022003200141ca016a2d00003a00de02200141cb016a2800002111200141cf016a2800002112200141d3016a2800002113200141d7016a28000021142003200141e0016a2900003700cd02200320012900db013703c8022001280280032115200b200141e8016a20012f010641796a220241057410ce04210b201041e8026a20014184036a200241027410ce042107200141063b0106201020023b0106200320032f01dc023b01c402200320032d00de023a00c602200320032903c8023703e002200320032900cd023700e502200a4107490d01201041066a210e200b200a417a6a22094105746a200b200a41796a22084105746a220b200241ffff037120086b41057410cf041a200b41186a200341a0026a41186a290300370000200b41106a200341a0026a41106a290300370000200b41086a200341a0026a41086a290300370000200b20032903a002370000200720094102746a210b200720084102746a21020c020b200141086a2207200a41016a220c4105746a2007200a4105746a22072009200a6b41057410cf041a200741186a2002290300370000200741106a2008290300370000200741086a200b290300370000200720032903a002370000200141e8026a2202200c4102746a2002200a4102746a220220012f0106200a6b41027410cf041a20022006360200200120012f010641016a3b01060c080b200141086a2202200a41016a22084105746a2002200a4105746a2202200e2f0100200a6b41057410cf041a200241186a200341a0026a41186a290300370000200241106a200341a0026a41106a290300370000200241086a200341a0026a41086a290300370000200220032903a002370000200141e8026a220b200a4102746a2102200b20084102746a210b200a21080b200b2002200e2f010020086b41027410cf041a20022006360200200e200e2f010041016a3b0100200341c0026a41026a221620032d00c60222023a00002003418c026a41026a221720023a0000200320032900e50237009502200320032903e00237039002200320032f01c40222023b01c00220032003290095023700fd0120032003290390023703f801200320023b018c0220012802002209450d0520012f0104210e20034190036a41027221180340201620172d00003a0000200320032f018c023b01c002200320032903f8013703a002200320032900fd013700a502200e41ffff037121010240024002400240024020092f01062202410b490d002018410041be0310cd041a41c40310272207450d0320074100360200200741046a20034190036a41c00310ce041a200320092f00c8013b01dc022003200941ca016a2d00003a00de022003200941db016a2900003703c8022003200941e0016a2900003700cd02200941cb016a2800002119200941cf016a280000211a200941d3016a280000211b200941d7016a280000211c20094180036a280200211d200741086a200941e8016a20092f0106220841796a220241057410ce04211e200741e8026a20094184036a200241027410ce04211f20074194036a200941b0036a2008417a6a220a41027410ce042106200941063b0106200720023b01060240200a450d00410021022006210803402008280200220b20023b0104200b2007360200200841046a2108200a200241016a2202470d000b0b200320032d00de0222023a00c602200320032f01dc0222083b01c402200320032903c8023703e002200320032900cd023700e50220034190026a41026a220a20023a0000200320083b019002200320032903e00237039003200320032900e50237009503200e41ffff037122084107490d01201e2001417a6a220b4105746a201e200141796a22024105746a220820072f010620026b41057410cf041a200841186a20032900a5023700002008201436000f2008201336000b2008201236000720082011360003200841026a20162d00003a0000200820032f01c0023b0000200820032903a002370013201f200b41027422086a201f20024102746a220e20072f0106221120026b41027410cf041a200e20153602002007201141016a220e3b01062001410274221120066a416c6a200620086a2208200e41ffff03712201200b6b41027410cf041a200820103602002001200b490d02200720116a41fc026a210803402008280200220b200241016a22023b0104200b2007360200200841046a210820022001490d000c030b0b200941086a2208200141016a220b4105746a200820014105746a2208200220016b41057410cf041a200841186a20032900a5023700002008201436000f2008201336000b2008201236000720082011360003200841026a200341c0026a41026a2d00003a0000200820032f01c0023b0000200820032903a002370013200941e8026a2202200b41027422086a2002200141027422076a220220092f0106220a20016b41027410cf041a200220153602002009200a41016a22023b0106200720094194036a22016a41086a200120086a2208200241ffff03712207200b6b41027410cf041a20082010360200200e41ffff037120074f0d0b2009200b417f6a22024102746a4198036a210803402008280200220b200241016a22023b0104200b2009360200200841046a210820022007490d000c0c0b0b200941086a2202200141016a220e4105746a200220014105746a220220092f010620016b41057410cf041a200241186a20032900a5023700002002201436000f2002201336000b2002201236000720022011360003200241026a20162d00003a0000200220032f01c0023b0000200220032903a002370013200941e8026a220b200e41027422066a200b200141027422026a220b20092f0106221120016b41027410cf041a200b20153602002009201141016a220b3b0106200220094194036a22116a41086a201120066a2206200b41ffff0371220b200e6b41027410cf041a200620103602002008200b4f0d00200920026a4198036a2102034020022802002208200141016a22013b010420082009360200200241046a2102200b2001470d000b0b2017200a2d00003a0000200320032f0190023b018c0220032003290390033703f80120032003290095033700fd01200928020022020d0120192111201c2114201b2113201a211220072110201d21150c080b41c4034104102a000b20092f0104210e20192111201c2114201b2113201a211220022109201d2115200721100c000b0b4194034104102a000b4194034104102a000b102b000b200c4108102a000b41c8004108102a000b20034190036a410272410041be0310cd041a41c40310272202450d0120024100360200200241046a20034190036a41c00310ce041a2002200c280200220836029403200c2002360200200c200c28020441016a360204200841003b010420082002360200200220022f0106220b4105746a220841086a20032f018c023b00002008410a6a2003418c026a41026a2d00003a0000200841176a2014360000200841136a20133600002008410f6a20123600002008410b6a20113600002008411b6a20032903f801370000200841206a20032900fd0137000020024194036a200b41016a22084102746a20103602002002200b4102746a41e8026a2015360200200220083b0106201020083b0104201020023602000b200020034190016a41c80010ce041a200341d0066a24000f0b41c4034104102a000bcc0b03087f017e037f230041306b22022400200241186a41086a220342003703002002420037031841cdf8c4004116200241186a1004200241086a41086a20032903003703002002200229031837030820024100360218200241086a4110200241186a100521030240024002400240024002400240024020022802182204417f460d002003450d002002200436022c20022003360228200241186a200241286a102d20022802182205450d02200241206a2802002106200228021c21072004450d01200310290c010b4101210541002106410021070b200520064105746a210820052103410021060240024003400240200820036b41e0004b0d0020032008460d03034020002003460d03200620032000412010d00422044100476a21062004450d032008200341206a2203470d000c040b0b20032000460d01200620032000412010d00422044100476a21062004450d01200341206a22042000460d01200620042000412010d00422044100476a21062004450d01200341c0006a22042000460d01200620042000412010d00422044100476a21062004450d01200341e0006a22042000460d01200620042000412010d00422044100476a210620034180016a210320040d000b0b200241186a41086a220342003703002002420037031841bec7c5004119200241186a1004200241086a41086a20032903003703002002200229031837030820024100360218200241086a4110200241186a1005210002400240024020022802182203417f460d002000450d00200220003602282002200336022c20024100360218200241186a20002003410420034104491b220410ce041a2002200320046b36022c2002200020046a3602280240200341034d0d0020022802182103200241186a200241286a1045200228021822090d020b418f89c3004133104e000b410421094100210041002108410021030c010b200229021c210a20001029200a422088a72100200aa721080b02400240200320016a220420034f0d002008210b200321040c010b02400240200020064d0d002008210b0c010b02400240200820006b200641016a2000200020064d1b220c20006b220d490d002008210b0c010b2000200d6a22032000490d092008410174220b20032003200b491b220b41ffffffff0371200b470d09200b41027422034100480d090240024020080d002003102721090c010b200920084102742003102821090b2009450d050b200920004102746a210302400240200d4102490d002000417f73200c6a2100034020034100360200200341046a21032000417f6a22000d000b200c417f6a21000c010b200d450d010b20034100360200200041016a21000b200020064d0d04200920064102746a2203200328020020016a3602000b200241186a41086a220342003703002002420037031841bec7c5004119200241186a1004200241086a41086a2003290300370300200220022903183703082002410036022020024201370318410410272203450d042003200436000020024284808080c00037021c2002200336021820022000360228200241286a200241186a10300240024020000d0020022802202101200228021c2108200228021821060c010b2000410274210d4100200228022022036b2100200228021c21082009210403402004280200210c02400240200820006a4104490d00200228021821060c010b200341046a22062003490d0920084101742201200620062001491b22014100480d090240024020080d002001102721060c010b200228021820082001102821060b2006450d082002200136021c20022006360218200121080b200441046a21042002200341046a2201360220200620036a200c3600002000417c6a210020012103200d417c6a220d0d000b0b200241086a411020062001100302402008450d00200610290b200b450d00200910290b02402007450d00200510290b200241306a24000f0b418f89c3004133104e000b20034104102a000b41e4f8c400200620001037000b41044101102a000b20014101102a000b102b000bde0605017f017e047f027e017f230041d0006b2201240042002102200141286a41086a220342003703002001420037032841aa8dc300410d200141286a1004200141186a41086a2003290300370300200120012903283703184100210320014100360228200141186a4110200141286a100521040240024002400240024020012802282205417f460d002001200536020c20012004360208200141286a200141086a104320012802282206450d02200129022c210202402005450d00200410290b2002422088a721032002a721050c010b41042106410021050b200141286a41206a200041206a280200360200200141286a41186a200041186a290200370300200141286a41106a200041106a290200370300200141286a41086a200041086a29020037030020012000290200370328024020032005470d00024020032002a7470d00200341016a22002003490d0420034101742205200020002005491bad220742247e2208422088a70d042008a722004100480d040240024020030d002000102721060c010b2006200341246c2000102821060b2006450d0320024280808080708320078421020b2002422088a721030b2006200341246c22096a22002001290328370200200041206a200141286a41206a280200360200200041186a200141286a41186a290300370200200041106a200141286a41106a290300370200200041086a200141286a41086a22002903003702002001200242ffffffff0f83200341016a2205ad4220868437020c20012006360208200042003703002001420037032841aa8dc300410d200141286a1004200141186a41086a2000290300370300200120012903283703182001411036022c2001200141186a360228200141086a200141286a105c2002a72104024020052003490d00200941246a21002006210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a28020010290c030b2003410c6a280200450d02200341086a28020010290c020b2003410c6a280200450d01200341086a28020010290c010b200341086a280200450d00200341046a28020010290b200341246a21032000415c6a22000d000b0b02402004450d00200610290b200141d0006a24000f0b418f89c3004133104e000b20004104102a000b102b000bd20601077f230041106b22022400024002400240024002400240024020002802704101460d0002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0720034101742205200420042005491b22054100480d070240024020030d002005102721040c010b200128020020032005102821040b2004450d0320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280274210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d0720044101742203200520052003491b22034100480d070240024020040d002003102721040c010b200128020020042003102821040b2004450d0420012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0620034101742205200420042005491b22054100480d060240024020030d002005102721040c010b200128020020032005102821040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b20002001109d0220002802782103200220004180016a280200220036020c2002410c6a2001103002402000450d0020004105742106200141086a2105200141046a210703400240024020072802002204200528020022006b4120490d00200128020021040c010b200041206a22082000490d0720044101742200200820082000491b22004100480d070240024020040d002000102721040c010b200128020020042000102821040b2004450d062001200436020020072000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b20054101102a000b20034101102a000b20054101102a000b20004101102a000b102b000be70101017f024020002d0000417b6a220141064b0d00024002400240024020010e0700040401020403000b200041086a2d00004101470d03200041146a280200450d03200041106a28020010290c030b200041046a2d00004103470d0202402000410c6a280200450d00200041086a28020010290b200041186a280200450d02200041146a28020010290c020b200041046a2802000d012000410c6a280200450d01200041086a28020010290c010b200041086a2d00004105490d00200041306a280200450d002000412c6a28020010290b0240200041fc006a280200450d00200028027810290b0b130020004106360204200041f890c3003602000b34002000418d97c30036020420004100360200200041146a410f360200200041106a419497c300360200200041086a42063702000b950101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102722060d0041204101102a000b20062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000b7401027f230041106b22022400200241003602082002420137030002404101102722030d0041014101102a000b200341003a00002002428180808010370204200220033602002002410036020c2002410c6a20021030200041086a200228020836020020002002290300370200200241106a24000b130020004100360204200041b8d6c5003602000b980104037f017e017f017e230041106b220224002002410036020c200141102002410c6a10052103024002400240200228020c2204417f470d00420021050c010b20024200370300200220032004410820044108491b10ce042106200441074d0d01200629030021072003102920014110100c420121050b2000200537030020002007370308200241106a24000f0b418f89c3004133104e000b0a0041c88ac3001058000b0a0041b88bc3001058000bf30c020b7f067e23004180016b22082400024002400240024002400240200728021c41016a220941004c0d002007411c6a210a2007200936021c200741246a280200210b200741206a220c210d024002400340200d280200220e41086a210f200e2f01062210410574210d41002111024002400340200d450d012004200f412010d0042212450d02200d41606a210d201141016a2111200f41206a210f2012417f4a0d000b2011417f6a21100b200b450d02200b417f6a210b200e20104102746a41880b6a210d0c010b0b200e201141e0006c6a220d41e8026a280200450d00200d41f8026a2903002113200d41f0026a29030021140c010b200841286a2007412c6a2802002004200741306a28020028021c110200200841306a2903002113200728021c2109200829032821140b20072009417f6a36021c200141186a29030021152007280250210d20012903102116024002400240024041004101410220142013842217501b20021b0e03010200010b200d41a8016a210d0c020b200d4188016a210d0c010b200d4198016a210d0b20162015844200510d01200841186a200d290300200d41086a2903002016201510d40420014200200129030822152008290318427f200841186a41086a290300501b7d22162016201556220d1b3703080240200d450d0041c6b5c300210d4122210f0c060b200a28020041016a220141004c0d022007200136021c2007280224210b024002400340200c280200220e41086a210f200e2f01062210410574210d41002111024002400340200d450d012003200f412010d0042212450d02200d41606a210d201141016a2111200f41206a210f2012417f4a0d000b2011417f6a21100b200b450d02200b417f6a210b200e20104102746a41880b6a210c0c010b0b200e201141e0006c6a220d41e8026a280200450d00200d41f8026a2903002115200d41f0026a29030021160c010b200841086a2007412c6a2802002003200741306a28020028021c110200200841106a2903002115200728021c2101200829030821160b200a2001417f6a3602000240201620057d2218201656201520067d2016200554ad7d221620155620162015511b4101470d0041e8b5c300210d411d210f0c060b024020174200520d002007280250220d290378200556200d4180016a290300221520065620152006511b450d004185b6c300210d411f210f0c060b2008200341022018201610910102402008280200220d450d002008280204210f0c060b0240201420057c2217201454220d201320067c200dad7c221520135420152013511b450d0041a4b6c300210d412d210f0c060b4100210d024020032004470d000c060b024020032004412010d0040d000c060b200a20032018201610f401200a20042017201510f401200841e0006a41086a200341086a290000370300200841e0006a41106a200341106a290000370300200841e0006a41186a200341186a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a290000370300200820032900003703602008200429000037034002400240200741c0006a280200220f2007413c6a280200460d00200728023821110c010b200f41016a220d200f490d05200f4101742211200d200d2011491b220dad42e8007e2215422088a70d052015a722124100480d0502400240200f0d002012102721110c010b2007280238200f41e8006c2012102821110b2011450d04200720113602382007413c6a200d3602002007280240210f0b4100210d2011200f41e8006c6a220f41003a0000200f2008290360370001200f41096a200841e0006a41086a290300370000200f41116a200841e0006a41106a290300370000200f41196a200841e0006a41186a290300370000200f41216a2008290340370000200f41296a200841c0006a41086a290300370000200f41316a200841c0006a41106a290300370000200f41396a200841c0006a41186a290300370000200f41c4006a2008413c6a280000360000200f41c1006a2008280039360000200f41e0006a4100360200200f4201370358200f41d0006a2006370300200f41c8006a20053703002007200728024041016a3602400c050b41d8a8c1004118200841e0006a4180a9c10010a201000b41fcecc2001058000b41d8a8c1004118200841e0006a4180a9c10010a201000b20124108102a000b102b000b2000200f3602042000200d36020020084180016a24000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a28020022040d00200321000c010b2004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000b0b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10d901200141306a24000b85e3010b047f017e037f017e097f017e037f097e027f0a7e2e7f230041c0176b2202240041d7c7c5004113108a02210302400240024002400240024002402001417f6a2204410670450d002003200341ff017141024771450d010b200241f80b6a41086a22034200370300200242003703f80b41abccc1004112200241f80b6a100420024198106a41086a2003290300370300200220022903f80b37039810200241003602b80d20024198106a4110200241b80d6a100521030240024002400240024020022802b80d2201417f460d002003450d00200220013602b40b200220033602b00b200241b80d6a200241b00b6a102d20022802b80d2205450d0220022902bc0d21062001450d01200310290c010b41012105420021060b410021070240024002402006422088a7220141057422030d0041082108410021090c010b20034105752209ad42d0007e220a422088a70d09200aa7220b4100480d09200b10272208450d010b2006a7210c0240200520036a2005460d002001410574210b20024198106a41206a2103410021072008210d200521010340200241b00b6a41086a220e200141086a290000370300200241b00b6a41106a220f200141106a290000370300200241b00b6a41186a2210200141186a290000370300200220012900003703b00b200241b80d6a200241b00b6a104d20024198106a41186a201029030037030020024198106a41106a200f29030037030020024198106a41086a200e290300370300200320022903b80d370300200341086a200241b80d6a41086a290300370300200341106a200241b80d6a41106a290300370300200341186a200241b80d6a41186a290300370300200341206a200241b80d6a41206a290300370300200341286a200241b80d6a41286a290300370300200220022903b00b37039810200741016a2107200d20024198106a41d00010ce0441d0006a210d200141206a2101200b41606a220b0d000b0b0240200c450d00200510290b200241f80b6a41086a22034200370300200242003703f80b41bec7c5004119200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a100521030240024002402002280298102201417f460d002003450d00200220033602b00b200220013602b40b200241003602981020024198106a20032001410420014104491b220b10ce041a20022001200b6b3602b40b20022003200b6a3602b00b0240200141034d0d00200228029810210f20024198106a200241b00b6a104520022802981022110d020b418f89c3004133104e000b410421114100210e410021124100210f0c010b200229029c10210620031029200241b80d6a4110100c2006422088a7210e2006a721120b200241800a6a41ceecc200410d10940120022903880a210620022802800a2103200241f0096a41cfa2c400411710940120022903f809210a20022802f0092101200241f80b6a41086a220c4200370300200242003703f80b41cfa2c4004117200241f80b6a1004200241b80d6a41086a2213200c290300370300200220022903f80b3703b80d20022006420020031b220637039810200241b80d6a411020024198106a4108100302402006200a420020011b7d221450450d00410021150c040b200c4200370300200242003703f80b41cdf8c4004116200241f80b6a10042013200c290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a100521030240024002402002280298102201417f460d002003450d00200220013602b40b200220033602b00b20024198106a200241b00b6a102d2002280298102216450d02200241a0106a280200210d200228029c1021172001450d01200310290c010b410121164100210d410021170b200241d8096a41c8f9c4004111108601200241d8096a41106a290300211820022903e009211920022802d8092103200241c0096a41b18ac0004116108601200241b0096a20022903c809420020022802c00922011b221a200241c0096a41106a290300420020011b428094ebdc03420010d404200241a0096a20022903b0092206200241b0096a41086a290300220a4280ec94a37c427f10d30420024190096a2019420020031b2018420020031b200dad420010d304201442ffffffff0f8342ffffffff0f2014428080808010541b211b20022903a009201a7c211420024190096a41086a290300211c4100210b41d0dec1002101200229039009211d02400240034002404190e1c100200122036b41304b0d0020034190e1c100460d03200220032802002201360298102002418094ebdc0336029c1020024180096a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d3042002290380092219201820147e428094ebdc038042ffffffff0f837c2218201d5a20024180096a41086a2903002018201954ad7c2218201c5a2018201c511b0d03200241f0086a41086a21100c020b200220032802002201360298102002418094ebdc0336029c10200241e0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d30420022903e0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a200241e0086a41086a2903002018201954ad7c2218201c5a2018201c511b0d02200220032802102201360298102002418094ebdc0336029c10200241d0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d304024020022903d0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a200241d0086a41086a2903002018201954ad7c2218201c5a2018201c511b450d002003210b0c030b200220032802202201360298102002418094ebdc0336029c10200241c0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d304024020022903c0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a200241c0086a41086a2903002018201954ad7c2218201c5a2018201c511b450d00200341106a210b0c030b200220032802302201360298102002418094ebdc0336029c10200241b0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d304200341c0006a2101200341306a210b20022903b0082219201820147e428094ebdc038042ffffffff0f837c2218201d54200241b0086a41086a2903002018201954ad7c2218201c542018201c511b0d000b200341206a210b0c010b03404180e1c1002003220b460d01200b41106a21032002200b41106a2802002201360298102002418094ebdc0336029c10200241f0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d30420022903f0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a20102903002018201954ad7c2218201c5a2018201c511b450d000b0b4200211e20024190086a201d201c428094ebdc03420010d40420024180086a200229039008221920024190086a41086a290300221a4280ec94a37c427f10d304200b41d0dec100200b1b2203410c6a2d00002101200341046a280200210b200341086a28020021032002418094ebdc0336029c10200220033602981020024198106a2003418094ebdc034b4102746a35020021182002418094ebdc0336029c102002200b36029810200241f0076a2019201a20024198106a200b418094ebdc034b4102746a350200221f420010d304200241a0086a2006200a2018420010d304200241e0076a420020022903a008220a201820147e428094ebdc038042ffffffff0f837c220620022903f0072218201f200229038008201d7c7e428094ebdc038042ffffffff0f837c22147d22192019200656200241a0086a41086a2903002006200a54ad7c220a200241f0076a41086a2903002014201854ad7c22197d2006201454ad7d2218200a562018200a511b22031b427f200620147c22142014200654220b200a20197c200bad7c2206200a542006200a511b220b1b20011b4200201820031b427f2006200b1b20011b201b420010d304200241d0076a20022903e007200241e0076a41086a29030042e08f860f420010d4040240200d41057422030d00420021200c040b2011200e4102746a2121201620036a2122200241d0076a41086a290300212320022903d0072124200fad21252011210e4200211e420021202016210d024002400340200e2021460d0602400240200e2802002203450d00024002400240024002400240200f450d00200241c0076a202420232025420010d404200241b0076a20022903c0072206200241c0076a41086a290300220a2025420010d304200241a0076a2006200a200f20032003200f4b1bad2214420010d304202420022903b0077d20147e202580210620022903a0072114200241a0076a41086a290300211a411210272203450d01200341106a41002f0088a3443b0000200341086a4100290080a344370000200341002900f8a24437000020034112413210282203450d022003200d2900003700122003412a6a200d41186a290000370000200341226a200d41106a2900003700002003411a6a200d41086a290000370000200241c00a6a41186a22014200370300200241c00a6a41106a220b4200370300200241c00a6a41086a22104200370300200242003703c00a20034132200241c00a6a1000200241b80d6a41186a2001290300370300200241b80d6a41106a200b290300370300200241b80d6a41086a22052010290300370300200220022903c00a3703b80d2002410036029810200241b80d6a412020024198106a10052101200228029810220b417f460d042001450d042002200b36029c10200220013602981020024198076a20024198106a102e200228029807450d0320024180076a20024198106a1053200229038007a7450d0320024180076a41106a290300210a2002290388072119200b450d05200110290c050b41dcf9c4001058000b41124101102a000b41324101102a000b418f89c3004133104e000b420021194200210a0b2003102942002118200242003703c00d200242003703b80d024002402014200642ffffffff0f837c2206201920062019200654200a201a2006201454ad7c221454200a2014511b22031b22267d22272014200a201420031b22287d2006202654ad7d22298450450d00420021060c010b20024198106a200d104d20024198106a41086a29030022064200200229039810220a42015620064200522006501b22031b2106200a420120031b210a20022802b81021100240024020022802c01022030d00200241f8056a200a2006428094ebdc03420010d404200241f8056a41086a290300212a20022903f805212b0c010b2010200341306c6a210b200241f0066a200a2006428094ebdc03420010d404200241d0066a20272029428094ebdc03420010d404200241e0066a20272029428094ebdc03420010d504200241f0066a41086a290300222a420020022903f006222b420156202a420052202a501b22031b2118202b420120031b2119200241d0066a41086a290300211b20022903d006211f20022903e006212c201021030340200241c0066a200a200329030022142014200a56200341086a290300221420065620142006511b22011b2006201420011b2019201810d40420022903c006221a428080808010544100200241c0066a41086a290300501b450d04200241b0066a200a20062019201810d40420022903b0062214428080808010544100200241b0066a41086a290300501b450d0602402014a7450d0020024188066a201f201b201a42ffffffff0f83428094ebdc037e201442ffffffff0f838042ffffffff0f832214420010d30420024198066a200341106a200229038806221a2014202c7e428094ebdc038042ffffffff0f837c221420024188066a41086a2903002014201a54ad7c10d603200241b80d6a20022903980620022903a00620024198066a41106a29030010eb01200341306a2203200b460d020c010b0b41c489c3001058000b200241e8056a200a20022903a81022142014200a5620024198106a41186a290300221420065620142006511b22031b2006201420031b202b4201202b420156202a420052202a501b22031b2214202a420020031b221810d40420022903e8052219428080808010544100200241e8056a41086a290300501b450d02200241d8056a200a20062014201810d40420022903d8052206428080808010544100200241d8056a41086a290300501b450d042006a7450d05200241c8056a20272029428094ebdc03420010d404200241b8056a20022903c805220a200241c8056a41086a29030022144280ec94a37c427f10d304200241a8056a200a2014201942ffffffff0f83428094ebdc037e200642ffffffff0f838042ffffffff0f832206420010d30420022903a805220a2006202720022903b8057c7e428094ebdc038042ffffffff0f837c2218200a54ad2106200241a8056a41086a290300210a024020022802bc10450d00201010290b200a20067c21060b20024190056a200d201820267c220a200620287c200a201854ad7c10d603200241b80d6a20022903900520022903980520024190056a41106a29030010eb01427f202020052903007c201e20022903b80d7c220a201e542203ad7c22062003200620205420062020511b22031b2120427f200a20031b211e0b200e41046a210e200d41206a220d2022470d010c070b0b10a003000b10a103000b41c489c3001058000b418f89c3004133104e000b200b4108102a000b418f89c3004133104e000b02402012450d00201110290b200241b0106a202037030020024198106a41106a201e37030020024198106a41086a41003a0000200241033a00981041b8d6c500410020024198106a108801200241f8046a41b18ac0004116108601200241f8046a41106a2903002106200229038005210a20022802f8042103200241f80b6a41086a22014200370300200242003703f80b41b18ac0004116200241f80b6a1004200241b80d6a41086a2001290300370300200220022903f80b3703b80d2002427f2006420020031b220620207c200a420020031b220a201e7c2214200a542203ad7c220a2003200a200654200a2006511b22031b3703a0102002427f201420031b37039810200241b80d6a411020024198106a411010030240201e202084500d00201d201c84500d0042002106200241b00b6a41086a22034200370300200242003703b00b41b18ac0004116200241b00b6a1004200241b80d6a41086a2003290300370300200220022903b00b3703b80d2002410036029810200241b80d6a411020024198106a100521030240024002400240024002402002280298102201417f470d00420021064200210a0c010b024020030d004200210a0c010b200242003703a010200242003703981020024198106a20032001411020014110491b10ce041a2001410f4d0d01200241a0106a290300210a2002290398102106200310290b2006201d7d2214200656200a201c7d2006201d54ad7d2206200a562006200a511b0d04200241e8046a20142006201d201c10d404200241b8046a200241e8046a41086a29030022064200201e420010d304200241c8046a2020420020022903e804220a420010d304200241d8046a200a4200201e420010d304200642005220204200527120022903c0044200527220022903d00442005272200241d8046a41086a290300220620022903b80420022903c8047c7c2214200654720d0420022903d8042118200241b00b6a41086a22034200370300200242003703b00b41b18ac0004116200241b00b6a1004200241b80d6a41086a2003290300370300200220022903b00b3703b80d2002410036029810200241b80d6a411020024198106a100521032002280298102201417f460d022003450d02200242003703a010200242003703981020024198106a20032001411020014110491b10ce041a2001410f4d0d01200241a0106a290300210a2002290398102106200310290c030b418f89c3004133104e000b418f89c3004133104e000b420021064200210a0b200241b00b6a41086a22014200370300200242003703b00b41b18ac0004116200241b00b6a1004200241b80d6a41086a220b2001290300370300200220022903b00b3703b80d2002427f200a20147c200620187c221a2006542203ad7c221920032019200a542019200a511b22031b3703a0102002427f201a20031b37039810200241b80d6a411020024198106a4110100320024198106a109701200241a8046a20024198106a2006427f85201820031b2206200a427f85201420031b2214108301200241a8046a41086a290300211820022903a804210a20024190046a41b18ac00041161086012006200a7d200a20067d200a2006582018201458201820145122031b220d1b211b201420187d2006200a54ad7d201820147d200a200654ad7d200d1b211f20024190046a41106a2903004200200228029004220d1b21192002290398044200200d1b211a02400240200a200656201820145620031b0d00200b4200370300200242003703b80d41b18ac0004116200241b80d6a10042001200b290300370300200220022903b80d3703b00b200242002019201f7d201a201b54ad7d2206201a201b7d220a201a56200620195620062019511b22031b3703c00d20024200200a20031b3703b80d200241b80d6a21030c010b200241f80b6a41086a22034200370300200242003703f80b41b18ac0004116200241f80b6a100420012003290300370300200220022903f80b3703b00b2002427f2019201f7c201a201b7c220a201a542203ad7c22062003200620195420062019511b22031b3703c00d2002427f200a20031b3703b80d200241b80d6a21030b200241b00b6a41102003411010030b410121152017450d00201610290b20024188046a4189c7c500411210b5012002280288042103200228028c042101200c4200370300200242003703f80b4189c7c5004112200241f80b6a10042013200c290300370300200220022903f80b3703b80d2002200141016a410120031b221636029810200241b80d6a411020024198106a4104100320024180046a419bc7c500412310b501200c4200370300200242003703f80b419bc7c5004123200241f80b6a10042013200c290300370300200220022903f80b3703b80d2002200436029810200241b80d6a411020024198106a41041003024002400240024002400240024002400240024002400240024002400240201641a105490d00200241f80b6a41086a22034200370300200242003703f80b41eac7c5004112200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a1005212d024002400240024002400240200228029810222e417f460d00202d450d002002202e36029c102002202d36029810200241f8036a20024198106a102e20022802f803450d1a024002400240024020022802fc0322224180042022418004491b220c0d00410421050c010b200c410374220310272205450d010b02402022450d00200228029810210e200228029c1021014100210f4100210d4100210b0340200241003602b00b200241b00b6a200e20014104200141044922211b221010ce041a2002200120106b220336029c102002200e20106a220e360298100240024020210d0020022802b00b2121200241003602b00b200241b00b6a200e2003410420034104491b221010ce041a2002200320106b220136029c102002200e20106a220e36029810200341034b0d010b200c450d1f200510290c1f0b200b41016a210320022802b00b21100240200b200c470d00200f20032003200f491b220c41ffffffff0171200c470d1e200c41037422134100480d1e02400240200b0d002013102721050c010b2005200d2013102821050b2005450d040b2005200d6a220b2021360200200b41046a2010360200200f41026a210f200d41086a210d2003210b20222003470d000b0b2005450d1c2022ad422086200cad842206422088a721032006a721170240202e450d00202d10290b20172003470d040c030b20034104102a000b20134104102a000b41042105410021170b2017220341016a22012003490d172003410174220b20012001200b491b221741ffffffff01712017470d17201741037422014100480d170240024020030d002001102721050c010b200520034103742001102821050b2005450d010b201641e07a6a2101200520034103746a220b2004360204200b20163602002005200341016a220f4103746a210d410021030240200f41044f0d002005210b0c020b2005210e02400340200e220b28020020014f0d040240200b41086a2802002001490d00200341016a21030c050b0240200b41106a2802002001490d00200341026a21030c050b200b41186a28020020014f0d01200341046a2103200d200b41206a220e6b41184b0d000b200b41206a210b0c020b200341036a21030c020b20014104102a000b200b200d460d000340200b28020020014f0d01200341016a2103200d200b41086a220b470d000b0b024002400240024002400240200f2003490d0041002101200f20036b2210450d0502402003450d002005200520034103746a201041037410cf041a0b2005280204210c200241f80b6a41086a22034200370300200242003703f80b419fcac5004113200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d20024198106a200241b80d6a411010bb0102402002280298104101470d00024020024198106a41086a2802002221200c2021200c491b220f200228029c1022014f0d002001210f0c050b02402001200f4f0d000340411a10272203450d04200341186a41002f00e8b3433b0000200341106a41002900e0b343370000200341086a41002900d8b343370000200341002900d0b3433700002003411a413410282203450d052003200136001a200241c00a6a41186a220b4200370300200241c00a6a41106a220d4200370300200241c00a6a41086a220e4200370300200242003703c00a2003411e200241c00a6a1000200241e00a6a41186a200b290300370300200241e00a6a41106a200d290300370300200241e00a6a41086a200e290300370300200220022903c00a3703e00a200241e00a6a4120100c20031029200141016a22032101200f2003470d000b0b2021200c4b0d040b200241f80b6a41086a22034200370300200242003703f80b419fcac5004113200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d200241b80d6a4110100c0c040b419cb1c5001058000b411a4101102a000b41344101102a000b200241f80b6a41086a22034200370300200242003703f80b419fcac5004113200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d410410272203450d032003200f36000020034104410810282203450d0420032021360004200241b80d6a4110200341081003200310290b201021010b200241f80b6a41086a22034200370300200242003703f80b41eac7c5004112200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d200241003602a0102002420137039810200220013602b00b200241b00b6a20024198106a10300240024020010d0020022802a0102103200228029c10210b20022802981021010c010b200520014103746a2113410020022802a010220f6b210d200228029c10210b410021030340200f20036a210e200520036a2210280200210c02400240200b200d6a4104490d0020022802981021010c010b200e41046a2201200e490d16200b4101742221200120012021491b22214100480d1602400240200b0d002021102721010c010b200228029810200b2021102821010b2001450d062002202136029c1020022001360298102021210b0b2002200e41046a22213602a0102001200f6a20036a200c360000201041046a280200210c0240200b200d6a417c6a41034b0d00202141046a22222021490d16200b4101742221202220222021491b22214100480d1602400240200b0d002021102721010c010b2001200b2021102821010b2001450d072002202136029c1020022001360298102021210b0b2002200e41086a3602a0102001200f6a20036a41046a200c360000200d41786a210d200341086a2103201041086a2013470d000b200f20036a21030b200241b80d6a41102001200310030240200b450d00200110290b2017450d00200510290b200241f0036a41bdc6c500411610b50120022802f403212f20022802f0032130200241e8036a41d3c6c500411d10b50120022802ec03213120022802e8032132200241c00a6a41186a22034200370300200241c00a6a41106a22014200370300200241c00a6a41086a220b4200370300200242003703c00a41b3a4c400411a200241c00a6a1000200241b80d6a41186a2003290300370300200241b80d6a41106a2001290300370300200241b80d6a41086a200b290300370300200220022903c00a3703b80d2002410036029810200241b80d6a412020024198106a1005210302400240200228029810220b417f470d00410021010c010b410021012003450d00200241c00a6a200b4120200b4120491b22016a41004100412020016b2001411f4b1b10cd041a200241c00a6a2003200110ce041a200b411f4d0d05200241e00a6a41186a2201200241c00a6a41186a290300370300200241e00a6a41106a220b200241c00a6a41106a290300370300200241e00a6a41086a220d200241c00a6a41086a290300370300200220022903c00a3703e00a2003102920024198106a41186a200129030037030020024198106a41106a200b29030037030020024198106a41086a200d290300370300200220022903e00a37039810410121010b412810272203450d05200320013a0004200341b8d6c5003602002003200229039810370005200320022f00b00b3b00252003410d6a20024198106a41086a290300370000200341156a20024198106a41106a2903003700002003411d6a20024198106a41186a290300370000200341276a200241b20b6a2d00003a0000200241c00a6a41186a22014200370300200241c00a6a41106a220b4200370300200241c00a6a41086a220d4200370300200242003703c00a41c6a3c400411a200241c00a6a1000200241b80d6a41186a2001290300370300200241b80d6a41106a200b290300370300200241b80d6a41086a200d290300370300200220022903c00a3703b80d4100210b2002410036029810200241b80d6a412020024198106a100521010240200228029810220d417f460d002001450d00200241c00a6a200d4120200d4120491b220b6a410041004120200b6b200b411f4b1b10cd041a200241c00a6a2001200b10ce041a200d411f4d0d07200241e00a6a41186a220b200241c00a6a41186a290300370300200241e00a6a41106a220d200241c00a6a41106a290300370300200241e00a6a41086a220e200241c00a6a41086a290300370300200220022903c00a3703e00a2001102920024198106a41186a200b29030037030020024198106a41106a200d29030037030020024198106a41086a200e290300370300200220022903e00a370398104101210b0b412810272233450d072033200b3a0004203341b8d6c5003602002033200229039810370005203320022f00b00b3b00252033410d6a20024198106a41086a2201290300370000203341156a20024198106a41106a220b2903003700002033411d6a20024198106a41186a220d290300370000203341276a200241b00b6a41026a2d00003a00002002420037028c0d2002418883c0003602880d200241003602a80d200242083703a00d200241b80c6a411c6a200241880d6a360200200241b80c6a41186a200241b00d6a360200200241003602c80c200241f4f9c4003602bc0c200220033602b80c2002200241a00d6a3602cc0c2002200241b00d6a3602c40c2002200241b00d6a3602c00c20024198106a200241b80c6a108b0202400240024020022d00d810220e4102470d00200241023a00f80d0c010b200241f80b6a41386a220f20024198106a41386a290300370300200241f80b6a41306a221020024198106a41306a290300370300200241f80b6a41286a220520024198106a41286a290300370300200241f80b6a41206a220c20024198106a41206a290300370300200241f80b6a41186a2221200d290300370300200241f80b6a41106a220d200b290300370300200241f80b6a41086a220b2001290300370300200241e00a6a41086a2201200241e1106a2222290000370300200241ef0a6a2213200241e8106a29000037000020022002290398103703f80b200220022900d9103703e00a200241d4106a200f290300370200200241cc106a2010290300370200200241c4106a2005290300370200200241bc106a200c29030037020020024198106a411c6a202129030037020020024198106a41146a200d290300370200200241a4106a200b290300370200200241013602c80c200220022903f80b37029c10200241b00b6a20024198106a41c40010ce041a200241003602981020024198106a410472200241b00b6a41c40010ce041a20024198106a41c8006a200e3a0000202220022903e00a370000200241e9106a2001290300370000200241f0106a2013290000370000200241b80d6a200241b80c6a41146a20024198106a10950320022d00f80d4102470d010b20031029410821344100213541082105410821174100210c0c0e0b20024198106a200310d70341c80010272234450d082034200241b80d6a41c80010ce041a200241d80c6a41186a200241b80c6a41186a290300370300200241d80c6a41106a200241b80c6a41106a290300370300200241d80c6a41086a200241b80c6a41086a290300370300200220022903b80c3703d80c20024198106a200241d80c6a108b02024020022d00d81022054102470d004101210c410121350c0c0b20024198106a41046a2103200241e1106a210d20024198106a410472212e200241ec0c6a2136200241d9106a210e20022802e80c21374102210f41c800210b410021014101213502400340200241f80b6a41386a221020024198106a41386a290300370300200241f80b6a41306a220c20024198106a41306a290300370300200241f80b6a41286a222120024198106a41286a290300370300200241f80b6a41206a222220024198106a41206a290300370300200241f80b6a41186a221320024198106a41186a290300370300200241f80b6a41106a220420024198106a41106a290300370300200241f80b6a41086a221620024198106a41086a290300370300200241e00a6a41086a2217200e41086a290000370300200241e00a6a410f6a222d200e410f6a29000037000020022002290398103703f80b2002200e2900003703e00a200341386a2010290300370200200341306a200c290300370200200341286a2021290300370200200341206a2022290300370200200341186a2013290300370200200341106a2004290300370200200341086a2016290300370200200320022903f80b3702002002203720016a221041016a3602e80c200241b00b6a20024198106a41c40010ce041a2002201036029810202e200241b00b6a41c40010ce041a200d20022903e00a370000200d41086a2017290300370000200d410f6a202d290000370000200220053a00e010200241b80d6a203620024198106a10950320022d00f80d4102460d0120024198106a200241b80d6a41c80010ce041a0240200141016a22102035470d00200241b00b6a20022802d80c20022802dc0c280210110000201041016a22052010490d15200f20052005200f491b2235ad42c8007e2206422088a70d152006a722054100480d15024002402001417f470d002005102721340c010b2034200b2005102821340b2034450d0c0b2034200b6a20024198106a41c80010ce041a200f41026a210f200b41c8006a210b20024198106a200241d80c6a108b022010210120022d00d81022054102460d0c0c000b0b200141016a210c203421050c0c0b41044101102a000b41084101102a000b20214101102a000b20214101102a000b418f89c3004133104e000b41284104102a000b418f89c3004133104e000b41284104102a000b41c8004108102a000b20054108102a000b201041016a210c0b20342105200241023a00f80d0b20022802d80c220120022802dc0c220328020011010002402003280204450d00200110290b200521170b200241b80d6a2033109303024002400240024020022802d80d222e450d00200241b00b6a41017221360240024002400240034020022802e00d211320022802dc0d2137200241d80c6a41186a2238200241b80d6a41186a290300370300200241d80c6a41106a2239200241b80d6a41106a290300370300200241d80c6a41086a223a200241b80d6a41086a290300370300200220022903b80d3703d80c200241b00b6a200241d80c6a108c02024002400240024020022d00b00b4101460d00200241003602b8100c010b200241f80b6a41186a203641186a290000370300200241f80b6a41106a203641106a290000370300200241f80b6a41086a203641086a290000370300200220362900003703f80b20024198106a200241f80b6a108d0220022802b81022030d010b420021194200211a0c010b20024198106a41086a290300211a200229039810211920022802bc10450d00200310290b2013ad42c8007e2206422088a70d062006a72203417f4c0d0602400240024020030d00410821160c010b200310272216450d010b02400240201341057422030d00410021220c010b202e20036a212d41002122202e210403402004220e41206a2104200241880d6a2103200228028c0d2110024003402003280200220f41086a2101200f2f0106222141057421034100210b0240024003402003450d01200e2001412010d004220d450d02200341606a2103200b41016a210b200141206a2101200d417f4a0d000b200b417f6a21210b2010450d022010417f6a2110200f20214102746a4194036a21030c010b0b200c200f200b4102746a41e8026a220328020022014d0d052005200141c8006c6a22012903102106200141186a290300210a200241d0036a41b18ac0004116108601200241c0036a20022903d803200241d0036a41106a290300427f420010d404200c200328020022014d0d06200241b0036a2019201a20022903c003420020022802d003220b1b221442012014420156200241c0036a41086a2903004200200b1b22144200522014501b220b1b20144200200b1b10d4042005200141c8006c6a220141186a427f200a200620022903b0037c2214200654220bad7c2218200b2018200a54201420065a1b220b1b3703002001427f2014200b1b370310200241e00a6a41186a2201200e41186a290000370300200241e00a6a41106a220b200e41106a290000370300200241e00a6a41086a220d200e41086a2900003703002002200e2900003703e00a2003280200210e024020132022470d00201341016a22032013490d122013410174220f20032003200f491b2203ad42c8007e2206422088a70d122006a7220f4100480d120240024020130d00200f102721160c010b2016201341c8006c200f102821160b2016450d08200321130b2016202241c8006c6a220342003703002003200e360220200341186a4200370300200341106a4200370300200341086a4200370300200320022903e00a3702242003412c6a200d290300370200200341346a200b2903003702002003413c6a2001290300370200202241016a21220b2004202d470d000b0b200241c00a6a41186a22032038290300370300200241c00a6a41106a22012039290300370300200241c00a6a41086a220b203a290300370300200220022903d80c3703c00a20024198036a41b18ac000411610860120024188036a20022903a00320024198036a41106a290300427f420010d404200241f8026a2019201a2002290388034200200228029803220d1b22064201200642015620024188036a41086a2903004200200d1b22064200522006501b220d1b20064200200d1b10d404200241b80c6a41086a220d200b290300370300200241b80c6a41106a220b2001290300370300200241b80c6a41186a22012003290300370300200220022903c00a3703b80c20022903f802210602402037450d00202e10290b2016450d0620024198106a41186a220e200129030037030020024198106a41106a220f200b29030037030020024198106a41086a220b200d290300370300200220022903b80c37039810024020022802a80d220120022802a40d470d00200241b80d6a203310d70320022802a40d220320022802a80d220d6b417f20022802b80d221041016a222120212010491b22104f0d00200d20106a2210200d490d0f2003410174220d20102010200d491b220dad42d0007e220a422088a70d0f200aa722104100480d0f0240024020030d002010102721030c010b20022802a00d200341d0006c2010102821030b2003450d062002200d3602a40d200220033602a00d0b20022802a00d200141d0006c6a22032016360220200320022903981037022c200341286a2022360200200341246a2013360200200342003703102003420037030820032006370300200341186a4200370300200341346a200b2903003702002003413c6a200f290300370200200341c4006a200e2903003702002002200141016a3602a80d200241b80d6a203310930320022802d80d222e0d010c060b0b20034108102a000b41e086c3002001200c1037000b41acf2c2002001200c1037000b200f4108102a000b20104108102a000b2033102902400240200c2031410420321b22034101200341014b1b4f0d0002402035450d00203410290b024020022802a80d2203450d00200341d0006c210120022802a00d41206a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b024020022802a40d0d00410021130c020b20022802a00d1029410021130c010b200c202f410020301b2203200c2003491b223341ffffff3f712033470d0120334105742203417f4c0d01024002400240024020030d00410121130c010b200310272213450d010b2033ad422c7e2206422088a70d032006a72203417f4c0d0302400240024020030d00410421320c010b200310272232450d010b024020330d004100213a4100213b0c030b2005200c41c8006c22386a211620024198106a41186a212e20024198106a41106a213620024198106a41086a21374100212d2033213b03400240200c450d002038210303400240201741c0006a2d00000d00200241e8026a427f427f201741106a290300220642012006420156201741186a29030022064200522006501b22011b2006420020011b10d4042017200241e8026a41086a290300370308201720022903e8023703000b201741c8006a2117200341b87f6a22030d000b0b20022802a00d220d20022802a80d222141d0006c6a21040240024002400240024002402021450d00200d210e03400240200e2802282203450d00200341c8006c210b200e28022041206a21030340200c200328020022014d0d0402402005200141c8006c6a22012d00400d002001290310220a200141186a290300221484500d00200241d8026a200e29030022064200428080808010420010d304200241a8026a420042002006420010d304200241c8026a427f20022903d802200e41086a290300220642ffffffff0f8320065220022903b00242005272200241d8026a41086a2903002218200642208620022903a8027c7c220620185472220f1b427f2006200f1b200a201410d404200241b8026a200e41146a350200200e41186a290300220642208684200642208820022903c802200241c8026a41086a29030010d3042001427f2001290300220620022903b8027c220a200a200654220f200141086a22102903002206200241b8026a41086a2903007c200fad7c220a200654200a2006511b220f1b3703002010427f200a200f1b3703000b200341c8006a2103200b41b87f6a220b0d000b0b200e41d0006a220e2004470d000b0b202d41016a213a2005200c41c8006c6a210e203821012005210303402003210b02400240200e20036b41d8014d0d00200b41c0006a2d00000d01200b41c8006a21030c070b0340024020010d00202d213a0c0c0b200141b87f6a2101200b41c0006a210f200b41c8006a2203210b200f2d00000d000b200341b87f6a210b0c060b200b4188016a2d0000450d03200b41d0016a2d0000450d02200141e07d6a2101200b41a0026a2103200b4198026a2d00000d000b410321010c030b41acf2c2002001200c1037000b200b41d8016a2103410221010c010b200b4190016a2103410121010b200b200141c8006c6a210b0b02402003200e460d00200b41086a2903002106200b290300210a0340200341c8006a21010240200341c0006a2d00000d00200341086a2903002214200620032903002218200a54201420065420142006511b220e1b21062018200a200e1b210a2003200b200e1b210b0b2001210320162001470d000b0b200b41013a004002402021450d00200b417c6a2110200b41206a21210340200d41d0006a21220240200d2802282201450d00200d2802202103200141c8006c210103400240024020102003460d00200341246a2021412010d0040d010b200d41186a220e2903002106200b41086a220f290300210a2003200b2903002214200d29031022187d3703002003200a20067d2014201854ad7d370308200b2903002106200e200f290300370300200d20063703100b200341c8006a2103200141b87f6a22010d000b0b2022210d20222004470d000b0b202e200b41386a2900003703002036200b41306a2900003703002037200b41286a2900003703002002200b2900203703981002400240203b202d470d00202d4101742203203a203a2003491b223b41ffffff3f71203b470d0e203b41057422034100480d0e02400240202d0d002003102721130c010b2013202d4105742003102821130b2013450d010b2013202d4105746a2203200229039810370000200341186a202e290300370000200341106a2036290300370000200341086a203729030037000020052117203a212d203a20334f0d040c010b0b20034101102a000b20034104102a000b20034101102a000b0240024020022802a80d22030d00410021360c010b20022802a00d2222200341d0006c6a212e2013203a4105746a210e410021360340200220222f002c3b01b80d20022022412e6a2d00003a00ba0d20022022413f6a290000370398102002202241c4006a29000037009d10024020222802282203450d002022280220220f200341c8006c6a21042022413b6a2800002137202241376a2800002138202241336a28000021392022412f6a28000021312022412c6a21054100210c4108212141002110024002400340200f220d41246a2101200d41c8006a210f201321030240024003400240200e20036b41e0004b0d002003200e460d030340024020012003470d002003210b0c040b024020032001412010d0040d002003210b0c040b200e200341206a2203470d000c040b0b024020032001470d002003210b0c020b024020032001412010d0040d002003210b0c020b200341206a220b2001460d01200b2001412010d004450d01200341c0006a220b2001460d01200b2001412010d004450d01200341e0006a220b2001460d0120034180016a2103200b2001412010d0040d000b0b2005200b460d00200b2005412010d004450d000240024020222903102218200d290300220a85202241186a2903002214200d41086a2903002206858450450d0042002106428080808010210a0c010b20024198026a200a4200428080808010420010d30420024188026a42004200200a420010d3040240200642ffffffff0f832006522002290390024200527220024198026a41086a290300221920064220862002290388027c7c221a201954724101470d000240201842208820144220868422182014422088221484500d00200241e8016a200a20062018201410d404200241e8016a41086a290300210620022903e801210a0c020b41bcf2c2001058000b200241f8016a200229039802201a20184201201842015620144200522014501b22031b2014420020031b10d404200241f8016a41086a290300210620022903f801210a0b200d200a370310200d41186a20063703002002200d2f00243b01900b2002200d41266a2d00003a00920b2002200d41376a2900003703800b2002200d413c6a2900003700850b200d41336a2800002101200d412f6a280000210b200d412b6a2800002116200d41276a280000210d0240200c2010470d00200c41016a2203200c490d10200c4101742217200320032017491b2203ad42307e2214422088a70d102014a722174100480d1002400240200c0d002017102721210c010b2021200c41306c2017102821210b2021450d032003210c0b20022d00920b211720022f01900b212d2021201041306c6a2203200136000f2003200b36000b200320163600072003200d3600032003202d3b0100200341026a20173a00002003200a370320200341286a2006370300200320022903800b370013200341186a20022900850b370000201041016a21100b200f2004470d000b02402010450d0002400240201041306c22010d00420021064200210a0c010b202141206a2103420021064200210a0340200341086a290300200a7c2003290300220a20067c2206200a54ad7c210a200341306a2103200141506a22010d000b0b200241d8016a420042808080801020067d22142014428080808010564200200a200642808080801056ad7c7d22064200522006501b22031b22194200200620031b22062010ad221a420010d40420022903d801211402402019201a5441002006501b0d00200241d8016a41086a2903002118202141206a21032010210103402003427f2003290300220620147c220a200a200654220b200341086a220d290300220620187c200bad7c220a200654200a2006511b220b1b370300200d427f200a200b1b370300200341306a21032001417f6a22010d000b0b200241c8016a20142006201a200610d3040240201920022903c8017da7220d450d004100210303402021200320107041306c6a2201427f2001290320220642017c220a200a200654220b200141286a22012903002214200bad7c2218201454200a20065a1b220b1b3703202001427f2018200b1b370300200341016a2203200d490d000b0b200220022f01b80d3b01ac0b200220022d00ba0d3a00ae0b20022002290398103703980b2002200229009d1037009d0b024020332036470d00203341016a22032033490d0f20334101742201200320032001491b2203ad422c7e2206422088a70d0f2006a722014100480d0f0240024020330d002001102721320c010b20322033412c6c2001102821320b2032450d03200321330b20022d00ae0b210120022f01ac0b210b20322036412c6c6a2203203736000f2003203836000b20032039360007200320313600032003200b3b0100200341026a20013a0000200320022903980b370013200341186a200229009d0b370000200320103602282003200c36022420032021360220203641016a21360c030b200c450d02202110290c020b20174108102a000b20014104102a000b202241d0006a2222202e470d000b0b02402035450d00203410290b024020022802a80d2203450d00200341d0006c210120022802a00d41206a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b20022802a40d450d0020022802a00d10290b20022802900d210f20022802880d21010240200228028c0d2203450d00034020012802940321012003417f6a22030d000b0b0240200f450d004100210b410021030340200f417f6a210f02400240200320012f01064f0d00200341016a21030c010b02400240200128020022030d00200bad21064100210d410021030c010b2001330104422086200bad8421064101210d0b200110292006a7210b024002402006422088a7220e20032f01064f0d00200321010c010b034002400240200328020022010d00200bad2106410021010c010b200d41016a210d2003330104422086200bad8421060b200310292006a7210b200121032006422088a7220e20012f01064f0d000b0b200e41027420016a4198036a28020021010240200d417f6a2203450d00034020012802940321012003417f6a22030d000b0b410021030b200f0d000b0b02402001418883c000460d0020012802002103200110292003450d0020032802002101200310292001450d00024020012802002203450d00034020011029200321012003280200220b2103200b0d000b0b200110290b024020130d00200241086a41c8f9c4004111108601410021130c030b2036412c6c2203412c6e213c41002117024002400240024020030d004108213d4100213c0c010b203c41ffffff1f71203c470d0a203c41067422014100480d0a20011027223d450d010b024002402032203220036a2237460d00200241b80d6a410172210e41002117203d210c203221050340200241c00a6a41186a2216200541186a290200370300200241c00a6a41106a222d200541106a290200370300200241c00a6a41086a222e200541086a290200370300200220052902003703c00a200241b80d6a2005108c02024002400240024020022d00b80d4101460d00200241003602b8100c010b200241b00b6a41186a200e41186a290000370300200241b00b6a41106a200e41106a290000370300200241b00b6a41086a200e41086a2900003703002002200e2900003703b00b20024198106a200241b00b6a108d0220022802b81022030d010b4200211a4200211b0c010b20024198106a41086a290300211b200229039810211a20022802bc10450d00200310290b2005280220210b4100210d024002402005280228222141306c220f0d0041082104410021210c010b202141ffffff1f712021470d0d202141067422034100480d0d200310272204450d030b2005412c6a21220240200b200b200f6a460d004100210d200421030340200b220141286a290300210a200141206a2903002106200241b80d6a2005108c02024002400240024020022d00b80d4101460d00200241003602b8100c010b200241b00b6a41186a200e41186a290000370300200241b00b6a41106a200e41106a290000370300200241b00b6a41086a200e41086a2900003703002002200e2900003703b00b20024198106a200241b00b6a108d0220022802b810220b0d010b42002118420021190c010b20024198106a41086a2903002119200229039810211820022802bc10450d00200b10290b200141306a210b200241b0016a41b18ac000411610860120024188016a20022903b801200241b0016a41106a290300427f420010d404200241e8006a20182019200229038801420020022802b00122101b22144201201442015620024188016a41086a290300420020101b22144200522014501b22101b2014420020101b10d40420024198016a41b18ac0004116108601200241f8006a20022903a00120024198016a41106a290300427f420010d404200241386a200a420020022903682214420010d304200241d8006a200642002014420010d304200241286a420042002006420010d304200241c8006a2002290378420020022802980122101b221442012014420156200241f8006a41086a290300420020101b22144200522014501b22101b2014420020101b427f200235025c200241d8006a41086a2903002218200229033820022903287c7c221442208684200229034020022903308442005220142018547222101b42ffffffff0f201442208820101b10d304200320063703002003200a370308200341286a200141186a290300370300200341206a200141106a290300370300200341186a200141086a290300370300200341106a2001290300370300200341386a200241c8006a41086a290300370300200341306a2002290348370300200341c0006a2103200d41016a210d200f41506a220f0d000b0b200c201a370300200c201b370308200c2004360230200c41386a200d360200200c41346a2021360200200c20022903c00a370310200c41186a202e290300370300200c41206a202d290300370300200c41286a2016290300370300201741016a2117200c41c0006a210c2022210520222037470d000b0b200242003702940a2002418883c0003602900a024002400240203a450d002013203a4105746a213120024198106a410272213e200241c00a6a41136a2134200241e00a6a41136a213f200241b80d6a4101722121201321050340200241b80d6a2005108c02024002400240024020022d00b80d4101460d00200241003602b8100c010b200241b00b6a41186a202141186a290000370300200241b00b6a41106a202141106a290000370300200241b00b6a41086a202141086a290000370300200220212900003703b00b20024198106a200241b00b6a108d0220022802b81022030d010b420021064200210a0c010b20024198106a41086a290300210a200229039810210620022802bc10450d00200310290b200241b00b6a41186a2222200541186a290000370300200241b00b6a41106a2204200541106a290000370300200241b00b6a41086a2216200541086a290000370300200220052900003703b00b0240024002400240024002400240024020022802900a220e418883c000460d0020022802940a210f0c010b200241b80d6a410041e00210cd041a20024198106a410041900410cd041a41f8061027220e450d014100210f200e41003b0106200e4100360200200e41086a200241b80d6a41e00210ce041a200e41e8026a20024198106a41900410ce041a200241003602940a2002200e3602900a0b200541206a210502400340200e41086a2101200e41066a210c200e2f0106221041057421034100210b024003402003450d01200241b00b6a2001412010d004220d450d03200341606a2103200b41016a210b200141206a2101200d417f4a0d000b200b417f6a21100b0240200f450d00200f417f6a210f200e20104102746a41f8066a280200210e0c010b0b200241b80c6a41186a22032022290300370300200241b80c6a41106a20042903002214370300200241b80c6a41086a20162903002218370300200220022903b00b22193703b80c200220022802980a41016a3602980a200241f80b6a41106a22302014370300200241f80b6a41086a22402018370300200241f80b6a41186a22412003290300370300200220193703f80b200c2f01002201410b490d04200241b80d6a410041e00210cd041a20024198106a410041900410cd041a41f80610272203450d02200341003b010620034100360200200341086a200241b80d6a41e00210ce04210b200341e8026a20024198106a41900410ce04210d200241e00a6a41086a2242200e41d0016a290000370300200241e00a6a41106a2243200e41d8016a290000370300200241e00a6a41186a2244200e41e0016a29000037030020024198106a41086a222d200e4190056a29030037030020024198106a41106a222e200e4198056a29030037030020024198106a41186a2237200e41a0056a29030037030020024198106a41206a2238200e41a8056a29030037030020024198106a41286a2239200e41b0056a2903003703002002200e2900c8013703e00a2002200e2903880537039810200b200e41e8016a200e2f010641796a220141057410ce04210b200d200e41b8056a200141306c10ce04210d200e41063b0106200320013b0106200220022f01e00a3b01ac0b200220022d00e20a3a00ae0b2002203f2900003703980b2002203f41056a224529000037009d0b20022800e30a214620022800e70a214720022800eb0a214820022800ef0a2149200241b80d6a41286a224a2039290300370300200241b80d6a41206a224b2038290300370300200241b80d6a41186a224c2037290300370300200241b80d6a41106a224d202e290300370300200241b80d6a41086a224e202d29030037030020022002290398103703b80d0240024020104107490d002010410574200b6a41c07e6a200b201041796a220f4105746a220b200141ffff0371200f6b41057410cf041a200b41186a2041290300370000200b41106a2030290300370000200b41086a2040290300370000200b20022903f80b370000201041306c200d6a220141e07d6a200141b07d6a2201200341066a220c2f0100200f6b41306c10cf041a200141186a200a370300200120063703102001200a37030820012006370300200141286a4100360200200142083703200c010b200e41086a20104105746a220141206a2001200c2f010020106b41057410cf041a200141186a2041290300370000200141106a2030290300370000200141086a2040290300370000200120022903f80b370000200e41e8026a201041306c6a220141306a2001200c2f010020106b41306c10cf041a200141186a200a370300200120063703102001200a37030820012006370300200141286a4100360200200142083703200b200c200c2f010041016a3b0100200241a00d6a41026a220120022d00ae0b3a00002016204e2903003703002004204d2903003703002022204c290300370300200241b00b6a41206a224f204b290300370300200241b00b6a41286a2250204a290300370300200220022f01ac0b3b01a00d200220022903980b3703c00a2002200229009d0b3700c50a200220022903b80d3703b00b200241d80c6a41286a22512050290300370300200241d80c6a41206a2252204f290300370300200241d80c6a41186a22532022290300370300200241d80c6a41106a22542004290300370300200241d80c6a41086a22552016290300370300200220022903b00b3703d80c200220022f01a00d3b01900b200220012d00003a00920b200220022903c00a3703800b200220022900c50a3700850b0240200e280200220f0d00200241900a6a21012003210b0c060b200e2f0104213541002156200321570340200241b00d6a41026a225820022d00920b3a0000200220022f01900b3b01b00d200220022903800b3703a00d200220022900850b3700a50d20502051290300370300204f2052290300370300202220532903003703002004205429030037030020162055290300370300200220022903d80c3703b00b203541ffff03712110024002400240200f2f01062203410b490d00203e410041a20710cd041a41a8071027220d450d07200d4100360200200d41046a20024198106a41a40710ce041a2044200f41e0016a2900003703002043200f41d8016a2900003703002042200f41d0016a2900003703002002200f2900c8013703e00a2039200f41b0056a2903003703002038200f41a8056a2903003703002037200f41a0056a290300370300202e200f4198056a290300370300202d200f4190056a2903003703002002200f2903880537039810200d41086a200f41e8016a200f2f0106220141796a220341057410ce042159200d41e8026a200f41b8056a200341306c10ce04215a200d41f8066a200f4194076a2001417a6a220c41027410ce04212f200f41063b0106200d20033b01060240200c450d0041002103202f210103402001280200220b20033b0104200b200d360200200141046a2101200c200341016a2203470d000b0b204a2039290300370300204b2038290300370300204c2037290300370300204d202e290300370300204e202d29030037030020022002290398103703b80d200220022f01e00a3b01ac0b200220022d00e20a3a00ae0b20022900e30a210620022900eb0a210a2002204529000037009d0b2002203f2900003703980b203420022903980b370000203441056a220c200229009d0b370000200220022d00ae0b3a00c20a200220022f01ac0b3b01c00a2002200a3700cb0a200220063700c30a2039204a2903003703002038204b2903003703002037204c290300370300202e204d290300370300202d204e290300370300200220022903b80d37039810203541ffff037122014107490d0120592010417a6a220b4105746a2059201041796a22034105746a2201200d2f010620036b41057410cf041a200141186a20022900a50d3700002001204936000f2001204836000b2001204736000720012046360003200141026a20582d00003a0000200120022f01b00d3b0000200120022903a00d370013201041306c205a6a220141e07d6a200141b07d6a2201200d2f0106223520036b41306c10cf041a200141286a2050290300370300200141206a204f290300370300200141186a2022290300370300200141106a2004290300370300200141086a2016290300370300200120022903b00b370300200d203541016a22013b010620104102742235202f6a416c6a202f200b4102746a2210200141ffff0371200b6b41027410cf041a20102057360200200b200d2f010622104b0d02200d20356a41e0066a210103402001280200220b200341016a22033b0104200b200d360200200141046a210120032010490d000c030b0b200f41086a2201201041016a220b4105746a200120104105746a2201200320106b220d41057410cf041a2001204936000f2001204836000b2001204736000720012046360003200141026a20582d00003a0000200120022f01b00d3b0000200120022903a00d370013200141186a20022900a50d370000200f201041306c6a22014198036a200141e8026a220c200d41306c10cf041a20014190036a205029030037030020014188036a204f29030037030020014180036a2022290300370300200141f8026a2004290300370300200141f0026a2016290300370300200c20022903b00b370300200f200341016a22033b01062010410274200f41f8066a22016a41086a2001200b4102746a2201200341ffff0371200b6b41027410cf041a2001205736020002402010200f2f010622034f0d002057200b3b01042057200f360200200b20034f0d002003417f6a210d200f200b417f6a22034102746a4180076a210103402001280200220b200341026a3b0104200b200f360200200141046a2101200d200341016a2203470d000b0b41001a200241900a6a1a200e1a0c090b200f41086a2203201041016a220b4105746a200320104105746a2203200f2f0106223520106b222f41057410cf041a2003204936000f2003204836000b2003204736000720032046360003200341026a20582d00003a0000200320022f01b00d3b0000200320022903a00d370013200341186a20022900a50d370000200f41e8026a201041306c6a220341306a2003202f41306c10cf041a200341286a2050290300370300200341206a204f290300370300200341186a2022290300370300200341106a2004290300370300200341086a2016290300370300200320022903b00b370300200f203541016a22033b01062010410274222f200f41f8066a22356a41086a2035200b4102746a2235200341ffff0371200b6b41027410cf041a203520573602002001200f2f0106220b4f0d00200f202f6a41fc066a2103034020032802002201201041016a22103b01042001200f360200200341046a2103200b2010470d000b0b205641016a21102002419c0d6a41026a220320022d00c20a3a00002040202d2903003703002030202e29030037030020412037290300370300200241f80b6a41206a22012038290300370300200241f80b6a41286a220b2039290300370300200220022f01c00a3b019c0d20022002290398103703f80b200220342900003703880d2002200c29000037008d0d20022800c30a214620022800c70a214720022800cb0a214820022800cf0a21492051200b29030037030020522001290300370300205320412903003703002054203029030037030020552040290300370300200220022903f80b3703d80c200220022f019c0d3b01900b200220032d00003a00920b200220022903880d3703800b2002200229008d0d3700850b0240200f28020022030d00200f1a200241900a6a22011a200d210b0c070b200f2f01042135200241900a6a1a200f1a2003210f200d2157201021560c000b0b200e200b41306c6a22034180036a200a370300200341f8026a2006370300200341f0026a200a370300200341e8026a200637030020034190036a410036020020034188036a220b28020021012003418c036a2802002103200b42083703002001450d052003450d05200110290c050b41f8064108102a000b41f8064108102a000b41a8074108102a000b200e20104105746a220341286a200341086a220b200120106b41057410cf041a200341206a2041290300370000200341186a2030290300370000200341106a2040290300370000200b20022903f80b370000200e201041306c6a22034198036a200341e8026a2201200e2f010620106b41306c10cf041a20034190036a410036020020034188036a420837030020034180036a200a370300200341f8026a2006370300200341f0026a200a37030020012006370300200e200e2f010641016a3b01060c010b203e410041a20710cd041a41a80710272203450d0320034100360200200341046a20024198106a41a40710ce041a20032001280200220d3602f806200120033602002001200128020441016a360204200d41003b0104200d2003360200200320032f0106220d4105746a220141086a20022f01900b3b00002001410a6a20022d00920b3a0000200141176a2049360000200141136a20483600002001410f6a20473600002001410b6a20463600002001411b6a20022903800b370000200141206a20022900850b3700002003200d41306c6a220141e8026a20022903d80c370300200141f0026a2055290300370300200141f8026a205429030037030020014180036a205329030037030020014188036a205229030037030020014190036a2051290300370300200341f8066a200d41016a22014102746a200b360200200320013b0106200b20013b0104200b2003360200200e1a0b20052031470d000b0b20174106742203450d04203d20036a212d203d211603402016450d05024020162802382203450d002016280230222220034106746a2104201641106a212103402022220c41106a210e200c41c0006a2122200241900a6a210320022802940a2110024003402003280200220f41086a2101200f2f0106220541057421034100210b0240024003402003450d01200e2001412010d004220d450d02200341606a2103200b41016a210b200141206a2101200d417f4a0d000b200b417f6a21050b2010450d022010417f6a2110200f20054102746a41f8066a21030c010b0b200f200b41306c6a220341e8026a2201427f20012903002206200c2903307c220a200a2006542201200341f0026a220b2903002206200c41386a220d2903007c2001ad7c220a200654200a2006511b22011b370300200b427f200a20011b37030020024198106a41086a220e202141086a2900003703002021290000210620024198106a41106a220f202141106a29000037030020024198106a41186a2210202141186a2900003703002002200637039810200d2903002106200c290330210a20034188036a210d0240024020034190036a220b28020022012003418c036a280200460d00200d28020021030c010b200141016a22032001490d1120014101742205200320032005491b2205ad42307e2214422088a70d112014a7220c4100480d110240024020010d00200c102721030c010b200d280200200141306c200c102821030b2003450d06200d2003360200200d41046a2005360200200b28020021010b2003200141306c6a220320063703082003200a3703002003200229039810370310200341186a200e290300370300200341206a200f290300370300200341286a2010290300370300200b200b28020041016a3602000b20222004470d000b0b201641c0006a2216202d470d000c050b0b41a8074108102a000b200c4108102a000b20034108102a000b20014108102a000b200241f80b6a41086a22034200370300200242003703f80b41cdf8c4004116200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a10052103024002400240200228029810220b417f460d002003450d002002200b3602b40b200220033602b00b20024198106a200241b00b6a102d2002280298102237450d02200241a0106a2802002101200228029c102138200b450d01200310290c010b4100213841012137410021010b024002400240024002400240024020014105742204450d00203721030340410f10272201450d07200141076a4100290091a3443700002001410029008aa3443700002001410f412f10282201450d062001200329000037000f200141276a200341186a220f2900003700002001411f6a200341106a2210290000370000200141176a200341086a2205290000370000200241c00a6a41186a220b4200370300200241c00a6a41106a220d4200370300200241c00a6a41086a220e4200370300200242003703c00a2001412f200241c00a6a1000200241b80d6a41186a220c200b290300370300200241b80d6a41106a2221200d290300370300200241b80d6a41086a2222200e290300370300200220022903c00a3703b80d200241b80d6a4120100c20011029411210272201450d05200141106a41002f00c4a344222e3b0000200141086a41002900bca3442206370000200141002900b4a344220a37000020014112413210282201450d04200120032900003700122001412a6a200f290000370000200141226a20102900003700002001411a6a2005290000370000200b4200370300200d4200370300200e4200370300200242003703c00a20014132200241c00a6a1000200c200b2903003703002021200d2903003703002022200e290300370300200220022903c00a3703b80d200241206a200241b80d6a412010c102200228022421162002280220212d20011029024020164100202d1b22164102490d00411210272201450d04200141106a202e3b0000200141086a20063700002001200a37000020014112413210282201450d03200120032900003700122001412a6a200f290000370000200141226a20102900003700002001411a6a2005290000370000200b4200370300200d4200370300200e4200370300200242003703c00a20014132200241c00a6a1000200c200b2903003703002021200d2903003703002022200e290300370300200220022903c00a3703b80d20022016417f6a36029810200241b80d6a412020024198106a41041003200110290b200341206a2103200441606a22040d000b0b02402038450d00203710290b20022802900a210f024020022802940a2203450d00200321010340200f2802f806210f2001417f6a22010d000b03402003417f6a22030d000b0b024020022802980a22210d00427f2114427f21060c090b02400240200f2f0106450d00200f41e8026a210d200f41086a210e4101210c0c010b02400240200f28020022030d004100210b41002101410021030c010b200f2f0104210b410121010b0240200b20032f0106490d000340200141016a210120032f0104220b200328020022032f01064f0d000b0b2003200b41306c6a41e8026a210d2003200b4105746a41086a210e200b41027420036a41fc066a280200210f4100210c2001417f6a2203450d000340200f2802f806210f2003417f6a22030d000b0b20024198106a41106a212d427f2114427f21060340200d41086a2203290300210a200d2903002118200241b00b6a41186a2222200e41186a290000370300200241b00b6a41106a2204200e41106a290000370300200241b00b6a41086a2216200e41086a2900003703002002200e2900003703b00b200d280228220ead42307e2219422088a70d082019a72201417f4c0d08200d41186a29030021192003290300211a200d290310211b200d290300211f200d2802202103024002400240024002400240024020010d00410821100c010b200110272210450d010b02400240200e0d004100210b0c010b2003200e41306c6a210d4100210b201021010340200120032903003703002001200341086a290300370308200141106a200341106a290300370300200141186a200341186a290300370300200141206a200341206a290300370300200141286a200341286a290300370300200141306a2101200b41016a210b200341306a2203200d470d000b0b20024198106a41186a20193703002002201b3703a8102002201f370398102002200b3602c0102002200e3602bc10200220103602b8102002201a3703a010410f10272203450d01200341076a4100290091a3443700002003410029008aa3443700002003410f412f10282205450d02200520022903b00b37000f200541276a20222903003700002005411f6a2004290300370000200541176a2016290300370000200241c00a6a41186a22034200370300200241c00a6a41106a22014200370300200241c00a6a41086a220b4200370300200242003703c00a2005412f200241c00a6a1000200241b80d6a41186a2003290300370300200241b80d6a41106a2001290300370300200241b80d6a41086a200b290300370300200220022903c00a3703b80d200241003602800c200242013703f80b200220024198106a3602d80c200241d80c6a200241f80b6a10592002202d3602d80c200241d80c6a200241f80b6a105920022802b8102103200220022802c01022013602d80c200241d80c6a200241f80b6a103002402001450d00200141306c210d03400240024020022802fc0b220b20022802800c22016b4120490d0020022802f80b210b0c010b200141206a220e2001490d17200b4101742210200e200e2010491b220e4100480d1702400240200b0d00200e1027210b0c010b20022802f80b200b200e1028210b0b200b450d062002200e3602fc0b2002200b3602f80b0b200b20016a220b41086a200341186a290000370000200b41106a200341206a290000370000200b41186a200341286a2900003700002002200141206a3602800c200b200341106a290000370000200220033602d80c200241d80c6a200241f80b6a1059200341306a2103200d41506a220d0d000b0b20182014542103200a2006512101200a200654210b20022802fc0b210d200241b80d6a412020022802f80b220e20022802800c10030240200d450d00200e10290b2003200b20011b21032021417f6a212120051029024020022802bc10450d0020022802b81010290b200a200620031b21062018201420031b21142021450d0e0240200c200f2f01064f0d00200f200c41306c6a41e8026a210d200f200c4105746a41086a210e200c41016a210c0c060b02400240200f28020022030d004100210b41002101410021030c010b200f2f0104210b410121010b200b20032f0106490d040340200141016a210120032f0104220b200328020022032f01064f0d000c050b0b20014108102a000b410f4101102a000b412f4101102a000b200e4101102a000b2003200b41306c6a41e8026a210d2003200b4105746a41086a210e200b41027420036a41fc066a280200210f4100210c2001417f6a2203450d000340200f2802f806210f2003417f6a22030d000c010b0b0b41324101102a000b41124101102a000b41324101102a000b41124101102a000b412f4101102a000b410f4101102a000b418f89c3004133104e000b1039000b200241f80b6a41086a22034200370300200242003703f80b41c8f9c4004111200241f80b6a1004200241b80d6a41086a22012003290300370300200220022903f80b3703b80d200220063703a0102002201437039810200241b80d6a411020024198106a4110100320034200370300200242003703f80b41cdf8c4004116200241f80b6a100420012003290300370300200220022903f80b3703b80d200241003602a01020024201370398102002203a3602b00b200241b00b6a20024198106a103002400240203a0d0020022802a0102101200228029c10210e200228029810210f0c010b203a4105742110410020022802a01022016b210d200228029810210f200228029c10210e2013210303400240200e200d6a411f4b0d00200141206a220b2001490d08200e4101742205200b200b2005491b220b4100480d0802400240200e0d00200b1027210f0c010b200f200e200b1028210f0b200f450d07200b210e0b200f20016a220b2003290000370000200b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200d41606a210d200141206a2101200341206a2103201041606a22100d000b2002200e36029c10200220013602a0102002200f360298100b200241b80d6a4110200f200110030240200e450d00200f10290b20022802980a211020022802900a210b024020022802940a2203450d000340200b2802f806210b2003417f6a22030d000b0b02402010450d004100210d410021030340024002402003200b2f01064f0d00200b200341306c6a2201418c036a280200210f20014188036a2802002101200341016a21030c010b02400240200b28020022030d00200dad21064100210e410021030c010b200b330104422086200dad8421064101210e0b200b10292006a7210d024002402006422088a7220f20032f01064f0d00200321010c010b034002400240200328020022010d00200dad2106410021010c010b200e41016a210e2003330104422086200dad8421060b200310292006a7210d200121032006422088a7220f20012f01064f0d000b0b200f41027420016a41fc066a280200210b2001200f41306c6a2203418c036a280200210f20034188036a28020021010240200e417f6a2203450d000340200b2802f806210b2003417f6a22030d000b0b410021030b2001450d012010417f6a21100240200f450d00200110290b20100d000b0b0240200b418883c000460d00200b2802002103200b10292003450d0020032802002101200310292001450d00024020012802002203450d00034020011029200321012003280200220b2103200b0d000b0b200110290b02402017450d0020174106742101203d41306a210303400240200341046a280200450d00200328020010290b200341c0006a2103200141406a22010d000b0b203aad21060240203c450d00203d10290b20064220862106203bad210a02402036450d002036412c6c2101203241206a210303400240200341046a280200450d00200328020010290b2003412c6a2103200141546a22010d000b0b2006200a8421062033450d00203210290b02402012452015720d00201110290b20130d0102402007450d00200741d0006c2101200841c0006a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b2009450d00200810290b200041003602000c010b200020063702042000201336020002402007450d00200741d0006c2101200841c0006a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b2009450d00200810290b200241c0176a24000f0b200b4101102a000b102b000b418f89c3004133104e000b9f0501067f230041c0046b22012400200141b8036a41086a22024200370300200142003703b8034188d4c3004116200141b8036a100420014190016a41086a2002290300370300200120012903b80337039001200141003602b80320014190016a4110200141b8036a10052103024002400240024020012802b8032204417f470d00411221020c010b200120043602ac02200120033602a802200141b8036a200141a8026a103c20012802b8034112460d02200141b0026a200141b8036a41880110ce041a200141003a00a001200141a0016a20012802a802220520012802ac022202410047220610ce041a20022006490d012001200220066b3602ac022001200520066a3602a802024002402002450d0020012d00a00122054103490d010b200141b0026a103d0c030b20012802b0022102200141a0016a200141b0026a41047241840110ce041a20024112460d02200141b8036a200141a0016a41840110ce041a02402004450d00200310290b20014190016a4110100c0b2001410c6a200141b8036a41840110ce041a0240024020024112470d00419ed4c30021060c010b200141b0026a2001410c6a41840110ce041a200141013a00a001200141b8036a41086a22064200370300200142003703b80341f586c500411f200141b8036a100420014190016a41086a2006290300370300200120012903b8033703900120014190016a4110200141a0016a41011003200641023a0000200141053a00b8034100210641b8d6c5004100200141b8036a108801200120023602b803200141b8036a410472200141b0026a41840110ce041a200141a0016a20004280ce187c200141b8036a20054280af1a10b50320012802a0014101470d0020012802a40121060b200141c0046a240020060f0b20062002103e000b418f89c3004133104e000bb81304077f137e017f047e23004180036b22012400200141c0016a41086a22024200370300200142003703c00141b7d2c3004115200141c0016a1004200141d8026a41086a2002290300370300200120012903c0013703d802200141003602c001200141d8026a4110200141c0016a100521020240024002400240024002400240024002400240024020012802c0012203417f460d002002450d002001200336022c20012002360228200141c0016a200141286a103f20012802c0012204450d02200141c8016a280200210520012802c40121062003450d01200210290c010b4108210441002105410021060b0240200541b0016c22020d00200141003602302001200436022c200120043602282001200141f8026a3602340c080b200420026a2103200141c0016a20042802880110b603200441b0016a21020240024020012802d00122070d0042002108420021090c010b200141186a20012903c001200141c0016a41086a290300200141d8016a350200420010d304200141186a41086a29030021092001290318210820012802d401450d00200710290b200141013602302001200336022c200120023602282001200141f8026a3602342004450d072004ad422086210a024020022003460d00200541b0016c41d07e6a21034201210b0340200141c0016a20024188016a28020010b6030240024020012802d00122070d004200210c4200210d0c010b200141086a20012903c001200141c0016a41086a29030020013502d801420010d304200141086a41086a290300210d2001290308210c20012802d401450d00200710290b02402008200c562009200d562009200d511b0d002002ad422086200b84210a200c2108200d21090b200241b0016a2102200b42017c210b200341d07e6a22030d000b0b200a428080808010540d072005200aa722024d0d0120042005417f6a220741b0016c6a22034180016a290300210d20034188016a290300210920034190016a290300210b20034198016a290300210c200341e0006a2903002108200341e8006a290300210a200341f0006a290300210e200341f8006a290300210f200341c0006a2903002110200341c8006a2903002111200341d0006a2903002112200341d8006a2903002113200341206a2903002114200341286a2903002115200341306a2903002116200341386a290300211720032903002118200329030821192003290310211a2004200241b0016c6a220241186a221b290300211c200341a8016a290300211d200341a0016a290300211e201b200341186a2903003703002002290310211f2002201a3703102002290308211a200220193703082002290300211920022018370300200241386a2203290200211820032017370200200241306a2203290200211720032016370200200241286a2203290200211620032015370200200241206a2203290200211520032014370200200241d8006a2203290200211420032013370200200241d0006a2203290200211320032012370200200241c8006a2203290200211220032011370200200241c0006a2203290200211120032010370200200241f8006a220329020021102003200f370200200241f0006a2203290200210f2003200e370200200241e8006a2203290200210e2003200a370200200241e0006a2203290200210a2003200837020020024198016a200c37020020024190016a200b37020020024188016a2203280200211b2003200937020020024180016a220329020021092003200d370200200241a0016a201e370200200241a8016a201d370200200141286a41f8006a2010370300200141286a41f0006a200f370300200141286a41e8006a200e370300200141286a41e0006a200a370300200141286a41d8006a2014370300200141286a41d0006a2013370300200141286a41c8006a2012370300200141286a41c0006a2011370300200141286a41386a2018370300200141286a41306a2017370300200141286a41286a2016370300200141286a41206a2015370300200141286a41186a201c370300200141286a4180016a20093703002001201f3703382001201a37033020012019370328200120073602b801200120063602b401200120043602b001200141c0016a41086a22024200370300200142003703c00141b7d2c3004115200141c0016a1004200141d8026a41086a2002290300370300200120012903c0013703d802200141103602c4012001200141d8026a3602c001200141b0016a200141c0016a103302402007450d00200541b0016c41d07e6a21032004210203402002103d200241b0016a2102200341d07e6a22030d000b0b02402006450d00200410290b411310272202450d022002410f6a41002800ecd143360000200241086a41002900e5d143370000200241002900ddd14337000020024113412610282202450d032002201b360013200141c0016a41186a22034200370300200141c0016a41106a22074200370300200141c0016a41086a22044200370300200142003703c00120024117200141c0016a1000200141d8026a41186a2003290300370300200141d8026a41106a2007290300370300200141d8026a41086a2004290300370300200120012903c0013703d802200141003602c001200141d8026a4120200141c0016a1005210320012802c0012207417f460d052003450d05200120033602b001200120073602b401200142003703c801200142003703c001200141c0016a20032007411020074110491b220410ce041a2001200720046b3602b4012001200320046a3602b0012007410f4d0d04200141c8016a290300210920012903c001210d200141c0016a200141b0016a102d20012802c0012207450d0420012902c401210b20031029200141d8026a4120100c200b422088a72104200ba721050c060b418f89c3004133104e000b41ccd2c300200220051037000b41134101102a000b41264101102a000b418f89c3004133104e000b410021070b200210290240024020070d00200141286a103d0c010b024020044105742203450d002007210203402002200d200910ad01200241206a2102200341606a22030d000b0b200141e8016a2009370300200141e0016a200d370300200141d8016a2004360200200141d4016a2005360200200141d0016a2007360200200141cc016a201b360200200141c8016a41013a0000200141053a00c00141b8d6c5004100200141c0016a108801200141c0016a200141286a41880110ce041a200141d8026a20004280ce187c200141c0016a41004280af1a10b50320012802d8024101470d0020012802dc0221020c020b410021020c010b02402005450d00200541b0016c21032004210203402002103d200241b0016a2102200341d07e6a22030d000b0b41dcd2c30021022006450d00200410290b20014180036a240020020bda0604047f017e047f017e230041d0046b22022400024002400240411a10272203450d00200341186a41002f00dbd1433b0000200341106a41002900d3d143370000200341086a41002900cbd143370000200341002900c3d1433700002003411a413410282203450d012003200136001a200241c0026a41186a22014200370300200241c0026a41106a22044200370300200241c0026a41086a22054200370300200242003703c0022003411e200241c0026a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903c002370300200241003602c00220024120200241c0026a1005210102400240024020022802c0022204417f460d002001450d002002200136022020022004360224200242003703c002200241c0026a20012004410820044108491b220510ce041a2002200420056b3602242002200120056a3602200240200441074d0d0020022903c0022106200241c0026a200241206a103c20022802c0022105200241cc036a200241c0026a41047241840110ce041a20054112460d00200241bc016a200241cc036a41840110ce041a20022005360230200241306a410472200241bc016a41840110ce042107200241003a00c002200241c0026a2002280220220820022802242209410047220a10ce041a2009200a490d0620022009200a6b220436022420022008200a6a220a360220024002402009450d0020022d00c00222084103490d010b200241306a103d0c010b200242003703c002200241c0026a200a2004410820044108491b220910ce041a2002200420096b3602242002200a20096a360220200441074b0d02200241306a103d0b418f89c3004133104e000b200041123602080c010b20022903c002210b200241c0026a200741840110ce041a200220022800293602cc0320022002412c6a2800003600cf03200241306a200241c0026a41840110ce041a200220022800cf033600bf01200220022802cc033602bc012001102920002005360208200020063703002000410c6a200241306a41840110ce041a20004198016a20083a000020004190016a200b370200200020022802bc01360099012000419c016a20022800bf013600000b20031029200241d0046a24000f0b411a4101102a000b41344101102a000b200a2009103e000bfc0202047f017e230041d0006b22022400024002400240411310272203450d002003410f6a4100280096d243360000200341086a410029008fd24337000020034100290087d24337000020034113412610282203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033037030820024100360230200241086a4120200241306a100521040240024020022802302201417f460d002002200136022c20022004360228200241306a200241286a102d20022802302205450d042002290234210602402001450d00200410290b20002006370204200020053602000c010b20004100360208200042013702000b20031029200241d0006a24000f0b41134101102a000b41264101102a000b418f89c3004133104e000bc80301047f230041c0006b2202240002400240024002400240411010272203450d00200341086a41002900a6d1433700002003410029009ed1433700002001280200210420034110412010282203450d01200320043600102003412041c00010282203450d02200320012900043700142003412c6a2001411c6a290000370000200341246a200141146a2900003700002003411c6a2001410c6a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034134200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300410021042002410036022020024120200241206a100521050240024020022802202201417f460d00200241003a0020200241206a20052001410047220410ce041a20012004490d052001450d0620022d0020220141ff0071220441064f0d0620051029200141077621010c010b410021010b20031029200020043a0001200020013a0000200241c0006a24000f0b41104101102a000b41204101102a000b41c0004101102a000b20042001103e000b418f89c3004133104e000b8f0e04017f047e117f087e230041a0036b22052400024002400240024002400240024020040d00420021064200210742002108420021090c010b20054180036a41186a220a420037030020054180036a41106a220b420037030020054180036a41086a220c42003703002005420037038003419ad2c300411d20054180036a1000200541c0026a41186a200a290300370300200541c0026a41106a200b290300370300200541c0026a41086a200c29030037030020052005290380033703c0024100210c200541003602d801200541c0026a4120200541d8016a1005210d024020052802d801220a417f460d0020054180036a200a4120200a4120491b220b6a410041004120200b6b200b411f4b1b10cd041a20054180036a200d200b10ce041a200a411f4d0d02200541d8016a41186a220a20054180036a41186a290300370300200541d8016a41106a220b20054180036a41106a290300370300200541d8016a41086a220c20054180036a41086a29030037030020052005290380033703d801200d102920054190016a41186a200a29030037030020054190016a41106a200b29030037030020054190016a41086a200c290300370300200520052903d801370390014101210c0b41281027220b450d02200b200c3a0004200b41b8d6c500360200200b200529039001370005200b20052f00d8013b0025200b410d6a20054190016a41086a290300370000200b41156a20054190016a41106a290300370000200b411d6a20054190016a41186a290300370000200b41276a200541da016a2d00003a000020054190016a200b10ad0342002108420021094200210642002107024020052d00d0014106460d002004417f6a210e200541d8016a41c0006a210f200541d8016a41206a2110200541d8016a41186a2111200341ff0171211242002106420021074200210842002109034020112007370300200520063703e801200520083703d801200520093703e001201020054190016a41c10010ce04210a02400240200f2002460d00200f2002412010d0040d010b200541e0026a41186a220c200a41186a2213290200370300200541e0026a41106a220d200a41106a2214290200370300200541e0026a41086a2215200a41086a22162902003703002005200a2902003703e002411010272204450d06200441086a41002900a6d1433700002004410029009ed14337000020044110412010282204450d07200420013600102004412041c00010282204450d08200420052903e0023700142004412c6a200c290300370000200441246a200d2903003700002004411c6a201529030037000020054180036a41186a2217420037030020054180036a41106a2218420037030020054180036a41086a2219420037030020054200370380032004413420054180036a1000200541c0026a41186a2017290300370300200541c0026a41106a2018290300370300200541c0026a41086a201929030037030020052005290380033703c002200541c0026a412041b8d6c50041004100100b211a20041029201a417f470d0020052d00b8022104200c2013290000370300200d2014290000370300201520162900003703002005200a2900003703e00202404100417f4101200420124b1b20042012461b41016a41014b0d00200321040b20054180016a200541e0026a10950120054180016a41086a290300211b200529038001211c02400240200441ff01710d002005201c201b420a420010d4042017200c2903003703002018200d29030037030020192015290300370300200520052903e00237038003200541106a200120054180036a4100200e10aa03200541106a41186a290300211d200541106a41086a290300211e2005290320211f2005290310212020052903002221211c200541086a2903002222211b0c010b200541c0006a201b42002004ad42ff01832221420010d304200541d0006a201c42002021420010d3042017200c2903003703002018200d29030037030020192015290300370300200520052903e00237038003200541e0006a200120054180036a2004200e10aa03200541306a42004200201c420010d304427f200541d0006a41086a2903002221200529034020052903307c7c221d2005290348200529033884420052201d2021547222041b2122427f200529035020041b2121200541e0006a41186a290300211d200541e0006a41086a290300211e2005290370211f200529036021200b201b20077c201c20067c2207201c54ad7c201d7c2007201f7c2206200754ad7c2107202220097c202120087c2209202154ad7c201e7c200920207c2208200954ad7c21090b20054190016a200b10ad0320052d00d0014106470d000b0b200b10290b2000200637031020002008370300200041186a200737030020002009370308200541a0036a24000f0b418f89c3004133104e000b41284104102a000b41104101102a000b41204101102a000b41c0004101102a000b8607010d7f230041e0006b220124000240024002400240024002400240411a10272202450d00200241186a41002f00dbd1433b0000200241106a41002900d3d143370000200241086a41002900cbd143370000200241002900c3d1433700002002411a413410282202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c20021029411310272202450d022002410f6a4100280096d243360000200241086a410029008fd24337000020024100290087d24337000020024113412610282202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1000200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100c20021029200141c0006a200010a8032001280244210820012802402109024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010272202450d06200241086a41002900a6d1433700002002410029009ed14337000020024110412010282202450d07200220003600102002412041c00010282202450d08200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10002006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100c20021029200a41606a220a0d000b0b02402008450d00200910290b200141e0006a24000f0b411a4101102a000b41344101102a000b41134101102a000b41264101102a000b41104101102a000b41204101102a000b41c0004101102a000bfa0201057f230041d0006b22022400024002400240411710272203450d002003410f6a41002900ffd143370000200341086a41002900f8d143370000200341002900f0d14337000020034117412e10282203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1000200241086a41186a2004290300370300200241086a41106a2005290300370300200241086a41086a20062903003703002002200229033037030820024100360230200241086a4120200241306a100521050240024020022802302204417f460d002002200436022c20022005360228200241306a200241286a103b20022802302206450d042002290234210102402004450d00200510290b20002001370204200020063602000c010b20004100360208200042083702000b20031029200241d0006a24000f0b41174101102a000b412e4101102a000b418f89c3004133104e000bec0903037f047e097f23002202210320024180036b416071220224002001411c6a220429020021052004200229039802370200200141146a2204290200210620042002290390023702002001410c6a220429020021072004200229038802370200200241003a00800220012902042108200120022903800237020420022005370378200220063703702002200737036820022008370360200141246a2d0000210920024180026a41176a2204200537000020024180026a41106a220a200229007137030020024180026a41086a220b2002290069370300200220022900613703800202402008a741ff01714101460d00200041063a0040200324000f0b200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b29030037030020022002290380023703180240024002400240411510272204450d002004410d6a41002900bbd143370000200441086a41002900b6d143370000200441002900aed14337000020044115413510282204450d0120042002290318370015200420093a00342004412c6a2002412f6a290000370000200441256a200241186a41106a2903003700002004411d6a200241186a41086a29030037000020024180026a41186a220a420037030020024180026a41106a220b420037030020024180026a41086a220c420037030020024200370380022004413520024180026a1000200241e0016a41186a200a290300370300200241e0016a41106a200b290300370300200241e0016a41086a200c29030037030020022002290380023703e0012002410036028002200241e0016a412020024180026a1005210d200228028002220e417f460d032002200e36023c2002200d36023820024180026a200241386a10fc0220022d00a1024102460d02200241b8016a41206a220a20024180026a41206a2d00003a0000200241b8016a41186a220b20024180026a41186a290300370300200241b8016a41106a220c20024180026a41106a290300370300200241b8016a41086a220f20024180026a41086a29030037030020022002290380023703b801200241e0006a200241a2026a41c10010ce041a0240200e450d00200d10290b200241386a41086a220e200f290300370300200241386a41106a220d200c290300370300200241386a41186a2210200b290300370300200241386a41206a2211200a2d00003a0000200220022903b80137033820024180026a200241e0006a41c10010ce041a200a20112d00003a0000200b2010290300370300200c200d290300370300200f200e290300370300200220022903383703b801200241e0006a20024180026a41c10010ce041a200141246a200241e0006a41c0006a2d00003a00002001411c6a200241e0006a41386a290000370000200141146a200241e0006a41306a2900003700002001410c6a200241e0006a41286a290000370000200120022900800137000420002002290318370000200041086a200241186a41086a290300370000200041106a200241186a41106a290300370000200041176a200241186a41176a290000370000200020093a001f200020022903b801370020200041286a200f290300370000200041306a200c290300370000200041386a200b290300370000200041c0006a200a2d00003a000020041029200324000f0b41154101102a000b41354101102a000b418f89c3004133104e000b41b6b7c30041d700104e000bd50703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042005370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a00102402008a741ff01714101460d0020004200370300200324000f0b200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a0013703000240024002400240411210272204450d00200441106a41002f0088a3443b0000200441086a4100290080a344370000200441002900f8a24437000020044112413210282204450d0120042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a100020024180016a41186a200a29030037030020024180016a41106a200b29030037030020024180016a41086a200c290300370300200220022903a00137038001200241003602a00120024180016a4120200241a0016a1005210b20022802a001220a417f460d032002200a36029c022002200b36029802200241a0016a20024198026a10af0320022d00b8014102460d02200241a0016a41086a290300210520022903a001210820022802b001210c200241206a200241b9016a41c70010ce041a0240200a450d00200b10290b200241a0016a200241206a41c10010ce041a200241206a200241a0016a41c10010ce041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2005370300200041286a2008370300200041386a200c360200200020093a00272000420137030020041029200324000f0b41124101102a000b41324101102a000b418f89c3004133104e000b41b6b7c30041d700104e000b860905027f027e057f017e027f23004190026b22022400200241206a2001102e0240024002402002280220450d0020022802242103200241086a200110532002290308a70d010b200041023a00180c010b200241186a290300210420022903102105200241003a00f001200241f0016a2001280200220620012802042207410047220810ce041a02400240024020072008490d002001200720086b22093602042001200620086a22083602002007450d0220022d00f001220741014b0d02410021060240024020070e020100010b200241f0016a2009412020094120491b22076a41004100412020076b2007411f4b1b10cd041a200241f0016a2008200710ce041a2001200920076b220a3602042001200820076a22083602002009411f4d0d03200241b0016a41086a200241f0016a41086a290000220b37030020024190016a41186a200241f0016a41186a29000037030020024190016a41106a200241f0016a41106a29000037030020024190016a41086a200b370300200220022900f001220b3703b0012002200b3703900141012106200a21090b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a2903003703002002200229039001370370200241003a00f001200241f0016a20082009410047220710ce041a20092007490d012001200920076b220a3602042001200820076a22073602002009450d0220022d00f001220841014b0d02410021090240024020080e020100010b200241f0016a200a4120200a4120491b22086a41004100412020086b2008411f4b1b10cd041a200241f0016a2007200810ce041a2001200a20086b3602042001200720086a360200200a411f4d0d03200241b0016a41086a200241f0016a41086a290000220b37030020024190016a41186a200241f0016a41186a29000037030020024190016a41106a200241f0016a41106a29000037030020024190016a41086a200b370300200220022900f001220b3703b0012002200b37039001410121090b200241306a41186a220120024190016a41186a290300370300200241306a41106a220720024190016a41106a290300370300200241306a41086a220820024190016a41086a290300370300200241d0006a41086a220a200241f0006a41086a290300370300200241d0006a41106a220c200241f0006a41106a290300370300200241d0006a41186a220d200241f0006a41186a2903003703002002200229039001370330200220022903703703502000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290350370019200041216a200a290300370000200041296a200c290300370000200041316a200d2903003700002000413a6a2002290330370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a2002412e6a2f01003b0100200041da006a200228012a3601000c030b20082007103e000b20072009103e000b200041023a00180b20024190026a24000b3400200041ceb8c30036020420004100360200200041146a4107360200200041106a41d4b8c300360200200041086a42043702000b950101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102722060d0041204101102a000b20062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000b130020004102360204200041e4c5c3003602000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242f02e3700000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242eb023700000bef0803037f017e047f230041f0026b22052400200541c986c500411910b5010240024002402005280204410020052802001b2206417f6a220720064d0d00200541123602100c010b200541086a200710a70320052802104112460d00200541a8016a200541086a41a00110ce041a20052903a8012108200541a8016a41086a103d20082001580d00200041f7d2c30036020420004101360200200041086a41c7003602002002103d0c010b200541a8016a41086a22074200370300200542003703a80141c986c5004119200541a8016a1004200541086a41086a2007290300370300200520052903a8013703082005200641016a3602a801200541086a4110200541a8016a41041003200520013703a8012007200241880110ce042109200520033a00c002200520043703b802024002400240024002400240411a10272207450d00200741186a41002f00dbd1433b0000200741106a41002900d3d143370000200741086a41002900cbd143370000200741002900c3d1433700002007411a413410282202450d012002200636001a200541086a41186a22074200370300200541086a41106a220a4200370300200541086a41086a220b4200370300200542003703082002411e200541086a1000200541c8026a41186a2007290300370300200541c8026a41106a200a290300370300200541c8026a41086a200b290300370300200520052903083703c802200541003602102005420137030820052903a8012101410810272207450d022005410836020c20052005280210220a41086a360210200520073602082007200a6a20013700002009200541086a1032024020052d00c002220741024b0d00024002400240024020070e03000102000b4100210a0c020b4101210a0c010b4102210a0b2005200a3a00ef0202400240200528020c20052802102207460d002005280208210b0c010b200741016a220b2007490d072007410174220c200b200b200c491b220c4100480d070240024020070d00200c1027210b0c010b20052802082007200c1028210b0b200b450d052005200c36020c2005200b360208200528021021070b2005200741016a360210200b20076a200a3a00000b20052903b802210102400240200528020c220a200528021022076b4108490d002005280208210a0c010b200741086a220b2007490d06200a4101742207200b200b2007491b22074100480d0602400240200a0d0020071027210a0c010b2005280208200a20071028210a0b200a450d052005200736020c2005200a360208200528021021070b2005200741086a360210200a20076a2001370000200528020c2107200541c8026a41202005280208220a2005280210100302402007450d00200a10290b200210292009103d200541b4016a2006360200200541b1016a20033a0000200541a8016a41086a41033a0000200541053a00a80141b8d6c5004100200541a8016a10880120004100360200200020063602040c060b411a4101102a000b41344101102a000b41084101102a000b200c4101102a000b20074101102a000b102b000b200541f0026a24000bd10302047f037e230041d0006b2202240002400240411310272203450d002003410f6a41002800ecd143360000200341086a41002900e5d143370000200341002900ddd14337000020034113412610282203450d0120032001360013200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034117200241286a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229032837030820024100360228200241086a4120200241286a1005210102400240024020022802282204417f460d002001450d00200220013602482002200436024c2002420037033020024200370328200241286a20012004411020044110491b220510ce041a2002200420056b36024c2002200120056a36024802402004410f4d0d00200241306a290300210620022903282107200241286a200241c8006a102d200228022822040d020b418f89c3004133104e000b410021040c010b200229022c2108200110292000200637030820002007370300200020083702140b2000200436021020031029200241d0006a24000f0b41134101102a000b41264101102a000b130020004111360204200041bcd4c3003602000b3400200041f3f3c30036020420004100360200200041146a410f360200200041106a41fcf3c300360200200041086a42093702000ba00101037f230041a0016b220224002002411236020020024100360298012002420137039001200241003a009f010240410110272203450d002002200336029001200320022802980122046a20022d009f013a000020024101360294012002200441016a2203360298012000200229039001370200200041086a2003360200024020022802004112460d002002103d0b200241a0016a24000f0b41014101102a000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002400240412010272206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c00010282206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b41204101102a000b41c0004101102a000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021030200041086a200228020836020020002002290300370200200241106a24000b1300200041063602042000419490c4003602000b3201017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280af1a3700000b3201017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242c0d1023700000b3e01017f02404110102722020d0041104101102a000b20024200370008200242808084fea6dee111370000200042908080808002370204200020023602000b3201017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280ce183700000be51a03037f027e067f230041f0016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e12000102030405060708090a0b0c0d0e0f1011000b200241e8006a200141086a10960220004100360200200041106a200241e8006a41086a290300370300200041086a20022903683703000c110b109702000b20004102360200200041086a200141086a2903003703000c0f0b200241e8006a200141046a1038200041033602002000410c6a200241f0006a280200360200200020022903683702040c0e0b109802000b0240024002400240200141086a280200417f6a220341014b0d0020030e020102010b41e4bdc0001058000b41012103024002402001410c6a22042d00004101460d00200241026a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01002002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b200241246a41026a200241026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01003b012420022002290368370328200141386a29030021052001290330210641012107200241106a21010c010b41012103024002402001410c6a22042d00004101460d00200241ee016a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01ec012002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b41022107200241246a41026a200241ec016a41026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01ec013b012420022002290368370328200220012903303703102002200141386a290300370318200141c8006a290300210520012903402106200221010b20012006370300200120053703082000410c6a20033a0000200041086a2007360200200020022f01243b000d2000410f6a200241266a2d00003a0000200041106a2004360200200041146a20022903283702002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a280200360200200041386a200241106a41086a290300370300200041306a2002290310370300200041c0006a2002290300370300200041c8006a200241086a290300370300200041053602000c0c0b200241e8006a200141086a10990220004106360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c0b0b200241e8006a41186a200141286a290000370300200241e8006a41106a200141206a290000370300200241f0006a200141186a290000370300200241e8006a41286a200141386a290000370300200241e8006a41306a200141c0006a290000370300200241e8006a41386a200141c8006a2900003703002002200141106a2900003703682002200141306a290000370388012001410c6a2802002203417f4c0d0b0240024020030d00410121010c010b20012802042104200310272201450d0d20012004200310ce041a0b200241286a41386a2204200241e8006a41386a290300370300200241286a41306a2207200241e8006a41306a290300370300200241286a41286a2208200241e8006a41286a290300370300200241286a41206a2209200241e8006a41206a290300370300200241286a41186a220a200241e8006a41186a290300370300200241286a41106a220b200241e8006a41106a290300370300200241286a41086a220c200241e8006a41086a290300370300200220022903683703282000410c6a2003360200200041086a200336020020002001360204200041106a2002290328370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a2004290300370200200041073602000c0a0b200241e8006a200141086a109a0220004108360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c090b200241e8006a200141046a109b0220004109360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c080b200241e8006a200141046a109b022000410a360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c070b200241e8006a200141086a10c8012000410b360200200041c0006a200241e8006a41386a290300370300200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c060b2000410c360200200041086a200141086a2903003703000c050b2001410c6a2802002203417f4c0d050240024020030d00410121010c010b20012802042104200310272201450d0820012004200310ce041a0b200020013602042000410d3602002000410c6a2003360200200041086a20033602000c040b024002400240024002400240200141086a280200417f6a220341024b0d0020030e03010203010b4190a9c1001058000b200141386a2903002105200141306a290300210641012103024002402001410c6a2d00004101460d00200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a00002002200141146a29020037036820012f000d2001410f6a2d0000411074722104200141106a2802002101410021030c010b200141106a28020021010b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a29030037030020022002290368370328410121070c030b2001410c6a28020022034108762104410221070c010b2001410c6a28020022034108762104410321070b0b2000410e360200200041386a2005370300200041306a2006370300200041106a2001360200200041086a2007360200200041146a20022903283702002000410c6a2004410874200341ff0171723602002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a2802003602000c030b200241e8006a200141086a109c02200041086a200241e8006a41800110ce041a2000410f3602000c020b02400240024002402001280204417f6a220341014b0d0020030e020102010b41f8e2c1001058000b41880110272203450d072003200141086a280200109502410121010c010b4101210302400240200141086a2d00004101460d00200241e8006a41086a200141186a290200370300200241e8006a41106a200141206a290200370300200241e8006a41186a200141286a2d00003a00002002200141106a29020037036820012f00092001410b6a2d00004110747221072001410c6a2802002104410021030c010b2001410c6a28020021040b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a2903003703002002200229036837032820032007410874722103410221010b20002001360204200041103602002000410c6a2004360200200041086a2003360200200041106a2002290328370200200041186a200241286a41086a290300370200200041206a200241286a41106a290300370200200041286a200241286a41186a2802003602000c010b200241e8006a200141086a10b101200041086a200241e8006a41d80010ce041a200041113602000b200241f0016a24000f0b1039000b20034101102a000b20034101102a000b4188014108102a000bb20503047f027e057f230041d0006b220224000240411310272203450d002003410f6a41002800ecd143360000200341086a41002900e5d143370000200341002900ddd143370000024020034113412610282204450d0020042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1000200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a2903002106200129030021070240411010272203450d00200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a10300240024020030d0020022802302105200228022c21092002280228210a0c010b2003410574210b2002280228210a200228022c21092002280230210020082103034002400240200920006b4120490d00200041206a21050c010b0240200041206a22052000490d002009410174220c20052005200c491b220c4100480d000240024020090d00200c1027210a0c010b200a2009200c1028210a0b0240200a450d00200c21090c020b200c4101102a000b102b000b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200b41606a220b0d000b2002200936022c200220053602302002200a3602280b200241086a4120200a2005100302402009450d00200a10290b200410290240200141146a280200450d00200810290b200241d0006a24000f0b41104101102a000b41264101102a000b41134101102a000bbd0402087f047e230041e0006b22022400024002400240410f10272203450d00200341076a41002900909d44370000200341002900899d443700002003410f412f10282203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a22054200370300200242003703202003412f200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002410036024020024120200241c0006a100521050240024020022802402201417f460d00200241206a2001412020014120491b22046a41004100412020046b2004411f4b1b10cd041a200241206a2005200410ce041a2001411f4d0d04200241c0006a41186a2201200241206a41186a2204290300370300200241c0006a41106a2206200241206a41106a2207290300370300200241c0006a41086a2208200241206a41086a2209290300370300200220022903203703402005102920042001290300220a37030020072006290300220b37030020092008290300220c37030020022002290340220d370320200041013a00002000200d370001200041096a200c370000200041116a200b370000200041196a200a3700000c010b200041003a00000b20031029200241e0006a24000f0b410f4101102a000b412f4101102a000b418f89c3004133104e000bba0f010f7f230041f0006b22042400024002400240024002400240024002400240024002400240411a10272205450d00200541186a41002f00dbd1433b0000200541106a41002900d3d143370000200541086a41002900cbd143370000200541002900c3d1433700002005411a413410282205450d012005200136001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041b8d6c50041004100100b21062005102902400240024002402006417f470d0041839ec40021070c010b200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411010272205450d05200541086a41002900a6d1433700002005410029009ed14337000020054110412010282205450d06200520013600102005412041c00010282205450d07200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041b8d6c50041004100100b210c200510290240200c417f470d00200441086a200110a8032006200041186a2900003703002007200041106a2900003703002008200041086a2900003703002004200029000037034802400240200428020c220d20042802102206460d00200641016a21052004280208210e0c010b200641016a22052006490d0420064101742207200520052007491b220d41ffffff3f71200d470d04200d41057422074100480d040240024020060d0020071027210e0c010b2004280208200641057420071028210e0b200e450d0a2004200d36020c2004200e3602080b200e20064105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a29030037000020042005360210411310272206450d0a2006410f6a4100280096d243360000200641086a410029008fd24337000020064100290087d2433700002006411341261028220f450d0b200f2001360013200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a2208420037030020044200370348200f4117200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a20082903003703002004200429034837032820044100360250200442013703482004200536026c200441ec006a200441c8006a10300240024020050d0020042802502106200428024c210c200428024821100c010b200541057421114100200428025022066b210820042802482110200428024c210c200e210503400240200c20086a411f4b0d00200641206a22072006490d06200c4101742212200720072012491b22074100480d0602400240200c0d002007102721100c010b2010200c2007102821100b2010450d052007210c0b201020066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b2004200c36024c20042006360250200420103602480b200441286a41202010200610030240200c450d00201010290b200f1029200d450d00200e10290b2009200041186a290000370300200a200041106a290000370300200b200041086a29000037030020042000290000370308411010272205450d0b200541086a41002900a6d1433700002005410029009ed14337000020054110412010282205450d0c200520013600102005412041c00010282205450d0d200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110272206450d0e41002107200641807f410020021b2003723a0000200441286a412020064101100320061029200510290b200441f0006a240020070f0b20074101102a000b102b000b411a4101102a000b41344101102a000b41104101102a000b41204101102a000b41c0004101102a000b20074101102a000b41134101102a000b41264101102a000b41104101102a000b41204101102a000b41c0004101102a000b41014101102a000bec0302047f027e230041d0006b2202240002400240411310272203450d002003410f6a41002800bb9c44360000200341086a41002900b49c44370000200341002900ac9c4437000020034113413310282203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034133200241286a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229032837030820024100360228200241086a4120200241286a1005210102400240024020022802282204417f460d002001450d00200220013602482002200436024c20024200370328200241286a20012004410820044108491b220510ce041a2002200420056b36024c2002200120056a3602480240200441074d0d0020022903282106200241286a200241c8006a102d200228022822040d020b418f89c3004133104e000b410021040c010b200229022c2107200110292000200737020c200020063703000b2000200436020820031029200241d0006a24000f0b41134101102a000b41334101102a000bf40801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024020002d00004101460d000240024020022003460d00200128020021020c010b200341016a22022003490d0920034101742204200220022004491b22044100480d090240024020030d002004102721020c010b200128020020032004102821020b2002450d0320012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c010b0240024020022003460d00200128020021020c010b200341016a22022003490d0820034101742204200220022004491b22044100480d080240024020030d002004102721020c010b200128020020032004102821020b2002450d0320012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240200141046a2802002202200428020022036b4120490d00200128020021020c010b200341206a22042003490d0820024101742203200420042003491b22034100480d080240024020020d002003102721020c010b200128020020022003102821020b2002450d0420012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a2802002103024020002d00214101460d000240024020022003460d00200128020021000c010b200341016a22002003490d0820034101742202200020002002491b22024100480d080240024020030d002002102721000c010b200128020020032002102821000b2000450d0520012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b0240024020022003460d00200128020021020c010b200341016a22022003490d0720034101742204200220022004491b22044100480d070240024020030d002004102721020c010b200128020020032004102821020b2002450d0520012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240200141046a2802002202200428020022036b4120490d00200128020021020c010b200341206a22042003490d0720024101742203200420042003491b22034100480d070240024020020d002003102721020c010b200128020020022003102821020b2002450d0620012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000f0b20044101102a000b20044101102a000b20034101102a000b20024101102a000b20044101102a000b20034101102a000b102b000bab0201027f230041106b2202240020024100360208200242013703000240412010272203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210592002200041106a36020c2002410c6a20021059200028022021032002200041286a280200220036020c2002410c6a2002103002402000450d002003200041186c6a210003402002200336020c2002410c6a20021059200341106a200210302000200341186a2203470d000b0b2002280204210320012802002001280204200228020022002002280208100302402003450d00200010290b200241106a24000f0b41204101102a000bcd0801067f230041106b220224002002410036020820024201370300200041106a200210302002200036020c2002410c6a20021059200228020421032002280208210402400240024002400240024002400240024020002d00184101460d000240024020032004460d00200228020021050c010b200441016a22032004490d0920044101742205200320032005491b22034100480d090240024020040d002003102721050c010b200228020020042003102821050b2005450d0320022003360204200220053602000b2002200441016a2206360208200520046a41003a00000c010b0240024020032004460d00200228020021050c010b200441016a22032004490d0820044101742205200320032005491b22034100480d080240024020040d002003102721050c010b200228020020042003102821050b2005450d0320022003360204200220053602000b2002200441016a360208200520046a41013a00000240024020022802042203200228020822046b4120490d00200441206a21060c010b200441206a22062004490d0820034101742207200620062007491b22074100480d080240024020030d002007102721050c010b200520032007102821050b2005450d042002200736020420022005360200200721030b200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a290000370000200220063602082004200041196a2900003700000b02400240200041396a2d00004101460d00024020032006470d00200341016a22002003490d0920034101742204200020002004491b22004100480d090240024020030d002000102721050c010b200520032000102821050b2005450d0620022000360204200220053602000b2002200641016a360208200520066a41003a00002002280208210420022802042105200228020021030c010b024020032006470d00200341016a22042003490d0820034101742207200420042007491b22044100480d080240024020030d002004102721050c010b200520032004102821050b2005450d0620022004360204200220053602000b2002200641016a360208200520066a41013a00000240024020022802042205200228020822046b4120490d00200228020021030c010b200441206a22032004490d0820054101742206200320032006491b22064100480d080240024020050d002006102721030c010b200228020020052006102821030b2003450d072002200636020420022003360200200621050b200320046a220641086a200041c2006a290000370000200641106a200041ca006a290000370000200641186a200041d2006a2900003700002002200441206a220436020820062000413a6a2900003700000b2001280200200128020420032004100302402005450d00200310290b200241106a24000f0b20034101102a000b20034101102a000b20074101102a000b20004101102a000b20044101102a000b20064101102a000b102b000b9316010c7f230041f0026b2201240002400240024002400240411210272202450d00200241106a41002f0088a3443b0000200241086a4100290080a344370000200241002900f8a24437000020024112413210282202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e8006a41186a22004200370300200141e8006a41106a22034200370300200141e8006a41086a220442003703002001420037036820024132200141e8006a1000200141c8016a41186a2000290300370300200141c8016a41106a2003290300370300200141c8016a41086a2004290300370300200120012903683703c8012001410036029002200141c8016a412020014190026a100521002001280290022205417f460d032000450d032001200536024c2001200036024820014190026a200141c8006a10af0320012d00a80222034102460d02200141e8006a41186a200141c1026a290000370300200141e8006a41106a200141b9026a290000370300200141e8006a41086a200141b1026a290000370300200141f0016a41086a200141d2026a290100370300200141f0016a41106a200141da026a290100370300200141f0016a41186a200141e2026a290100370300200120012900a9023703682001200141ca026a2901003703f001200141c9026a2d0000210402402005450d00200010290b200141c8016a4120100c0c040b41124101102a000b41324101102a000b418f89c3004133104e000b410221030b200141286a41186a2200200141e8006a41186a290300370300200141286a41106a2205200141e8006a41106a290300370300200141286a41086a2206200141e8006a41086a290300370300200141086a41086a2207200141f0016a41086a2208290300370300200141086a41106a2209200141f0016a41106a220a290300370300200141086a41186a220b200141f0016a41186a220c29030037030020012001290368370328200120012903f00137030820021029024020034102460d0020082006290300370300200a2005290300370300200c2000290300370300200141c8006a41086a2007290300370300200141c8006a41106a2009290300370300200141c8006a41186a200b290300370300200120012903283703f0012001200129030837034841002102024002400240024002400240024002400240200441ff01714101470d00411210272202450d01200241106a41002f0088a3443b0000200241086a4100290080a344370000200241002900f8a24437000020024112413210282202450d02200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210272200450d04200041106a41002f0088a3443b0000200041086a4100290080a344370000200041002900f8a24437000020004112413210282200450d05200020012903f0013700122000412a6a200141f0016a41186a290300370000200041226a200141f0016a41106a2903003700002000411a6a200141f0016a41086a290300370000200141e8006a41186a22054200370300200141e8006a41106a22064200370300200141e8006a41086a220742003703002001420037036820004132200141e8006a1000200141c8016a41186a2005290300370300200141c8016a41106a2006290300370300200141c8016a41086a2007290300370300200120012903683703c8012001410036029002200141c8016a412020014190026a100521062001280290022205417f470d0141e0a3c40041d300104e000b200141e8006a41186a22004200370300200141e8006a41106a22054200370300200141e8006a41086a220642003703002001420037036841b3a4c400411a200141e8006a1000200141c8016a41186a2000290300370300200141c8016a41106a2005290300370300200141c8016a41086a2006290300370300200120012903683703c8010240200441ff01714101460d00200141c8016a4120100c0c080b412010272200450d0520002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141c8016a4120200041201003200010290c070b200120053602ec01200120063602e80120014190026a200141e8016a10af0320012d00a80222074102460d05200141b0016a41106a220820014190026a41106a2209290300370300200141b0016a41086a220a20014190026a41086a220b29030037030020012001290390023703b001200141e8006a200141a9026a220c41c70010ce041a02402005450d00200610290b200b200a29030037030020092008290300370300200120012903b00137039002200120073a00a802200c200141e8006a41c70010ce041a200141c9026a20043a0000200141ca026a2001290348370100200141d2026a200141c8006a41086a290300370100200141da026a200141c8006a41106a290300370100200141e2026a200141c8006a41186a290300370100200141e8006a41186a22044200370300200141e8006a41106a22054200370300200141e8006a41086a220642003703002001420037036820004132200141e8006a1000200141c8016a41186a2004290300370300200141c8016a41106a2005290300370300200141c8016a41086a2006290300370300200120012903683703c8012001412036026c2001200141c8016a36026820014190026a200141e8006a10c80320001029410121040c070b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41204101102a000b418f89c3004133104e000b41002100410021040b02400240024002400240024020020d00410021030c010b200141e8006a41186a22054200370300200141e8006a41106a22064200370300200141e8006a41086a220742003703002001420037036820024132200141e8006a1000200141c8016a41186a2005290300370300200141c8016a41106a2006290300370300200141c8016a41086a2007290300370300200120012903683703c8012001410036029002200141c8016a412020014190026a100521062001280290022205417f460d02200120053602ec01200120063602e80120014190026a200141e8016a10af0320012d00a8024102460d01200141b0016a41106a220720014190026a41106a2208290300370300200141b0016a41086a220920014190026a41086a220a29030037030020012001290390023703b001200141e8006a200141a9026a220b41c70010ce041a02402005450d00200610290b200a200929030037030020082007290300370300200120012903b00137039002200b200141e8006a41c70010ce0420012903f001370000200141b1026a200141f0016a41086a290300370000200141b9026a200141f0016a41106a290300370000200141c1026a200141f0016a41186a290300370000200120033a00a802200141e8006a41186a22034200370300200141e8006a41106a22054200370300200141e8006a41086a220642003703002001420037036820024132200141e8006a1000200141c8016a41186a2003290300370300200141c8016a41106a2005290300370300200141c8016a41086a2006290300370300200120012903683703c8012001412036026c2001200141c8016a36026820014190026a200141e8006a10c80320021029410121030b200420004572450d020c030b418f89c3004133104e000b41e0a3c40041d300104e000b200010290b2002452003720d00200210290b200141f0026a24000bf31b01107f230041d0026b220124000240024002400240411210272202450d00200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a24437000020024112413210282202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141b0016a41186a22004200370300200141b0016a41106a22034200370300200141b0016a41086a22044200370300200142003703b00120024132200141b0016a1000200141f8016a41186a2000290300370300200141f8016a41106a2003290300370300200141f8016a41086a2004290300370300200120012903b0013703f80120014100360260200141f8016a4120200141e0006a1005210020012802602204417f460d022000450d02200120043602c402200120003602c002200141c0006a200141c0026a102d0240024020012802402205450d0020012802442106200141e0006a200141c0026a10940320012d006022074102470d012006450d00200510290b418f89c3004133104e000b200141b0016a41186a200141f9006a290000370300200141b0016a41106a200141f1006a290000370300200141b0016a41086a200141e9006a290000370300200141a0026a41086a2001418a016a290100370300200141a0026a41106a20014192016a290100370300200141a0026a41186a2001419a016a290100370300200120012900613703b001200120014182016a2901003703a00220014181016a2d0000210302402004450d00200010290b200141f8016a4120100c0c030b41124101102a000b41324101102a000b410221070b200141206a41186a2200200141b0016a41186a290300370300200141206a41106a2204200141b0016a41106a290300370300200141206a41086a2208200141b0016a41086a290300370300200141086a2209200141a0026a41086a220a290300370300200141106a220b200141a0026a41106a220c290300370300200141186a220d200141a0026a41186a220e290300370300200120012903b001370320200120012903a00237030020021029024002400240024020074102460d00200a2008290300370300200c2004290300370300200e2000290300370300200141c0006a41086a2009290300370300200141c0006a41106a200b290300370300200141c0006a41186a200d290300370300200120012903203703a002200120012903003703404100210c024002400240024002400240024002400240200341ff01714101470d00411210272202450d01200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a2443700002002411241321028220c450d02200c2001290340370012200c412a6a200141d8006a290300370000200c41226a200141c0006a41106a290300370000200c411a6a200141c0006a41086a2903003700000b0240024020074101470d00411210272202450d04200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a2443700002002411241321028220d450d05200d20012903a002370012200d412a6a200141a0026a41186a290300370000200d41226a200141a0026a41106a290300370000200d411a6a200141a0026a41086a290300370000200141b0016a41186a22024200370300200141b0016a41106a22004200370300200141b0016a41086a22044200370300200142003703b001200d4132200141b0016a1000200141f8016a41186a2002290300370300200141f8016a41106a2000290300370300200141f8016a41086a2004290300370300200120012903b0013703f80120014100360260200141f8016a4120200141e0006a1005210020012802602204417f460d072000450d072001200436029c022001200036029802200141c0026a20014198026a102d024020012802c002220e450d00200141c8026a280200210220012802c402210f200141b0016a20014198026a10940320012d00b00122084102470d02200f450d00200e10290b418f89c3004133104e000b200141b0016a41186a22024200370300200141b0016a41106a22004200370300200141b0016a41086a22044200370300200142003703b00141c6a3c400411a200141b0016a1000200141f8016a41186a2002290300370300200141f8016a41106a2000290300370300200141f8016a41086a2004290300370300200120012903b0013703f8010240200341ff01714101460d00200141f8016a4120100c0c080b412010272202450d0520022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a290300370000200141f8016a4120200241201003200210290c070b200141e0006a200141b0016a41017241c10010ce041a200141b0016a200141e0006a41c30010ce041a02402004450d00200010290b200120083a006c200120023602682001200f3602642001200e360260200141ed006a200141b0016a41c30010ce041a2001418d016a20033a00002001418e016a200129034037010020014196016a200141c0006a41086a2903003701002001419e016a200141c0006a41106a290300370100200141a6016a200141c0006a41186a290300370100200141b0016a41186a22004200370300200141b0016a41106a22034200370300200141b0016a41086a22044200370300200142003703b001200d4132200141b0016a1000200141f8016a41186a2000290300370300200141f8016a41106a2003290300370300200141f8016a41086a2004290300370300200120012903b0013703f801200141003602b801200142013703b001200120023602c002200141c0026a200141b0016a1030024002402002450d002002410574210a410020012802b80122006b210420012802b001210920012802b4012108200e210203400240200820046a411f4b0d00200041206a22032000490d0e2008410174220b20032003200b491b22034100480d0e0240024020080d002003102721090c010b200920082003102821090b2009450d03200321080b200920006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200a41606a220a0d000b200120083602b401200120003602b801200120093602b0010b200141ec006a200141b0016a10c60320012802b4012102200141f8016a412020012802b001220020012802b801100302402002450d00200010290b0240200f450d00200e10290b200d10294101210f0c080b20034101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41204101102a000b41e0a3c40041d300104e000b4100210d4100210f0b02400240200c0d00410021020c010b200141b0016a41186a22024200370300200141b0016a41106a22004200370300200141b0016a41086a22034200370300200142003703b001200c4132200141b0016a1000200141f8016a41186a2002290300370300200141f8016a41106a2000290300370300200141f8016a41086a2003290300370300200120012903b0013703f80120014100360260200141f8016a4120200141e0006a1005210320012802602200417f460d042001200036029c022001200336029802200141c0026a20014198026a102d0240024020012802c002220e450d00200141c8026a280200210220012802c4022110200141b0016a20014198026a10940320012d00b0014102470d012010450d00200e10290b418f89c3004133104e000b200141e0006a200141b0016a41017241c10010ce041a200141b0016a200141e0006a41c30010ce041a02402000450d00200310290b20012002360268200120103602642001200e360260200141ed006a200141b0016a41c30010ce0420012903a002370000200141f5006a200141a0026a41086a290300370000200141fd006a200141a0026a41106a29030037000020014185016a200141a0026a41186a290300370000200120073a006c200141b0016a41186a22004200370300200141b0016a41106a22034200370300200141b0016a41086a22044200370300200142003703b001200c4132200141b0016a1000200141f8016a41186a2000290300370300200141f8016a41106a2003290300370300200141f8016a41086a2004290300370300200120012903b0013703f801200141003602b801200142013703b001200120023602c002200141c0026a200141b0016a103002402002450d002002410574210a410020012802b80122006b210420012802b001210920012802b4012108200e210203400240200820046a411f4b0d00200041206a22032000490d062008410174220b20032003200b491b22034100480d060240024020080d002003102721090c010b200920082003102821090b2009450d05200321080b200920006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200a41606a220a0d000b200120083602b401200120003602b801200120093602b0010b200141ec006a200141b0016a10c60320012802b4012102200141f8016a412020012802b001220020012802b801100302402002450d00200010290b02402010450d00200e10290b200c1029410121020b0240200f200d45720d00200d10290b0240200c452002720d00200c10290b2006450d00200510290b200141d0026a24000f0b20034101102a000b102b000b41e0a3c40041d300104e000b13002000410d360204200041d0a4c4003602000b3400200041ced2c40036020420004100360200200041146a4115360200200041106a41d8d2c400360200200041086a42073702000b7501027f230041106b22022400200241003602082002420137030002404104102722030d0041044101102a000b2003410036000020024284808080c000370204200220033602002002410036020c2002410c6a20021030200041086a200228020836020020002002290300370200200241106a24000b3001017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242003700000bdf0301077f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10592002200336023c2002413c6a200241306a10592002280220210320022004280200220436023c2002413c6a200241306a10300240024002402004450d00200441306c210503400240024020022802342206200228023822046b4120490d00200441206a2107200228023021060c010b200441206a22072004490d0420064101742208200720072008491b22084100480d040240024020060d002008102721060c010b200228023020062008102821060b2006450d0320022008360234200220063602300b200620046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a290000370000200220073602382004200341106a2900003700002002200336023c2002413c6a200241306a1059200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a28020036020002402002280224450d00200228022010290b200241c0006a24000f0b20084101102a000b102b000b7001017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10302002200241086a36022c2002412c6a200241206a1059200041086a200228022836020020002002290320370200200241306a24000b3201017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241c0843d3600000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241043600000bdf0606077f047e037f037e017f017e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a22054200370300200242003703800120024180016a2001280200220620012802042207412020074120491b220810ce041a2001200720086b3602042001200620086a360200024002402007411f4b0d00200041003602200c010b200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a2001105302402002290348a70d00200041003602200c010b200241c8006a41106a29030021092002290350210a200241306a2001105302402002290330a70d00200041003602200c010b200241c0006a290300210b2002290338210c200241286a2001102e024002400240024002402002280228450d0002400240200228022c220d41aa01200d41aa01491b220e0d00410821040c010b200e41186c220710272204450d030b0240200d450d00200241106a41106a210f4100210341002106410021080340200241106a20011053024002402002290310a7450d00200f290300211020022903182111200241086a2001102e20022802080d010b200e450d03200410290c030b200841016a2107200228020c210502402008200e470d002003200720072003491b220ead42187e2212422088a70d072012a722134100480d070240024020080d002013102721040c010b200420062013102821040b2004450d060b200420066a2208201037030820082011370300200841106a2005360200200341026a2103200641186a210620072108200d2007470d000b0b20040d010b200041003602200c040b20024180016a41186a200241e0006a41186a290300221037030020024180016a41106a200241e0006a41106a290300221137030020024180016a41086a200241e0006a41086a290300221237030020022002290360221437038001200041186a200b3703002000200c370310200020093703082000200a3703002000200dad422086200ead84370224200020043602202000412c6a2014370200200041346a20123702002000413c6a2011370200200041c4006a20103702000c030b20074108102a000b20134108102a000b102b000b200241a0016a24000b130020004102360204200041b8f6c4003602000b3101017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241a0053600000bb90d021e7f037e230041f0026b22042400024002400240024002400240410d10272205450d00200541056a41002900aca344370000200541002900a7a3443700002005410d412d10282205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1000200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001200441003602a002200441e0016a4120200441a0026a10052107024002400240024020042802a0022206417f460d00200441003a00a002200441a0026a20072006410047220810ce041a20062008490d062006450d0720042d00a002220641034f0d07200710292005102920060e03010302010b200510290b200441f8006a2001108c0220042d00784101470d06200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a108d02200441c0016a41186a22082005290000370300200441c0016a41106a22092006290000370300200441c0016a41086a220a2007290000370300200420042900793703c00120042802c002220b450d06200441e0016a41186a220c2008290300370300200441e0016a41106a220d2009290300370300200441e0016a41086a220e200a290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a220f200441a0026a41186a2210290300370300200441086a41286a2211200441ec026a2212280200360200200441086a41206a2213200441e4026a2214290200370300200441086a41186a2215200441dc026a2216290200370300200441086a41106a2217200441d4026a2218290200370300200441086a41086a2219200441cc026a221a290200370300200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221b200f290300370300200441386a41306a221c2007290300370300200441386a41286a221d2005290300370300200441386a41206a221e200429038002370300200441386a41186a221f200c290300370300200441386a41106a2220200d290300370300200441386a41086a2221200e290300370300200420042903e001370338200f201b2903003703002007201c2903003703002005201d290300370300200441e0016a41206a221b201e290300370300200c201f290300370300200d2020290300370300200e2021290300370300200420042903383703e001200441f8006a41186a201f290300370300200441f8006a41106a2020290300370300200441f8006a41086a2021290300370300200420042903383703782010200f29030037030020082007290300370300200620052903003703002004200b3602c0022004201b2903003703a002200441c4026a22052004290308370200201a2019290300370200201820172903003702002016201529030037020020142013290300370200201220112802003602002010290300212220082008290300222320027c22243703002010202220037c2024202354ad7c37030020062903002122200420042903a002222320027c22243703a0022006202220037c2024202354ad7c370300200441c0016a200120022003109f0120043502c001210220092903002122200a2903002103200441f8006a200441a0026a10d80302402005280200450d0020042802c00210290b200242018521020c070b200441a0026a2001108c0220042d00a0024101470d05200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a20022003109f0120043502384201852102200441386a41106a2903002122200441386a41086a29030021030c060b200441a0026a200120022003109f0120043502a0024201852102200441b0026a2903002122200441a8026a29030021030c050b410d4101102a000b412d4101102a000b20082006103e000b418f89c3004133104e000b420021020b2000200337030820002002370300200041106a2022370300200441f0026a24000b0900200042003702000bdb0201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410e10a80102400240410e10272203450d00200341066a410029009fa34437000020034100290099a3443700002003410e412e10282203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1000200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a10c70320031029200241d0006a24000f0b410e4101102a000b412e4101102a000b02000bd70302027f077e23004180016b22032400200341c0006a200110ae0302400240024020032903404201520d00200241016a2104200341c0006a41086a21020340200341086a41306a200241306a2903002205370300200341086a41286a200241286a2903002206370300200341086a41206a200241206a2903002207370300200341086a41186a200241186a2903002208370300200341086a41106a200241106a2903002209370300200341086a41086a200241086a290300220a37030020032002290300220b370308200341c0006a41306a2005370300200341c0006a41286a2006370300200341c0006a41206a2007370300200341c0006a41186a2008370300200341c0006a41106a20093703002002200a3703002003200b3703402004417f6a2204450d02200341c0006a200110ae0320032903404201510d000b0b200042003703000c010b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a2903003703000b20034180016a24000beb050a067f017e017f017e017f017e017f017e017f017e230041206b2202240002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d022001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c37000020052008370000024020032001490d00200321040c030b2006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c370000200520083700002003410172220420014f0d022006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a22012900002108200020054105746a220041086a2205290000210a200041106a2204290000210c200041186a2203290000210e20012000290000370000200141186a220629000021102006200e370000200141106a2206290000210e2006200c370000200141086a2201290000210c2001200a370000200320103700002004200e3700002005200c370000200020083700000b200241206a24000f0b41c481c500200520011037000b41b481c500200420011037000be90609067f017e017f017e017f027e017f017e027f230041206b22022400024020014101762203450d0003402003417f6a2203210402400240024003402004410174220541017221060240200541026a220520014f0d00200620014f0d0220052006200020064105746a200020054105746a412010d0044100481b21060b200620014f0d03200420014f0d02200020044105746a2204200020064105746a2205412010d004417f4a0d03200541086a22072900002108200541106a2209290000210a200541186a220b290000210c2004290000210d20042005290000370000200441186a220e290000210f200e200c370000200441106a220e290000210c200e200a370000200441086a2204290000210a20042008370000200b200f3700002009200c3700002007200a3700002005200d370000200621040c000b0b41b883c500200620011037000b41c883c500200420011037000b20030d000b0b0240024020014102490d002001210703402007417f6a220720014f0d02200241186a2209200041186a2204290000370300200241106a220b200041106a2205290000370300200241086a220e200041086a2203290000370300200020074105746a220641086a2900002108200641106a290000210a200641186a290000210c2000290000210d200020062900003700002004200c3700002005200a370000200320083700002002200d37030041002105024002400240034020062002290300370000200641186a2009290300370000200641106a200b290300370000200641086a200e2903003700002005410174220641017221040240200641026a220620074f0d00200420074f0d0220062004200020044105746a200020064105746a412010d0044100481b21040b200420074f0d03200520074f0d02200020054105746a2205200020044105746a2206412010d004417f4a0d032009200541186a2203290000370300200b200541106a2210290000370300200e200541086a2211290000370300200641086a2900002108200641106a290000210a200641186a290000210c2005290000210d200520062900003700002003200c3700002010200a370000201120083700002002200d370300200421050c000b0b41b883c500200420071037000b41c883c500200520071037000b200741014b0d000b0b200241206a24000f0b41c481c500200720011037000bdb08030a7f017e0a7f230041c0006b22022400200041a07f6a21032001417f6a2104200141324921054101210641002107024003400240024020062001490d00410021080c010b41012108200020064105746a2209200941606a412010d0044100480d0003404101210a20042006460d03200641016a2106200941206a220a2009412010d0042108200a21092008417f4a0d000b200620014921080b2006200146210a20050d0120062001460d0102400240024002402006417f6a220920014f0d002008450d0120002006410574220b6a220a290000210c200a200020094105746a22092900003700002009200c370000200a41086a220d290000210c200d200941086a220e290000370000200e200c370000200a41106a220f290000210c200f200941106a22102900003700002010200c370000200a41186a2211290000210c2011200941186a22122900003700002012200c37000020064102490d03200920002006417e6a22084105746a2213412010d004417f4a0d032009290000210c20092013290000370000200241206a41186a22142012290000370300200241206a41106a22152010290000370300200241206a41086a2216200e290000370300200e201341086a2900003700002010201341106a2900003700002012201341186a2900003700002002200c3703204100210e2008450d022003200b6a210903400240200241206a2009412010d0044100480d002008210e0c040b200941206a2009290000370000200941386a200941186a290000370000200941306a200941106a290000370000200941286a200941086a290000370000200941606a21092008417f6a22080d000c030b0b41b481c500200920011037000b41c481c500200620011037000b2000200e4105746a22092002290320370000200941186a2014290300370000200941106a2015290300370000200941086a20162903003700000b200741016a21070240200120066b22104102490d00200a41206a2209200a412010d004417f4a0d00200a290000210c200a2009290000370000200241206a41186a22122011290000370300200241206a41106a2213200f290000370300200241206a41086a220b200d290000370300200d200941086a290000370000200f200941106a2900003700002011200941186a2900003700002002200c3703204101210d024020104103490d00200a41c0006a200241206a412010d004417f4a0d00410321084102210e0340200a200e4105746a220941606a220d2009290000370000200d41186a200941186a290000370000200d41106a200941106a290000370000200d41086a200941086a290000370000024020082010490d00200e210d0c020b20084105742109200e210d2008210e200841016a2108200a20096a200241206a412010d0044100480d000b0b200a200d4105746a22092002290320370000200941186a2012290300370000200941106a2013290300370000200941086a200b2903003700000b20074105470d000b4100210a0b200241c0006a2400200a0bb204030e7f017e017f230041c0006b22032400200128020022042001280208220541047422066a210720012802042108200421010240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b0130024020012d0000220e41ac01470d00200141106a21010c020b2003410c6a41026a200b2d0000220f3a0000200320032f013022103b010c200141046a29020021112001410c6a2802002112200920103b0000200941026a200f3a00002003200e3a00302003201236023c20032011370234200341206a200341306a200210df032003200c2900003703102003200d290000370017024020032d0020220e411a470d002006200a41106a220a470d010c030b0b2000200e3a000020002003290310370001200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d00200a41046a28020010290b200141106a2101200a41106a2007470d000b0b2008450d02200410290c020b20012007460d0003400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a22012007470d000b0b02402008450d00200410290b2000411a3a00000b200341c0006a24000bf6d60202097f017e230041106b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dad0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450db00120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490df00120044101742207200620062007491b22074100480df0010240024020040d002007102721060c010b200928020020042007102821060b2006450db00120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df1012004410174220a20062006200a491b220a4100480df1010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490def0120044101742207200620062007491b22074100480def010240024020040d002007102721060c010b200928020020042007102821060b2006450db10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df0012004410174220a20062006200a491b220a4100480df0010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210a2001410c6a2802002104200141086a2802002109200141046a280200210b02400240200241086a2802002002410c6a2802002201460d00200a28020021050c010b200141016a22052001490dee0120014101742206200520052006491b22064100480dee010240024020010d002006102721050c010b200a28020020012006102821050b2005450db20120022005360204200241086a20063602002002410c6a28020021010b2002410c6a2206200141016a360200200520016a410e3a000020032009200b200b20094102746a200210e00320032d0000411a470d9303200241086a2107034002400240200728020020062802002201460d00200a28020021050c010b200141016a22052001490def0120014101742208200520052008491b22084100480def010240024020010d002008102721050c010b200a28020020012008102821050b2005450db4012002200536020420072008360200200628020021010b2006200141016a360200200520016a200441807f72200441ff0071200441077622011b3a00002001210420010d000b0240200941ffffffff0371450d00200b10290b2000411a3a00000c95030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490ded0120044101742206200520052006491b22064100480ded010240024020040d002006102721050c010b200228020420042006102821050b2005450db30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490dec0120044101742207200620062007491b22074100480dec010240024020040d002007102721060c010b200928020020042007102821060b2006450db30120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490ded012004410174220a20062006200a491b220a4100480ded010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490deb0120044101742207200620062007491b22074100480deb010240024020040d002007102721060c010b200928020020042007102821060b2006450db40120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490dec012004410174220a20062006200a491b220a4100480dec010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490deb0120044101742206200520052006491b22064100480deb010240024020040d002006102721050c010b200928020020042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dea0120044101742206200520052006491b22064100480dea010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490de90120044101742206200520052006491b22064100480de9010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de80120044101742207200620062007491b22074100480de8010240024020040d002007102721060c010b200928020020042007102821060b2006450db60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de9012004410174220a20062006200a491b220a4100480de9010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db801200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de70120044101742207200620062007491b22074100480de7010240024020040d002007102721060c010b200928020020042007102821060b2006450db70120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de8012004410174220a20062006200a491b220a4100480de8010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db901200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de60120044101742207200620062007491b22074100480de6010240024020040d002007102721060c010b200928020020042007102821060b2006450db80120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de7012004410174220a20062006200a491b220a4100480de7010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dba01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de50120044101742207200620062007491b22074100480de5010240024020040d002007102721060c010b200928020020042007102821060b2006450db90120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de6012004410174220a20062006200a491b220a4100480de6010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbb01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de40120044101742207200620062007491b22074100480de4010240024020040d002007102721060c010b200928020020042007102821060b2006450dba0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de5012004410174220a20062006200a491b220a4100480de5010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbc01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de30120044101742208200720072008491b22084100480de3010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de4012004410174220b20072007200b491b220b4100480de4010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de40120044101742209200620062009491b22094100480de4010240024020040d002009102721060c010b200a28020020042009102821060b2006450dbe012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de20120044101742208200720072008491b22084100480de2010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de3012004410174220b20072007200b491b220b4100480de3010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de30120044101742209200620062009491b22094100480de3010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de10120044101742208200720072008491b22084100480de1010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de2012004410174220b20072007200b491b220b4100480de2010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de20120044101742209200620062009491b22094100480de2010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de00120044101742208200720072008491b22084100480de0010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de1012004410174220b20072007200b491b220b4100480de1010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de10120044101742209200620062009491b22094100480de1010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddf0120044101742208200720072008491b22084100480ddf010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de0012004410174220b20072007200b491b220b4100480de0010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de00120044101742209200620062009491b22094100480de0010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dde0120044101742208200720072008491b22084100480dde010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddf012004410174220b20072007200b491b220b4100480ddf010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddf0120044101742209200620062009491b22094100480ddf010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc8012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c93010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddd0120044101742208200720072008491b22084100480ddd010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc70120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dde012004410174220b20072007200b491b220b4100480dde010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dde0120044101742209200620062009491b22094100480dde010240024020040d002009102721060c010b200a28020020042009102821060b2006450dca012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddc0120044101742208200720072008491b22084100480ddc010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc90120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddd012004410174220b20072007200b491b220b4100480ddd010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcb01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddd0120044101742209200620062009491b22094100480ddd010240024020040d002009102721060c010b200a28020020042009102821060b2006450dcc012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddb0120044101742208200720072008491b22084100480ddb010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddc012004410174220b20072007200b491b220b4100480ddc010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddc0120044101742209200620062009491b22094100480ddc010240024020040d002009102721060c010b200a28020020042009102821060b2006450dce012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dda0120044101742208200720072008491b22084100480dda010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddb012004410174220b20072007200b491b220b4100480ddb010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddb0120044101742209200620062009491b22094100480ddb010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8f010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd90120044101742208200720072008491b22084100480dd9010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dda012004410174220b20072007200b491b220b4100480dda010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dda0120044101742209200620062009491b22094100480dda010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd80120044101742208200720072008491b22084100480dd8010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd9012004410174220b20072007200b491b220b4100480dd9010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd90120044101742209200620062009491b22094100480dd9010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd70120044101742208200720072008491b22084100480dd7010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd8012004410174220b20072007200b491b220b4100480dd8010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd80120044101742209200620062009491b22094100480dd8010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd60120044101742208200720072008491b22084100480dd6010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da3022004410174220b20072007200b491b220b4100480da3020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da30220044101742209200620062009491b22094100480da3020240024020040d002009102721060c010b200a28020020042009102821060b2006450dd9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da10220044101742208200720072008491b22084100480da1020240024020040d002008102721070c010b200a28020020042008102821070b2007450dd80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da2022004410174220b20072007200b491b220b4100480da2020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dda01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da20220044101742209200620062009491b22094100480da2020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da00220044101742208200720072008491b22084100480da0020240024020040d002008102721070c010b200a28020020042008102821070b2007450dda0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da1022004410174220b20072007200b491b220b4100480da1020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450ddc01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da10220044101742209200620062009491b22094100480da1020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddd012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9f0220044101742208200720072008491b22084100480d9f020240024020040d002008102721070c010b200a28020020042008102821070b2007450ddc0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da0022004410174220b20072007200b491b220b4100480da0020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dde01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da00220044101742209200620062009491b22094100480da0020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddf012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9e0220044101742208200720072008491b22084100480d9e020240024020040d002008102721070c010b200a28020020042008102821070b2007450dde0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9f022004410174220b20072007200b491b220b4100480d9f020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9f0220044101742209200620062009491b22094100480d9f020240024020040d002009102721060c010b200a28020020042009102821060b2006450de1012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c87010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9d0220044101742208200720072008491b22084100480d9d020240024020040d002008102721070c010b200a28020020042008102821070b2007450de00120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9e022004410174220b20072007200b491b220b4100480d9e020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9e0220044101742209200620062009491b22094100480d9e020240024020040d002009102721060c010b200a28020020042009102821060b2006450de3012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9c0220044101742208200720072008491b22084100480d9c020240024020040d002008102721070c010b200a28020020042008102821070b2007450de20120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9d022004410174220b20072007200b491b220b4100480d9d020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9d0220044101742209200620062009491b22094100480d9d020240024020040d002009102721060c010b200a28020020042009102821060b2006450de5012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9b0220044101742208200720072008491b22084100480d9b020240024020040d002008102721070c010b200a28020020042008102821070b2007450de40120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9c022004410174220b20072007200b491b220b4100480d9c020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9c0220044101742209200520052009491b22094100480d9c020240024020040d002009102721050c010b200a28020020042009102821050b2005450de7012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a0220044101742208200720072008491b22084100480d9a020240024020040d002008102721070c010b200a28020020042008102821070b2007450de60120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b022004410174220b20072007200b491b220b4100480d9b020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b0220044101742209200620062009491b22094100480d9b020240024020040d002009102721060c010b200a28020020042009102821060b2006450de9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d990220044101742208200720072008491b22084100480d99020240024020040d002008102721070c010b200a28020020042008102821070b2007450de80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a022004410174220b20072007200b491b220b4100480d9a020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dea01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a0220044101742209200620062009491b22094100480d9a020240024020040d002009102721060c010b200a28020020042009102821060b2006450deb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450dea0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742207200520052007491b22074100480d96020240024020040d002007102721050c010b200228020420042007102821050b2005450dec0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210e1032003210220032d0000411a470df0020c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450dec0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c200210e2032003210220032d0000411a470def020c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d940220044101742208200520052008491b22084100480d94020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d940220054101742204200820082004491b22044100480d94020240024020050d002004102721050c010b200628020020052004102821050b2005450ded0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d930220044101742207200520052007491b22074100480d93020240024020040d002007102721050c010b200628020020042007102821050b2005450ded0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d930220054101742204200720072004491b22044100480d93020240024020050d002004102721050c010b200628020020052004102821050b2005450dee0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490def0120044101742206200520052006491b22064100480def010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dba0220044101742206200520052006491b22064100480dba020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db90220044101742206200520052006491b22064100480db9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db80220044101742206200520052006491b22064100480db8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db70220044101742206200520052006491b22064100480db7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db60220044101742206200520052006491b22064100480db6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db50220044101742206200520052006491b22064100480db5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db40220044101742206200520052006491b22064100480db4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db30220044101742206200520052006491b22064100480db3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db20220044101742206200520052006491b22064100480db2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db10220044101742206200520052006491b22064100480db1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db00220044101742206200520052006491b22064100480db0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daf0220044101742206200520052006491b22064100480daf020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae0220044101742206200520052006491b22064100480dae020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad0220044101742206200520052006491b22064100480dad020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dac0220044101742206200520052006491b22064100480dac020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dab0220044101742206200520052006491b22064100480dab020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daa0220044101742206200520052006491b22064100480daa020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da90220044101742206200520052006491b22064100480da9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da80220044101742206200520052006491b22064100480da8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da70220044101742206200520052006491b22064100480da7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da60220044101742206200520052006491b22064100480da6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da50220044101742206200520052006491b22064100480da5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da40220044101742206200520052006491b22064100480da4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da30220044101742206200520052006491b22064100480da3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da20220044101742206200520052006491b22064100480da2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da10220044101742206200520052006491b22064100480da1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da00220044101742206200520052006491b22064100480da0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9f0220044101742206200520052006491b22064100480d9f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9e0220044101742206200520052006491b22064100480d9e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9d0220044101742206200520052006491b22064100480d9d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9c0220044101742206200520052006491b22064100480d9c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9b0220044101742206200520052006491b22064100480d9b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9a0220044101742206200520052006491b22064100480d9a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d990220044101742206200520052006491b22064100480d99020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d980220044101742206200520052006491b22064100480d98020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d970220044101742206200520052006491b22064100480d97020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742206200520052006491b22064100480d96020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d940220044101742206200520052006491b22064100480d94020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d930220044101742206200520052006491b22064100480d93020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411a3a000020012d00004109470df201200141086a28020041ffffffff0371450df201200141046a28020010290cf2010b20064101102a000b20064101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20084101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b102b000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20074101102a000b20064101102a000b20084101102a000b20044101102a000b20074101102a000b20044101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20002003290300370200200041086a200341086a290300370200200941ffffffff0371450d01200b10290c010b20002002290200370200200041086a200241086a29020037020020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200341106a24000bb60301057f2004410c6a2105200441086a2106024002400240034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d0420074101742209200820082009491b22094100480d040240024020070d002009102721080c010b200428020420072009102821080b2008450d022004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b024020022003460d002004410c6a2105200441086a2106034020022802002101034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d0620074101742209200820082009491b22094100480d060240024020070d002009102721080c010b200428020420072009102821080b2008450d052004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b200241046a22022003470d000b0b2000411a3a00000f0b20094101102a000b20094101102a000b102b000bc30301067f200141c000712103200141ff0071210402400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107034002402005417f470d00200341ff01710d020b02400240200728020020062802002208460d00200228020421030c010b200841016a22032008490d0520084101742204200320032004491b22044100480d050240024020080d002004102721030c010b200228020420082004102821030b2003450d032002200336020420072004360200200628020021080b2006200841016a360200200320086a200141807f723a0000200541c000712103200541ff007121042005210120054107752208210520080d002008210520030d000b0b02400240200241086a2802002002410c6a2802002205460d00200228020421080c010b200541016a22082005490d0320054101742203200820082003491b22034100480d030240024020050d002003102721080c010b200228020420052003102821080b2008450d0220022008360204200241086a20033602002002410c6a28020021050b2002410c6a200541016a360200200820056a20043a00002000411a3a00000f0b20044101102a000b20034101102a000b102b000bc30301067f2001a7220341c000712104200341ff0071210502400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107034002402001427f520d00200441ff01710d020b02400240200728020020062802002204460d00200228020421050c010b200441016a22052004490d0520044101742208200520052008491b22084100480d050240024020040d002008102721050c010b200228020420042008102821050b2005450d032002200536020420072008360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b02400240200241086a2802002002410c6a2802002204460d00200228020421030c010b200441016a22032004490d0320044101742206200320032006491b22064100480d030240024020040d002006102721030c010b200228020420042006102821030b2003450d0220022003360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000f0b20084101102a000b20064101102a000b102b000bcf03010a7f230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110e403024020022802184101470d002000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010290b200741106a2107200641706a22060d000b0b2008450d04200910290c040b200220032900003703082002200429000037000f20022d0020210a2002200229000f37001f200220022903083703180240024020072008470d00200741016a220b2007490d032005200b200b2005491b220841ffffffff00712008470d032008410474220b4100480d030240024020070d00200b102721090c010b20092006200b102821090b2009450d010b200920066a220b200a3a0000200b41016a2002290318370000200b41086a200229001f370000200541026a2105200641106a2106200741016a2107200a41ff01714106460d030c010b0b200b4108102a000b102b000b20002009360204200041003602002000410c6a2007360200200041086a20083602000b200241306a24000b99b601020a7f017e230041f0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d02200320054f0d0120052003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c610b2001280200220620046a2d000021072001410c6a2208200536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d0020070ec001b702b702010203b70200000000000405060708090a00000000000000000b0c000000000d0e0f101100000012131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901b7020b2000410b3a000420004101360200200041056a20073a00000cb9020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da102200620056a2c00002101200820093602004100210a0240200141004e0d00411821090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410221070cbd020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a10e603200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbc020b4102210a410221070cb8020b4103210a410221070cb7020b4101210a0b410221070cb5020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da102200620056a2c00002101200820093602004100210a0240200141004e0d00411821090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410321070cbc020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a10e603200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbb020b4102210a410321070cb7020b4103210a410321070cb6020b4101210a0b410321070cb4020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da102200620056a2c00002101200820093602004100210a0240200141004e0d00411821090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410421070cbb020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a10e603200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cba020b4102210a410421070cb6020b4103210a410421070cb5020b4101210a0b410421070cb3020b410621070cb2020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb5020b410721070cb1020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb4020b410821070cb0020b200241d8006a200110e70341042109200228025822064101460da201200241e0006a280200210b200228025c210302400240200241e4006a28020022040d00410021074100210a0c010b0240024020044102742205410275220741ffffffff03712007470d0020054100480d002005102722090d0120054104102a000b102b000b200441027421042005417c6a210a410021050340200920056a200320056a2802003602002004200541046a2205470d000b200a41027641016a210a0b0240200b450d00200310290b20022d005c4105470dae022006450dae0220022802640da3010cae020b410a21070cae020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb1020b410b21070cad020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22044f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b20014120490d01410d210120074110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb0020b0240024020032004460d00200441016a22012004490dd901200320014f0d0120012003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000cb0020b200620046a2d0000210520082001360200024020050d00410c21074100210a0cad020b200041163a000420004101360200200041056a20053a00000caf020b410d21070cab020b410e21070caa020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cad020b410f21070ca9020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cac020b411021070ca8020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cab020b411121070ca7020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000caa020b411221070ca6020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000ca9020b411321070ca5020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddb01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca8020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9c010b20032001460d9a012001417f460dd7012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9b010b200aad210c411421070ca4020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddc01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca7020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9d010b20032001460d9b012001417f460dd8012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9c010b200aad210c411521070ca3020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddd01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca6020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9e010b20032001460d9c012001417f460dd9012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9d010b200aad210c411621070ca2020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dde01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca5020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9f010b20032001460d9d012001417f460dda012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9e010b200aad210c411721070ca1020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddf01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca4020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca0010b20032001460d9e012001417f460ddb012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9f010b200aad210c411821070ca0020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de001200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca3020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca1010b20032001460d9f012001417f460ddc012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da0010b200aad210c411921070c9f020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de101200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca2020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca2010b20032001460da0012001417f460ddd012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da1010b200aad210c411a21070c9e020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de201200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca1020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca3010b20032001460da1012001417f460dde012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da2010b200aad210c411b21070c9d020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de301200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca0020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca4010b20032001460da2012001417f460ddf012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da3010b200aad210c411c21070c9c020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de401200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9f020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca5010b20032001460da3012001417f460de0012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da4010b200aad210c411d21070c9b020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de501200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9e020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca6010b20032001460da4012001417f460de1012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da5010b200aad210c411e21070c9a020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de601200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9d020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca7010b20032001460da5012001417f460de2012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da6010b200aad210c411f21070c99020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de701200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9c020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca8010b20032001460da6012001417f460de3012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b41202107024020054120490d00410d21012004410f4b0da7010b200aad210c0c98020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de801200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9b020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca9010b20032001460da7012001417f460de4012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da8010b200aad210c412121070c97020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de901200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9a020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caa010b20032001460da8012001417f460de5012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da9010b200aad210c412221070c96020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dea01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c99020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cab010b20032001460da9012001417f460de6012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daa010b200aad210c412321070c95020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450deb01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c98020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cac010b20032001460daa012001417f460de7012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dab010b200aad210c412421070c94020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dec01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c97020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cad010b20032001460dab012001417f460de8012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dac010b200aad210c412521070c93020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ded01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c96020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cae010b20032001460dac012001417f460de9012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dad010b200aad210c412621070c92020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dee01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c95020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caf010b20032001460dad012001417f460dea012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dae010b200aad210c412721070c91020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450def01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c94020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb0010b20032001460dae012001417f460deb012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daf010b200aad210c412821070c90020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df001200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c93020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb1010b20032001460daf012001417f460dec012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db0010b200aad210c412921070c8f020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df101200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c92020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb2010b20032001460db0012001417f460ded012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db1010b200aad210c412a21070c8e020b0240024020032005460d00200441026a21012005417f460dee01200320014f0d0120012003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c91020b200620056a2d0000210920082001360200024020090d00412b21074100210a0c8e020b200041153a000420004101360200200041056a20093a00000c90020b0240024020032005460d00200441026a21012005417f460dee01200320014f0d0120012003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c90020b200620056a2d0000210920082001360200024020090d00412c21074100210a0c8d020b200041153a000420004101360200200041056a20093a00000c8f020b41002101410021090240024002400340410d210a2001411f4b0d010240024020032005460d002005417f460df2012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e6034105210a0c020b200620056a2c0000210420082007360200200441ff00712001411f71742009722109200141076a21012007210520044100480d000b200441c00071210502402001411f4b0d0020050d020b0240024020014120490d0020050d010b200441ff01714108490d0320014120490d032005450d010c030b20044180017241ff017141f7014b0d020b2000200a36020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c90020b2009417f2001411f71747221090b412d21070c8b020b4200210c4100210102400240024002400340410e21072001413f4b0d010240024020032005460d002005417f460df3012003200541016a22094f0d01200541016a2003107f000b200241013a0008200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241086a360238200241286a200241d8006a10e6032002290328210c20022802302101410521070c030b200620056a2d0000210420082009360200200441ff0071220aad2001413f71ad86200c84210c200141076a210120092105200441187441187522094100480d000b200941c00071210502402001413f4b0d0020050d030b02400240200141c000490d0020050d010b200141c000490d0420090d010c040b200a41ff00460d030b0b200020073a0004200020022f00183b000520004101360200200041106a2001360200200041086a200c370200200041076a2002411a6a2d00003a00000c8f020b200c427f2001413f71ad8684210c0b412e21070c8a020b02400240200320056b4104490d00200441056a21012005417b4b0dee01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320004281808080d000370300200041086a2002290228370200200041106a200241286a41086a2802003602000c8d020b200620056a280000210920082001360200412f21070c89020b02400240200320056b4108490d00200441096a2101200541774b0dee01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e6032002290328210c200041106a2002280230360200200041086a200c37020020004281808080d0003703000c8c020b200620056a290000210c20082001360200413021070c88020b413121070c87020b413221070c86020b413321070c85020b413421070c84020b413521070c83020b413621070c82020b413721070c81020b413821070c80020b413921070cff010b413a21070cfe010b413b21070cfd010b413c21070cfc010b413d21070cfb010b413e21070cfa010b413f21070cf9010b41c00021070cf8010b41c10021070cf7010b41c20021070cf6010b41c30021070cf5010b41c40021070cf4010b41c50021070cf3010b41c60021070cf2010b41c70021070cf1010b41c80021070cf0010b41c90021070cef010b41ca0021070cee010b41cb0021070ced010b41cc0021070cec010b41cd0021070ceb010b41ce0021070cea010b41cf0021070ce9010b41d00021070ce8010b41d10021070ce7010b41d20021070ce6010b41d30021070ce5010b41d40021070ce4010b41d50021070ce3010b41d60021070ce2010b41d70021070ce1010b41d80021070ce0010b41d90021070cdf010b41da0021070cde010b41db0021070cdd010b41dc0021070cdc010b41dd0021070cdb010b41de0021070cda010b41df0021070cd9010b41e00021070cd8010b41e10021070cd7010b41e20021070cd6010b41e30021070cd5010b41e40021070cd4010b41e50021070cd3010b41e60021070cd2010b41e70021070cd1010b41e80021070cd0010b41e90021070ccf010b41ea0021070cce010b41eb0021070ccd010b41ec0021070ccc010b41ed0021070ccb010b41ee0021070cca010b41ef0021070cc9010b41f00021070cc8010b41f10021070cc7010b41f20021070cc6010b41f30021070cc5010b41f40021070cc4010b41f50021070cc3010b41f60021070cc2010b41f70021070cc1010b41f80021070cc0010b41f90021070cbf010b41fa0021070cbe010b41fb0021070cbd010b41fc0021070cbc010b41fd0021070cbb010b41fe0021070cba010b41ff0021070cb9010b41800121070cb8010b41810121070cb7010b41820121070cb6010b41830121070cb5010b41840121070cb4010b41850121070cb3010b41860121070cb2010b41870121070cb1010b41880121070cb0010b41890121070caf010b418a0121070cae010b418b0121070cad010b418c0121070cac010b418d0121070cab010b418e0121070caa010b418f0121070ca9010b41900121070ca8010b41910121070ca7010b41920121070ca6010b41930121070ca5010b41940121070ca4010b41950121070ca3010b41960121070ca2010b41970121070ca1010b41980121070ca0010b41990121070c9f010b419a0121070c9e010b419b0121070c9d010b419c0121070c9c010b419d0121070c9b010b419e0121070c9a010b419f0121070c99010b41a00121070c98010b41a10121070c97010b41a20121070c96010b41a30121070c95010b41a40121070c94010b41a50121070c93010b41a60121070c92010b41a70121070c91010b41a80121070c90010b41a90121070c8f010b41aa0121070c8e010b41ab0121070c8d010b200041013602002000200241d8006a41047222012902003702042000410c6a200141086a2902003702000c8f010b200228026010290c8a010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8c010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8a010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c88010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c86010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c84010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c82010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c80010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7e0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7c0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7a0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c780b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c760b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c740b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c720b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c700b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6e0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6c0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6a0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c680b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c660b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c640b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c620b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c600b417f2005103e000b417f2009103e000b417f2009103e000b417f2009103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f2001103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f2001103e000b417f200541016a103e000b417f200541016a103e000b20052001103e000b20052001103e000b20092003107f000b20092003107f000b20092003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b0240024002400240024002402007200a470d002007210a0c010b2007200a490d010240200a0d004100210a024020070d00410421090c020b20091029410421090c010b20092007410274200a410274220510282209450d020b4100210541002107034002402005411f4d0d00410f21010c080b20012802082206200128020c2203460d06200341016a22042003490d0320062004490d04200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d21012003410f4b0d070b2007ad422086200aad84210c410921070c040b41ac87c5001058000b20054104102a000b417f2004103e000b20042006107f000b20004100360200200041106a200c3703002000410c6a2009360200200041096a200a3a0000200041086a20073a00000c020b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a280200360200200a41ffffffff0371450d00200910290b200241f0006a24000bd30101017f230041106b22022400024002400240024020002d00000e03010200010b2002200128021841dcbfc500410b2001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c020b2002200128021841e7bfc500410c2001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b2002200128021841f3bfc500410d2001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040b200241106a240020000b8a0301067f230041306b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b024002400240024002400240200141146a2802000d00200621070c010b02402004450d00024002402006410f4b0d002003280204450d010b200620066a220720064f0d020b4101210541002107200241086a21060c020b41f0d2c500410041001037000b2007417f4c0d01200241086a2106024020070d0041012105410021070c010b200710272205450d020b200241003602102002200736020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a29020037030020022001290200370318200241146a4180d3c500200241186a1091040d0220002006290200370200200041086a200641086a280200360200200241306a24000f0b1039000b20074101102a000b4198d3c5004133200241186a41ccd3c50010a201000bf30603067f017e067f230041c0006b2202240041002103410021040240024002400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005107f000b200241013a000f2002413c6a41013602002002420137022c20024180c0c5003602282002411f3602142002200241106a36023820022002410f6a360210200241186a200241286a10e603410521030c020b200128020020066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b200241086a200241186a41086a280200220136020020022002290218220837030020002003360204200041086a2008370200200041106a2001360200200041013602000c050b410421090240024020040d004100210a0c010b4100210a4100210b0340200b220c41016a210b4100210341002105024002400240034002402003411f4d0d00410f21010c020b024002402001280208220d200128020c2206460d00200641016a22072006490d09200d20074f0d012007200d107f000b200241013a00002002413c6a41013602002002420137022c20024180c0c5003602282002411f3602142002200241106a36023820022002360210200241186a200241286a10e60320022802182103200228021c2106200228022021074100210e410521010c030b200128020020066a2d000021062001200736020c200641ff00712003411f71742005722105200341076a21032006418001710d000b20034120490d0220064110490d02410d21010b0b20004101360200200041106a20073602002000410c6a2006360200200041086a20033602002000200e410874200172360204200a450d07200910290c070b0240200a200c470d00200a4101742203200a41016a220620062003491b220341ffffffff03712003470d06200341027422064100480d0602400240200a0d002006102721090c010b2009200a4102742006102821090b2009450d052003210a0b2005410876210e2009200c4102746a2005360200200b2004470d000b0b20002009360204200041003602002000410c6a2004360200200041086a200a3602000c040b417f2007103e000b417f2007103e000b20064104102a000b102b000b200241c0006a24000bf6d60202097f017e230041106b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dad0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450db00120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490df00120044101742207200620062007491b22074100480df0010240024020040d002007102721060c010b200928020020042007102821060b2006450db00120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df1012004410174220a20062006200a491b220a4100480df1010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490def0120044101742207200620062007491b22074100480def010240024020040d002007102721060c010b200928020020042007102821060b2006450db10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df0012004410174220a20062006200a491b220a4100480df0010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210a2001410c6a2802002104200141086a2802002109200141046a280200210b02400240200241086a2802002002410c6a2802002201460d00200a28020021050c010b200141016a22052001490dee0120014101742206200520052006491b22064100480dee010240024020010d002006102721050c010b200a28020020012006102821050b2005450db20120022005360204200241086a20063602002002410c6a28020021010b2002410c6a2206200141016a360200200520016a410e3a000020032009200b200b20094102746a200210e00320032d0000411a470d9303200241086a2107034002400240200728020020062802002201460d00200a28020021050c010b200141016a22052001490def0120014101742208200520052008491b22084100480def010240024020010d002008102721050c010b200a28020020012008102821050b2005450db4012002200536020420072008360200200628020021010b2006200141016a360200200520016a200441807f72200441ff0071200441077622011b3a00002001210420010d000b0240200941ffffffff0371450d00200b10290b2000411a3a00000c95030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490ded0120044101742206200520052006491b22064100480ded010240024020040d002006102721050c010b200228020420042006102821050b2005450db30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490dec0120044101742207200620062007491b22074100480dec010240024020040d002007102721060c010b200928020020042007102821060b2006450db30120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490ded012004410174220a20062006200a491b220a4100480ded010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490deb0120044101742207200620062007491b22074100480deb010240024020040d002007102721060c010b200928020020042007102821060b2006450db40120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490dec012004410174220a20062006200a491b220a4100480dec010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490deb0120044101742206200520052006491b22064100480deb010240024020040d002006102721050c010b200928020020042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dea0120044101742206200520052006491b22064100480dea010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490de90120044101742206200520052006491b22064100480de9010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de80120044101742207200620062007491b22074100480de8010240024020040d002007102721060c010b200928020020042007102821060b2006450db60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de9012004410174220a20062006200a491b220a4100480de9010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db801200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de70120044101742207200620062007491b22074100480de7010240024020040d002007102721060c010b200928020020042007102821060b2006450db70120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de8012004410174220a20062006200a491b220a4100480de8010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db901200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de60120044101742207200620062007491b22074100480de6010240024020040d002007102721060c010b200928020020042007102821060b2006450db80120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de7012004410174220a20062006200a491b220a4100480de7010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dba01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de50120044101742207200620062007491b22074100480de5010240024020040d002007102721060c010b200928020020042007102821060b2006450db90120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de6012004410174220a20062006200a491b220a4100480de6010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbb01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de40120044101742207200620062007491b22074100480de4010240024020040d002007102721060c010b200928020020042007102821060b2006450dba0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de5012004410174220a20062006200a491b220a4100480de5010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbc01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de30120044101742208200720072008491b22084100480de3010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de4012004410174220b20072007200b491b220b4100480de4010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de40120044101742209200620062009491b22094100480de4010240024020040d002009102721060c010b200a28020020042009102821060b2006450dbe012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de20120044101742208200720072008491b22084100480de2010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de3012004410174220b20072007200b491b220b4100480de3010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de30120044101742209200620062009491b22094100480de3010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de10120044101742208200720072008491b22084100480de1010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de2012004410174220b20072007200b491b220b4100480de2010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de20120044101742209200620062009491b22094100480de2010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de00120044101742208200720072008491b22084100480de0010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de1012004410174220b20072007200b491b220b4100480de1010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de10120044101742209200620062009491b22094100480de1010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddf0120044101742208200720072008491b22084100480ddf010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de0012004410174220b20072007200b491b220b4100480de0010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de00120044101742209200620062009491b22094100480de0010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dde0120044101742208200720072008491b22084100480dde010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddf012004410174220b20072007200b491b220b4100480ddf010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddf0120044101742209200620062009491b22094100480ddf010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc8012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c93010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddd0120044101742208200720072008491b22084100480ddd010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc70120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dde012004410174220b20072007200b491b220b4100480dde010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dde0120044101742209200620062009491b22094100480dde010240024020040d002009102721060c010b200a28020020042009102821060b2006450dca012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddc0120044101742208200720072008491b22084100480ddc010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc90120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddd012004410174220b20072007200b491b220b4100480ddd010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcb01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddd0120044101742209200620062009491b22094100480ddd010240024020040d002009102721060c010b200a28020020042009102821060b2006450dcc012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddb0120044101742208200720072008491b22084100480ddb010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddc012004410174220b20072007200b491b220b4100480ddc010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddc0120044101742209200620062009491b22094100480ddc010240024020040d002009102721060c010b200a28020020042009102821060b2006450dce012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dda0120044101742208200720072008491b22084100480dda010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddb012004410174220b20072007200b491b220b4100480ddb010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddb0120044101742209200620062009491b22094100480ddb010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8f010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd90120044101742208200720072008491b22084100480dd9010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dda012004410174220b20072007200b491b220b4100480dda010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dda0120044101742209200620062009491b22094100480dda010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd80120044101742208200720072008491b22084100480dd8010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd9012004410174220b20072007200b491b220b4100480dd9010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd90120044101742209200620062009491b22094100480dd9010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd70120044101742208200720072008491b22084100480dd7010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd8012004410174220b20072007200b491b220b4100480dd8010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd80120044101742209200620062009491b22094100480dd8010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd60120044101742208200720072008491b22084100480dd6010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da3022004410174220b20072007200b491b220b4100480da3020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da30220044101742209200620062009491b22094100480da3020240024020040d002009102721060c010b200a28020020042009102821060b2006450dd9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da10220044101742208200720072008491b22084100480da1020240024020040d002008102721070c010b200a28020020042008102821070b2007450dd80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da2022004410174220b20072007200b491b220b4100480da2020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dda01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da20220044101742209200620062009491b22094100480da2020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da00220044101742208200720072008491b22084100480da0020240024020040d002008102721070c010b200a28020020042008102821070b2007450dda0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da1022004410174220b20072007200b491b220b4100480da1020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450ddc01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da10220044101742209200620062009491b22094100480da1020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddd012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9f0220044101742208200720072008491b22084100480d9f020240024020040d002008102721070c010b200a28020020042008102821070b2007450ddc0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da0022004410174220b20072007200b491b220b4100480da0020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dde01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da00220044101742209200620062009491b22094100480da0020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddf012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9e0220044101742208200720072008491b22084100480d9e020240024020040d002008102721070c010b200a28020020042008102821070b2007450dde0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9f022004410174220b20072007200b491b220b4100480d9f020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9f0220044101742209200620062009491b22094100480d9f020240024020040d002009102721060c010b200a28020020042009102821060b2006450de1012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c87010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9d0220044101742208200720072008491b22084100480d9d020240024020040d002008102721070c010b200a28020020042008102821070b2007450de00120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9e022004410174220b20072007200b491b220b4100480d9e020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9e0220044101742209200620062009491b22094100480d9e020240024020040d002009102721060c010b200a28020020042009102821060b2006450de3012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9c0220044101742208200720072008491b22084100480d9c020240024020040d002008102721070c010b200a28020020042008102821070b2007450de20120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9d022004410174220b20072007200b491b220b4100480d9d020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9d0220044101742209200620062009491b22094100480d9d020240024020040d002009102721060c010b200a28020020042009102821060b2006450de5012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9b0220044101742208200720072008491b22084100480d9b020240024020040d002008102721070c010b200a28020020042008102821070b2007450de40120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9c022004410174220b20072007200b491b220b4100480d9c020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9c0220044101742209200520052009491b22094100480d9c020240024020040d002009102721050c010b200a28020020042009102821050b2005450de7012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a0220044101742208200720072008491b22084100480d9a020240024020040d002008102721070c010b200a28020020042008102821070b2007450de60120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b022004410174220b20072007200b491b220b4100480d9b020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b0220044101742209200620062009491b22094100480d9b020240024020040d002009102721060c010b200a28020020042009102821060b2006450de9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d990220044101742208200720072008491b22084100480d99020240024020040d002008102721070c010b200a28020020042008102821070b2007450de80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a022004410174220b20072007200b491b220b4100480d9a020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dea01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a0220044101742209200620062009491b22094100480d9a020240024020040d002009102721060c010b200a28020020042009102821060b2006450deb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450dea0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742207200520052007491b22074100480d96020240024020040d002007102721050c010b200228020420042007102821050b2005450dec0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210e1032003210220032d0000411a470df0020c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450dec0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c200210e2032003210220032d0000411a470def020c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d940220044101742208200520052008491b22084100480d94020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d940220054101742204200820082004491b22044100480d94020240024020050d002004102721050c010b200628020020052004102821050b2005450ded0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d930220044101742207200520052007491b22074100480d93020240024020040d002007102721050c010b200628020020042007102821050b2005450ded0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d930220054101742204200720072004491b22044100480d93020240024020050d002004102721050c010b200628020020052004102821050b2005450dee0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490def0120044101742206200520052006491b22064100480def010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dba0220044101742206200520052006491b22064100480dba020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db90220044101742206200520052006491b22064100480db9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db80220044101742206200520052006491b22064100480db8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db70220044101742206200520052006491b22064100480db7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db60220044101742206200520052006491b22064100480db6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db50220044101742206200520052006491b22064100480db5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db40220044101742206200520052006491b22064100480db4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db30220044101742206200520052006491b22064100480db3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db20220044101742206200520052006491b22064100480db2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db10220044101742206200520052006491b22064100480db1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db00220044101742206200520052006491b22064100480db0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daf0220044101742206200520052006491b22064100480daf020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae0220044101742206200520052006491b22064100480dae020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad0220044101742206200520052006491b22064100480dad020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dac0220044101742206200520052006491b22064100480dac020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dab0220044101742206200520052006491b22064100480dab020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daa0220044101742206200520052006491b22064100480daa020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da90220044101742206200520052006491b22064100480da9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da80220044101742206200520052006491b22064100480da8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da70220044101742206200520052006491b22064100480da7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da60220044101742206200520052006491b22064100480da6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da50220044101742206200520052006491b22064100480da5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da40220044101742206200520052006491b22064100480da4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da30220044101742206200520052006491b22064100480da3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da20220044101742206200520052006491b22064100480da2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da10220044101742206200520052006491b22064100480da1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da00220044101742206200520052006491b22064100480da0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9f0220044101742206200520052006491b22064100480d9f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9e0220044101742206200520052006491b22064100480d9e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9d0220044101742206200520052006491b22064100480d9d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9c0220044101742206200520052006491b22064100480d9c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9b0220044101742206200520052006491b22064100480d9b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9a0220044101742206200520052006491b22064100480d9a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d990220044101742206200520052006491b22064100480d99020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d980220044101742206200520052006491b22064100480d98020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d970220044101742206200520052006491b22064100480d97020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742206200520052006491b22064100480d96020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d940220044101742206200520052006491b22064100480d94020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d930220044101742206200520052006491b22064100480d93020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411a3a000020012d00004109470df201200141086a28020041ffffffff0371450df201200141046a28020010290cf2010b20064101102a000b20064101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20084101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b102b000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20074101102a000b20064101102a000b20084101102a000b20044101102a000b20074101102a000b20044101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20002003290300370200200041086a200341086a290300370200200941ffffffff0371450d01200b10290c010b20002002290200370200200041086a200241086a29020037020020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200341106a24000b8307010c7f200028021021030240024002400240200028020822044101460d0020030d012000280218200120022000411c6a28020028020c11050021030c030b2003450d010b0240024020020d00410021020c010b200120026a2105200041146a28020041016a21064100210720012103200121080340200341016a210902400240024020032c0000220a417f4a0d000240024020092005470d004100210b200521030c010b20032d0001413f71210b200341026a220921030b200a411f71210c0240200a41ff0171220a41df014b0d00200b200c41067472210a0c020b0240024020032005470d004100210d2005210e0c010b20032d0000413f71210d200341016a2209210e0b200d200b41067472210b0240200a41f0014f0d00200b200c410c7472210a0c020b02400240200e2005470d004100210a200921030c010b200e41016a2103200e2d0000413f71210a0b200b410674200c411274418080f0007172200a72220a418080c400470d020c040b200a41ff0171210a0b200921030b02402006417f6a2206450d00200720086b20036a21072003210820052003470d010c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20040d002000280218200120022000411c6a28020028020c1105000f0b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b0240200220096b200028020c2206490d002000280218200120022000411c6a28020028020c1105000f0b410021074100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a210a024002400240410020002d0030220320034103461b0e0402000100020b200a21074100210a0c010b200a4101762107200a41016a410176210a0b200741016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110400450d000b41010f0b2000280204210941012103200028021820012002200028021c28020c1105000d00200a41016a2103200028021c210a20002802182100034002402003417f6a22030d0041000f0b20002009200a280210110400450d000b41010f0b20030bfb07030e7f017e017f200241086a2103200241046a210420012802002205210602400240024002400240034002400240200428020020032802002207460d00200228020021080c010b200741016a22082007490d0220074101742209200820082009491b22094100480d020240024020070d002009102721080c010b200228020020072009102821080b2008450d032002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a21072006450d03200a21072005450d03200b41746a210d200241086a210841002107200a210e02400340200e2103024003402003280200220f0d01200741016a2107200b2003410c6a2203470d000c080b0b2003410c6a210e200741016a21102005417f6a2105200341046a290200211102400240034002400240200241046a220428020020082802002206460d00200228020021090c010b200641016a22092006490d0620064101742201200920092001491b22014100480d060240024020060d002001102721090c010b200228020020062001102821090b2009450d022002200936020020042001360200200828020021060b2008200641016a360200200920066a200741807f72200741ff0071200741077622061b3a0000200621072006450d020c000b0b20014101102a000b2011422088a7221221060240034002400240200428020020082802002207460d00200228020021090c010b200741016a22092007490d0520074101742201200920092001491b22014100480d050240024020070d002001102721090c010b200228020020072001102821090b2009450d022002200936020020042001360200200828020021070b2008200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b0240024020042802002206200828020022076b2012490d00200228020021060c010b200720126a22092007490d0420064101742207200920092007491b22074100480d040240024020060d002007102721060c010b200228020020062007102821060b2006450d032002200636020020042007360200200828020021070b2008200720126a360200200620076a200f201210ce041a02402011a7450d00200f10290b200d2003460d052010210720050d010c050b0b20014101102a000b20074101102a000b102b000b20094101102a000b2003410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d00200610290b2007410c6a2207200b470d000b0b0240200c450d00200a10290b2000411a3a00000bcb0401067f200441046a2105024002400240024002400240200441086a2802002004410c6a2802002206460d00200528020021070c010b200641016a22072006490d0420064101742208200720072008491b22084100480d040240024020060d002008102721070c010b200528020020062008102821070b2007450d0120042007360204200441086a20083602002004410c6a28020021060b2004410c6a2208200641016a360200200720066a20024101463a0000200441086a2109034002400240200928020020082802002206460d00200528020021070c010b200641016a22072006490d052006410174220a20072007200a491b220a4100480d050240024020060d00200a102721070c010b20052802002006200a102821070b2007450d03200420073602042009200a360200200828020021060b2008200641016a360200200720066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2107200441086a2108034002400240200828020020072802002206460d00200528020021010c010b200641016a22012006490d0620064101742209200120012009491b22094100480d060240024020060d002009102721010c010b200528020020062009102821010b2001450d052004200136020420082009360200200728020021060b2007200641016a360200200120066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b20084101102a000b200a4101102a000b20094101102a000b102b000bc30701097f230041d0006b2202240002400240024002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d0420032005490d072001280200220620046a2d000021072001200536020c0240200741014d0d00410c21040c020b4100210820070e020302030b200241013a001f200241cc006a41013602002002420137023c20024180c0c5003602382002411f3602342002200241306a36024820022002411f6a360230200241206a200241386a10e6032002411a6a200241286a28020036010020022002290320370112200220022901103703002002200241166a290100370106410521040b200020073a0005200020043a000420002002290300370106200041013602002000410c6a20022901063701000c060b410121080b410120036b2109200441026a2104410021074100210a02400240034002402007411f4d0d00410f21070c020b02400240200920046a4102460d002004450d06200320044f0d0120042003107f000b200241013a0000200241cc006a41013602002002420137023c20024180c0c5003602382002411f3602342002200241306a36024820022002360230200241106a200241386a10e603410521070c020b200620046a417f6a2d000021052001200436020c200541ff00712007411f7174200a72210a200441016a2104200741076a21072005418001710d000b20074120490d01410d210720054110490d010b2000200736020420004101360200200041086a2002290210370200200041106a200241106a41086a2802003602000c050b0240024020080d00410021040c010b2004417f6a2104410021074100210802400240034002402007411f4d0d00410f21040c020b0240024020032004460d002004417f460d082003200441016a22094f0d01200441016a2003107f000b200241013a0000200241cc006a41013602002002420137023c20024180c0c5003602382002411f3602342002200241306a36024820022002360230200241106a200241386a10e603410521040c020b200620046a2d000021052001200936020c200541ff00712007411f71742008722108200741076a2107200921042005418001710d000b20074120490d01410d210420054110490d010b2000200436020420004101360200200041086a2002290210370200200041106a200241106a41086a2802003602000c060b410121040b2000200a360204200041003602002000410c6a2008360200200041086a20043602000c040b417f2005103e000b417f2004103e000b417f200441016a103e000b20052003107f000b200241d0006a24000ba60301077f2002410c6a2103200141086a28020022042105024002400240034002400240200241086a220628020020032802002207460d00200228020421080c010b200741016a22082007490d0420074101742209200820082009491b22094100480d040240024020070d002009102721080c010b200228020420072009102821080b2008450d022002200836020420062009360200200328020021070b2003200741016a360200200820076a200541807f72200541ff0071200541077622071b3a00002007210520070d000b200128020421032001280200210802400240200241086a28020022052002410c6a28020022076b2004490d00200228020421050c010b200720046a22062007490d0320054101742207200620062007491b22074100480d030240024020050d002007102721050c010b200228020420052007102821050b2005450d0220022005360204200241086a20073602002002410c6a28020021070b2002410c6a200720046a360200200520076a2008200410ce041a02402003450d00200810290b2000411a3a00000f0b20094101102a000b20074101102a000b102b000b8b07010b7f230041d0086b22022400410021034100210402400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005107f000b200241013a0089082002411c6a41013602002002420137020c20024180c0c5003602082002411f36029c08200220024198086a360218200220024189086a36029808200241b8086a200241086a10e603410521030c020b2001280200220820066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b2000200336020420004101360200200041086a20022902b808370200200041106a200241b8086a41086a2802003602000c030b024020040d002000428080808010370200200041086a42003702000c030b200241086a410041800810cd041a410121094100210a410021064100210b03400240024002400240200520076b2004200b6b22034180082003418008491b2203490d00200720036a220c2007490d022005200c4f0d01200c2005107f000b200241013a00a708200241cc086a4101360200200242013702bc0820024180c0c5003602b8082002411f36029c08200220024198086a3602c8082002200241a7086a36029808200241a8086a200241b8086a10e60320024194086a200241b0086a280200360000200220022903a80837008c08200041053a000420002002290089083700052000410c6a20024190086a29000037000020004101360200200a450d06200910290c060b200241086a200820076a200310ce041a2001200c36020c0240200a20066b2003490d00200320066a210c0c020b0240200620036a220c2006490d00200a4101742207200c200c2007491b22074100480d0002400240200a0d002007102721090c010b2009200a2007102821090b02402009450d002007210a0c030b20074101102a000b102b000b2007200c103e000b200920066a200241086a200310ce041a20042003200b6a220b4d0d02200128020c21072001280208210520012802002108200c21060c000b0b417f2007103e000b200241086a2009200c10dc01024020022802084101470d000240200a450d00200910290b200041083a0004200041013602000c010b200020093602042000410c6a200c360200200041086a200a360200200041003602000b200241d0086a24000b1600200120002802002200280200200028020810e9030bef0201067f230041c0006b2202240041002103410021040240024003400240024002402003411f4b0d002001280204220520012802082206460d01200641016a22072006490d04200520074f0d0220072005107f000b200041013602002000410f3a00040c040b200241013a000f200241346a41013602002002420137022420024180c0c5003602202002411f36023c2002200241386a36023020022002410f6a360238200241106a200241206a10e6032002410b6a200241186a28020036000020022002290310370003200041053a0004200020022900003700052000410c6a200241076a290000370000200041013602000c030b200128020020066a2d0000210620012007360208200641ff00712003411f71742004722104200341076a21032006418001710d000b0240024020034120490d002006410f4b0d010b20004100360200200020043602040c020b200041013602002000410d3a00040c010b417f2007103e000b200241c0006a24000bdb06010a7f20012802042103200128020021044100210541012106410021072001280208220821090240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d070240024020050d00200a102721060c010b20062005200a102821060b2006450d02200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d052005410174220a20092009200a491b220941004e0d010c050b200a4101102a000b0240024020050d002009102721060c010b200620052009102821060b2006450d01200921050b200620076a2004200810ce041a02402003450d00200410290b200128020c210c0240200520086b20076b200141146a2802002209490d00200820096a20076a21030c020b200820076a220a20096a2203200a490d022005410174220a20032003200a491b220a4100480d020240024020050d00200a102721060c010b20062005200a102821060b02402006450d00200a21050c020b200a4101102a000b20094101102a000b200620086a20076a200c200910ce041a200241086a210b200241046a210820032109024002400340024002402008280200200b2802002207460d002002280200210a0c010b200741016a220a2007490d0420074101742204200a200a2004491b22044100480d040240024020070d0020041027210a0c010b2002280200200720041028210a0b200a450d022002200a36020020082004360200200b28020021070b200b200741016a360200200a20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b02400240200241046a2802002209200241086a28020022076b2003490d00200228020021090c010b200720036a220a2007490d0320094101742207200a200a2007491b22074100480d030240024020090d002007102721090c010b200228020020092007102821090b2009450d0220022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a2006200310ce041a02402005450d00200610290b2000411a3a00000240200141106a280200450d00200c10290b0f0b20044101102a000b20074101102a000b102b000be5bc0106077f017e047f017e197f027e230041f080046b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280204220320012802082204460d00200441016a22052004490d02200320054f0d0120052003107f000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210420022802dc8004210120004101360200200041003a00042001450d1d200410290c1d0b200128020020046a2d00002104200120053602082004410b4b0d02024020040e0c00100f0e0d0c0b0a02060504000b200241c0006a200110f0034101210620022802442107024020022802404101470d0020074108762108200241d0006a2802002101200241c0006a41086a29030021090c1c0b4100210a200241c0006a41004180800110cd041a4100210b410021032007450d10410121064100210b410021054100210c034002400240024002402001280204220d200128020822036b2007200c6b220441808001200441808001491b2204490d00200320046a22082003490d02200d20084f0d012008200d107f000b200241013a00c88004200241ec80046a4101360200200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c880046a360220200241286a200241d880046a10e6032002290328210920022802302101410521070240200b450d00200610290b0c1f0b200241c0006a200128020020036a200410ce041a200120083602080240200b20056b2004490d00200420056a21030c020b200520046a22032005490d14200b4101742208200320032008491b22084100480d1402400240200b0d002008102721060c010b2006200b2008102821060b02402006450d002008210b0c020b20084101102a000b20032008103e000b200620056a200241c0006a200410ce041a2003210520072004200c6a220c4b0d000c110b0b417f2005103e000b200241c0006a200110f303024020022802404101470d00200041013602002000200241c0006a41047222012902003702042000410c6a200141086a2902003702000c1b0b200241d4006a2802002108200241d0006a2802002101200241cc006a2802002105200241c8006a280200210b2002280244210c410021044100210302400240034002402004411f4d0d00410f21010c0a0b20052001460d082001417f460d012005200141016a2206490d02200c20016a2d0000220a41ff00712004411f71742003722103200441076a210420062101200a418001710d000b20044120490d06410d2101200a410f4b0d080c060b417f200141016a103e000b200141016a2005107f000b200041123a000420004101360200200041056a20043a00000c190b200241c0006a200110f3030240024020022802404101470d00200228024422014108762106200241c0006a41086a2903002209422088210e200241d0006a280200210a0c010b200241386a200241d4006a280200360200200241306a200241cc006a29020037030020022002290244370328410021064100210141002105024002400240024002400240024002400240034002402001411f4d0d00410f21070c070b2002280230220a20022802342204460d08200441016a22032004490d02200a2003490d01200228022820046a2d0000210420022003360234200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d0041002106410d21070c060b02400240024020050d004100210d410421030c010b410421034100210d4100210703402007220f41016a2107410021014100210c02400240024002400240024003404100210602402001411f4d0d00410f21070c0f0b2002280230220b20022802342204460d01200441016a220a2004490d02200b200a490d04200228022820046a2d000021042002200a360234200441ff00712001411f7174200c72210c200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d21070c0e0b200241c0006a200241286a10e303024020022802404101470d002002280244220741087621062002280250210a200228024c210b200228024821080c0e0b200228024c21102002280248211120022802442112410021044100210b034002402004411f4d0d00410f21070c0e0b200228023022062002280234220a460d0c200a41016a2201200a490d0320062001490d0520022802282208200a6a2d0000210a20022001360234200a41ff00712004411f7174200b72210b200441076a2104200a418001710d000b20044120490d05200a410f4d0d05410d21070c0c0b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a72108410521070c0c0b417f200a103e000b417f2001103e000b200a200b107f000b20012006107f000b41002113200241c0006a41004180800410cd041a02400240200b0d0041012114410021150c010b41002113410121144100210a4100211603400240024002400240200620016b200b20166b220441808004200441808004491b2204490d00200120046a22152001490d02200620154f0d0120152006107f000b200241013a00c78004200241013602ec8004200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c780046a360220200241c880046a200241d880046a10e60320022802c88004210820022802cc8004210b20022802d08004210a410521072013450d0b201410290c0b0b200241c0006a200820016a200410ce041a2002201536023402402013200a6b2004490d002004200a6a21150c020b200a20046a2215200a490d1e20134101742201201520152001491b22014100480d1e0240024020130d002001102721140c010b201420132001102821140b02402014450d00200121130c020b20014101102a000b20012015103e000b2014200a6a200241c0006a200410ce041a200b200420166a22164d0d012002280234210120022802302106200228022821082015210a0c000b0b0240200d200f470d00200d4101742201200d41016a220420042001491b2201ad421c7e2209422088a70d1b2009a722044100480d1b02400240200d0d002004102721030c010b2003200d411c6c2004102821030b2003450d032001210d0b2003200f411c6c6a2201200c41087622043b000120012014360210200120123602042001200c3a0000200141036a20044110763a0000200141186a2015360200200141146a20133602002001410c6a2010360200200141086a201136020020072005470d000b0b200228023420022802384621010240200228022c450d00200228022810290b2001450d072005ad422086200dad842109410c21040c1c0b20044104102a000b2003200a107f000b417f2003103e000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a72108410521070b02402010450d0020104104742104201221010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b410021062011450d00201210290b0240200f450d002003200f411c6c6a210c20032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200c470d000b0b200d450d03200310290c030b4100210b410021080c020b20024103410220011b3a00c88004200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d88004210920022802e08004210a02402005450d0020032005411c6c6a210620032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b2001210520012006470d000b0b2009422088210e4105210141002106200d450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a7210841052107410021060b2006410874200741ff0171722101200bad220e4220862008ad842109200228022c450d00200228022810290b20004101360200200041106a200a360200200041086a200e422086200942ffffffff0f838437020020002006410874200141ff0171723602040c180b200241c0006a200110f3030240024020022802404101470d002002280244220b4108762101200241c0006a41086a2903002209422088210e200241d0006a28020021080c010b200241d4006a2802002114200241d0006a2802002101200241cc006a280200210a200241c8006a28020021132002280244210c410021044100210602400240024002400240024002400240024002400240024002400240034002402004411f4d0d00410f210b0c020b02400240200a2001460d002001417f460d06200a200141016a22054f0d01200141016a200a107f000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d88004210920022802e0800421084105210b0c030b200c20016a2d0000220341ff00712004411f71742006722106200441076a2104200521012003418001710d000b20044120490d0220034110490d02410d210b0b0b2009422088a7210d2009a721160c0b0b024002400240024002400240024002400240024002400240024020060d0041002117410421030c010b200241c9006a211841042103410021174100211903402019221a41016a2119410021014100210b034002402001411f4d0d00410f210b0c170b200a2005460d142005417f460d0d200a200541016a2204490d06200c20056a2d0000220741ff00712001411f7174200b72210b200141076a2101200421052007418001710d000b024020014120490d002007410f4d0d00410d210b0c160b4100210f200241c0006a41004180800110cd041a02400240200b0d00410121102004210541002111410021070c010b41002111410121104100211541002112034002400240200a20046b200b20126b220141808001200141808001491b2201490d00200420016a22052004490d0f200a20054f0d012005200a107f000b200241013a00c78004200241013602ec8004200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c780046a360220200241c880046a200241d880046a10e60320022903c880042209422088a7210d20022802d0800421082009a721164105210b2011450d18201010290c180b200241c0006a200c20046a200110ce041a02400240201120156b2001490d00200120156a21070c010b201520016a22072015490d2820114101742204200720072004491b22044100480d280240024020110d002004102721100c010b201020112004102821100b2010450d0d200421110b201020156a200241c0006a200110ce041a2005210420072115200b200120126a22124b0d000b0b20024100360234200220103602282002200736023820022007ad4220862011ad8437022c4100210141002112034002402001411f4d0d00410f210b0c140b2007200f460d12200f417f460d0a2007200f41016a220b490d052010200f6a2d000021042002200b360234200441ff00712001411f71742012722112200141076a2101200b210f2004418001710d000b024020014120490d002004410f4d0d00410d210b0c130b4100211b0240024020120d004104211c410021110c010b410021114104211c4100211d0340201d221e41016a211d4100210141002115024002400240034002402001411f4d0d00410f211520162101200d211f0c020b024002402002280230220f20022802342204460d00200441016a220b2004490d10200f200b4f0d01200b200f107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7211f20022802e0800421082009a72101410521150c020b2002280228221020046a2d000021072002200b360234200741ff00712001411f71742015722115200141076a21012007418001710d000b20014120490d0120074110490d0120162101200d211f410d21150b200141087621204101210741002104200821214100210b20012116201f210d0c010b0240024002400240200f200b460d00200441026a2101200b417f460d0e200f20014f0d012001200f107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022802d88004212220022802dc8004212320022802e080042124410521150c010b2010200b6a2c00002104200220013602340240200441004e0d00411821150c010b0240200441c000710d00410621150c010b200441807f72220141ff017141fb014b0d0141062115200121040b20224108762120410121074100210b2023211f20242121202221010c010b20154180807c71210b201541087621042001417f732101410021070b200b200441ff017141087472201541ff017172210b02402007450d002020410874200141ff01717221162011450d15201c10290c150b02402011201e470d0020114101742204201141016a220720072004491b220441ffffffff01712004470d28200441037422074100480d280240024020110d0020071027211c0c010b201c201141037420071028211c0b201c450d09200421110b201c201e4103746a220420013a00042004200b360200201d2012470d000b0b4101210b41082110410021014100210741002115034020012104200241c0006a200241286a10e403024020022802404101470d0020022802502121200228024c211f200228024821162002280244210b0c120b200241d880046a41026a2201201841026a2d00003a0000200220182f00003b01d88004200228024c211e2002280250211d200228025421250240024020022d0048220f4106470d00200b417f6a210b0c010b200f417e6a41034f0d00200b41016a2226200b4f21272026210b20270d004115211f419487c50021164104210b200f4109470d11201d41ffffffff03710d100c110b200241c0006a41026a222620012d00003a0000200220022f01d880043b0140024020072015470d00200741016a22012007490d27201b20012001201b491b221541ffffffff00712015470d27201541047422014100480d270240024020070d002001102721100c010b201020042001102821100b2010450d040b201020046a2201200f3a00002001410c6a2025360200200141086a201d360200200141046a201e360200200141016a20022f01403b0000200141036a20262d00003a0000201b41026a211b200441106a2101200741016a2107200b0d000b200228023420022802384621010240200228022c450d00200228022810290b2001450d1402402017201a470d0020174101742201201741016a220420042001491b2201ad42187e2209422088a70d262009a722044100480d260240024020170d002004102721030c010b2003201741186c2004102821030b2003450d04200121170b2003201a41186c6a2201201036020c20012012360208200120113602042001201c360200200141146a2007360200200141106a201536020020192006470d000b0b2005201446210102402013450d00200c10290b2001450d142006ad4220862017ad842109410b21040c270b20014108102a000b20044104102a000b200f41016a2007107f000b200541016a200a107f000b20074104102a000b417f2001103e000b417f200b103e000b417f200f41016a103e000b20044101102a000b20042005103e000b417f200541016a103e000b417f200141016a103e000b201e10290b0b02402007450d00201021010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b02402015450d00201010290b2011450d01201c10290c010b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7211f20022802e0800421212009a721164105210b0b0240200228022c450d00200228022810290b201f210d202121080c020b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210d20022802e0800421082009a721164105210b0c010b20024103410220011b3a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022802d88004211620022802dc8004210d20022802e08004210802402007450d00200441106a21054100210103400240201020016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010290b2005200141106a2201470d000b0b02402015450d00201010290b4105210b2011450d00201c10290b0240201a450d002003201a41186c6a210a2003210503400240200541046a280200450d00200528020010290b0240200541146a2802002204450d00200528020c2101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200541186a21010240200541106a280200450d00200528020c10290b200121052001200a470d000b0b2017450d01200310290c010b20024103410220011b3a0028200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d88004210920022802e08004210802402006450d002003200641186c6a210a2003210503400240200541046a280200450d00200528020010290b0240200541146a2802002204450d00200528020c2101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200541186a21010240200541106a280200450d00200528020c10290b200121052001200a470d000b0b2009422088210e4105210b410021012017450d01200310290c010b200b4108762101200dad220e4220862016ad8421092013450d00200c10290b20004101360200200041106a2008360200200041086a200e422086200942ffffffff0f838437020020002001410874200b41ff0171723602040c170b200241c0006a200110f3030240024020022802404101470d00200228024422014108762106200241c0006a41086a2903002209422088210e200241d0006a280200210a0c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200370300200220022902443703d880044100210641002101410021050240024002400240024002400240024002400240034002402001411f4d0d00410f210b0c080b20022802e08004220a20022802e480042204460d09200441016a22032004490d01200a2003490d0420022802d8800420046a2d00002104200220033602e48004200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d0041002106410d210b0c070b0240024020050d004100210d410421030c010b410421034100210d4100210803402008221641016a2108410021014100210c0240024002400240024003404100210602402001411f4d0d00410f210b0c030b20022802e08004220b20022802e480042204460d01200441016a220a2004490d09200b200a490d0c20022802d8800420046a2d000021042002200a3602e48004200441ff00712001411f7174200c72210c200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d210b0c020b200241c0006a200241d880046a10e303024020022802404101470d002002280244220b41087621062002280250210a200228024c2108200228024821070c020b200228024c21132002280248210f20022802442115200241c0006a200241d880046a10e703024020022802404101470d002002280244210b2002280250210a200228024c21082002280248210702402013450d0020134104742104201521010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200b4108762106200f450d02201510290c020b200228024821142002280244210702400240200228024c22010d00410021064104210b4100210a0c010b2001410274220a410275220641ffffffff03712006470d1e200a4100480d1e200a1027220b450d0d200a417c6a2110200b210120072104034020012004280200360200200141046a2101200441046a2104200a417c6a220a0d000b201041027641016a210a0b02402014450d00200710290b200d2016470d04200d4101742201200d41016a220420042001491b2201ad421c7e2209422088a70d1d2009a722044100480d1d200d0d022004102721030c030b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a721082002280230210a2009a721074105210b0b02402016450d0020032016411c6c6a210c20032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200c470d000b0b200d450d0e200310290c0e0b2003200d411c6c2004102821030b2003450d052001210d0b20032016411c6c6a2201200c41087622043b00012001200b360210200120153602042001200c3a0000200141036a20044110763a0000200141186a200a360200200141146a20063602002001410c6a2013360200200141086a200f36020020082005470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d072005ad422086200dad842109410a21040c1a0b417f2003103e000b417f200a103e000b20044104102a000b2003200a107f000b200a200b107f000b200a4104102a000b41002108410021070c020b20024103410220011b3a00c88004200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200229032821092002280230210a02402005450d0020032005411c6c6a210620032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b2001210520012006470d000b0b2009422088210e4105210141002106200d450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a721082002280230210a2009a721074105210b410021060b2006410874200b41ff01717221012008ad220e4220862007ad84210920022802dc8004450d0020022802d8800410290b20004101360200200041106a200a360200200041086a200e422086200942ffffffff0f838437020020002006410874200141ff0171723602040c160b200820064621010240200b450d00200c10290b02402001450d00410921040c0f0b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200241e380046a200241306a280200360000200220022903283700db8004200041053a0004200020022900d880043700052000410c6a200241df80046a290000370000200041013602000c150b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e603410521010b2000200136020420004101360200200041086a20022902d88004370200200041106a200241d880046a41086a280200360200200b450d13200c10290c130b200241c0006a200110f3030240024020022802404101470d00200228024422044108762101200241c0006a41086a2903002209422088210e200241d0006a28020021060c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200370300200220022902443703d880044100210c4100210141002105024002400240024002400240024002400240024002400240024002400240024002400240034002402001411f4d0d00410f2104410021050c130b20022802e08004220a20022802e480042204460d11200441016a22032004490d01200a2003490d0820022802d8800420046a2d00002104200220033602e48004200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d2104410021050c120b0240024020050d0041002116410421030c010b410421034100210a41002116410021130340200241c0006a200241d880046a10ee03024020022802404101470d002002200229024c22093703c8800420022802482105200228024421042009a7210c0c110b200228024821152002280244210f0240024020022802e08004220420022802e480042206460d00200641016a22012006490d05200420014f0d0120012004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c0e0b200228024c211420022802d88004220c20066a2d0000210d200220013602e480040240200d41034d0d00410a21010c100b02400240024002400240200d0e0400010203000b4100210d4100210b4100210603400240200b411f4d0d00410f21010c150b20042001460d132001417f460d092004200141016a2207490d0f200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4100210d200b4120490d032008410f4d0d03410d21010c130b4100210b410021060340200b411f4b0d100240024020042001460d002001417f460d0b2004200141016a22074f0d01200141016a2004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c120b200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4101210d200b4120490d022008410f4d0d020c0e0b4100210b410021060340200b411f4b0d0f0240024020042001460d002001417f460d0b2004200141016a22074f0d01200141016a2004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c110b200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4102210d200b4120490d012008410f4b0d0d0c010b4100210b410021060340200b411f4b0d0e0240024020042001460d002001417f460d0b2004200141016a22074f0d01200141016a2004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c100b200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4103210d200b4120490d002008410f4b0d0c0b200220063602d080042002200d3602cc800420022902cc80042109024020162013470d0020164101742201201641016a220420042001491b2201ad42147e220e422088a70d1d200ea722044100480d1d0240024020160d002004102721030c010b2003201641146c2004102821030b2003450d09200121160b2003201341146c6a2201200937020c20012014360208200120153602042001200f360200200a41146a210a201341016a2201211320012005470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d0f2005ad4220862016ad842109410821040c1e0b417f2003103e000b417f2001103e000b417f200141016a103e000b417f200141016a103e000b417f200141016a103e000b417f200141016a103e000b20044104102a000b2003200a107f000b200141016a2004107f000b410d21014100210d0c030b410f21014100210d0c020b20022802282105200229022c2109410521014100210d0c010b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e60320022802282105200229022c2109410521010b200d4108742001722104200220093703c880042009a7210c2015450d00200f10290b20022802cc8004210602402013450d002003210103400240200141046a280200450d00200128020010290b200141146a2101200a416c6a220a0d000b0b2016450d02200310290c020b20024103410220011b3a00c88004200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200229032821092002280230210602402005450d00200541146c21042003210103400240200141046a280200450d00200128020010290b200141146a21012004416c6a22040d000b0b2009422088210e41052104410021012016450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210c200228023021062009a72105410521040b20044108762101200cad220e4220862005ad84210920022802dc8004450d0020022802d8800410290b20004101360200200041106a2006360200200041086a200e422086200942ffffffff0f838437020020002001410874200441ff0171723602040c120b200241c0006a200110f3030240024020022802404101470d00200228024422054108762101200241c0006a41086a2903002209422088210e200241d0006a280200210a0c010b200241386a200241d4006a280200360200200241306a200241cc006a290200370300200220022902443703284100210b410021014100210602400240024002400240024002400240034002402001411f4d0d00410f21054100210c0c090b2002280230220a20022802342204460d07200441016a22052004490d01200a2005490d052002280228220c20046a2d0000210420022005360234200441ff00712001411f71742006722106200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d21054100210c0c080b024020060d00410421034100210d0c060b2006417f6a21144100211641002107410021084100210d4104210f410421030340024002400240024002400240024002400240200a2005460d00200541016a22042005490d0b200a20044f0d012004200a107f000b200241013a00c78004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241c880046a200241c0006a10e60320022802c88004210c20022802cc8004210b20022802d08004210a410521130c010b200c20056a2c000021012002200436023402400240200141004e0d00411821130c010b41062113200141c00071450d00200141807f72220141ff017141fb014b0d020b0b200241e880046a200a360200200241e480046a200b360200200241e080046a200c360200200220013a00dd8004200220133a00dc80040c010b024002400240200a2004460d00200541026a21052004417f460d0b200a20054f0d012005200a107f000b200241013a00c78004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241c880046a200241c0006a10e60320022802c88004210c20022802cc8004210b20022802d08004210a410521010c010b200c20046a2d00002104200220053602340240200441014b0d004100210a20040e020403040b410c21010b200241e880046a200a360200200241e480046a200b360200200241e080046a200c360200200220043a00dd8004200220013a00dc80040b200241013a00d8800420022802dc800421050c020b418002210a0b200241c0006a200241286a10e303200228024c210b2002280248210c2002280244210520022802404101470d01200241d0006a280200210a0b02402008450d00200320076a21060340024020032802082204450d0020032802002101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200341106a21010240200341046a280200450d00200328020010290b2001210320062001470d000b0b200d450d09200f10290c090b200841016a211302402008200d470d002016201320132016491b220d41ffffffff0071200d470d11200d41047422044100480d110240024020080d0020041027210f0c010b200f200720041028210f0b200f450d05200f21030b200320076a220420053602002004410c6a20154180807c712001417f7341ff017172200a722215360200200441086a200b360200200441046a200c36020020142008460d06201641026a2116200741106a2107200228023421052002280230210a2002280228210c201321080c000b0b417f2005103e000b417f2004103e000b417f2005103e000b20044104102a000b2005200a107f000b200228023420022802384621010240200228022c450d00200228022810290b02402001450d002006ad422086200dad842109410721040c0e0b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d88004210920022802e08004210a02402006450d00200320064104746a2106200321050340024020052802082204450d0020052802002101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200541106a21010240200541046a280200450d00200528020010290b2001210520012006470d000b0b2009422088210e4105210541002101200d450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a7210c410521050b20054108762101200bad220e422086200cad842109200228022c450d00200228022810290b20004101360200200041106a200a360200200041086a200e422086200942ffffffff0f838437020020002001410874200541ff0171723602040c110b200241c0006a200110f3030240024020022802404101470d00200228024422044108762105200241c0006a41086a2903002209422088210e200241d0006a28020021010c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200220937030020022002290244220e3703d88004200ea7210c2009a721034100210420022802e4800421014100210502400240024002400240024002400240024003402004411f4b0d0120032001460d032001417f460d042003200141016a220a490d06200c20016a2d0000220641ff00712004411f71742005722105200441076a2104200a21012006418001710d000b2002200a3602e4800420044120490d012006410f4d0d0141002104410d210c0c060b200220013602e4800441002104410f210c0c050b0240024020050d00410421034100210d0c010b4100210741002106410021014100210d410421030340200241c0006a200241d880046a10ec0320022f004520022d0047411074722104200228024c210b2002280248210820022d0044210c024020022802404101470d00200241d0006a2802002101200d450d08200310290c080b200141016a210a02402001200d470d002007200a200a2007491b220dad420c7e2209422088a70d102009a722164100480d100240024020010d002016102721030c010b200320062016102821030b2003450d050b200320066a2201200c3a0000200141036a20044110763a0000200141016a20043b0000200141086a200b360200200141046a2008360200200741026a21072006410c6a2106200a21012005200a470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d062005ad422086200dad842109410621040c110b200220033602e48004200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210b200228023021012009a721084105210c410021040c040b417f200141016a103e000b20164104102a000b200141016a2003107f000b4100210b410021080b200441ffffff07712205410874200c41ff0171722104200bad220e4220862008ad84210920022802dc8004450d0120022802d8800410290c010b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088210e200228023021014105210441002105200d450d00200310290b20004101360200200041106a2001360200200041086a200e422086200942ffffffff0f838437020020002005410874200441ff0171723602040c100b200241c0006a200110f3030240024020022802404101470d00200228024422044108762105200241c0006a41086a2903002209422088210e200241d0006a28020021010c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200220937030020022002290244220e3703d88004200ea7210c2009a721054100210420022802e480042101410021060240024002400240024002400240024002400240024003402004411f4b0d0120052001460d032001417f460d042005200141016a220a490d07200c20016a2d0000220341ff00712004411f71742006722106200441076a2104200a21012003418001710d000b2002200a3602e4800420044120490d012003410f4d0d0141002104410d210a0c080b200220013602e4800441002104410f210a0c070b024020060d004100210b410421030c060b2006417f6a2116410421034108210d4100210841002107034002400240024002402005200a460d00200a41016a2201200a490d07200520014f0d0120012005107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e6032002280228210b200228022c210c200228023021014105210a0c010b200c200a6a2c00002104200220013602e480040240200441004e0d004118210a0c010b4107210a0240200441c000710d000c010b200441807f7222044170470d00200241c0006a200241d880046a10ec0320022f004520022d004741107472210420022d0044210a20022802404101470d0120044180feff0771410876210520022802502101200228024c210c2002280248210b0b2005410874200441ff01717221042008450d09200310290c090b200228024c21052002280248210c0240024020072008460d002008210b0c010b20084101742201200841016a220b200b2001491b220bad420c7e2209422088a70d102009a722014100480d100240024020080d002001102721030c010b20032008410c6c2001102821030b2003450d050b2003200d6a22012005360200200141796a220520043b00002001417c6a200c360200200141786a200a3a0000200541026a20044110763a000020162007460d06200741016a2107200d410c6a210d20022802e48004210a20022802e08004210520022802d88004210c200b21080c000b0b200220053602e48004200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210c200228023021012009a7210b4105210a410021040c060b417f200141016a103e000b417f2001103e000b20014104102a000b200141016a2005107f000b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d022006ad422086200bad842109410521040c0c0b4100210c4100210b0b200441ffffff07712205410874200a41ff0171722104200cad220e422086200bad84210920022802dc8004450d0120022802d8800410290c010b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088210e200228023021014105210441002105200b450d00200310290b20004101360200200041106a2001360200200041086a200e422086200942ffffffff0f838437020020002005410874200441ff0171723602040c0f0b200241c0006a200110f3030240024020022802404101470d00200228024422044108762105200241c0006a41086a2903002209422088210e200241d0006a28020021010c010b200241d4006a280200210d200241d0006a2802002101200241cc006a2802002105200241c8006a28020021072002280244210c4100210b41002104410021060240024002400240024002400240034002402004411f4d0d00410f2104410021050c030b20052001460d012001417f460d032005200141016a220a490d06200c20016a2d0000220341ff00712004411f71742006722106200441076a2104200a21012003418001710d000b024020044120490d002003410f4d0d00410d2104410021050c020b410421030240024020060d00410021130c010b410021164100211303402016221541016a2116200a2101410021044100210b024002400240034002402004411f4d0d00410f21040c020b0240024020052001460d002001417f460d0b2005200141016a220a4f0d01200141016a2005107f000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210520022802dc8004210b20022802e080042101410521040c030b200c20016a2d0000220841ff00712004411f7174200b72210b200441076a2104200a21012008418001710d000b20044120490d0220084110490d02410d21040b0b2013450d04200310290c040b024020132015470d0020154101742201201620162001491b221341ffffffff03712013470d0e201341027422014100480d0e0240024020150d002001102721030c010b200320154102742001102821030b2003450d070b200320154102746a200b36020020162006470d000b0b200a200d46210102402007450d00200c10290b2001450d062006ad4220862013ad842109410421040c0f0b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e0800421012009a72105410521040b200bad220e4220862005ad842109410021052007450d05200c10290c050b417f200141016a103e000b417f200141016a103e000b20014104102a000b200141016a2005107f000b20024103410220011b3a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088210e20022802e08004210141052104410021052013450d00200310290b20004101360200200041106a2001360200200041086a200e422086200942ffffffff0f838437020020002005410874200441ff0171723602040c0e0b200241c0006a200110f3030240024020022802404101470d00200228024422044108762101200241c0006a41086a2903002209422088210e200241d0006a28020021060c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200370300200220022902443703d880044100210c41002101410021050240024002400240024002400240024002400240034002402001411f4d0d00410f2104410021050c0b0b20022802e08004220a20022802e480042204460d09200441016a22032004490d02200a2003490d0120022802d8800420046a2d00002104200220033602e48004200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d2104410021050c0a0b02400240024020050d0041002116410421030c010b410421034100210a41002116410021130340200241c0006a200241d880046a10ee03200228024c210c2002280248210f20022802442110024020022802404101470d0020022802502106200f2105201021040c0a0b200241c0006a200241d880046a10ee03200228024c21112002280248211420022802442112024020022802404101470d0020022802502106201421052011210c201221040c090b024002400240024002400240024002400240024002400240024002400240024020022802e08004220620022802e48004220b460d00200b41016a2201200b490d02200620014f0d0120012006107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022802282105200229022c210e4105210741002115410021060c160b20022802d88004220d200b6a2d00002104200220013602e48004410021150240200441034d0d0041092107410021060c160b024002400240024020040e0400010203000b410021154100210441002107034002402004411f4d0d00410f21070c180b0240024020062001460d002001417f460d072006200141016a22084f0d01200141016a2006107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022802282105200229022c210e41052107410021150c190b200d20016a2d0000210b200220083602e48004200b41ff00712004411f71742007722107200441076a210420082101200b418001710d000b4100211520044120490d0f200b410f4d0d0f410d21070c160b0240024020062001460d00200b41026a21042001417f460d0620062004490d07200d20016a2c00002101200220043602e4800402402001417f4a0d00411821050c0e0b200141c000710d010c0c0b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e6032002290328210920022802302104410521050c0c0b200141807f7222014170470d0a200241c0006a200241d880046a10ec032002290348210920022802442107024020022802404101470d00200228025021040c0d0b410121150c0f0b200241c0006a200241d880046a10ec032002290348210920022802442107024020022802404101460d00410221150c0f0b200220022802503602482007418080807871211520074180807c712106200741087621040c0c0b0240024020062001460d00200b41026a21082001417f460d0620062008490d08200d20016a2c00002104200220083602e480040240200441004e0d0041182107410021060c180b200441c000710d010c090b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60341052107200229022c210e20022802282105410021060c160b200441807f72220441ff017141fc01490d070240024020062008460d00200b41036a21012008417f460d07200620014f0d0120012006107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022802282105200229022c210e41052107410021060c160b200d20086a2d0000210b200220013602e48004410021060240200b41014d0d00410c210741002115200b21040c160b2004417f732104410321150240200b0e020e000e0b410121060c0d0b417f2001103e000b417f200141016a103e000b417f2004103e000b20042006107f000b417f2008103e000b417f2001103e000b20082006107f000b41062107410021060c0d0b410721050b200141ff017141087420057221070b200220043602482007418080807871211520074180807c712106200741087621040b200220093703402002290244210e2009a721050c090b0b024020162013470d0020164101742201201641016a220b200b2001491b2201ad42287e220e422088a70d11200ea7220b4100480d110240024020160d00200b102721030c010b2003201641286c200b102821030b2003450d03200121160b2003201341286c6a2201201236020c2001200c3602082001200f36020420012010360200200141206a20093702002001411c6a20073602002001411a6a20063a0000200141196a20043a0000200141186a20153a0000200141146a2011360200200141106a2014360200200a41286a210a201341016a2201211320012005470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d082005ad4220862016ad842109410321040c120b200b4104102a000b2003200a107f000b417f2003103e000b0b41002106410021040b200741ff0171200441ff0171410874722006418080fc0771722015722104200e422088a72106200ea7210c2014450d00201210290b200f450d00201010290b02402013450d002003210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200a41586a220a0d000b0b2016450d02200310290c020b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200229032821092002280230210602402005450d00200541286c21042003210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200441586a22040d000b0b2009422088210e41052104410021012016450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210c200228023021062009a72105410521040b20044108762101200cad220e4220862005ad84210920022802dc8004450d0020022802d8800410290b20004101360200200041106a2006360200200041086a200e422086200942ffffffff0f838437020020002001410874200441ff0171723602040c0d0b200241c0006a200110f3030240024020022802404101470d00200228024422014108762105200241c0006a41086a2903002209422088210e200241d0006a28020021040c010b200241d4006a2802002113200241d0006a2802002101200241cc006a2802002105200241c8006a28020021072002280244210c41002108410021044100210a024002400240024002400240024002400240034002402004411f4d0d00410f21014100210a0c0a0b20052001460d082001417f460d022005200141016a2206490d01200c20016a2d0000220341ff00712004411f7174200a72210a200441076a2104200621012003418001710d000b024020044120490d002003410f4d0d00410d21014100210a0c090b024002400240200a0d0041002112410421030c010b410120056b210d4100210b4104210341002112410021110340024002400240024002400240024002400240024020052006460d00200641016a22012006490d0120052001490d050240200c20066a2d0000221641e000460d004117210f0c130b201141016a211a200641026a2101410021164100210441002108034002402004411f4d0d00410f210f0c0a0b200d20016a4102460d082001450d0320052001490d07200c20016a417f6a2d0000220641ff00712004411f71742008722108200141016a2101200441076a21042006418001710d000b024020044120490d002006410f4d0d00410d210f0c090b2001417f6a210441002115410121100240024020080d00410021170c010b4100211441002106410021170340024002400240024020052004460d00200120066a2216450d09200520164f0d0120162005107f000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022802e0800421014105210f0c010b02400240200c20046a2c0000221641004e0d004118210f0c010b4106210f201641c00071450d00201641807f72221641ff017141fb014b0d020b0b2017450d0b201010290c0b0b200641016a210f024020062017470d002014200f200f2014491b22174100480d1b0240024020060d002017102721100c010b201020062017102821100b20100d0020174101102a000b200441016a2104201020066a2016417f733a0000201441026a2114200f21062008200f470d000b0b2010411076411074221f201041087641ff0171410874221872201041ff017122107221144100210103404100211602402015411f4d0d00410f210f0c130b0240024020052004460d002004417f460d072005200441016a22064f0d01200441016a2005107f000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022d00e08004210120022d00e18004210520022f01e2800421044105210f0c130b200c20046a2d0000220f41ff00712015411f71742001722101201541076a211520062104200f418001710d000b20154120490d09200f410f4d0d09410d210f0c110b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022d00e08004210120022d00e18004210520022f01e2800421044105210f0c110b417f2001103e000b417f2001103e000b417f2016103e000b417f200441016a103e000b20012005107f000b20012005107f000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210820022802e0800421012009a7210a4105210f0b20014110762104200141087621050c090b0240200141014d0d004104210f41ba8cc500210a412421080c070b02400240024020010e020001000b410421040c010b20052006460d06024002400240200641016a22012006490d0020052001490d010240200c20066a2c0000221641004e0d004118210f0c0c0b4106210f201641c00071450d02201641807f72221641ff017141fb014d0d022016417f732104200121060c030b417f200641016a103e000b200641016a2005107f000b0c080b024020122011470d0020124101742201201241016a221620162001491b220141ffffffff00712001470d0f200141047422164100480d0f0240024020120d002016102721030c010b200320124104742016102821030b2003450d03200121120b200320114104746a220120194180807c71200441ff01714108747241e00072221936020c200120083602082001201736020420012018201072201f72360200200b41106a210b201a2111201a200a470d000b0b2006201346210102402007450d00200c10290b2001450d07200aad4220862012ad842109410221040c100b20164104102a000b200141016a2005107f000b417f200141016a103e000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022d00e08004210120022d00e18004210520022f01e2800421044105210f0b0b2017450d00201410290b200541ff0171410874200141ff017172210520044110742104201641ff0171410874210602402011450d002003210103400240200141046a280200450d00200128020010290b200141106a2101200b41706a220b0d000b0b200520047221042006200f7221012012450d02200310290c020b20024103410220011b3a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d88004210920022802e0800421040240200a450d00200a41047421052003210103400240200141046a280200450d00200128020010290b200141106a2101200541706a22050d000b0b2009422088210e41052101410021052012450d02200310290c020b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210820022802e0800421042009a7210a410521010b200141087621052008ad220e422086200aad8421092007450d00200c10290b20004101360200200041106a2004360200200041086a200e422086200942ffffffff0f838437020020002005410874200141ff0171723602040c0c0b410021014100210402400340410021080240200a4105470d00410f21070c0b0b2003200a460d032003200a4d0d012006200a6a2d0000220541ff00712001411f71742004722104200141076a2101200a41016a220c210a2005418001710d000b024020014120490d002005410f4d0d00410d21070c0a0b024020040d0041002105410121134100210a4100210d0c050b200241c0006a410041800810cd041a410121134100210d4100210541002107034002400240024002402003200c6b200420076b22014180082001418008491b2201490d00200c20016a2216200c490d02200320164f0d0120162003107f000b200241013a00c88004200241ec80046a4101360200200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c880046a360220200241286a200241d880046a10e60320022903282209422088a7210a200228023021012009a72104410521070240200d0d002004210d0c0f0b201310292004210d0c0e0b200241c0006a2006200c6a200110ce041a0240200d20056b2001490d00200120056a210a0c020b200520016a220a2005490d04200d410174220c200a200a200c491b220c4100480d0402400240200d0d00200c102721130c010b2013200d200c102821130b02402013450d00200c210d0c020b200c4101102a000b200c2016103e000b201320056a200241c0006a200110ce041a2016210c200a21052004200120076a22074d0d040c000b0b200a41016a2003107f000b102b000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210a20022802e0800421012009a7210d410521070c070b200241c0006a2013200a10dc01024020022802404101470d00410821070240200d0d000c080b201310290c070b201341087621052016210c0b2003200c490d012003200c6b2204417f4c0d020240024020040d00410121010c010b200410272201450d0420012006200c6a200410ce041a0b200aad4220862109200dad210e2004ad222842208621290240200b450d00200610290b2009200e8421092029202884210e2005410874201341ff0171722103410121040b200020043a000420004100360200200041056a20022f001d3b0000200041186a200e370200200041146a20013602002000410c6a2009370200200041086a2003360200200041206a200229020c370200200041076a2002411f6a2d00003a0000200041286a2002410c6a41086a2902003702000c060b200c2003103e000b1039000b20044101102a000b4100210a4100210d0b200aad422086200dad842109200b450d00200610290b20004101360200200041106a2001360200200041086a200937020020002008410874200741ff0171723602040b200241f080046a24000bf404010b7f230041c080016b220224002002200110f003410121030240024020022802004101470d0020002002290204370204200041013602002000410c6a2002410c6a2902003702000c010b20022802042104200241004180800110cd042105410021064100210702400240024002402004450d00410021084100210641012103410021090340024002402001280204220a200128020822076b200420096b220b41808001200b41808001491b220b490d002007200b6a220c2007490d04200a200c4f0d01200c200a107f000b200541013a008f8001200541b480016a4101360200200542013702a4800120054180c0c5003602a080012005411f3602bc80012005200541b880016a3602b0800120052005418f80016a3602b880012005419080016a200541a080016a10e6032005418b80016a2005419880016a2802003600002005200529039080013700838001200041053a00042000200529008080013700052000410c6a2005418780016a290000370000200041013602002006450d06200310290c060b2005200128020020076a200b10ce04210a2001200c36020802400240200620086b200b490d00200b20086a21070c010b2008200b6a22072008490d052006410174220c20072007200c491b220c4100480d050240024020060d00200c102721030c010b20032006200c102821030b2003450d04200c21060b200320086a200a200b10ce041a200721082004200b20096a22094b0d000b0b2000200336020420004100360200200041146a2007360200200041106a41003602002000410c6a2007360200200041086a20063602000c030b2007200c103e000b200c4101102a000b102b000b200241c080016a24000b0e0020003502004101200110aa010bf60201037f230041c0006b22022400200141086a2802002103200128020421042002200128020022013602100240024002402001418080044b0d0002402004450d0020022003360214200120034b0d022003418080044d0d002002413c6a41013602002002420237022c200241ec9cc5003602282002410136021c200241c89cc5003602182002200241186a3602382002200241286a10e6030c030b200241003602000c020b2002413c6a41013602002002420237022c200241cc9cc5003602282002410136021c200241c89cc5003602182002200241186a3602382002200241286a10e6030c010b200241246a41013602002002413c6a41023602002002420237022c200241dc9cc5003602282002410136021c2002200241186a3602382002200241106a3602202002200241146a3602182002200241286a10e6030b024002402002280200450d0020002002290300370200200041086a200241086a2802003602000c010b200041003602000b200241c0006a24000bf90501037f230041f0006b2204240002400240024002400240024020012802084102460d00412e10272201450d01200041013a0000200141266a41002900e09e45370000200141206a41002900da9e45370000200141186a41002900d29e45370000200141106a41002900ca9e45370000200141086a41002900c29e45370000200141002900ba9e45370000200041086a42ae808080e005370200200041046a20013602000c050b02400240024002400240200128020022052d0000416e6a2201411e4b0d004100210620010e1f03000000000000000000000000000000000000000000000000000008040102030b412010272201450d05200041013a0000200141186a41002900809f45370000200141106a41002900f89e45370000200141086a41002900f09e45370000200141002900e89e45370000200041086a42a08080808004370200200041046a20013602000c080b410221060c060b410321060c050b20042005280204220136020c0240024020012003490d0041889fc5002105200441e8006a2103200441d0006a2101200441c0006a21020c010b200220014101746a22012d0001450d0441989fc5002105200441386a2103200441206a2101200441106a21020b20034101360204200141146a410136020020012003360210200142023702042001200536020020032004410c6a3602002002200110e603200041013a00002000410c6a200241086a280200360200200041046a20022902003702000c050b410121060c030b412e4101102a000b41204101102a000b20012d000021060b0240200541106a2d00004106470d00200041003a0000200020063a00010c010b0240412910272201450d00200041013a0000200141286a41002d00d09f453a0000200141206a41002900c89f45370000200141186a41002900c09f45370000200141106a41002900b89f45370000200141086a41002900b09f45370000200141002900a89f45370000200041086a42a98080809005370200200041046a20013602000c010b41294101102a000b200441f0006a24000b8f0201017f230041106b220224000240024002400240024020002d00000e0401020300010b2002200128021841d0bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c030b2002200128021841d3bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c020b2002200128021841d6bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b2002200128021841d9bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040b200241106a240020000bf7c30103077f027e027f230041f0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00000eac0100df010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01000b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450dab012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490dde0120044101742209200820082009491b22094100480dde010240024020040d002009102721080c010b200128021820042009102821080b2008450dad01200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060cde010b0240200141306a2802002204200141346a22062802004f0d002002310001210a200141206a350200210b024020042001412c6a280200470d00200441016a22022004490ddd0120044101742206200220022006491b220241ffffffff01712002470ddd01200241037422064100480ddd010240024020040d002006102721040c010b200128022820044103742006102821040b2004450dad01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200a422886200b84370200200141306a2201200128020041016a3602000cde010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450ddd012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450ddd012000200329023c370204200020013602000cde010b0240200141306a2802002204200141346a22062802004f0d002002310001210a200141206a350200210b024020042001412c6a280200470d00200441016a22022004490ddc0120044101742206200220022006491b220241ffffffff01712002470ddc01200241037422064100480ddc010240024020040d002006102721040c010b200128022820044103742006102821040b2004450dad01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200a422886200b8442808080803084370200200141306a2201200128020041016a3602000cdd010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450ddc012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450ddc012000200329023c370204200020013602000cdd010b2002310001210a200341d8006a200141186a200141286a22044100108004024020032d00584101470d002000200329025c370200200041086a200341e4006a2802003602000cdd010b0240200141306a2802002202200141346a22062802004f0d00200141206a350200210b024020022001412c6a280200470d00200241016a22062002490ddb0120024101742205200620062005491b220641ffffffff01712006470ddb01200641037422054100480ddb010240024020020d002005102721020c010b200428020020024103742005102821020b2002450dad01200120023602282001412c6a2006360200200141306a28020021020b200128022820024103746a200a422886200b8442808080801084370200200141306a2201200128020041016a3602000cdc010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450ddb012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450ddb012000200329023c370204200020013602000cdc010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450dac012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c2003200136025841d497c5004134200341d8006a41c497c50010a201000b02400240200141286a220228020020044103746a22042d00044101470d002004310005210a200341d8006a200141186a20021081042003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cdd010b411a10272201450dad01200141186a41002f00a098453b0000200141106a41002900989845370000200141086a410029009098453700002001410029008898453700002000429a808080a003370204200020013602000cdc010b0240200141306a2802002204200141346a22062802004f0d00200141206a350200210b024020042001412c6a280200470d00200441016a22062004490dda0120044101742205200620062005491b220641ffffffff01712006470dda01200641037422054100480dda010240024020040d002005102721020c010b200228020020044103742005102821020b2002450daf01200120023602282001412c6a2006360200200141306a28020021040b200128022820044103746a200a422886200b8442808080802084370200200141306a2201200128020041016a3602000cdb010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dda012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dda012000200329023c370204200020013602000cdb010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450dae012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c2003200136025841d497c5004134200341d8006a41c497c50010a201000b200141286a220528020020044103746a22042d00052106024020042d00044101470d00200641ff01714104470daf010b0240024020024101460d00200341d8006a200141186a220220051081042003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cdc010b20012d003822024104460dd901200341d8006a200141186a2206200520021080040240024020032d00584101460d000240200141206a2802002204200141246a22082802004f0d00024020042001411c6a280200470d00200441016a22082004490ddc0120044101742207200820082007491b22084100480ddc010240024020040d002008102721040c010b200628020020042008102821040b2004450db401200120043602182001411c6a2008360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cdc010b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200836020020032003360268200341106a200341d8006a10e60320032802102204450ddb012003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450ddb01200329023c210a0c010b200328025c2202450dda01200341e0006a290300210a0b2000200a370204200020023602000cdb010b200641ff01714104460dd9010240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dd90120044101742208200520052008491b22054100480dd9010240024020040d002005102721020c010b200228020020042005102821020b2002450db201200120023602182001411c6a2005360200200141206a28020021040b200128021820046a20063a0000200141206a2201200128020041016a3602000cda010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102202450dd9012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd9012000200329023c370204200020013602000cda010b2003200241046a280200220236024802400240200141306a280200220420024d0d0020042002417f736a22022004490d0141d2a2c500411d104e000b200341ec006a220241023602002003411c6a41013602002003420237025c20034190a2c50036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821042003200329023c37021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e6032003280214450dd101200328021010290cd1010b200141286a220428020020024103746a22022d00044103460dd10120022d0005220241ff01714104460dd101200341d8006a200141186a220620042002108004024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dd90120044101742208200520052008491b22054100480dd9010240024020040d002005102721040c010b200628020020042005102821040b2004450db301200120043602182001411c6a2005360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cd3010b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102204450dd2012003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e6032003280214450dd101200328021010290cd1010b200328025c2202450dd101200341e0006a290300210a0cd2010b200241046a2802002102200341d8006a200141186a2205200141286a220641001080040240024020032d00584101470d00200341e0006a290300210a200328025c22010d010cd9010b200141306a28020021042003200236024802400240200420024d0d0020042002417f736a22022004490d0141d2a2c500411d104e000b200341ec006a220141023602002003411c6a41013602002003420237025c20034190a2c50036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821022003200329023c37021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b200329023c210a200328023822010d010cd9010b200628020020024103746a22022d00044103460dd80120022d0005220241ff01714104460dd801200341d8006a200520062002108004024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490dd90120044101742208200620062008491b22064100480dd9010240024020040d002006102721040c010b200528020020042006102821040b2004450db401200120043602182001411c6a2006360200200141206a28020021040b200128021820046a20023a0000200141206a2201200128020041016a3602000cda010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dd9012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd901200329023c210a0c010b200328025c2201450dd801200341e0006a290300210a0b2000200a370204200020013602000cd8010b200241086a2802002105200241046a280200210420032002410c6a280200220636024802400240200141306a280200220220064d0d0020022006417f736a22062002490d0141d2a2c500411d104e000b200341ec006a22044102360200200341106a410c6a41013602002003420237025c20034190a2c50036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821022003200329023c37021420032002360210200441013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b2003200329023c370204200320032802383602000ccd010b410421090240200141286a220c280200220820064103746a22062d00044103460d0020062d000521090b200320093a00302005450dc801200941ff0171220d4104460dc701200541027421050340200320042802002206360248200220064d0dca0120022006417f736a220620024f0dce01200820064103746a22062d00044103460dcb0120062d000522074104460dcb01200d2007470dcb01200441046a21042005417c6a22050d000cc9010b0b20012d003822024104460dc501200341d8006a200141186a2206200141286a20021080040240024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dd70120044101742208200520052008491b22054100480dd7010240024020040d002005102721040c010b200628020020042005102821040b2004450db301200120043602182001411c6a2005360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cc8010b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102204450dc7012003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450dc701200329023c210a0c010b200328025c2202450dc601200341e0006a290300210a0b2000200a370204200020023602000cd6010b200128020021042003200241046a2802002202360254024002400240200441386a28020020024b0d00200341ec006a41013602002003420237025c200341d8a0c500360258200341013602342003200341306a3602682003200341d4006a360230200341386a200341d8006a10e603200341186a200329023c370300200341013602102003200328023822043602140c010b2003200428023020024102746a2802002202360200024002402004412c6a28020020024b0d0041012106200341ec006a41013602002003420237025c200341e8a0c5003602582003410136024c2003200341c8006a36026820032003360248200341386a200341d8006a10e603200341186a200329023c220a370300200a422088a7210820032802382104200aa721020c010b2003411c6a200428022420024104746a22042d000d22083a0000200341186a2004280208220236020020042802002104410021060b20032006360210200320043602142006450d010b200341186a21010cc3010b02402002450d002004417f6a2104200141286a2106200141186a21050340200341d8006a20052006200420026a2d0000108004024020032d00584101470d00200341e0006a2101200328025c21040cc5010b2002417f6a22020d000b0b200841ff01714104460dd4010240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490dd40120024101742206200420042006491b22044100480dd4010240024020020d002004102721020c010b200128021820022004102821020b2002450db101200120023602182001411c6a2004360200200141206a28020021020b200128021820026a20083a0000200141206a2201200128020041016a3602000cd5010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450dd4012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382204450dd401200329023c210a0cc3010b200241046a28020021052001280200210220034100360238024002400240200241146a2802000d00200341d8006a41146a41013602002003420237025c200341b8a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e6030c010b200341d8006a200141186a2204200141286a22064100108004024020032d00584101470d00200341e0006a290300210a0cc2010b20012802002208412c6a280200210220032005360238200220054b0d01200341ec006a41013602002003420237025c200341e8a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e6030b2003290214210a200328021022010dc1010cd4010b200828022420054104746a22052d000d2108024020052802082202450d002005280200417f6a21050340200341d8006a20042006200520026a2d0000108004024020032d00584101470d00200341e0006a290300210a0cc2010b2002417f6a22020d000b0b200841ff01714104460dd3010240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490dd30120024101742205200620062005491b22064100480dd3010240024020020d002006102721020c010b200428020020022006102821020b2002450db101200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20083a0000200141206a2201200128020041016a3602000cd4010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dd3012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd301200329023c210a0cc0010b200341d8006a200141186a200141286a410410800420032d00584101470dd201200328025c2201450dd2012000200341e0006a290300370204200020013602000cd3010b200341d8006a200141186a2204200141286a22064100108004200341d8006a21020240024020032d00584101460d00200341d8006a200420064104108004200341d8006a210220032d00584101460d00200341d8006a2004200620032d00592205108004200341d8006a210220032d00584101460d000240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490dd30120024101742208200620062008491b22064100480dd3010240024020020d002006102721020c010b200428020020022006102821020b2002450db201200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20053a0000200141206a2201200128020041016a3602000cd4010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dd3012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd301200329023c210a0c010b200241046a2802002201450dd201200241086a290200210a0b2000200a370204200020013602000cd2010b200341d8006a200141046a200241046a2802001082040240024020032d00584101460d000240200141206a2802002202200141246a22042802004f0d0020032d00592104024020022001411c6a280200470d00200241016a22062002490dd20120024101742205200620062005491b22064100480dd2010240024020020d002006102721020c010b200128021820022006102821020b2002450db201200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cd3010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450dd2012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd201200329023c210a0c010b200328025c2201450dd101200341e0006a290300210a0b2000200a370204200020013602000cd1010b2003200241046a2802002202360200200341d8006a200141046a2002108204024020032d00584101470d002003200328025c22013602382003200341e0006a290300220a37023c0cbb010b200320032d005922023a0030200341d8006a200141186a200141286a4104108004024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380cba010b200320032d005922013a004820014104460dcf01200241ff01712001460dcf01200341106a41146a41253602002003411c6a4120360200200341d8006a41146a41033602002003420337025c200341c498c500360258200341013602142003200341106a3602682003200341c8006a3602202003200341306a36021820032003360210200341386a200341d8006a10e6030cb9010b200341d8006a200141046a200241046a2802001082040240024020032d00584101460d00200341d8006a200141186a2206200141286a20032d00592204108004024020032d00584101460d000240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490dd10120024101742208200520052008491b22054100480dd1010240024020020d002005102721020c010b200628020020022005102821020b2002450db201200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cd2010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102202450dd1012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd101200329023c210a0c020b200328025c2201450dd001200341e0006a290300210a0c010b200328025c2201450dcf01200341e0006a290300210a0b2000200a370204200020013602000ccf010b200128020021042003200241046a280200220236023802400240200441206a28020020024d0d000240200141206a2802002206200141246a22052802004f0d00200428021820024101746a2d00002102024020062001411c6a280200470d00200641016a22042006490dcf0120064101742205200420042005491b22044100480dcf010240024020060d002004102721060c010b200128021820062004102821060b2006450db101200120063602182001411c6a2004360200200141206a28020021060b200128021820066a20023a0000200141206a2201200128020041016a3602000cd0010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102202450dcf012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dcf01200329023c210a0c010b200341ec006a41013602002003420237025c20034188a1c5003602582003410136024c2003200341c8006a3602682003200341386a360248200341106a200341d8006a10e60320032802102201450dce012003290214210a0b2000200a370204200020013602000cce010b2003200241046a28020022023602282001280200210420032002360254024002400240200441206a28020020024b0d00200341ec006a41013602002003420237025c20034188a1c5003602582003410136024c2003200341c8006a3602682003200341d4006a360248200341106a200341d8006a10e6030c010b200428021820024101746a22022d00010d01200341ec006a41013602002003420237025c20034198a1c50036025820034101360204200320033602682003200341d4006a360200200341106a200341d8006a10e6030b2003280210210120032003290214220a37023c200320013602380cb6010b200320022d000022023a002f200341d8006a200141186a200141286a4104108004024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380cb5010b200320032d005922013a00002001200241ff0171460dcc0120014104460dcc01200341106a41146a41253602002003411c6a4125360200200341d8006a41146a41033602002003420337025c200341dc98c500360258200341013602142003200341106a3602682003200336022020032003412f6a3602182003200341286a360210200341386a200341d8006a10e6030cb4010b200341d8006a2001200241046a280200410441001084042003280258450dcb0120002003290358370200200041086a200341d8006a41086a2802003602000ccc010b200341d8006a2001200241046a280200410841011084042003280258450dca0120002003290358370200200041086a200341d8006a41086a2802003602000ccb010b200341d8006a2001200241046a280200410441021084042003280258450dc90120002003290358370200200041086a200341d8006a41086a2802003602000cca010b200341d8006a2001200241046a280200410841031084042003280258450dc80120002003290358370200200041086a200341d8006a41086a2802003602000cc9010b200341d8006a2001200241046a280200410141001084042003280258450dc70120002003290358370200200041086a200341d8006a41086a2802003602000cc8010b200341d8006a2001200241046a280200410141001084042003280258450dc60120002003290358370200200041086a200341d8006a41086a2802003602000cc7010b200341d8006a2001200241046a280200410241001084042003280258450dc50120002003290358370200200041086a200341d8006a41086a2802003602000cc6010b200341d8006a2001200241046a280200410241001084042003280258450dc40120002003290358370200200041086a200341d8006a41086a2802003602000cc5010b200341d8006a2001200241046a280200410141011084042003280258450dc30120002003290358370200200041086a200341d8006a41086a2802003602000cc4010b200341d8006a2001200241046a280200410141011084042003280258450dc20120002003290358370200200041086a200341d8006a41086a2802003602000cc3010b200341d8006a2001200241046a280200410241011084042003280258450dc10120002003290358370200200041086a200341d8006a41086a2802003602000cc2010b200341d8006a2001200241046a280200410241011084042003280258450dc00120002003290358370200200041086a200341d8006a41086a2802003602000cc1010b200341d8006a2001200241046a280200410441011084042003280258450dbf0120002003290358370200200041086a200341d8006a41086a2802003602000cc0010b200341d8006a2001200241046a280200410441011084042003280258450dbe0120002003290358370200200041086a200341d8006a41086a2802003602000cbf010b200341d8006a2001200241046a280200410441001085042003280258450dbd0120002003290358370200200041086a200341d8006a41086a2802003602000cbe010b200341d8006a2001200241046a280200410841011085042003280258450dbc0120002003290358370200200041086a200341d8006a41086a2802003602000cbd010b200341d8006a2001200241046a280200410441021085042003280258450dbb0120002003290358370200200041086a200341d8006a41086a2802003602000cbc010b200341d8006a2001200241046a280200410841031085042003280258450dba0120002003290358370200200041086a200341d8006a41086a2802003602000cbb010b200341d8006a2001200241046a280200410141001085042003280258450db90120002003290358370200200041086a200341d8006a41086a2802003602000cba010b200341d8006a2001200241046a280200410241001085042003280258450db80120002003290358370200200041086a200341d8006a41086a2802003602000cb9010b200341d8006a2001200241046a280200410141011085042003280258450db70120002003290358370200200041086a200341d8006a41086a2802003602000cb8010b200341d8006a2001200241046a280200410241011085042003280258450db60120002003290358370200200041086a200341d8006a41086a2802003602000cb7010b200341d8006a2001200241046a280200410441011085042003280258450db50120002003290358370200200041086a200341d8006a41086a2802003602000cb6010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c20034188a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e60320032802102202450d002003290214210a0c010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db50120024101742206200420042006491b22044100480db5010240024020020d002004102721020c010b200128021820022004102821020b2002450d9801200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb6010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db5012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450db501200329023c210a0b2000200a370204200020023602000cb5010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c20034188a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e60320032802102202450d002003290214210a0c010b200341d8006a200141186a2204200141286a4100108004024020032d00584101460d000240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490db50120024101742205200620062005491b22064100480db5010240024020020d002006102721020c010b200428020020022006102821020b2002450d9901200120023602182001411c6a2006360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb6010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450db5012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450db501200329023c210a0c010b200328025c2202450db401200341e0006a290300210a0b2000200a370204200020023602000cb4010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db20120024101742206200420042006491b22044100480db2010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb3010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db2012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450db2012000200329023c370204200020013602000cb3010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db10120024101742206200420042006491b22044100480db1010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41013a0000200141206a2201200128020041016a3602000cb2010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db1012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450db1012000200329023c370204200020013602000cb2010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db00120024101742206200420042006491b22044100480db0010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41023a0000200141206a2201200128020041016a3602000cb1010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db0012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450db0012000200329023c370204200020013602000cb1010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490daf0120024101742206200420042006491b22044100480daf010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41033a0000200141206a2201200128020041016a3602000cb0010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450daf012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450daf012000200329023c370204200020013602000cb0010b200341d8006a200141001086042003280258450dae0120002003290358370200200041086a200341d8006a41086a2802003602000caf010b200341d8006a200141001087042003280258450dad0120002003290358370200200041086a200341d8006a41086a2802003602000cae010b200341d8006a200141001087042003280258450dac0120002003290358370200200041086a200341d8006a41086a2802003602000cad010b200341d8006a200141001087042003280258450dab0120002003290358370200200041086a200341d8006a41086a2802003602000cac010b200341d8006a200141001087042003280258450daa0120002003290358370200200041086a200341d8006a41086a2802003602000cab010b200341d8006a200141001087042003280258450da90120002003290358370200200041086a200341d8006a41086a2802003602000caa010b200341d8006a200141001087042003280258450da80120002003290358370200200041086a200341d8006a41086a2802003602000ca9010b200341d8006a200141001087042003280258450da70120002003290358370200200041086a200341d8006a41086a2802003602000ca8010b200341d8006a200141001087042003280258450da60120002003290358370200200041086a200341d8006a41086a2802003602000ca7010b200341d8006a200141001087042003280258450da50120002003290358370200200041086a200341d8006a41086a2802003602000ca6010b200341d8006a200141001087042003280258450da40120002003290358370200200041086a200341d8006a41086a2802003602000ca5010b200341d8006a200141011086042003280258450da30120002003290358370200200041086a200341d8006a41086a2802003602000ca4010b200341d8006a200141011087042003280258450da20120002003290358370200200041086a200341d8006a41086a2802003602000ca3010b200341d8006a200141011087042003280258450da10120002003290358370200200041086a200341d8006a41086a2802003602000ca2010b200341d8006a200141011087042003280258450da00120002003290358370200200041086a200341d8006a41086a2802003602000ca1010b200341d8006a200141011087042003280258450d9f0120002003290358370200200041086a200341d8006a41086a2802003602000ca0010b200341d8006a200141011087042003280258450d9e0120002003290358370200200041086a200341d8006a41086a2802003602000c9f010b200341d8006a200141011087042003280258450d9d0120002003290358370200200041086a200341d8006a41086a2802003602000c9e010b200341d8006a200141011087042003280258450d9c0120002003290358370200200041086a200341d8006a41086a2802003602000c9d010b200341d8006a200141011087042003280258450d9b0120002003290358370200200041086a200341d8006a41086a2802003602000c9c010b200341d8006a200141011087042003280258450d9a0120002003290358370200200041086a200341d8006a41086a2802003602000c9b010b200341d8006a200141011087042003280258450d990120002003290358370200200041086a200341d8006a41086a2802003602000c9a010b200341d8006a200141021087042003280258450d980120002003290358370200200041086a200341d8006a41086a2802003602000c99010b200341d8006a200141021087042003280258450d970120002003290358370200200041086a200341d8006a41086a2802003602000c98010b200341d8006a200141021087042003280258450d960120002003290358370200200041086a200341d8006a41086a2802003602000c97010b200341d8006a200141021087042003280258450d950120002003290358370200200041086a200341d8006a41086a2802003602000c96010b200341d8006a200141021087042003280258450d940120002003290358370200200041086a200341d8006a41086a2802003602000c95010b200341d8006a200141021087042003280258450d930120002003290358370200200041086a200341d8006a41086a2802003602000c94010b200341d8006a200141031087042003280258450d920120002003290358370200200041086a200341d8006a41086a2802003602000c93010b200341d8006a200141031087042003280258450d910120002003290358370200200041086a200341d8006a41086a2802003602000c92010b200341d8006a200141031087042003280258450d900120002003290358370200200041086a200341d8006a41086a2802003602000c91010b200341d8006a200141031087042003280258450d8f0120002003290358370200200041086a200341d8006a41086a2802003602000c90010b200341d8006a200141031087042003280258450d8e0120002003290358370200200041086a200341d8006a41086a2802003602000c8f010b200341d8006a200141031087042003280258450d8d0120002003290358370200200041086a200341d8006a41086a2802003602000c8e010b200341d8006a200141001088042003280258450d8c0120002003290358370200200041086a200341d8006a41086a2802003602000c8d010b200341d8006a200141001088042003280258450d8b0120002003290358370200200041086a200341d8006a41086a2802003602000c8c010b200341d8006a200141001088042003280258450d8a0120002003290358370200200041086a200341d8006a41086a2802003602000c8b010b200341d8006a200141001089042003280258450d890120002003290358370200200041086a200341d8006a41086a2802003602000c8a010b200341d8006a200141001089042003280258450d880120002003290358370200200041086a200341d8006a41086a2802003602000c89010b200341d8006a200141001089042003280258450d870120002003290358370200200041086a200341d8006a41086a2802003602000c88010b200341d8006a200141001089042003280258450d860120002003290358370200200041086a200341d8006a41086a2802003602000c87010b200341d8006a200141001089042003280258450d850120002003290358370200200041086a200341d8006a41086a2802003602000c86010b200341d8006a200141001089042003280258450d840120002003290358370200200041086a200341d8006a41086a2802003602000c85010b200341d8006a200141001089042003280258450d830120002003290358370200200041086a200341d8006a41086a2802003602000c84010b200341d8006a200141001089042003280258450d820120002003290358370200200041086a200341d8006a41086a2802003602000c83010b200341d8006a200141001089042003280258450d810120002003290358370200200041086a200341d8006a41086a2802003602000c82010b200341d8006a200141001089042003280258450d800120002003290358370200200041086a200341d8006a41086a2802003602000c81010b200341d8006a200141001089042003280258450d7f20002003290358370200200041086a200341d8006a41086a2802003602000c80010b200341d8006a200141001089042003280258450d7e20002003290358370200200041086a200341d8006a41086a2802003602000c7f0b200341d8006a200141001089042003280258450d7d20002003290358370200200041086a200341d8006a41086a2802003602000c7e0b200341d8006a200141001089042003280258450d7c20002003290358370200200041086a200341d8006a41086a2802003602000c7d0b200341d8006a200141001089042003280258450d7b20002003290358370200200041086a200341d8006a41086a2802003602000c7c0b200341d8006a200141011088042003280258450d7a20002003290358370200200041086a200341d8006a41086a2802003602000c7b0b200341d8006a200141011088042003280258450d7920002003290358370200200041086a200341d8006a41086a2802003602000c7a0b200341d8006a200141011088042003280258450d7820002003290358370200200041086a200341d8006a41086a2802003602000c790b200341d8006a200141011089042003280258450d7720002003290358370200200041086a200341d8006a41086a2802003602000c780b200341d8006a200141011089042003280258450d7620002003290358370200200041086a200341d8006a41086a2802003602000c770b200341d8006a200141011089042003280258450d7520002003290358370200200041086a200341d8006a41086a2802003602000c760b200341d8006a200141011089042003280258450d7420002003290358370200200041086a200341d8006a41086a2802003602000c750b200341d8006a200141011089042003280258450d7320002003290358370200200041086a200341d8006a41086a2802003602000c740b200341d8006a200141011089042003280258450d7220002003290358370200200041086a200341d8006a41086a2802003602000c730b200341d8006a200141011089042003280258450d7120002003290358370200200041086a200341d8006a41086a2802003602000c720b200341d8006a200141011089042003280258450d7020002003290358370200200041086a200341d8006a41086a2802003602000c710b200341d8006a200141011089042003280258450d6f20002003290358370200200041086a200341d8006a41086a2802003602000c700b200341d8006a200141011089042003280258450d6e20002003290358370200200041086a200341d8006a41086a2802003602000c6f0b200341d8006a200141011089042003280258450d6d20002003290358370200200041086a200341d8006a41086a2802003602000c6e0b200341d8006a200141011089042003280258450d6c20002003290358370200200041086a200341d8006a41086a2802003602000c6d0b200341d8006a200141011089042003280258450d6b20002003290358370200200041086a200341d8006a41086a2802003602000c6c0b200341d8006a200141011089042003280258450d6a20002003290358370200200041086a200341d8006a41086a2802003602000c6b0b200341d8006a200141011089042003280258450d6920002003290358370200200041086a200341d8006a41086a2802003602000c6a0b200341d8006a200141021088042003280258450d6820002003290358370200200041086a200341d8006a41086a2802003602000c690b200341d8006a200141021088042003280258450d6720002003290358370200200041086a200341d8006a41086a2802003602000c680b200341d8006a200141021088042003280258450d6620002003290358370200200041086a200341d8006a41086a2802003602000c670b200341d8006a200141021088042003280258450d6520002003290358370200200041086a200341d8006a41086a2802003602000c660b200341d8006a200141021088042003280258450d6420002003290358370200200041086a200341d8006a41086a2802003602000c650b200341d8006a200141021088042003280258450d6320002003290358370200200041086a200341d8006a41086a2802003602000c640b200341d8006a200141021088042003280258450d6220002003290358370200200041086a200341d8006a41086a2802003602000c630b200341d8006a200141021089042003280258450d6120002003290358370200200041086a200341d8006a41086a2802003602000c620b200341d8006a200141021089042003280258450d6020002003290358370200200041086a200341d8006a41086a2802003602000c610b200341d8006a200141021089042003280258450d5f20002003290358370200200041086a200341d8006a41086a2802003602000c600b200341d8006a200141021089042003280258450d5e20002003290358370200200041086a200341d8006a41086a2802003602000c5f0b200341d8006a200141021089042003280258450d5d20002003290358370200200041086a200341d8006a41086a2802003602000c5e0b200341d8006a200141021089042003280258450d5c20002003290358370200200041086a200341d8006a41086a2802003602000c5d0b200341d8006a200141021089042003280258450d5b20002003290358370200200041086a200341d8006a41086a2802003602000c5c0b200341d8006a200141031088042003280258450d5a20002003290358370200200041086a200341d8006a41086a2802003602000c5b0b200341d8006a200141031088042003280258450d5920002003290358370200200041086a200341d8006a41086a2802003602000c5a0b200341d8006a200141031088042003280258450d5820002003290358370200200041086a200341d8006a41086a2802003602000c590b200341d8006a200141031088042003280258450d5720002003290358370200200041086a200341d8006a41086a2802003602000c580b200341d8006a200141031088042003280258450d5620002003290358370200200041086a200341d8006a41086a2802003602000c570b200341d8006a200141031088042003280258450d5520002003290358370200200041086a200341d8006a41086a2802003602000c560b200341d8006a200141031088042003280258450d5420002003290358370200200041086a200341d8006a41086a2802003602000c550b200341d8006a200141031089042003280258450d5320002003290358370200200041086a200341d8006a41086a2802003602000c540b200341d8006a200141031089042003280258450d5220002003290358370200200041086a200341d8006a41086a2802003602000c530b200341d8006a200141031089042003280258450d5120002003290358370200200041086a200341d8006a41086a2802003602000c520b200341d8006a200141031089042003280258450d5020002003290358370200200041086a200341d8006a41086a2802003602000c510b200341d8006a200141031089042003280258450d4f20002003290358370200200041086a200341d8006a41086a2802003602000c500b200341d8006a200141031089042003280258450d4e20002003290358370200200041086a200341d8006a41086a2802003602000c4f0b200341d8006a200141031089042003280258450d4d20002003290358370200200041086a200341d8006a41086a2802003602000c4e0b200341d8006a200141014100108a042003280258450d4c20002003290358370200200041086a200341d8006a41086a2802003602000c4d0b200341d8006a200141024100108a042003280258450d4b20002003290358370200200041086a200341d8006a41086a2802003602000c4c0b200341d8006a200141024100108a042003280258450d4a20002003290358370200200041086a200341d8006a41086a2802003602000c4b0b200341d8006a200141034100108a042003280258450d4920002003290358370200200041086a200341d8006a41086a2802003602000c4a0b200341d8006a200141034100108a042003280258450d4820002003290358370200200041086a200341d8006a41086a2802003602000c490b200341d8006a200141004101108a042003280258450d4720002003290358370200200041086a200341d8006a41086a2802003602000c480b200341d8006a200141004101108a042003280258450d4620002003290358370200200041086a200341d8006a41086a2802003602000c470b200341d8006a200141024101108a042003280258450d4520002003290358370200200041086a200341d8006a41086a2802003602000c460b200341d8006a200141024101108a042003280258450d4420002003290358370200200041086a200341d8006a41086a2802003602000c450b200341d8006a200141034101108a042003280258450d4320002003290358370200200041086a200341d8006a41086a2802003602000c440b200341d8006a200141034101108a042003280258450d4220002003290358370200200041086a200341d8006a41086a2802003602000c430b200341d8006a200141004102108a042003280258450d4120002003290358370200200041086a200341d8006a41086a2802003602000c420b200341d8006a200141004102108a042003280258450d4020002003290358370200200041086a200341d8006a41086a2802003602000c410b200341d8006a200141014102108a042003280258450d3f20002003290358370200200041086a200341d8006a41086a2802003602000c400b200341d8006a200141014102108a042003280258450d3e20002003290358370200200041086a200341d8006a41086a2802003602000c3f0b200341d8006a200141034102108a042003280258450d3d20002003290358370200200041086a200341d8006a41086a2802003602000c3e0b200341d8006a200141004103108a042003280258450d3c20002003290358370200200041086a200341d8006a41086a2802003602000c3d0b200341d8006a200141004103108a042003280258450d3b20002003290358370200200041086a200341d8006a41086a2802003602000c3c0b200341d8006a200141014103108a042003280258450d3a20002003290358370200200041086a200341d8006a41086a2802003602000c3b0b200341d8006a200141014103108a042003280258450d3920002003290358370200200041086a200341d8006a41086a2802003602000c3a0b200341d8006a200141024103108a042003280258450d3820002003290358370200200041086a200341d8006a41086a2802003602000c390b200341d8006a200141024100108a042003280258450d3720002003290358370200200041086a200341d8006a41086a2802003602000c380b200341d8006a200141034101108a042003280258450d3620002003290358370200200041086a200341d8006a41086a2802003602000c370b200341d8006a200141004102108a042003280258450d3520002003290358370200200041086a200341d8006a41086a2802003602000c360b200341d8006a200141014103108a0420032802580d1b0c340b41184101102a000b20094101102a000b20064104102a000b20064104102a000b20054104102a000b41184101102a000b411a4101102a000b20054104102a000b41184101102a000b200341ec006a41013602002003420237025c200341a498c5003602582003412636023c2003200441056a3602382003200341386a360268200341106a200341d8006a10e603200041086a200341106a41086a280200360200200020032903103702000c2b0b20084101102a000b20054101102a000b20054101102a000b20064101102a000b20054101102a000b20044101102a000b20064101102a000b20064101102a000b20064101102a000b20054101102a000b20044101102a000b20044101102a000b20064101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20002003290358370200200041086a200341d8006a41086a2802003602000c190b200329023c210a200328023821010b2001450d162000200a370204200020013602000c170b200329023c210a200328023821010b2001450d142000200a370204200020013602000c150b200328025c2201450d130b2000200a370204200020013602000c130b2004450d112001290200210a0b2000200a370204200020043602000c110b0240024002400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450d012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490d1120044101742209200820082009491b22094100480d110240024020040d002009102721080c010b200128021820042009102821080b2008450d03200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060c110b41184101102a000b20094101102a000b200541027421050340200320042802002206360248200220064d0d0220022006417f736a220620024f0d060240200820064103746a22062d00044103460d0020062d00054104470d040b200441046a21042005417c6a22050d000b410421090b200341d8006a200141186a2202200c410010800420032d00584101470d02200341086a200341e4006a2802003602002003200329025c3703000c030b200341ec006a220441023602002003411c6a41013602002003420237025c20034190a2c50036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821022003200329023c37021420032002360210200441013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b2003200329023c370204200320032802383602000c020b2003411c6a4126360200200341ec006a41023602002003420237025c200341b498c5003602582003200641056a360218200341263602142003200341106a3602682003200341306a3602102003200341d8006a10e6030c010b0240200941ff01714104460d00200341d8006a2002200c200910800402400240024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490d0e20044101742205200620062005491b22064100480d0e0240024020040d002006102721020c010b200228020020042006102821020b2002450d04200120023602182001411c6a2006360200200141206a28020021040b200128021820046a20093a0000200141206a2202200228020041016a3602000c040b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102204450d032003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450d03200329023c210a0c010b200328025c2202450d02200341e0006a290300210a0b2003200a370204200320023602000c020b20064101102a000b200341003602000b024020032802002202450d0020002003290204370204200020023602000c0b0b0240024002400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450d012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490d0b20044101742209200820082009491b22094100480d0b0240024020040d002009102721080c010b200128021820042009102821080b2008450d03200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060c0b0b41184101102a000b20094101102a000b41d2a2c500411d104e000b20032802382202450d00200329023c210a0c010b0240200141306a2802002202417f6a220420024f0d00200420024d0d020b411810272200450d022003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b2000200a370204200020023602000c060b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490d0420044101742209200820082009491b22094100480d040240024020040d002009102721080c010b200128021820042009102821080b2008450d03200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060c040b41184101102a000b20094101102a000b102b000b200341d8006a200141186a20051081042003280258450d0020002003290358370200200041086a200341d8006a41086a2802003602000c010b200041003602000b200341f0006a24000b6501017f230041206b2202240020024127360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c2002419c81c6003602082002200236021820012000200241086a1091042101200241206a240020010b0c00200028020020011093040bcd0201067f02400240024002402001450d0020014108490d010240200141ffffffff01712001470d00200141037441076e21010c030b41f495c5001058000b200041106a4200370200200041086a4280808080c000370200200041046a418c96c5003602000c020b200141016a21010b02400240417f2001417f6a6776220141016a220241ffffffff01712002470d00200141086a417c712203200141056a2204490d00200320024103746a22052003490d002005417d4f0d00200510272206450d012001200241037641076c20014108491b2107200641ff01200410cd04220520036a21030240200241034b0d00200520026a418001410320016b10cd041a0b200041146a2007360200200041106a41003602002000410c6a2003360200200041086a2001360200200041046a20053602000c020b41f495c5001058000b20054104102a000b200041003a00000b970d02117f017e230041206b220124000240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b024020032004410176490d00200141086a200310fb0320012d00084101460d042001411c6a2802002105200141146a2802002106200141106a2802002107200128020c210820002802002209280200417f7341808182847871210a200041046a28020020096a41016a210b2000280208210c200028020c210d03400240024002400240200a0d00200941046a210203402002200b4f0d02200c41206a210c20022802002103200241046a220421022003418081828478712203418081828478460d000b200341808182847873210a2004417c6a21090b200c200a684138716a220e280200210f410021030240200e28020422104104490d0041002103200f2102201021040340200228000020034105777341b9f3ddf1796c2103200241046a21022004417c6a220441034b0d000b2010417c6a22022002417c7122026b21102002200f6a41046a210f0b201041014b0d01200f21020c020b2000200d36020c2000200636020820002005200d6b3602102000280200210420002008360200200041046a22032802002102200320073602002002450d070240200241016a220341ffffffff01712003470d00200241086a417c712208200241056a490d00200820034103746a2008491a0b200410290c070b200f41026a21022010417e6a21102003410577200f2f00007341b9f3ddf1796c21030b02402010450d00200341057720022d00007341b9f3ddf1796c21030b200a417f6a210f41002102200341057741ff017341b9f3ddf1796c221121030340200241046a2202200320077122046a2103200820046a280000418081828478712210450d000b0240200820106841037620046a20077122026a2c00004100480d002008280200418081828478716841037621020b200f200a71210a200820026a201141197622033a00002002417c6a20077120086a41046a20033a0000200620024103746a200e2902003702000c000b0b200241016a21044100210341002102024003400240024020034101710d00200220044f0d0320022103200241016a21020c010b200241036a220320024922080d0220032004492207450d022004200241046a20081b200420071b21020b200028020020036a220320032802002203410776417f73418182840871200341fffefdfb07726a360200410121030c000b0b20002802002102200041046a220428020041016a220341044f0d01200241046a2002200310cf041a2004280200220220002802006a41016a418001410320026b10cd041a0c020b41f495c5001058000b200220036a20022800003600000b417f210202400240200041046a2211280200220341016a220f2003490d00200041086a21064100210b0340200b220c41016a210b0240200c20002802006a2d0000418001470d00024003402006280200200c4103746a220e2802002107410021030240200e28020422084104490d004100210320072102200821040340200228000020034105777341b9f3ddf1796c2103200241046a21022004417c6a220441034b0d000b2008417c6a22022002417c7122026b2108200220076a41046a21070b02400240200841014b0d00200721020c010b200741026a21022008417e6a2108200341057720072f00007341b9f3ddf1796c21030b02402008450d00200341057720022d00007341b9f3ddf1796c21030b201128020021082000280200210741002102200341057741ff017341b9f3ddf1796c220a21030340200241046a2202200320087122046a2103200720046a280000418081828478712210450d000b0240200720106841037620046a20087122026a2c00004100480d002007280200418081828478716841037621020b2002200a20087122036b200c20036b732008714104490d01200720026a22032d000021042003200a41197622103a00002002417c6a20087120076a41046a20103a00000240200441ff01460d00200628020020024103746a220229020021122002200e290200370200200e20123702000c010b0b20002802002203200c6a41ff013a000020032011280200200c417c6a716a41046a41ff013a0000200628020020024103746a200e2902003702000c010b2007200c6a200a41197622023a00002008200c417c6a7120076a41046a20023a00000b200b200f470d000b200041046a28020022024108490d010b200241016a41037641076c21020b20002002200028020c6b3602100b200141206a24000b19002000200141186a280200360204200020012802103602000b810101017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d0220034101742201200220022001491b22014100480d020240024020030d002001102721020c010b200028020020032001102821020b2002450d0120002002360200200041046a20013602000b0f0b20014101102a000b102b000bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d0020002002200110ce041a200441e0006a24000f0b200441286a41146a4103360200200441346a411d360200200441106a41146a41033602002004200441086a36024020042004410c6a360244200441c8006a41146a41003602002004420337021420044190d1c5003602102004411d36022c200441b8d6c5003602582004420137024c200441e4d1c5003602482004200441286a3602202004200441c8006a3602382004200441c4006a3602302004200441c0006a360228200441106a41a0d2c5001057000bbc0601037f230041d0006b22042400200420033a000f0240024002400240024020022802082205417f6a220620054f0d00200620054d0d010b411810272202450d012004421837023420042002360230200441306a4100411810fe0320042004280238220241186a3602382002200428023022056a411841f6a1c500411810ff03200420042902343702342004200536023041d497c5004134200441306a41c497c50010a201000b200141086a2802002105200228020020064103746a2206280200210202400240024020062d0006450d0020052002460d010b024002400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d00002205417c6a220241014b0d02024020020e020400040b4118102722020d0141184101102a000b412b10272202450d05200041013a0000200241276a41002800f29b45360000200241206a41002900eb9b45370000200241186a41002900e39b45370000200241106a41002900db9b45370000200241086a41002900d39b45370000200241002900cb9b45370000200041086a42ab808080b005370200200041046a20023602000c060b200241106a4100290086a245370000200241086a41002900fea145370000200241002900f6a14537000020044298808080800337022420042002360220200441c4006a410136020020044201370234200441b89cc5003602302004412136024c2004200441c8006a3602402004200441206a360248200441106a200441306a10e60302402004280224450d00200428022010290b200041013a0000200041046a20042903103702002000410c6a200441106a41086a2802003602000c050b0240200341ff017122024104460d0020052002470d020b200041003a0000200020053a00010c040b20004180083b01000c030b200420053a0048200441c4006a4102360200200441206a410c6a412536020020044202370234200441f89bc500360230200441253602242004200441206a3602402004200441c8006a36022820042004410f6a360220200441106a200441306a10e6032000410c6a200441186a280200360200200041046a2004290310370200200041013a00000c020b41184101102a000b412b4101102a000b200441d0006a24000bc00502047f017e230041d0006b22032400024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044d0d010b411810272202450d01200241106a4100290086a245370000200241086a41002900fea145370000200241002900f6a14537000020034298808080800337022420032002360220200341cc006a41013602002003420137023c200341b89cc500360238200341213602142003200341106a3602482003200341206a3602102000200341386a10e6032003280224450d04200328022010290c040b0240024002402002280200220620054103746a2d000522054104460d00200341386a200120022005108004024020032d00384101470d002000200329023c370200200041086a200341c4006a2802003602000c070b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d010b411810272202450d02200241106a4100290086a245370000200241086a41002900fea145370000200241002900f6a14537000020034298808080800337022420032002360220200341cc006a41013602002003420137023c200341b89cc500360238200341213602142003200341106a3602482003200341206a3602102000200341386a10e6032003280224450d04200328022010290c040b200141086a28020021022003200737030820022007a7470d02200041003602000c030b41184101102a000b41184101102a000b200341cc006a41023602002003412c6a41013602002003420237023c200341989bc50036023820034101360224200320023602342003200341206a3602482003200341086a3602282003200341346a360220200341106a200341386a10e603200041086a200341106a41086a280200360200200020032903103702000b200341d0006a24000bad0301057f230041c0006b2203240020032002360200024002402001280204220420024b0d002001280208417c6a21052001410c6a280200410374210102400340024020010d00200320043602042003412c6a4102360200200341306a410c6a41013602002003420337021c200341c0a3c500360218200341013602342003200341306a3602282003200341046a36023820032003360230200341086a200341186a10e6032000410c6a200341106a280200360200200041046a2003290308370200200041013a00000c040b02402004200541046a2802006a220620044f0d00412010272204450d02200041013a0000200441186a41002900b8a345370000200441106a41002900b0a345370000200441086a41002900a8a345370000200441002900a0a345370000200041086a42a08080808004370200200041046a20043602000c040b200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a00010c020b41204101102a000b200041003a00002000200128020020026a2d00003a00010b200341c0006a24000bbe0201037f230041106b220224000240024020002d00004104470d002002200128021841f499c50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b2002200128021841f799c50041082001411c6a28020028020c1105003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41809ac500108c04210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241106a2400200041ff01714100470b820601037f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200541386a200141186a2203200141286a410010800420052d00384101470d012000200529023c370200200041086a200541c4006a2802003602000c020b200541cc006a41023602002005411c6a41013602002005420337023c200541f498c500360238200541013602142005200541106a36024820052005410c6a3602182005200541086a360210200541206a200541386a10e603200041086a200541206a41086a280200360200200020052903203702000c010b2001280200210220054100360220024020022802080d00200541cc006a41013602002005420237023c20054188a0c500360238200541013602342005200541306a3602482005200541206a360230200541106a200541386a10e60320052802102202450d0020002005290214370204200020023602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d0320024101742207200620062007491b22064100480d030240024020020d002006102721020c010b200328020020022006102821020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2202200228020041016a3602000c030b200541cc006a220241013602002005420137023c200541f0a2c50036023820054101360234200520063602302005200541306a360248200541106a200541386a10e60320052802102201450d022005200529021437021420052001360210200241013602002005420137023c200541b89cc500360238200541213602342005200541306a3602482005200541106a360230200541206a200541386a10e60302402005280214450d00200528021010290b20052802202202450d0220002005290224370204200020023602000c030b20064101102a000b102b000b200041003602000b200541d0006a24000bb00301017f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200128020021022005410036023420022802080d01200541cc006a41013602002005420237023c20054188a0c500360238200541013602142005200541106a3602482005200541346a360210200541206a200541386a10e60320052802202202450d0120002005290224370204200020023602000c020b200541cc006a41023602002005412c6a41013602002005420337023c200541f498c500360238200541013602242005200541206a36024820052005410c6a3602282005200541086a360220200541106a200541386a10e603200041086a200541106a41086a280200360200200020052903103702000c010b200541386a200141186a2202200141286a22032004108004024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200541386a200220034100108004024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200041003602000b200541d0006a24000be70301047f230041c0006b22032400200341286a200141186a2204200141286a20021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d0320024101742206200520052006491b22054100480d030240024020020d002005102721020c010b200428020020022005102821020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320053602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20054101102a000b102b000b200041003602000b200341c0006a24000ba00401047f230041c0006b22032400200341286a200141186a2204200141286a220520021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a200420052002108004024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d0320024101742206200520052006491b22054100480d030240024020020d002005102721020c010b200428020020022005102821020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320053602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20054101102a000b102b000b200041003602000b200341c0006a24000be70301057f230041c0006b22032400200341286a200141186a2204200141286a20021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d0320054101742207200620062007491b22064100480d030240024020050d002006102721050c010b200428020020052006102821050b2005450d02200120053602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320063602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20064101102a000b102b000b200041003602000b200341c0006a24000ba00401057f230041c0006b22032400200341286a200141186a2204200141286a220520021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a200420052002108004024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d0320054101742207200620062007491b22064100480d030240024020050d002006102721040c010b200428020020052006102821040b2004450d02200120043602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320063602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20064101102a000b102b000b200041003602000b200341c0006a24000be70301047f230041c0006b22042400200441286a200141186a2205200141286a20021080040240024020042d00284101470d002000200429022c370200200041086a200441346a2802003602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d0320024101742207200620062007491b22064100480d030240024020020d002006102721020c010b200528020020022006102821020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20033a0000200141206a2201200128020041016a3602000c030b2004413c6a220141013602002004420137022c200441f0a2c50036022820044101360214200420063602102004200441106a360238200441186a200441286a10e60320042802182202450d022004200429021c37021c20042002360218200141013602002004420137022c200441b89cc500360228200441213602142004200441106a3602382004200441186a3602102004200441286a10e6030240200428021c450d00200428021810290b20042802002201450d0220002004290204370204200020013602000c030b20064101102a000b102b000b200041003602000b200441c0006a24000bc10201037f230041206b220224000240024020002d00004104470d002002200128021841b2bfc50041082001411c6a28020028020c11050022003a001820022001360210200241003a0019200241003602140c010b2002200128021841babfc50041052001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41c0bfc500108c04210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241206a2400200041ff01714100470bf30202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d0041012104200628021841f481c60041b382c60020051b4102410120051b2006411c6a28020028020c1105000d0120012000280200200228020c11040021040c010b024020050d0041012104200628021841b482c60041022006411c6a28020028020c1105000d01200028020021060b41012104200341013a00172003200341176a3602102006290208210720062902102108200341346a41fc81c60036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b2003200a3703402003200937033820032008370328200320073703202003200b3703182003200341086a3602302001200341186a200228020c1104000d002003280230419482c6004102200328023428020c11050021040b200020043a00082000200028020441016a360204200341d0006a240020000b17000240200041046a280200450d00200028020010290b0b0c002000280200200110f7030b160020002802002200280200200028020820011082010b110020012000280200200028020810e9030bbd0801087f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a36020020034280808080800437030820032000360220410021062003410036021820034100360210200320053602302003200536022802400240024002400240200228020822070d0020022802002108200228020422092004200420094b1b220a450d0141012104200020082802002008280204200128020c1105000d04200841086a210241012106034002402005280200200341086a200541046a280200110400450d00410121040c060b2006200a4f0d02200241046a210020022802002101200541086a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110500450d000c050b0b20022802002108200228020422092002410c6a2802002205200520094b1b220a450d0041012104200020082802002008280204200128020c1105000d03200741106a2105200841086a21024101210603402003200541786a28020036020c2003200541106a2d00003a003820032005417c6a28020036020841002101410021040240024002400240200541086a2802000e0400010203000b2005410c6a2802002100410121040c020b02402005410c6a2802002207200328023422044f0d0041002104200328023020074103746a22072802044128470d0220072802002802002100410121040c020b41f8dbc500200720041037000b4100210420032802282207200328022c460d002003200741086a3602284100210420072802044128470d0020072802002802002100410121040b2003200036021420032004360210024002400240024002400240024020052802000e0404010006040b20032802282200200328022c470d010c050b200541046a2802002200200328023422044f0d01200328023020004103746a22002802044128470d04200028020028020021040c030b2003200041086a36022820002802044128470d03200028020028020021040c020b41f8dbc500200020041037000b200541046a28020021040b410121010b2003200436021c2003200136021802400240200541706a2802004101460d0020032802282204200328022c460d042003200441086a3602280c010b200541746a2802002204200328023422004f0d04200328023020044103746a21040b02402004280200200341086a200441046a280200110400450d00410121040c050b2006200a4f0d01200241046a210020022802002101200541246a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110500450d000c040b0b0240200920064d0d00410121042003280220200820064103746a22052802002005280204200328022428020c1105000d030b410021040c020b41c8dac5001058000b4188dcc500200420001037000b200341c0006a240020040bfc0101027f230041106b220224002002200128021841bb82c60041052001411c6a28020028020c1105003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a4190a3c500108c041a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841b682c60041012000411c6a28020028020c1105000d010b2002280200220128021841b782c60041012001411c6a28020028020c11050021010b200220013a00080b200241106a2400200141ff01714100470ba46601037f230041206b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00000eac010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab0100010b200220012802184183b4c50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000cab010b200220012802184194b4c500410b2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000caa010b20022001280218419fb4c50041032001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca9010b2002200128021841a2b4c50041052001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41a8b4c500108c0421000ca8010b2002200128021841b8b4c50041042001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41a8b4c500108c0421000ca7010b2002200128021841bcb4c50041022001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41a8b4c500108c0421000ca6010b2002200128021841beb4c50041042001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca5010b2002200128021841c2b4c50041032001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca4010b2002200128021841c5b4c50041022001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000ca3010b2002200128021841d8b4c50041042001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000ca2010b2002200128021841dcb4c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41e4b4c500108c04210120022000410c6a36020c20012002410c6a41c8b4c500108c0421000ca1010b2002200128021841f4b4c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca0010b2002200128021841fab4c50041042001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c9f010b2002200128021841feb4c500410c2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041016a36020c20012002410c6a418cb5c500108c0421000c9e010b20022001280218419cb5c50041042001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c9d010b2002200128021841a0b5c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c9c010b2002200128021841a6b5c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c9b010b2002200128021841aeb5c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c9a010b2002200128021841b6b5c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c99010b2002200128021841beb5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c98010b2002200128021841c7b5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c97010b2002200128021841d0b5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c96010b2002200128021841d7b5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c95010b2002200128021841deb5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c94010b2002200128021841e5b5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c93010b2002200128021841ecb5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c92010b2002200128021841f5b5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c91010b2002200128021841feb5c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c90010b200220012802184188b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8f010b200220012802184192b6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8e010b20022001280218419bb6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8d010b2002200128021841a4b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8c010b2002200128021841aeb6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8b010b2002200128021841b8b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8a010b2002200128021841c2b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c89010b2002200128021841ccb6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c88010b2002200128021841d4b6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c87010b2002200128021841dcb6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c86010b2002200128021841e4b6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c85010b2002200128021841ecb6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c84010b2002200128021841f5b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c83010b2002200128021841ffb6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c82010b200220012802184188b7c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c81010b200220012802184192b7c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c80010b20022001280218419cb7c500410d2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a418cb5c500108c0421000c7f0b2002200128021841a9b7c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a418cb5c500108c0421000c7e0b2002200128021841b3b7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41bcb7c500108c0421000c7d0b2002200128021841ccb7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41d4b7c500108c0421000c7c0b2002200128021841e4b7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c7b0b2002200128021841ecb7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41f4b7c500108c0421000c7a0b200220012802184184b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c790b20022001280218418ab8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c780b20022001280218418fb8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c770b200220012802184194b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c760b20022001280218419ab8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c750b2002200128021841a0b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c740b2002200128021841a6b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c730b2002200128021841acb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c720b2002200128021841b2b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c710b2002200128021841b8b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c700b2002200128021841beb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6f0b2002200128021841c4b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6e0b2002200128021841cab8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6d0b2002200128021841cfb8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6c0b2002200128021841d4b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6b0b2002200128021841dab8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6a0b2002200128021841e0b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c690b2002200128021841e6b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c680b2002200128021841ecb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c670b2002200128021841f2b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c660b2002200128021841f8b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c650b2002200128021841feb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c640b200220012802184184b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c630b200220012802184189b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c620b20022001280218418eb9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c610b200220012802184193b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c600b200220012802184198b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5f0b20022001280218419db9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5e0b2002200128021841a2b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5d0b2002200128021841a7b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5c0b2002200128021841acb9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5b0b2002200128021841b1b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5a0b2002200128021841b6b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c590b2002200128021841bbb9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c580b2002200128021841c0b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c570b2002200128021841c6b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c560b2002200128021841ccb9c50041092001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c550b2002200128021841d5b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c540b2002200128021841dbb9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c530b2002200128021841e1b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c520b2002200128021841e7b9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c510b2002200128021841eeb9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c500b2002200128021841f5b9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4f0b2002200128021841fcb9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4e0b200220012802184183bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4d0b200220012802184189bac50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4c0b20022001280218418ebac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4b0b200220012802184194bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4a0b20022001280218419abac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c490b2002200128021841a1bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c480b2002200128021841a8bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c470b2002200128021841afbac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c460b2002200128021841b6bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c450b2002200128021841bcbac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c440b2002200128021841c2bac50041092001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c430b2002200128021841cbbac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c420b2002200128021841d1bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c410b2002200128021841d7bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c400b2002200128021841ddbac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3f0b2002200128021841e4bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3e0b2002200128021841ebbac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3d0b2002200128021841f2bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3c0b2002200128021841f9bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3b0b2002200128021841ffbac50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3a0b200220012802184184bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c390b20022001280218418abbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c380b200220012802184190bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c370b200220012802184197bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c360b20022001280218419ebbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c350b2002200128021841a5bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c340b2002200128021841acbbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c330b2002200128021841b2bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c320b2002200128021841b8bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c310b2002200128021841bfbbc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c300b2002200128021841c7bbc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2f0b2002200128021841cfbbc500410a2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2e0b2002200128021841d9bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2d0b2002200128021841e0bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2c0b2002200128021841e6bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2b0b2002200128021841ecbbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2a0b2002200128021841f2bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c290b2002200128021841f8bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c280b2002200128021841febbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c270b200220012802184184bcc500410b2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c260b20022001280218418fbcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c250b200220012802184195bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c240b20022001280218419bbcc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c230b2002200128021841a2bcc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c220b2002200128021841aabcc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c210b2002200128021841b2bcc500410a2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c200b2002200128021841bcbcc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1f0b2002200128021841c3bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1e0b2002200128021841c9bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1d0b2002200128021841cfbcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1c0b2002200128021841d5bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1b0b2002200128021841dbbcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1a0b2002200128021841e1bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c190b2002200128021841e7bcc500410b2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c180b2002200128021841f2bcc500410a2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c170b2002200128021841fcbcc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c160b200220012802184188bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c150b200220012802184194bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c140b2002200128021841a0bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c130b2002200128021841acbdc500410d2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c120b2002200128021841b9bdc500410d2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c110b2002200128021841c6bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c100b2002200128021841d2bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0f0b2002200128021841debdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0e0b2002200128021841eabdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0d0b2002200128021841f6bdc500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0c0b200220012802184184bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0b0b200220012802184192bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0a0b2002200128021841a0bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c090b2002200128021841aebec500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c080b2002200128021841babec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c070b2002200128021841c8bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c060b2002200128021841d6bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c050b2002200128021841e4bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c040b2002200128021841f2bec500410d2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c030b2002200128021841ffbec50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c020b200220012802184190bfc50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c010b2002200128021841a1bfc50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000b20002d00082101024020002802042203450d00200141ff0171210441012101024020040d00024020034101470d0020002d0009450d00200028020022042d00004104710d0041012101200428021841b682c60041012004411c6a28020028020c1105000d010b2000280200220128021841b782c60041012001411c6a28020028020c11050021010b200020013a00080b200241206a2400200141ff01714100470bd00201027f230041106b220224002000280200280200210020012802184196a4c50041052001411c6a28020028020c1105002103200241003a0005200220033a00042002200136020020022000410c6a36020c2002419ba4c500410e2002410c6a41aca4c50010950421012002200036020c200141bca4c50041092002410c6a41c8a4c50010950421012002200041046a36020c200141d8a4c500410c2002410c6a41c8a4c50010950421012002200041086a36020c200141e4a4c500410c2002410c6a41c8a4c5001095041a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d00200341b082c6004102200111050021000c010b200341b282c6004101200111050021000b200220003a00040b200241106a2400200041ff01714100470bdd0302047f057e230041d0006b2205240041012106024020002d00040d0020002d000521070240200028020022082d00004104710d0041012106200828021841f481c60041f181c600200741ff017122071b4102410320071b2008411c6a28020028020c1105000d014101210620002802002208280218200120022008411c6a28020028020c1105000d01410121062000280200220828021841c481c60041022008411c6a28020028020c1105000d0120032000280200200428020c11040021060c010b0240200741ff01710d0041012106200828021841f681c60041032008411c6a28020028020c1105000d01200028020021080b41012106200541013a00172005200541176a360210200829020821092008290210210a200541346a41fc81c600360200200520082902183703082008290220210b2008290228210c200520082d00303a00482008290200210d2005200c3703402005200b3703382005200a370328200520093703202005200d3703182005200541086a360230200541086a2001200210c5040d00200541086a41c481c600410210c5040d002003200541186a200428020c1104000d002005280230419482c6004102200528023428020c11050021060b200041013a0005200020063a0004200541d0006a240020000b865f010b7f23004190016b220324002003200136021c2002280208220441586a2105200241106a2802002206412c6c2101024002400240024002400240024002400240024002400240024002400240024002400240024003402001450d01200141546a2101200541286a21072005412c6a2208210520072d00004104470d000b2006412c6c2101200441586a210503402001450d02200141546a2101200541286a21072005412c6a2209210520072d0000410b470d000b2006412c6c2101200441586a210503402001450d03200141546a2101200541286a21072005412c6a2204210520072d00004102470d000b024041002802c082464105490d002003410136023c20032003411c6a36023841002802c48246210120034188016a41980136020020034180016a42ec80808010370300200341f8006a4125360200200341f0006a4101360200200341e0006a4201370300200341d8006a410a360200200341aba8c50036027c20034186a8c500360274200341ec006a200341386a360200200341a4a5c50036025c200341fca7c5003602542003410536025041c882c60041b8d6c500200141024622011b200341d0006a41b4cac50041cccac50020011b2802101100000b200341106a20081080032003280214200328021c22014d0d03200328021020014102746a2201450d03200341086a20041080030240200328020c200128020022014d0d00200328020820014104746a22010d050b412510272201450d092001411d6a41002900c9a545370000200141186a41002900c4a545370000200141106a41002900bca545370000200141086a41002900b4a545370000200141002900aca545370000200041086a42a5808080d00437020020002001360204200041013602000c120b411310272201450d042001410f6a41002800ffa445360000200141086a41002900f8a445370000200141002900f0a445370000200041086a4293808080b00237020020002001360204200041013602000c110b410f10272201450d04200141076a410029008aa54537000020014100290083a545370000200041086a428f808080f00137020020002001360204200041013602000c100b410f10272201450d04200141076a4100290099a54537000020014100290092a545370000200041086a428f808080f00137020020002001360204200041013602000c0f0b412510272201450d042001411d6a41002900c9a545370000200141186a41002900c4a545370000200141106a41002900bca545370000200141086a41002900b4a545370000200141002900aca545370000200041086a42a5808080d00437020020002001360204200041013602000c0e0b0240200941086a280200200328021c22054b0d00412710272201450d062001411f6a41002900f0a545370000200141186a41002900e9a545370000200141106a41002900e1a545370000200141086a41002900d9a545370000200141002900d1a545370000200041086a42a7808080f00437020020002001360204200041013602000c0e0b20092802002109200341206a41086a420037030020034280808080c00037032020012d000d2107410021012003410036024020032007410447220a36023c2003200a360238200341003a0044024041002802c0824641044b0d00200341d0006a41086a200341386a41086a29030037030020032003290338370350200341d0006a21070c070b2003412936024c2003200341386a36024841002802c48246210120034188016a41cb0036020020034180016a42ec80808010370300200341f8006a4125360200200341f0006a4101360200200341e0006a4201370300200341d0006a41086a2207410a360200200341aba8c50036027c20034186a8c500360274200341ec006a200341c8006a360200200341f8a5c50036025c200341fca7c5003602542003410536025041c882c60041b8d6c500200141024622011b200341d0006a41b4cac50041cccac50020011b280210110000200328022c2108200328022821012007200341386a41086a29030037030020032003290338370350200341d0006a210720082001460d0620032802242101200341d0006a21070c070b41134101102a000b410f4101102a000b410f4101102a000b41254101102a000b41254101102a000b41274101102a000b200141016a22082001490d0520014101742206200820082006491b220841ffffffff00712008470d05200841047422064100480d050240024020010d002006102721010c010b200328022420014104742006102821010b2001450d012003200836022820032001360224200328022c21080b200120084104746a22012007290200370200200141086a200741086a2902003702002003200328022c41016a36022c410021072009200541186c6a2201280214450d022009200541186c6a410c6a2109200141146a2108200341d0006a410472210b410021074100210103400240200328022020074d0d00200341d0006a200341206a4100109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c060b2007200328022020032802542d000c1b21070b02400240024002400240024002402001200828020022054f0d002003200928020020014104746a2205360234024041002802c082464105490d002003412236023c2003200341346a36023841002802c482462105200341c90136028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c50036027420034101360270200342013703602003419c81c60036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328023421050b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d000022060eac0102220000002201030405060708090a0b0c0d0e0f1010101010101010101010101010111111111111111111121314141414151616161616161616161615161616161616161616161616161616161616161616161717171818181818181818181818181818181717171818181818181818181818181818181717171717171718181818181818171717171717171818181818181819191919191919191919191919191919191919191919191919020b20052d00012105200320032802203602402003200541044722053602382003200641034720057136023c200341003a0044024041002802c082464105490d002003412936024c2003200341386a36024841002802c482462105200341cb0036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341f8a5c50036025c2003410a360258200341fca7c500360254200341053602502003200341c8006a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b200341d0006a41086a200341386a41086a2903003703002003200329033837035002400240200328022c22052003280228460d00200328022421060c010b200541016a22062005490d282005410174220c20062006200c491b220c41ffffffff0071200c470d28200c410474220d4100480d280240024020050d00200d102721060c010b20032802242005410474200d102821060b2006450d1d2003200c36022820032006360224200328022c21050b200620054104746a22052003290350370200200541086a200341d0006a41086a2903003702002003200328022c41016a36022c0c210b41002105024041002802c082464105490d000240200328022c2206417f6a220c20064b0d002003280224200c4104746a4100200c2006491b21050b2003412a36024c200320053602382003200341386a36024841002802c482462105200341d30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c500360274200341013602702003420137036020034180a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341c8006a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b0240200328022c2205450d0020032005417f6a220536022c200328022420054104746a22052d000c4102470d1a0b411710272201450d1c2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c250b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b0240200328022c2205417f6a220620054f0d00200620054d0d180b411710272201450d1e2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c240b200341d0006a200341206a200541046a280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c240b200341d0006a200341206a2003280254280204109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102722010d0141174101102a000b200328022420064104746a41013a000c0c1f0b2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c230b200341d0006a200341206a200541046a280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c230b200341d0006a200341206a20032802542802042205109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c230b200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c230b20032005360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c1e0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c220b200341d0006a200341206a2005410c6a280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c220b2003280254280204210c200541086a2802004102742106200541046a280200210502400340024020060d00200341d0006a200341206a200c109a042003280250450d0220002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b200341d0006a200341206a2005280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c240b2006417c6a2106200541046a21052003280254280204200c460d000b412710272201450d1a2001411f6a41002900dda645370000200141186a41002900d6a645370000200141106a41002900cea645370000200141086a41002900c6a645370000200141002900bea645370000200041086a42a7808080f00437020020002001360204200041013602000c220b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102722010d0141174101102a000b200328022420064104746a41013a000c0c1d0b2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c210b200341d0006a200341206a200a109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c210b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102722010d0141174101102a000b200328022420064104746a41013a000c0c1c0b2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c200b200341d0006a200541046a2802002002109b04024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c200b200341d0006a200341206a20032802542205280208109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c200b200320052d000d4104472205360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c1b0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1f0b20032004108003024002402003280204200541046a28020022054d0d002003280200220620054104746a220c0d010b410e10272201450d18200141066a41002900eba645370000200141002900e5a645370000200041086a428e808080e00137020020002001360204200041013602000c1f0b200341d0006a200341206a200620054104746a280208109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1f0b2003200c2d000d4104472205360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c1a0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1e0b200341d0006a200341206a4101109a042003280250450d1820002003290350370204200041013602002000410c6a200341d8006a2802003602000c1d0b200341d0006a200341206a4102109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1d0b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1d0b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c180b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1c0b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c170b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1b0b200341d0006a200341206a4101109a042003280250450d1520002003290350370204200041013602002000410c6a200341d8006a2802003602000c1a0b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1a0b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c150b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c190b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c140b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c180b200341d0006a200341206a4101109a042003280250450d1220002003290350370204200041013602002000410c6a200341d8006a2802003602000c170b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c170b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c120b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c160b200341d0006a200341206a4102109a042003280250450d1020002003290350370204200041013602002000410c6a200341d8006a2802003602000c150b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c100b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c140b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c140b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0f0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c130b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0e0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c120b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c120b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0d0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c110b200341d0006a200341206a4102109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c110b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0c0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c100b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c100b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0b0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c0f0b200341d0006a200341206a4102109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c0f0b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0a0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c0e0b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c0e0b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c090b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c0d0b200328022420064104746a41013a000c0c070b20052802002106200320052802082205360238024041002802c082464105490d002003410136024c2003200341386a36024841002802c482462105200341db0036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341f4a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341c8006a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328023821050b2003200536022020032006360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b28021011000020032802202105200328024821060b0240200520066a220620054f0d00410e102722010d0a410e4101102a000b200320063602200c060b41fca6c500200120051037000b200d4104102a000b41174101102a000b41274101102a000b410e4101102a000b41174101102a000b200141016a22012008280200490d000c030b0b20064104102a000b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c010b20004100360200200020073602042003280228450d02200328022410290c020b2003280228450d01200328022410290c010b102b000b20034190016a24000bc60201027f230041106b2202240020012802184196a4c50041052001411c6a28020028020c1105002103200241003a0005200220033a00042002200136020020022000410c6a36020c2002419ba4c500410e2002410c6a41aca4c50010950421012002200036020c200141bca4c50041092002410c6a41c8a4c50010950421012002200041046a36020c200141d8a4c500410c2002410c6a41c8a4c50010950421012002200041086a36020c200141e4a4c500410c2002410c6a41c8a4c5001095041a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d00200341b082c6004102200111050021000c010b200341b282c6004101200111050021000b200220003a00040b200241106a2400200041ff01714100470b9b0201027f024002400240024002402001410c6a2802002203417f6a220420034d0d00411610272201450d01200020013602042001410e6a4100290089aa45370000200141086a4100290083aa45370000200141002900fba945370000200041086a4296808080e0023702000c040b0240200420026b220220044d0d00411b10272201450d0220002001360204200141176a41002800a8aa45360000200141106a41002900a1aa45370000200141086a4100290099aa4537000020014100290091aa45370000200041086a429b808080b0033702000c040b200320024d0d022000200128020420024104746a360204200041003602000f0b41164101102a000b411b4101102a000b41acaac500200220031037000b200041013602000bbb0201037f230041106b220224000240024020002802000d00200220012802184186b2c50041042001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b20022001280218418ab2c50041042001411c6a28020028020c1105003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a4190b2c500108c04210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241106a2400200041ff01714100470bc50401027f230041d0006b2203240020032002360204024041002802c082464105490d002003410136020c2003200341046a36020841002802c482462102200341c8006a41ef00360200200341c0006a42ec80808010370300200341386a4125360200200341306a4101360200200341206a4201370300200341186a410a360200200341aba8c50036023c20034186a8c5003602342003412c6a200341086a360200200341a4a9c50036021c200341fca7c5003602142003410536021041c882c60041b8d6c500200241024622021b200341106a41b4cac50041cccac50020021b280210110000200328020421020b0240024002402002450d00200341106a2001410010980420032802104101470d012000200341106a4104722202290200370200200041086a200241086a2802003602000c020b200041003602000c010b02400240024002402001280200220220032802142204280208460d00200220032802046b220420024d0d02410f102722020d01410f4101102a000b024020042d000c0d00412510272202450d03200042a5808080d004370204200020023602002002411d6a41002900c9a945370000200241186a41002900c4a945370000200241106a41002900bca945370000200241086a41002900b4a945370000200241002900aca9453700000c040b200041003602000c030b2000428f808080f00137020420002002360200200241076a41002900d8a945370000200241002900d1a9453700000c020b20004100360200200120043602000c010b41254101102a000b200341d0006a24000bd809010b7f230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c210202400340024020020d00410021070c020b200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810800320032802182107200328021c21020b2002410020071b21092006412c6c2102200441586a2105200741b8d6c50020071b210a02400340024020020d004100210b0c020b200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a20081080032003280210210b2003280214210c0b2006412c6c2102200441586a2105200b41b8d6c500200b1b210d0240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210502400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810800320032802082207200328020c41286c6a2108024003400240024002402008200722026b41f8004b0d0020022008460d0f2002411c6a2105034020022d0018450d02200541286a2105200241286a22022008470d000c100b0b20022d00180d012002411c6a2105200241286a21070c060b2005410c6a21070c050b200241c0006a2d0000450d01200241e8006a2d0000450d03200241a0016a210720024190016a2d00000d000b20024194016a21050c030b200241c4006a2105200241d0006a21070c020b4185aec50041c200104e000b200241ec006a2105200241f8006a21070b2001450d0203402001417f6a21010240024003400240024002402008200722026b41f8004b0d0020022008460d0e2002411c6a2105034020022d0018450d02200541286a2105200241286a22022008460d0f0c000b0b20022d00180d01200241286a210720010d052002411c6a21050c080b2005410c6a21072001450d070c040b200241c0006a2d0000450d02200241e8006a2d0000450d01200241a0016a210720024190016a2d00000d000b20010d0220024194016a21050c050b200241f8006a210720010d01200241ec006a21050c040b200241d0006a210720010d000b200241c4006a21050c020b410021050b200c4100200b1b200120056b22024d0d01200d20024102746a2205450d010b200320052802002202360224200920024d0d01200a20024104746a2202450d0120002002360204410021020c030b200341cc006a41013602002003420237023c200341a4afc5003602382003410136022c2003200341286a3602482003200341206a360228200341d0006a200341386a10e603200341d0006a21020c010b200341cc006a4102360200200341dc006a41013602002003420337023c200341b4afc500360238200341013602542003200341d0006a3602482003200341206a3602582003200341246a360250200341286a200341386a10e603200341286a21020b20022802002105200041086a200229020437020020002005360204410121020b20002002360200200341e0006a24000f0b41c7aec50041dd00104e000bc60902057f017e024020010d00200041ac013a00000f0b02400240024002400240024020012d00002202414f6a41fb004f0d000c010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e312c2c0001022c2c0304052c06072c2c08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292c0b20012d00012103410221020c2b0b20012d00012103410321020c2a0b20012d00012103410421020c290b200141046a2802002104410721020c270b200141046a2802002104410821020c260b2001280208220541ffffffff03712005470d2720054102742202417f4c0d270240024020020d00410421040c010b200210272204450d290b02402005450d00200128020421022005410274210620042103034020032002280200360200200341046a2103200241046a21022006417c6a22060d000b0b200135020c4220862005ad842107410921020c250b200141046a2802002104410b21020c240b200141046a280200210420012d00012103410c21020c240b200141046a2802002104410f21020c220b200141046a2802002104411021020c210b200141046a2802002104411121020c200b200141046a2802002104411221020c1f0b200141046a2802002104411321020c1e0b200141046a280200210420013502082107411421020c1d0b200141046a280200210420013502082107411521020c1c0b200141046a280200210420013502082107411621020c1b0b200141046a280200210420013502082107411721020c1a0b200141046a280200210420013502082107411821020c190b200141046a280200210420013502082107411921020c180b200141046a280200210420013502082107411a21020c170b200141046a280200210420013502082107411b21020c160b200141046a280200210420013502082107411c21020c150b200141046a280200210420013502082107411d21020c140b200141046a280200210420013502082107411e21020c130b200141046a280200210420013502082107411f21020c120b200141046a280200210420013502082107412021020c110b200141046a280200210420013502082107412121020c100b200141046a280200210420013502082107412221020c0f0b200141046a280200210420013502082107412321020c0e0b200141046a280200210420013502082107412421020c0d0b200141046a280200210420013502082107412521020c0c0b200141046a280200210420013502082107412621020c0b0b200141046a280200210420013502082107412721020c0a0b200141046a280200210420013502082107412821020c090b200141046a280200210420013502082107412921020c080b200141046a280200210420013502082107412a21020c070b20012d00012103412b21020c070b20012d00012103412c21020c060b200141046a2802002104412d21020c040b20012903082107412e21020c020b200141046a2802002104412f21020c020b20012903082107413021020b0b0b200020033a0001200020023a0000200041086a2007370300200041046a20043602000f0b1039000b20024104102a000b8d0301067f230041106b220224000240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b4104762207490d00200028020021030c010b200420076a22062004490d0220034101742205200620062005491b220641ffffffff00712006470d02200641047422054100480d020240024020030d002005102721030c010b200028020020034104742005102821030b2003450d0120002003360200200041046a2006360200200041086a280200210420012802042105200128020021060b0240024020062005470d00410021060c010b2001200641106a3602000b20022006109c04024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a29030037030002400240200128020022052001280204470d00410021050c010b2001200541106a3602000b200441016a2104200641106a210620022005109c0420022d000041ac01470d000b0b200041086a2004360200200241106a24000f0b20054108102a000b102b000b110020002802003502004101200110aa010bea0302057f017e02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441c4006a2802002105200441386a2802002106200441346a2802002107200141016a21010c010b02400240200028020022010d002003ad210841002104410021010c010b20003301044220862003ad842108410121040b200010292008a72103024002402008422088a7220620012f01064f0d00200121050c010b034002400240200128020022050d002003ad2108410021050c010b200441016a210420013301044220862003ad8421080b200110292008a72103200521012008422088a7220620052f01064f0d000b0b200641027420056a4198036a2802002100200520064105746a220141c4006a2802002105200141386a2802002106200141346a280200210702402004417f6a2201450d00034020002802940321002001417f6a22010d000b0b410021010b20054102460d012002417f6a210202402006450d00200710290b20020d000b0b02402000418883c000460d0020002802002101200010292001450d0020012802002105200110292005450d00024020052802002201450d000340200510292001210520012802002200210120000d000b0b200510290b0b2300200141fd80c60041f880c60020002802002d000022001b4104410520001b10e9030b02000bc60201037f230041206b2202240002400240200028020022002d00004104470d002002200128021841b2bfc50041082001411c6a28020028020c11050022003a001820022001360210200241003a0019200241003602140c010b2002200128021841babfc50041052001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41c0bfc500108c04210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241206a2400200041ff01714100470b890501047f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841ba82c60041012001411c6a28020028020c110500210502402003450d0020022000360204024020050d00024020012d0000410471450d0041012104200128021841b882c6004101200128021c28020c1105000d012001280200210541012104200241013a001720022005360218200241fc81c60036023420022001290218370308200220012d00303a00482002200128020436021c200220012902283703402002200129022037033820022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a1080010d012002280230419482c6004102200228023428020c11050021040c010b200241046a200110800121040b024020034101470d00200421050c010b200041046a21002003410274417c6a210320042105034020022000360204200541ff0171210441012105024020040d00024020012802002204410471450d00200241013a001720022004360218200241fc81c60036023420022001290218370308200220012d00303a00482002200128020436021c200220012902283703402002200129022037033820022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a1080010d012002280230419482c6004102200228023428020c11050021050c010b200128021841f481c6004102200128021c28020c1105000d00200241046a200110800121050b200041046a21002003417c6a22030d000b0b41012100024020050d00200128021841b982c6004101200128021c28020c11050021000b200241d0006a240020000b8c0e01087f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024020042d00002200410d4b0d00024002400240024002400240024002400240024002400240024020000e0e0001020304050607080e090a0b0c000b200441086a280200450d0d200441046a28020010290c0d0b0240200441086a280200450d00200441046a28020010290b200441146a280200450d0c200441106a28020010290c0c0b02402004410c6a2802002201450d00200441046a28020021002001410474210103400240200041046a280200450d00200028020010290b200041106a2100200141706a22010d000b0b200441086a280200450d0b200428020410290c0b0b02402004410c6a2802002201450d00200441046a2802002100200141286c210103400240200041046a280200450d00200028020010290b0240200041106a280200450d002000410c6a28020010290b200041286a2100200141586a22010d000b0b200441086a280200450d0a200428020410290c0a0b200441086a280200450d09200441046a28020010290c090b200441086a280200450d08200441046a28020010290c080b200441086a280200450d07200441046a28020010290c070b02402004410c6a2802002200450d00200441046a280200220520004104746a21060340024020052802082201450d0020052802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b200541106a21000240200541046a280200450d00200528020010290b2000210520002006470d000b0b200441086a280200450d06200428020410290c060b02402004410c6a2802002201450d00200441046a2802002100200141146c210103400240200041046a280200450d00200028020010290b200041146a21002001416c6a22010d000b0b200441086a280200450d05200428020410290c050b02402004410c6a2802002200450d00200441046a28020022052000411c6c6a2106034002402005410c6a2802002201450d0020052802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b0240200541086a280200450d00200528020410290b2005411c6a21000240200541146a280200450d00200528021010290b2000210520002006470d000b0b200441086a280200450d04200428020410290c040b02402004410c6a2802002200450d00200441046a2802002205200041186c6a210603400240200541046a280200450d00200528020010290b0240200541146a2802002201450d00200528020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b200541186a21000240200541106a280200450d00200528020c10290b2000210520002006470d000b0b200441086a280200450d03200428020410290c030b02402004410c6a2802002200450d00200441046a28020022052000411c6c6a2106034002402005410c6a2802002201450d0020052802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b0240200541086a280200450d00200528020410290b2005411c6a21000240200541146a280200450d00200528021010290b2000210520002006470d000b0b200441086a280200450d02200428020410290c020b0240200441046a2d0000220041024b0d0002400240024020000e03000102000b2004410c6a280200450d04200441086a28020010290c040b0240200441146a2802002201450d002004410c6a28020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510290b2000410c6a2100200141746a22010d000b0b200441106a280200450d03200428020c10290c030b0240200441146a2802002200450d002004410c6a280200220720004104746a210803402007220641106a2107024020062802042200450d0002402006410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510290b2000410c6a2100200141746a22010d000b0b200641086a280200450d00200628020410290b20072008470d000b0b200441106a280200450d02200428020c10290c020b2004410c6a280200450d01200441086a28020010290c010b0240200441086a280200450d00200441046a28020010290b0240200441146a2802002200450d00200441186a280200450d00200010290b200441246a280200450d00200441206a28020010290b20022003470d000b0b0bc30201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01834101200110aa0121000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2004418001103e000b2004418001103e000bd00203027f017e017f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210020034120710d012000ac22042004423f8722047c2004852000417f73411f76200110aa0121000c020b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141e8d9c5004102200220036a4180016a410020036b10ab0121000b20024180016a240020000f0b2003418001103e000b2000418001103e000bd00202027f027e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f55200110aa0121000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2003418001103e000b2003418001103e000b040041000b02000b02000b2700200028020c200041106a2802001010200041146a3502001022200041186a350200102200000b08002000200110100bcd0701037f024002400240024002400240024002402001413f4b0d0002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0820034101742205200420042005491b22054100480d080240024020030d002005102721040c010b200228020020032005102821040b2004450d0220022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000c050b200141808001490d032001418080808004490d020c010b20054101102a000b0240024002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0720034101742205200420042005491b22054100480d070240024020030d002005102721040c010b200228020020032005102821040b2004450d0120022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a000002400240200241046a2802002204200528020022036b4104490d00200228020021040c010b200341046a22052003490d0720044101742203200520052003491b22034100480d070240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c040b20054101102a000b20034101102a000b024002400240200241046a2802002204200241086a28020022036b4104490d00200228020021040c010b200341046a22052003490d0520044101742203200520052003491b22034100480d050240024020040d002003102721040c010b200228020020042003102821040b2004450d0120022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c020b20034101102a000b02400240200241046a2802002204200241086a28020022036b4102490d00200228020021040c010b200341026a22052003490d0320044101742203200520052003491b22034100480d030240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000b024020014103742201450d00200020016a210103402000280200200041046a280200200210c702200041086a22002001470d000b0b0f0b20034101102a000b102b000b841001047f024002400240024002400240024002400240024002400240024020002d0000220241024b0d0002400240024020020e03000102000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0f20024101742204200320032004491b22044100480d0f0240024020020d002004102721030c010b200128020020022004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110c7020f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0e20024101742204200320032004491b22044100480d0e0240024020020d002004102721030c010b200128020020022004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a000020002d0001210502400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d0e20024101742204200320032004491b22044100480d0e0240024020020d002004102721030c010b200128020020022004102821030b2003450d0520012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20053a0000200041086a2802002000410c6a280200200110c702200041146a280200200041186a280200200110c70202400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d0e20024101742204200320032004491b22044100480d0e0240024020020d002004102721030c010b200128020020022004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d00023a00000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0d20024101742204200320032004491b22044100480d0d0240024020020d002004102721030c010b200128020020022004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a000020002d0001210502400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d0d20024101742204200320032004491b22044100480d0d0240024020020d002004102721030c010b200128020020022004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20053a0000200041086a2802002000410c6a280200200110c702200041146a280200200041186a280200200110c702200041206a280200200041246a280200200110c70220002d0002220041044b0d000240024002400240024020000e050001020304000b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d1120004101742203200220022003491b22034100480d110240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d1020004101742203200220022003491b22034100480d100240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d0f20004101742203200220022003491b22034100480d0f0240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d0e20004101742203200220022003491b22034100480d0e0240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d0d20004101742203200220022003491b22034100480d0d0240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000b0f0b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20034101102a000b20034101102a000b20034101102a000b20034101102a000b20034101102a000b102b000bd50101027f200028020421020240024020002802004101460d00200041086a2802002200200110c6022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110c7022000417c6a2802002000280200200110c702200041186a2100200341686a22030d000c020b0b2000410c6a2802002200200110c6022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110c7022000417c6a2802002000280200200110c702200041186a2100200341686a22030d000b0b0bc806010a7f230041106b22022400200028020421030240024002400240024020002802004101460d00200041086a2802002200200110c6022000450d01200041d8006c2104410021050340200320056a220041046a280200200041086a280200200110c702200041d4006a2d0000210602400240200141046a2207280200200141086a22082802002209460d002001280200210a0c010b200941016a220a2009490d062009410174220b200a200a200b491b220b4100480d060240024020090d00200b1027210a0c010b20012802002009200b1028210a0b200a450d042001200a3602002007200b360200200828020021090b2008200941016a360200200a20096a20063a00002000410c6a200110ae0402400240200041346a2802004101460d002002200041386a2802002000413c6a28020028020c110000200228020022092002280208200110c7022002280204450d01200910290c010b200041386a280200200041c0006a280200200110c7020b200041c8006a2802002003200541d00041cc00200041c4006a2802004101461b6a6a280200200110ad042004200541d8006a2205470d000c020b0b2000410c6a2802002200200110c6022000450d00200041d8006c2104410021050340200320056a220041046a280200200041086a280200200110c702200041d4006a2d0000210602400240200141046a2207280200200141086a22082802002209460d002001280200210a0c010b200941016a220a2009490d052009410174220b200a200a200b491b220b4100480d050240024020090d00200b1027210a0c010b20012802002009200b1028210a0b200a450d042001200a3602002007200b360200200828020021090b2008200941016a360200200a20096a20063a00002000410c6a200110ae0402400240200041346a2802004101460d002002200041386a2802002000413c6a28020028020c110000200228020022092002280208200110c7022002280204450d01200910290c010b200041386a280200200041c0006a280200200110c7020b200041c8006a2802002003200541d00041cc00200041c4006a2802004101461b6a6a280200200110ad042004200541d8006a2205470d000b0b200241106a24000f0b200b4101102a000b200b4101102a000b102b000b0600200010230b0600200010240b2801017f0240200210232203450d002003200020022001200120024b1b10ce041a200010240b20030b1c01017f0240200010232201450d0020014100200010cd041a0b20010bb10101037f0240024002400240200028020022002802042203200028020822046b2002490d00200028020021030c010b200420026a22052004490d0220034101742204200520052004491b22044100480d020240024020030d002004102721030c010b200028020020032004102821030b2003450d012000200436020420002003360200200028020821040b2000200420026a360208200320046a2001200210ce041a41000f0b20044101102a000b102b000ba70401047f230041106b220224002000280200210002400240024002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c040b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c030b0240200028020822032000280204470d00200341016a22042003490d0620034101742205200420042005491b22044100480d060240024020030d002004102721030c010b200028020020032004102821030b2003450d022000200436020420002003360200200028020821030b200028020020036a20013a00002000200028020841016a3602080c030b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b20044101102a000b0240024020002802042204200028020822036b2001490d00200028020021040c010b200320016a22052003490d0320044101742203200520052003491b22034100480d030240024020040d002003102721040c010b200028020020042003102821040b2004450d022000200336020420002004360200200028020821030b2000200320016a360208200420036a2002410c6a200110ce041a0b200241106a240041000f0b20034101102a000b102b000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4180d3c500200241086a1091042101200241206a240020010b0c0042ebbe8cdadd9294ae070b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101104000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11050021040b20040bcd0801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b2107418002210803400240200820014f0d00200020086a2c000041bf7f4c0d0041002105200821060c020b2008417f6a21064100210520084101460d01200720086a21092006210820094101470d000b0b200420063602142004200036021020044100410520051b36021c200441b8d6c50041ead9c50020051b3602180240024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200420023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210820024101460d0420092002462106200821022006450d000c040b0b20042002200320081b360228200441306a41146a4103360200200441c8006a41146a4102360200200441d4006a410236020020044203370234200441f0d9c5003602302004410136024c2004200441c8006a3602402004200441186a3602582004200441106a3602502004200441286a360248200441306a4188dac5001057000b200441e4006a4102360200200441c8006a41146a4102360200200441d4006a4101360200200441306a41146a41043602002004420437023420044198dac5003602302004410136024c2004200441c8006a3602402004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a360248200441306a41b8dac5001057000b200221080b024020082001460d00410121060240024002400240200020086a22092c00002202417f4a0d0041002105200020016a220621010240200941016a2006460d00200941026a210120092d0001413f7121050b2002411f712109200241ff017141df014b0d01200520094106747221010c020b2004200241ff0171360224200441286a21020c020b4100210020062107024020012006460d00200141016a210720012d0000413f7121000b200020054106747221010240200241ff017141f0014f0d0020012009410c747221010c010b41002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d020b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441306a41146a4105360200200441ec006a4102360200200441e4006a4102360200200441c8006a41146a412b360200200441d4006a412c36020020044205370234200441e0dac500360230200420023602582004410136024c2004200441c8006a3602402004200441186a3602682004200441106a3602602004200441246a3602502004200441206a360248200441306a4188dbc5001057000b41c8dac5001058000b7f01037f230041206b2202240002402000280200200110be040d002001411c6a2802002103200128021821042002411c6a4100360200200241b8d6c5003602182002420137020c200241f0dbc50036020820042003200241086a1091040d002000280204200110be042101200241206a240020010f0b200241206a240041010bf00a03037f017e047f410121020240200128021841272001411c6a2802002802101104000d004102210302400240024002402000280200220241776a2200411e4d0d00200241dc00470d010c020b41f400210402400240024020000e1f05010303000303030303030303030303030303030303030303040303030304050b41f20021040c010b41ee0021040b0c020b02400240200210bd04450d00200241017267410276410773ad4280808080d0008421050c010b024002400240200241808004490d000240024002402002418080084f0d0020024180fe0371410876210641e1edc500210041002107200241ff017121040340200041026a2108200720002d000122036a2109024020002d000022002006460d00200020064b0d062009210720082100200841a7eec500470d010c060b20092007490d02200941a6014b0d03200741a7eec5006a2100024003402003450d012003417f6a210320002d00002107200041016a210020072004470d000c080b0b2009210720082100200841a7eec500470d000c050b0b200241ef83384b0d04200241e28b746a41e28d2c490d042002419fa8746a419f18490d04200241dee2746a410e490d04200241feffff0071419ef00a460d04200241a9b2756a4129490d04200241cb91756a410a4d0d0441012103200221040c070b20072009103e000b200941a601107f000b20024180fe0371410876210641b0e8c500210041002107200241ff01712104024002400340200041026a2108200720002d000122036a2109024020002d000022002006460d00200020064b0d03200921072008210020084182e9c500470d010c030b024020092007490d00200941a5024b0d0220074182e9c5006a2100024003402003450d012003417f6a210320002d00002107200041016a210020072004470d000c070b0b200921072008210020084182e9c500470d010c030b0b20072009103e000b200941a502107f000b200241ffff0371210741a7ebc50021034101210402400340200341016a21090240024020032d0000220041187441187522084100480d00200921030c010b200941e1edc500460d02200841ff007141087420032d0001722100200341026a21030b0240200720006b22074100480d0020044101732104200341e1edc500470d010b0b4101210320044101710d040c020b41c8dac5001058000b200241ffff0371210741cdefc50021034101210402400340200341016a21090240024020032d0000220041187441187522084100480d00200921030c010b200941e5f2c500460d02200841ff007141087420032d0001722100200341026a21030b0240200720006b22074100480d0020044101732104200341e5f2c500470d010b0b4101210320044101710d030c010b41c8dac5001058000b200241017267410276410773ad4280808080d0008421050b41032103200221040c010b200221040b03402003210741dc0021004101210241012103024002400240024020070e0401020300010b024002400240024002402005422088a741ff01710e06050403020100050b200542ffffffff8f60834280808080c000842105410321030c060b200542ffffffff8f608342808080803084210541f5002100410321030c050b200542ffffffff8f608342808080802084210541fb002100410321030c040b20042005a72207410274411c7176410f712203413072200341d7006a2003410a491b210002402007450d002005427f7c42ffffffff0f83200542808080807083842105410321030c040b200542ffffffff8f6083428080808010842105410321030c030b200542ffffffff8f6083210541fd002100410321030c020b20012802184127200128021c2802101104000f0b41002103200421000b20012802182000200128021c280210110400450d000b0b20020b950201017f024002402000418010490d00024002400240024002400240200041808004490d002000410c7641706a2201418002490d014188f3c50020014180021037000b200041067641606a220141df074b0d01200141d0dec5006a2d0000220141c9004b0d02200141037441e0f3c5006a21010c060b200141b0e6c5006a2d00004106742000410676413f7172220141ff034b0d02200141b0f8c5006a2d0000220141394b0d03200141037441b0fcc5006a21010c050b41e8f2c500200141e0071037000b41f8f2c500200141ca001037000b4198f3c50020014180041037000b41a8f3c5002001413a1037000b200041037641f8ffffff017141b8dcc5006a21010b200129030042012000413f71ad86834200520ba40201037f23004180016b2202240002400240024002400240200128020022034110710d0020034120710d012000ad4101200110aa0121000c020b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141e8d9c5004102200220036a4180016a410020036b10ab0121000c010b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141e8d9c5004102200220036a4180016a410020036b10ab0121000b20024180016a240020000f0b2000418001103e000b2000418001103e000b0e0020003502004101200110aa010b1c002001280218418181c600410b2001411c6a28020028020c1105000b1c002001280218418c81c600410e2001411c6a28020028020c1105000b140020002802002001200028020428020c1104000bc30501077f410021040240024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024003400240200620096b41034b0d0041002107200141ff0171210603402008450d04200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b2005200a200141ff01714641016a4101716a20076a417f6a21050c020b200520092d0000220a2007476a2105200a2007460d012005200941016a2d0000220a2007476a2105200a2007460d012005200941026a2d0000220a2007476a2105200a2007460d012005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000b0b410121090c010b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024003400240200220096b41034b0d0041002107200141ff0171210203402008450d04200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050c020b200520092d0000220a2007476a2105200a2007460d012005200941016a2d0000220a2007476a2105200a2007460d012005200941026a2d0000220a2007476a2105200a2007460d012005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000b0b41012109200520046a21050c020b41002109200520076a20046a21050c010b20042003103e000b20002005360204200020093602000b2701017f2000280200220128020020012802042000280204280200200028020828020010ba04000ba60401077f230041306b220324000240024020020d00410021040c010b200341286a210502400240024002400340024020002802082d0000450d00200028020041ed81c6004104200028020428020c1105000d050b2003410a3602282003428a808080103703202003200236021c200341003602182003200236021420032001360210200341086a410a2001200210c304024002400240024020032802084101470d00200328020c210403402003200420032802186a41016a2204360218024002402004200328022422064f0d00200328021421070c010b200328021422072004490d00200641054f0d072003280210200420066b22086a22092005460d0420092005200610d004450d040b200328021c22092004490d0220072009490d0220032006200341106a6a41176a2d0000200328021020046a200920046b10c3042003280204210420032802004101460d000b0b2003200328021c3602180b200028020841003a0000200221040c010b200028020841013a0000200841016a21040b2000280204210920002802002106024020044520022004467222070d00200220044d0d03200120046a2c000041bf7f4c0d030b200620012004200928020c1105000d04024020070d00200220044d0d04200120046a2c000041bf7f4c0d040b200120046a2101200220046b22020d000b410021040c040b20064104107f000b200120024100200410ba04000b200120022004200210ba04000b410121040b200341306a240020040b02000bfa0101017f230041106b220224002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a200110c5042101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a419882c600200241086a1091042101200241206a240020010b0e0020002802002001200210c5040b810201017f230041106b22022400200028020021002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a200110c5042101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a419882c600200241086a1091042101200241206a240020010b1c00200128021841bb82c60041052001411c6a28020028020c1105000b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200141016a2101200041016a21002002417f6a2202450d020c000b0b200420056b21030b20030b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b3e01017f230041106b2205240020052001200220032004410010d604200529030021012000200541086a29030037030820002001370300200541106a24000b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10d604200529031021012000200529031837030820002001370300200541206a24000be20502037f067e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a423f838821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa710d204200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200620012002200841ff007110d104200641106a20012002200741ff007110d204200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b4200210c0c010b4200210c4200210d03402009420186200a423f8884220b200b427f8520047c200a4201862002423f8884220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220e54ad7d2109200a200e7d210a420020024201862001423f8884842102200d2001420186842101200b420183220b210d2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b200c20024201862001423f8884842102200b20014201868421010b2000200137030020002002370308200641306a24000b0bdb82060200418080c0000bc08206180010001d0000008858110013000000db03000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e0000005000100043000000fb0a00003000000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962616c6c6f632f7665632e7273005000100043000000070b00002c0000004469676573744974656d206e6f7420657175616c3501100036000000326811005b000000fc0100000500000000000000000000000000000000000000f80010003d000000326811005b0000000302000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564003501100036000000326811005b000000c801000005000000000000000000000000000000326811005b000000cf0100000500000076616c69646174696f6e206572726f72c80110007c00000044021000490000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f7761736d2f6d6f642e727300000000000000140310000a000000000000000010110002000000000000000000000020031000010000000000000000000000280310000d0000000000000034e81000010000000000000000000000380310000100000000000000000000003c8310000800000000000000400310000400000000000000000000006003100001000000000000004e65774163636f756e740000ab0310001b0000005265617065644163636f756e740000009403100017000000611011000900000061101100090000006a101100070000006a10110007000000680310002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e74000000000000a40410001100000000000000b8041000020000000000000000000000c80410000100000000000000486561727462656174526563656976656400000060e810000b000000160510000b000000d0041000460000002041206e6577206865617274626561742077617320726563656976656420617420746869732060426c6f636b4e756d626572602066726f6d2060417574686f72697479496460417574686f72697479496454696d657374616d702055706461746542616c616e63657320546f74616c49737375616e636554696d657374616d7020526563656e7448696e74737405100031000000a50510004b0000007e0000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e72730806100023000000a50510004b0000007f0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d62657242616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636542616c616e636573204c6f636b730000002d00000008000000040000002e0000004765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746142616c616e6365732056657374696e6700000000000c07100008000000000000001407100002000000000000000000000044071000170000000000000000000000fc0710000b0000000000000008081000030000000000000000000000500810000d000000000000007472616e7366657200000000b58f10000400000000000000b01d11002300000000000000ee25110005000000000000004d0a1000130000006c0a100036000000386b110000000000a20a100042000000e40a1000480000002c0b100045000000710b10002d000000386b1100000000009e0b100046000000386b1100000000007e1b11000b000000e40b10004c000000300c100033000000630c10005a000000386b110000000000bd0c100013000000386b110000000000d00c100054000000240d10004b0000006f0d100035000000a40d100037000000db0d100056000000386b1100000000001f1c11000c0000007365745f62616c616e63650000000000db2a10000300000000000000b01d11002300000000000000450a100008000000000000004d0a10001300000000000000600a10000c000000000000004d0a100013000000b808100025000000386b110000000000dd0810004800000025091000420000006709100046000000ad0910003a000000386b110000000000e70910002d000000386b1100000000007e1b11000b000000891b110020000000140a1000310000001f1c11000c00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f66726565436f6d706163743c543a3a42616c616e63653e6e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e00000000000000ec0f10000d0000000000000000000000f90f10000a0000000000000000000000000000000000000000000000000000000000000040811100bc101000000000000000000004101000010000000000000001000000000000000c101000070000000101000000000000423111000c00000000000000131010002b0000000000000000000000000000000000000040811100001b100000000000000000004010100001000000000000000000000000000000481010000b0000000101000000000000423111000c00000000000000f90f10000a0000000000000000000000000000000000000040811100bc1010000000000000000000541010000b000000000000000100000000000000ac1010000f0000000101000000000000423111000c00000000000000f90f10000a0000000000000000000000000000000000000040811100bc1010000000000000000000cc1010000b00000000000000010000000000000024111000050000000101000000000000423111000c00000000000000291110002c000000000000000000000000000000000000004081110058111000000000000000000068111000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e636500991610002600000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e000063161000360000004672656542616c616e636500e913100027000000386b1100000000001014100050000000601410005d000000bd14100055000000121510004f0000006115100051000000b215100015000000386b110000000000c7151000570000001e16100045000000526573657276656442616c616e6365002f0000000000000001000000300000009e1110005d000000fb11100027000000386b110000000000221210005b0000007d12100049000000386b110000000000c61210005d000000231310002d000000386b1100000000005013100053000000a3131000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e0000002f000000000000000100000031000000701110002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e0000000000d81710001200000000000000f90f10000a0000000000000040811100ec1710000000000000000000fc171000010000000000000000000000949f10000b00000000000000f90f10000a0000000000000040811100041810000000000000000000a09f1000010000000000000000000000a89f10000b00000000000000f90f10000a0000000000000040811100041810000000000000000000b49f1000010000000000000000000000bc9f10001200000000000000f90f10000a0000000000000040811100041810000000000000000000d09f1000010000000000000000000000d89f10001200000000000000f90f10000a0000000000000040811100141810000000000000000000fc9f100001000000000000004578697374656e7469616c4465706f73697400002f00000000000000010000003200000024181000350000002f0000000000000001000000330000002f00000000000000010000003400000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e496d4f6e6c696e6520476f737369704174496d4f6e6c696e652052656365697665644865617274626561747373726d6c2f696d2d6f6e6c696e652d776f726b65722d737461747573576974686472617720686173206265656e20636865636b65642061626f76653b0a090909647565735f6c696d69746564203c2072656e745f627564676574203c2062616c616e6365202d2073756273697374656e6365203c2062616c616e6365202d206578697374656e7469616c5f6465706f7369743b0a09090971656400000000004c191000090000000000000058191000020000000000000000000000386b11000000000000000000686561727462656174000000000000004c1910000900000000000000881910002900000000000000b11910000a00000000000000d5ca1000070000004865617274626561743c543a3a426c6f636b4e756d6265722c20543a3a417574686f7269747949643e5f7369676e61747572650000000000c41a10000800000000000000000000001bf610000e0000000000000000000000000000000000000000000000000000000000000040811100cc1a10000000000000000000386b110000000000000000000100000000000000dc1a10000f0000000000000000000000eb1a1000150000000000000000000000000000000000000000000000000000000000000040811100001b10000000000000000000386b110000000000000000000000000000000000101b1000120000000201010000000000eb1a10001500000000000000221b10000e00000000000000d5ca1000070000000000000040811100301b10000000000000000000386b1100000000000000000001000000476f7373697041742f0000000000000001000000350000004c6173744e6577457261537461727473657373696f6e3a3a53657373696f6e496e6465782f000000000000000100000036000000526563656976656448656172746265617473543a3a417574686f7269747949642f00000000000000010000003100000000000000a83b11000e00000000000000eb1a1000150000000000000040811100781b10000000000000000000c83b110001000000000000002f00000000000000010000003700000054696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b20716564000038000000040000000400000039000000881c100043000000a50510004b000000b700000004000000401c100048000000820a00000a000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72737072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b207165646e6f7420656e6f75676820667265652066756e6473000000000c1d10000a00000000000000181d1000010000000000000000000000301d1000020000000000000066696e616c5f68696e74000000000000c5351000040000000000000073f3100017000000401d10003d0000007d1d10001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e00000000081e10000a000000000000001bf610000e0000000000000040811100141e10000000000000000000241e10000100000000000000000000002c1e10000d000000000000001bf610000e00000000000000408111003c1e100000000000000000004c1e1000010000000000000057696e646f7753697a6500002f00000000000000010000003a0000009b1e1000460000005265706f72744c6174656e63790000002f00000000000000010000003b000000541e100047000000205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e20546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e0000000a68110028000000fc1e1000430000008c010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e727300fc1e1000430000008c01000001000000676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756500000000282010000b0000000000000018e81000020000000000000000000000342010000100000000000000000000003c201000100000000000000034e810000100000000000000000000004c201000010000000000000000000000542010000c00000000000000a483100001000000000000000000000060201000010000000000000000000000682010000e0000000000000078201000020000000000000000000000882010000100000000000000566f746572526561706564002621100015000000426164526561706572536c6173686564172110000f00000054616c6c7953746172746564e22010003500000054616c6c7946696e616c697a6564000090e810000e00000090e810000e000000902010005200000020412074616c6c792028666f7220617070726f76616c20766f746573206f662073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e20412074616c6c792028666f7220617070726f76616c20766f746573206f662073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572436f756e63696c205265676973746572496e666f4f66436f756e63696c204d656d62657273436f756e63696c204e65787446696e616c697a657022100048000000820a00000a000000436f756e63696c205465726d4475726174696f6e436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204c6561646572626f617264007022100048000000880a00000e000000436f756e63696c2043616e64696461746573436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f7465727300000000000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000702410000d0000000000000080241000030000000000000000000000c8241000180000000000000000000000882510001300000000000000802410000300000000000000000000009c251000060000000000000000000000cc2510001300000000000000e0251000040000000000000000000000402610000c0000000000000000000000a02610000d00000000000000b0261000010000000000000000000000c82610000a000000000000000000000018271000100000000000000028271000010000000000000000000000402710000d0000000000000000000000a82710000e00000000000000b827100003000000000000000000000000281000080000000000000000000000402810001100000000000000542810000100000000000000000000006c281000030000000000000000000000842810000d0000000000000094281000010000000000000000000000ac281000040000000000000000000000cc2810001900000000000000e828100001000000000000000000000000291000020000000000000000000000102910001100000000000000e82810000100000000000000000000002429100002000000000000007365745f617070726f76616c7300000000000000b73510000500000000000000bc3510000900000000000000b0a910000500000000000000a02c10001200000000000000c53510000400000000000000c93510000800000085311000580000003931100010000000386b110000000000dd311000300000000d3210004a000000386b11000000000057321000350000008c32100051000000dd3210002c00000009331000530000005c33100062000000be331000600000001e3410001d0000003b341000570000009234100035000000386b110000000000c73410006b000000323510001d000000386b1100000000007e1b11000b0000002e271100080000004f3510002700000076351000410000001f1c11000c00000070726f78795f7365745f617070726f76616c7300d4301000650000003931100010000000386b1100000000007e1b11000b000000493110003c0000001f1c11000c000000726561705f696e6163746976655f766f7465720000000000ab3010000e000000000000004e1c11000c00000000000000db2a10000300000000000000b01d11002300000000000000b930100009000000000000004e1c11000c00000000000000c23010001200000000000000a02c1000120000004a2f100058000000a22f10005c000000fe2f100028000000386b1100000000002630100045000000386b1100000000006b30100040000000386b1100000000007e1b11000b0000002e27110008000000232f1000270000001f1c11000c000000726574726163745f766f74657200000000000000b0a9100005000000000000004e1c11000c000000472e10004b000000386b110000000000922e100042000000386b110000000000d42e10004f000000386b1100000000007e1b11000b0000002e27110008000000232f1000270000001f1c11000c0000007375626d69745f63616e64696461637900000000432e100004000000000000004e1c11000c000000b22c10001e000000386b110000000000d02c100044000000386b110000000000142d1000480000005c2d100051000000ad2d10004c000000f92d10001e000000386b1100000000007e1b11000b000000172e1000180000002f2e1000140000001f1c11000c00000070726573656e745f77696e6e6572000000000000922c10000900000000000000b01d110023000000000000009b2c10000500000000000000f32511001500000000000000b0a910000500000000000000a02c1000120000009e2b100059000000f72b1000680000005f2c10001e000000386b1100000000007e1b11000b0000007d2c1000150000000e7c1000110000001f1c11000c0000007365745f646573697265645f736561747300000000000000f629100005000000000000004e1c11000c000000de2a100059000000372b100052000000892b10001500000072656d6f76655f6d656d62657200000000000000db2a10000300000000000000b01d110023000000fb29100048000000386b110000000000432a1000480000008b2a1000500000007365745f70726573656e746174696f6e5f6475726174696f6e00000000000000f6291000050000000000000073f3100017000000a02910005600000088291000180000007365745f7465726d5f6475726174696f6e0000003429100054000000882910001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e28296020607369676e6564602073686f756c642068617665206174206c65617374202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473204c6f636b732074686520746f74616c2062616c616e6365206f662063616c6c657220696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f72206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f20746865206c617374206368756e6b2020207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f20626520637265617465642c20612066656520696e646963617465642062792020205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f727265637420706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e64657800000000000000543b10001400000000000000000000001bf610000e00000000000000000000000000000000000000000000000000000000000000408111007c3b10000000000000000000683b100001000000000000000100000000000000703b10000c00000000000000000000001bf610000e00000000000000000000000000000000000000000000000000000000000000408111007c3b100000000000000000008c3b100001000000000000000100000000000000943b10000c0000000000000000000000061111000300000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000a03b100001000000000000000100000000000000a0ad1000070000000000000000000000a83b10002300000000000000000000000000000000000000000000000000000000000000408111002c3d10000000000000000000cc3b100004000000000000000100000000000000ec3b1000090000000000000000000000f53b10000900000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000003c100001000000000000000100000000000000083c10000b0000000101000000000000133c100018000000000000002b3c10001100000000000000000000000000000000000000408111002c3d100000000000000000003c3c100005000000000000000100000000000000643c10000e0000000101000000000000423111000c00000000000000723c1000100000000000000000000000000000000000000040811100f43d10000000000000000000843c100002000000000000000000000000000000943c10000b0000000101000000000000423111000c000000000000009f3c1000170000000000000000000000000000000000000040811100b83c10000000000000000000c83c100001000000000000000000000000000000d03c1000060000000101000000000000c93510000800000000000000d63c10001900000000000000000000000000000000000000408111002c3d10000000000000000000f03c100001000000000000000100000000000000f83c10000c0000000000000000000000c93510000800000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000043d1000010000000000000001000000000000000c3d10000a0000000000000000000000c93510000800000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000183d100001000000000000000100000000000000203d10000a0000000000000000000000b11a11001100000000000000000000000000000000000000000000000000000000000000408111002c3d100000000000000000003c3d100001000000000000000100000000000000443d10000e0000000000000000000000061111000300000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000543d1000010000000000000001000000000000005c3d10000c0000000000000000000000683d1000280000000000000000000000000000000000000000000000000000000000000040811100903d10000000000000000000a03d100001000000000000000000000000000000a83d10000b0000000000000000000000b33d1000210000000000000000000000000000000000000000000000000000000000000040811100d43d10000000000000000000e43d10000200000000000000000000000000000010011100050000000101000000000000423111000c00000000000000423111000c0000000000000000000000000000000000000040811100f43d100000000000000000002801110002000000000000000000000050726573656e746174696f6e4475726174696f6e534310004f0000005465726d4475726174696f6e2f0000000000000001000000350000002d43100026000000446573697265645365617473f34210003a0000005665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e00cb4110005e000000294210005c0000008542100054000000d94210001a000000566f7465436f756e74566f7465496e64657800008441100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673e6f40100068000000386b110000000000d740100059000000386b11000000000030411000540000005265676973746572496e666f4f6628566f7465496e6465782c20753332290000fa3f10005f0000005940100016000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e00002f000000000000000100000036000000d93f100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00963f1000430000004e657874566f746572536574573f10003f000000566f746572436f756e7400003d3f10001a00000043616e6469646174657300002f000000000000000100000031000000213f10001c00000043616e646964617465436f756e740000fd3e1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e292f00000000000000010000003c000000b53e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e2f00000000000000010000003c000000043e1000670000006b3e10004a0000002f0000000000000001000000360000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722e2054686520766f746573206172652073746f726564206173206e756d657269632076616c75657320616e642070617273656420696e2061206269742d77697365206d616e6e65722e20496e206f7264657220746f2067657420612068756d616e2d7265616461626c6520726570726573656e746174696f6e2028605665633c626f6f6c3e60292c20757365205b60616c6c5f617070726f76616c735f6f66605d2e20467572746865726d6f72652c206561636820766563746f72206f66207363616c617273206973206368756e6b656420776974682074686520636170206f662060415050524f56414c5f5345545f53495a45602e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e74206d656d626572736869702e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e20746865206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c6420636f6e737469747574652074686520636f6c6c6563746976652e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e000000000000d44510000d000000000000001d3311000c0000000000000040811100e44510000000000000000000f4451000020000000000000000000000044610000a000000000000001d3311000c0000000000000040811100104610000000000000000000204610000100000000000000000000002846100009000000000000001d3311000c0000000000000040811100344610000000000000000000444610000200000000000000000000005446100014000000000000001d3311000c000000000000004081110068461000000000000000000078461000020000000000000000000000884610000a0000000000000006111100030000000000000040811100944610000000000000000000a4461000020000000000000000000000b44610001300000000000000f53b1000090000000000000040811100c84610000000000000000000d8461000030000000000000000000000b00911000c000000000000001bf610000e0000000000000040811100f0461000000000000000000000471000020000000000000000000000104710000a00000000000000061111000300000000000000408111001c47100000000000000000002c471000050000000000000000000000544710000e0000000000000006111100030000000000000040811100644710000000000000000000744710000100000000000000000000007c471000110000000000000006111100030000000000000040811100904710000000000000000000a0471000010000000000000043616e646964616379426f6e640000002f00000000000000010000003d000000b04b10004e000000fe4b100014000000566f74696e67426f6e6400002f0000000000000001000000320000006e4b100042000000566f74696e674665650000002f00000000000000010000003e000000074b10004a000000514b10001d00000050726573656e74536c617368506572566f7465722f000000000000000100000033000000a34a100045000000e84a10001f0000004361727279436f756e7400002f000000000000000100000037000000354a1000470000007c4a100027000000496e6163746976654772616365506572696f64002f00000000000000010000003f000000984910004c000000e44910004b0000002f4a1000060000002f00000000000000010000004000000046491000490000008f491000090000004465636179526174696f00002f000000000000000100000041000000f34710004d00000040481000410000008148100047000000c84810004a0000001249100034000000564f5445525f5345545f53495a4500002f000000000000000100000042000000cf47100024000000415050524f56414c5f5345545f53495a450000002f000000000000000100000043000000a84710002700000020546865206368756e6b2073697a65206f662074686520617070726f76616c20766563746f722e20546865206368756e6b2073697a65206f662074686520766f74657220766563746f722e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f20606d656d626572736869705f73697a65202d316020746f206b6565702074686520636f6c6c656374697665207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204120726561736f6e61626c652064656661756c742076616c75652069732032342e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e204120726561736f6e61626c652064656661756c742076616c756520697320313030302e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e204120726561736f6e61626c652064656661756c742076616c756520697320312e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e204120726561736f6e61626c652064656661756c742076616c756520697320322e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e204120726561736f6e61626c652064656661756c742076616c756520697320312e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e204120726561736f6e61626c652064656661756c742076616c756520697320392e00000a681100280000002c4c1000440000000b010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f656c656374696f6e732f7372632f6c69622e72732c4c1000440000000b01000001000000436f756e63696c2050726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e6465786261642074617267657420696e646578696e76616c69642074617267657420696e64657872657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e647363616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e747374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f6c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c65637465646475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c6e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e64696461746573696e76616c696420766f74657220696e64657877726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e6446524e4b00000000000070e710000800000000000000b8511000010000000000000000000000c0511000010000000000000000000000c85110000800000000000000b40f1100010000000000000000000000d0511000010000000000000000000000d85110000700000000000000e0511000030000000000000000000000f8511000010000000000000000000000005210000500000000000000b40f110001000000000000000000000008521000010000000000000000000000105210000800000000000000b40f1100010000000000000000000000185210000100000000000000348910000d000000e95210000e0000005370656e64696e67af5210003a0000004177617264656400348910000d0000006a1011000700000061101100090000008f521000200000004275726e740000006c52100023000000526f6c6c6f766572205210004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c726561647920657869737473647572696e6720657865637574696f6e0000000a681100280000004c5310004d0000005e000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f7761736d2f72756e74696d652e72734772616e64706146696e616c697479205374616c6c656454726561737572792050726f706f73616c730000e0531000190000000054100048000000bb0100002d00000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f6f70732f61726974682e7273616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f7765642f0000000000000001000000440000002f0000000000000001000000450000000a68110028000000a85410004300000084000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e7273000455100033000000375510004b000000b200000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f6163636f756e745f64622e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a090909097165640000000000205810001200000000000000345810000100000000000000000000004c58100001000000000000007265706f72745f6d69736265686176696f720000000000006d5810000700000000000000d5ca1000070000005458100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974790000000000d0de10000b00000000000000000000003c5a1000230000000000000000000000000000000000000000000000000000000000000040811100d06010000000000000000000605a100001000000000000000100000000000000685a10000500000000000000000000006d5a10001b0000000000000000000000000000000000000000000000000000000000000040811100885a10000000000000000000985a100001000000000000000100000000000000a05a10000d0000000000000000000000ad5a1000230000000000000000000000000000000000000000000000000000000000000040811100145b10000000000000000000d05a100001000000000000000000000000000000d85a10000a00000000000000000000001bf610000e0000000000000000000000000000000000000000000000000000000000000040811100145b10000000000000000000e45a100001000000000000000000000000000000ec5a1000070000000000000000000000f35a1000200000000000000000000000000000000000000000000000000000000000000040811100145b10000000000000000000245b10000100000000000000000000005665633c28417574686f7269747949642c20417574686f72697479576569676874293e00d45b10001b000000537461746553746f72656453746174653c543a3a426c6f636b4e756d6265723e2f000000000000000100000046000000b05b10002400000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e7f5b1000310000004e657874466f726365640000505b10002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229002f0000000000000001000000360000002c5b10002400000020607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e205468652063757272656e7420617574686f72697479207365742e0000000000745c10000d00000000000000845c1000020000000000000000000000b45c1000090000000000000000000000fc5c10000f000000000000000c5d1000010000000000000000000000245d10000700000000000000000000005c5d100010000000000000000c5d10000100000000000000000000006c5d1000080000000000000070726f706f73655f7370656e6400000000000000ee2511000500000000000000f325110015000000000000004a5f10000b00000000000000b01d110023000000785e10004b000000c35e10004d000000105f100015000000386b1100000000007e1b11000b0000002e27110008000000f57b100019000000255f1000250000001f1c11000c00000072656a6563745f70726f706f73616c00000000006d5e10000b00000000000000b5a91000160000002e5e10003f000000386b1100000000007e1b11000b0000002e27110008000000f57b100019000000e6f21000100000001f1c11000c000000617070726f76655f70726f706f73616cac5d100057000000035e10002b000000386b1100000000007e1b11000b0000002e27110008000000f57b1000190000000e7c1000110000001f1c11000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f69642050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e62656e65666963696172790000000000000088ad10000d0000000000000000000000348910000d0000000000000000000000000000000000000000000000000000000000000040811100606010000000000000000000706010000100000000000000010000000000000018ad1000090000000101000000000000348910000d00000000000000786010002400000000000000000000000000000000000000408111009c6010000000000000000000ac60100001000000000000000000000000000000b4601000090000000000000000000000bd601000120000000000000000000000000000000000000000000000000000000000000040811100d06010000000000000000000e06010000100000000000000010000002f000000000000000100000041000000456110002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e2f000000000000000100000036000000266110001f000000417070726f76616c735665633c50726f706f73616c496e6465783e002f000000000000000100000031000000e86010003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e000000000000506210000c000000000000005c621000070000000000000040811100646210000000000000000000746210000200000000000000000000008462100013000000000000001d3311000c0000000000000040811100986210000000000000000000a8621000010000000000000000000000b06210000b000000000000001bf610000e0000000000000040811100bc6210000000000000000000cc621000010000000000000000000000d462100004000000000000005c621000070000000000000040811100d86210000000000000000000e8621000010000000000000050726f706f73616c426f6e645065726d696c6c002f000000000000000100000047000000a863100055000000fd6310004400000050726f706f73616c426f6e644d696e696d756d002f00000000000000010000003200000056631000520000005370656e64506572696f64002f00000000000000010000004800000034631000220000004275726e2f000000000000000100000049000000f0621000440000002050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479205374617465496e636f6e73697374656e74207374617465202d20636f756c646e277420736574746c6520696d62616c616e636520666f722066756e6473207370656e74206279207472656173757279000000a854100043000000840000000100000050726f706f73657227732062616c616e636520746f6f206c6f774e6f2070726f706f73616c206174207468617420696e646578002d00000008000000040000004a0000004b00000000000000000000004c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004772616e64706146696e616c697479204e657874466f726365643a73657373696f6e3a6b65797353657373696f6e2056616c696461746f727353657373696f6e204e6578744b65797373657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a0909097165640000000a681100280000002c601100500000003701000009000000000000000467100008000000000000000c6710000200000000000000000000003c6710000a000000000000007365745f6b657973000000008aca100004000000000000009568100007000000000000009c6810000500000000000000d5ca1000070000008c67100039000000c5671000480000000d68100031000000386b1100000000003e68100035000000386b1100000000007e1b11000b000000736810002200000094f21000160000001f1c11000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e543a3a4b65797370726f6f6600000000000000c03111000a00000000000000000000000c6b1000130000000000000000000000000000000000000000000000000000000000000040811100ac6b10000000000000000000206b100001000000000000000100000000000000286b10000c0000000000000000000000136511000c0000000000000000000000000000000000000000000000000000000000000040811100346b10000000000000000000446b1000010000000000000001000000000000004c6b1000070000000000000000000000d33311000400000000000000000000000000000000000000000000000000000000000000408111006c6b10000000000000000000546b1000010000000000000001000000000000005c6b10000d0000000000000000000000d33311000400000000000000000000000000000000000000000000000000000000000000408111006c6b100000000000000000007c6b100001000000000000000100000000000000846b10000a00000000000000000000008e6b10001e0000000000000000000000000000000000000000000000000000000000000040811100ac6b10000000000000000000bc6b100002000000000000000100000000000000cc6b1000080000000204010000000000d5ca10000700000000000000d46b10000e0000000000000095681000070000000000000040811100206c10000000000000000000e46b100004000000000000000000000000000000046c1000080000000204010000000000d5ca100007000000000000000c6c10001400000000000000d46b10000e0000000000000040811100206c10000000000000000000306c10000400000000000000000000005665633c543a3a56616c696461746f7249643e00566e10001f00000043757272656e74496e6465782f000000000000000100000041000000386e10001e0000004368616e676564000a6e10002e0000005175657565644368616e6765640000002f000000000000000100000036000000f56d1000150000005175657565644b6579735665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e2f0000000000000001000000310000006e6d10004f000000bd6d1000380000004e6578744b657973543a3a56616c696461746f7249640000476d100027000000386b110000000000996c100056000000ef6c1000580000004b65794f776e6572284b65795479706549642c205665633c75383e292f000000000000000100000036000000506c100049000000386b110000000000996c100056000000ef6c10005800000020546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f662074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20517565756564206b657973206368616e6765642e205472756520696620616e797468696e6720686173206368616e67656420696e20746869732073657373696f6e2e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e00000000000000b06e10001000000000000000c06e1000050000000000000040811100c86e10000000000000000000d86e1000020000000000000044454455505f4b45595f505245464958265b75385d0000002f00000000000000010000004d000000e86e100059000000416f10000d0000002055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e6368206f662074686520747269652e00000000000080d1f00840787d01000000000065cd1d23b4cc3a113b5c2301000000d31b421e4fdcba34836c472001000000c75bbd1e52a1fd2e01b4511d010000005feb3f1f1d03952998c57b1a01000000bdb6ca1fa50181245d60c61701000000abd95e20029dc11fec4f3215010000006fadfd2034d5561b086ec01201000000efdba82133aa4017c3a4711001000000eb7a6222fd1b7f132df1460e01000000c1332d23942a1210ad66410c01000000777f0c2408d6f90c5e33620a01000000a3040525591e360ab7a5aa080100000085311d268803c70760341c070100000097465e279f85ac054289b805010000007346d628a4a4e603ce9181040100000019e89b2abe607502ad987903010000009db7d72c54ba5801bb71a30201000000eb88dd2ff4b29000c5cf0202010000000b8c8d349e412700f8d7a5010100000053657373696f6e205175657565644b657973636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f646553657373696f6e204b65794f776e65726e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e72656769737465726564206475706c6963617465206b657966696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e640a68110028000000907110003f0000006a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e7273000a00000014000000f071100048000000820a00000a00000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72737375646f000000009472100005000000000000009c721000010000000000000000000000a4721000010000000000000000000000ac7210000a0000000000000034e81000010000000000000000000000b872100001000000000000005375646964000000d333110004000000fc721000180000004b65794368616e6765640000c07210003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e907110003f0000006a000000010000005375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b65796f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f00000000008dcb100006000000000000004e000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000050000000000000000000000000000000510000000000000000000000000000004edc100004000000000000005200000000000000000000000000000000000000000000000000000000000000510000000000000000000000020000000000000000000000000000000000000053000000000000000000000000000000f7bd10000900000000000000540000000000000000000000000000000000000000000000000000000000000055000000000000000000000002000000000000000000000000000000000000005600000000000000000000000000000061c110000a000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000020000000000000000000000000000000000000051000000000000000000000000000000e6b7100007000000000000005900000000000000000000000000000000000000000000000000000000000000510000000000000000000000000000005a00000000000000000000000000000051000000000000000000000000000000f879100008000000000000005b000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000004e29110007000000000000005f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000006100000000000000000000000000000062000000000000000000000000000000007a100007000000000000006300000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000006500000000000000000000000000000066000000000000000000000000000000f3f910000900000000000000670000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000690000000000000000000000000000006a000000000000000000000000000000077a100007000000000000006b000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000006d000000000000000000000000000000510000000000000000000000000000000e7a100012000000000000006e000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000006d00000000000000000000000000000051000000000000000000000000000000207a100009000000000000006f00000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000007100000000000000000000000000000072000000000000000000000000000000297a10000f000000020000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000020000000000000000000000000000000000000074000000000000000000000000000000387a1000070000000000000075000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000077000000000000000000000000000000510000000000000000000000000000003f7a100008000000000000007800000000000000000000000000000000000000000000000000000000000000790000000000000000000000000000007a0000000000000000000000000000007b000000000000000000000000000000477a100009000000000000007c000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000007e0000000000000000000000000000007f000000000000000000000000000000507a100004000000000000008000000000000000000000000000000000000000000000000000000000000000810000000000000000000000000000008200000000000000000000000000000051000000000000000000000000000000547a100008000000000000008300000000000000000000000000000000000000000000000000000000000000840000000000000000000000000000008500000000000000000000000000000086000000000000000000000042616c616e63657353657373696f6e436f756e63696c546563686e6963616c436f6d6d6974746565456c656374696f6e7346696e616c697479547261636b65724772616e6470615472656173757279436f6e7472616374735375646f496d4f6e6c696e65000000003872100004000000000000007cef1000010000000000000000000000b47a1000090000000000000000000000fc7a10000700000000000000047b10000100000000000000000000001c7b100009000000000000001f7c10004e000000386b110000000000c17b100034000000386b1100000000007e1b11000b0000002e27110008000000f57b1000190000006d7c1000100000001f1c11000c0000007365745f6b657900000000004b1c11000300000000000000b01d110023000000647b10005d000000386b110000000000c17b100034000000386b1100000000007e1b11000b0000002e27110008000000f57b1000190000000e7c1000110000001f1c11000c0000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e202d204c696d697465642073746f726167652072656164732e202d204f6e65204442206368616e67652e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e202d204e6f204442207772697465732e00000000000000d87c1000030000000000000000000000423111000c0000000000000000000000000000000000000000000000000000000000000040811100dc7c10000000000000000000ec7c10000100000000000000010000004b6579002f000000000000000100000087000000f47c1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e4e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165640000002d00000008000000040000002e0000007375627374726174652d6e6f64650000df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000cbca25e39f1423870100000022f09549cb59f9ff010000008d8010001c000000187f100044000000bf000000030000006980100024000000187f100044000000c8000000030000003180100038000000187f100044000000060100002a0000000980100028000000187f1000440000000701000032000000e17f100028000000187f100044000000090100002c000000b57f10002c000000187f100044000000080100004c000000837f100032000000187f10004400000031010000030000005c7f100027000000187f1000440000003901000004000000f07e100028000000187f1000440000003f0100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e626164207369676e617475726520696e2065787472696e73696300418110000d000000268110001b000000e480100042000000bf010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b00005881100010000000696e697469616c697a655f626c6f636b708110000f0000006170706c795f65787472696e736963008881100013000000696e686572656e745f65787472696e7369637300a48110000f000000636865636b5f696e686572656e747300bc8110001400000076616c69646174655f7472616e73616374696f6ed88110000f0000006f6666636861696e5f776f726b657200f0811000160000006772616e6470615f70656e64696e675f6368616e6765000010821000150000006772616e6470615f666f726365645f6368616e6765496e76616c6964206f726967696e00000000003c8310000800000000000000448310000300000000000000000000005c831000010000000000000000000000648310000c0000000000000018e8100002000000000000000000000070831000010000000000000000000000788310000a00000000000000848310000100000000000000000000008c831000010000000000000000000000948310000f00000000000000a4831000010000000000000000000000ac831000010000000000000000000000b48310000a00000000000000c0831000020000000000000000000000d0831000020000000000000000000000e08310000800000000000000e8831000020000000000000000000000f883100001000000000000005472616e73666572611011000900000061101100090000006a101100070000002385100055000000496e7374616e746961746564ec84100037000000436f646553746f72656400005ce8100004000000be8410002e0000005363686564756c65557064617465640006111100030000008e841000300000004469737061746368656400006110110009000000d333110004000000238410004e000000718410001d000000436f6e74726163746110110009000000d5ca100007000000008410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e64656661756c743a0000000070e71000080000000000000088861000040000000000000000000000a8861000020000000000000000000000b88610000500000000000000c0861000050000000000000000000000e8861000020000000000000000000000f886100008000000000000008483100001000000000000000000000000871000010000000000000000000000088710000b000000000000008483100001000000000000000000000014871000010000000000000000000000f2e7100008000000000000001c8710000200000000000000000000002c871000010000000000000000000000348710000e000000000000001c8710000200000000000000000000004487100001000000000000006110110009000000348910000d0000005ce8100004000000c68810000b000000d1881000530000002489100010000000566f74656400000061101100090000005ce8100004000000d333110004000000c68810000b000000c68810000b0000003e881000420000008088100046000000417070726f7665640d88100031000000446973617070726f76656400d8871000350000005ce8100004000000d33311000400000097871000410000004d656d626572457865637574656400004c8710004b00000020412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578436f6e7472616374205072697374696e65436f6465496e7374616e636531436f6c6c656374697665204d656d62657273496e7374616e636532436f6c6c656374697665204d656d62657273436f6e747261637420436f646553746f72616765436f6e747261637420436f6e7472616374496e666f4f66436f6e74726163742047617350726963650a68110028000000e0891000450000007d000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6c6c6563746976652f7372632f6c69622e727300000000000000308b10000f00000000000000408b1000010000000000000000000000588b1000030000000000000000000000708b10000800000000000000788b1000020000000000000000000000a88b1000020000000000000000000000b94711000400000000000000b88b1000040000000000000000000000188c1000070000000000000000000000508c10000600000000000000588c1000040000000000000000000000b88c10000a0000000000000000000000088d10000f00000000000000188d1000020000000000000000000000488d1000050000000000000000000000708d10000a000000000000007c8d1000040000000000000000000000dc8d100006000000000000007570646174655f7363686564756c650000000000fb951000080000000000000003961000080000008b9510002d000000386b110000000000b8951000430000007075745f636f6465000000004d9310000900000000000000569310000c00000000000000879510000400000000000000d5ca100007000000fb94100057000000529510003500000000000000b58f10000400000000000000b01d11002300000000000000ee2511000500000000000000f325110015000000000000004d9310000900000000000000569310000c00000000000000629310000400000000000000d5ca1000070000006693100042000000386b110000000000a89310004a000000f29310002c0000001e941000460000006494100052000000b694100045000000637265617465000000000000449310000900000000000000f325110015000000000000004d9310000900000000000000569310000c00000000000000b98f10000900000000000000c28f10000b00000000000000629310000400000000000000d5ca1000070000002d9110006a000000386b1100000000009791100021000000386b110000000000b8911000500000000892100041000000499210005b000000a492100057000000fb9210002a000000259310001f000000636c61696d5f7375726368617267650000000000b58f10000400000000000000423111000c000000000000000f9110000a000000000000001991100014000000f58f10005c0000005190100045000000386b110000000000969010004e000000e49010002b000000726573746f72655f746f000000000000b58f10000400000000000000423111000c00000000000000b98f10000900000000000000c28f10000b00000000000000cd8f10000e000000000000001d3311000c00000000000000db8f10000500000000000000e08f1000150000000c8e100040000000386b1100000000004c8e10006f000000bb8e10004e000000098f1000640000006d8f10004800000020416c6c6f7773206120636f6e747261637420746f20726573746f7265206120746f6d6273746f6e6520627920676976696e67206974732073746f726167652e2054686520636f6e747261637420746861742077616e747320746f20726573746f72652028692e652e206f726967696e206f66207468652063616c6c2c206f7220606d73672e73656e6465726020696e20536f6c6964697479207465726d73292077696c6c20636f6d70757465206120746f6d6273746f6e652077697468206974732073746f7261676520616e642074686520676976656e20636f64655f686173682e2049662074686520636f6d707574656420746f6d6273746f6e65206d61746368207468652064657374696e6174696f6e206f6e652c207468652064657374696e6174696f6e20636f6e747261637420697320726573746f7265642077697468207468652072656e745f616c6c6f77616e636560207370656369666965642c207768696c6520746865206f726967696e2073656e647320616c6c206974732066756e647320746f207468652064657374696e6174696f6e20616e642069732072656d6f7665642e64657374636f64655f68617368436f6465486173683c543e72656e745f616c6c6f77616e636564656c74615665633c657865633a3a53746f726167654b65793e20416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e6175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c4761733e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c650000000000749810000800000000000000000000007c9810000300000000000000000000000000000000000000000000000000000000000000408111000099100000000000000000008098100001000000000000000100000000000000889810000f000000000000000000000003961000080000000000000000000000000000000000000000000000000000000000000040811100989810000000000000000000a898100001000000000000000100000000000000b09810000c0000000101000000000000c28f10000b00000000000000d5ca100007000000000000000000000000000000000000004081110060b010000000000000000000bc98100001000000000000000000000000000000c49810000b0000000101000000000000c28f10000b00000000000000cf98100016000000000000000000000000000000000000004081110060b010000000000000000000e898100001000000000000000000000000000000f09810000e000000000000000000000020cb10000300000000000000000000000000000000000000000000000000000000000000408111000099100000000000000000001099100001000000000000000100000000000000189910000e0000000101000000000000423111000c00000000000000269910000f00000000000000000000000000000000000000408111003899100000000000000000004899100001000000000000000000000000000000509910000800000000000000000000001d3311000c0000000000000000000000000000000000000000000000000000000000000040811100589910000000000000000000689910000100000000000000010000004761735370656e7447617300a49a10002000000043757272656e745363686564756c65002f0000000000000001000000880000007f9a1000250000005072697374696e65436f6465269a100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c65000000cd991000590000004163636f756e74436f756e74657200002f000000000000000100000035000000b899100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000002f00000000000000010000003c0000008e9910002a00000047617350726963652f000000000000000100000089000000709910001e00000020546865207072696365206f66206f6e6520756e6974206f66206761732e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e00000000449e100013000000000000001bf610000e0000000000000040811100589e10000000000000000000689e1000040000000000000000000000889e100010000000000000001d3311000c0000000000000040811100989e10000000000000000000a89e1000010000000000000000000000b09e1000110000000000000006111100030000000000000040811100c49e10000000000000000000d49e1000020000000000000000000000e49e10000b000000000000001d3311000c0000000000000040811100f09e10000000000000000000009f1000010000000000000000000000089f100011000000000000001d3311000c00000000000000408111001c9f100000000000000000002c9f1000070000000000000000000000649f10000f000000000000001d3311000c0000000000000040811100749f10000000000000000000849f1000020000000000000000000000949f10000b000000000000001d3311000c000000000000004081110010a010000000000000000000a09f1000010000000000000000000000a89f10000b000000000000001d3311000c000000000000004081110010a010000000000000000000b49f1000010000000000000000000000bc9f100012000000000000001d3311000c000000000000004081110010a010000000000000000000d09f1000010000000000000000000000d89f100012000000000000001d3311000c0000000000000040811100ec9f10000000000000000000fc9f100001000000000000000000000004a010000b000000000000001d3311000c000000000000004081110010a01000000000000000000020a0100002000000000000000000000030a010000b000000000000007c9810000300000000000000408111005ca0100000000000000000003ca010000200000000000000000000004ca010000d000000000000007c9810000300000000000000408111005ca0100000000000000000006ca010000200000000000000000000007ca0100008000000000000000611110003000000000000004081110084a01000000000000000000094a01000020000000000000000000000a4a010000c0000000000000006111100030000000000000040811100b0a010000000000000000000c0a01000010000000000000000000000c8a010000d000000000000007c981000030000000000000040811100d8a010000000000000000000e8a0100002000000000000005369676e6564436c61696d48616e6469636170002f00000000000000010000008a00000085a6100038000000386b110000000000bda610004300000000a710001a000000546f6d6273746f6e654465706f7369742f00000000000000010000008b00000050a610003500000053746f7261676553697a654f66667365740000002f000000000000000100000043000000d7a510004b00000022a610002e00000052656e7442797465466565002f00000000000000010000008c0000008aa510004d00000052656e744465706f7369744f66667365740000002f00000000000000010000008d00000012a410004100000053a4100016000000386b11000000000069a410005a000000c3a410005600000019a51000530000006ca510001e000000537572636861726765526577617264002f00000000000000010000008e000000bfa3100039000000f8a310001a0000005472616e73666572466565009aa31000250000004372656174696f6e4665650073a31000270000005472616e73616374696f6e4261736546656500003ca31000370000005472616e73616374696f6e4279746546656500002f000000000000000100000034000000f9a2100043000000436f6e7472616374466565002f000000000000000100000033000000a7a210004b000000f2a210000700000043616c6c426173654665650052a210004700000099a210000e000000437265617465426173654665650000002f00000000000000010000003b00000001a21000490000004aa21000080000004d617844657074682f00000000000000010000008f000000aca1100047000000f3a110000e0000004d617856616c756553697a652f0000000000000001000000900000005ea110004e000000426c6f636b4761734c696d69740000002f000000000000000100000091000000f8a010004900000041a110001d00000020546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e204120726561736f6e61626c652064656661756c742076616c75652069732031305f3030305f3030302e20546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e204120726561736f6e61626c652064656661756c742076616c7565206973203130302e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203137352e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203133352e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e204120726561736f6e61626c652064656661756c742076616c75652069732032312e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c6179496e7374616e636531436f6c6c6563746976652050726f706f73616c73496e7374616e636531436f6c6c65637469766520566f74696e670000000000000004a810000b0000000000000010a8100001000000000000000000000028a8100004000000000000000000000048a81000070000000000000050a8100001000000000000000000000068a8100003000000000000000000000028ed1000070000000000000080a81000020000000000000000000000b0a81000040000000000000000000000e0ed10000400000000000000d0a8100003000000000000000000000018a9100004000000000000007365745f6d656d6265727300000000003fab10000b00000000000000b11a110011000000beaa10005400000012ab100017000000386b11000000000029ab100016000000657865637574650000000000f4f61000080000000000000038aa10001e00000056aa10003d000000386b11000000000093aa10002b000000000000005ff81000090000000000000024aa10001400000000000000f4f61000080000000000000038aa10001e0000007e1b11000b000000d2a9100024000000f6a910002e0000001f1c11000c00000000000000f4f61000080000000000000005f410000700000000000000b0a910000500000000000000b5a910001600000000000000cba910000700000000000000d3331100040000007e1b11000b00000038a91000230000005ba91000550000001f1c11000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e642070726f76696465206974207072652d736f727465642e20526571756972657320726f6f74206f726967696e2e6e65775f6d656d62657273496e7374616e636531436f6c6c6563746976650000000000000018ad100009000000000000000000000021ad10000c000000000000000000000000000000000000000000000000000000000000004081110080b01000000000000000000030ad10000100000000000000010000000000000038ad10000a000000010100000000000005f41000070000000000000042ad100019000000000000000000000000000000000000004081110060b0100000000000000000005cad10000100000000000000000000000000000064ad100006000000010100000000000005f4100007000000000000006aad100013000000000000000000000000000000000000004081110060b01000000000000000000080ad10000100000000000000000000000000000088ad10000d00000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110070b01000000000000000000098ad100001000000000000000100000000000000a0ad1000070000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110080b010000000000000000000a8ad100001000000000000000100000050726f706f73616c735665633c543a3a486173683e00000070ae10002400000050726f706f73616c4f663c542061732054726169743c493e3e3a3a50726f706f73616c003dae100033000000566f74696e67566f7465733c543a3a4163636f756e7449643e00000010ae10002d00000050726f706f73616c436f756e74000000fead1000120000004d656d6265727300b0ad10004e000000205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e2050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e7374616e636532436f6c6c656374697665000000000018ad100009000000000000000000000021ad10000c000000000000000000000000000000000000000000000000000000000000004081110080b01000000000000000000030ad10000100000000000000010000000000000038ad10000a000000010100000000000005f41000070000000000000042ad100019000000000000000000000000000000000000004081110060b0100000000000000000005cad10000100000000000000000000000000000064ad100006000000010100000000000005f4100007000000000000006aad100013000000000000000000000000000000000000004081110060b01000000000000000000080ad10000100000000000000000000000000000088ad10000d00000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110070b01000000000000000000098ad100001000000000000000100000000000000a0ad1000070000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110080b010000000000000000000a8ad10000100000000000000010000002f0000000000000001000000360000002f0000000000000001000000410000002f0000000000000001000000310000000a68110028000000a8b0100044000000b7010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f6c69622e7273a8b0100044000000b7010000010000006e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e7443616e6e6f7420726573746f72652066726f6d20696e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163744f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b546f6d6273746f6e657320646f6e2774206d6174636843616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e7472616374e0891000450000007d0000000100000070726f706f736572206e6f742061206d656d6265726475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564496e7374616e636531436f6c6c6563746976652050726f706f73616c4f66496e7374616e636531436f6c6c6563746976652050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f742061206d656d6265726d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564000020b3100048000000880a00000e000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e7273496e7374616e636532436f6c6c6563746976652050726f706f73616c73496e7374616e636532436f6c6c65637469766520566f74696e67496e7374616e636532436f6c6c6563746976652050726f706f73616c4f66496e7374616e636532436f6c6c6563746976652050726f706f73616c436f756e740000000000000cb410000f000000000000001cb410000200000000000000000000002cb4100004000000000000004e65774163636f756e74496e646578006110110009000000c7b410000c0000004cb4100022000000386b1100000000006eb4100041000000afb41000180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e64657800ecb410002b00000017b5100044000000ff0000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e7273626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d6974206279207072696365000000b8b510003000000017b5100044000000f30000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b00b610004e00000017b5100044000000f40000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f77417574686f727368697020417574686f72496e646963657320456e756d53657400a0b6100019000000c0b6100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f6f70732f61726974682e72732d00000008000000040000002e0000000a6811002800000030b71000420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e7273000030b71000420000004a00000001000000696e76616c6964206163636f756e7420696e64657854696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e742064617461496e646963657300000000000000a0b810000b0000000000000000000000abb810000f0000000000000000000000000000000000000000000000000000000000000040811100bcb810000000000000000000ccb8100001000000000000000100000000000000d4b81000070000000101000000000000abb810000f00000000000000b11a1100110000000000000000000000000000000000000040811100dcb810000000000000000000ecb810000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e64657800002f0000000000000001000000410000000ab910001f000000456e756d536574002f000000000000000100000031000000f4b81000160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e000000b0b9100048000000880a00000e000000a0b610001900000060b9100047000000e20000000a0000000000000000000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e72730000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e7273496e6469636573204e657874456e756d536574417574686f727368697020556e636c65736d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e65644d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e52657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e00000000000044bc1000030000000000000048bc100001000000000000000000000060bc100009000000000000007365740000000000e2bd10000300000000000000e5bd100012000000a8bc100016000000386b110000000000bebc10005600000014bd100036000000386b1100000000004abd1000510000009bbd100011000000386b110000000000acbd10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d7000000000b0be100003000000000000000000000095e31000090000000000000000000000000000000000000000000000000000000000000040811100b4be10000000000000000000c4be100001000000000000000100000000000000ccbe1000090000000000000000000000d3331100040000000000000000000000000000000000000000000000000000000000000040811100f8c210000000000000000000d8be10000100000000000000010000004e6f77002f0000000000000001000000350000000dbf100024000000446964557064617465000000e0be10002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e000000000000006cbf10000d0000000000000095e310000900000000000000408111007cbf100000000000000000008cbf100004000000000000004d696e696d756d506572696f640000002f000000000000000100000092000000acbf10005a00000006c010005a00000060c0100059000000b9c010001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e0000000000000004c110000a0000000000000010c1100001000000000000000000000028c1100001000000000000007365745f756e636c657300000000000049c110000a0000000000000053c110000e00000030c11000190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e417574686f7273686970000000000074c210000600000000000000000000007ac210003a0000000000000000000000000000000000000000000000000000000000000040811100b4c210000000000000000000c4c2100001000000000000000100000000000000ccc21000060000000000000000000000423111000c0000000000000000000000000000000000000000000000000000000000000040811100d4c210000000000000000000e4c2100001000000000000000000000000000000ecc210000c0000000000000000000000d3331100040000000000000000000000000000000000000000000000000000000000000040811100f8c21000000000000000000008c31000010000000000000001000000556e636c65735665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e2f00000000000000010000003100000058c3100007000000417574686f7200002f0000000000000001000000360000003fc3100019000000446964536574556e636c65732f00000000000000010000003600000010c310002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c657300b0b9100048000000820a00000a000000556e636c657320616c72656164792073657420696e20626c6f636b2e756e636c652069732067656e65736973756e636c657320746f6f206869676820696e20636861696e756e636c6520706172656e74206e6f7420696e20636861696e756e636c65206e6f7420726563656e7420656e6f75676820746f20626520696e636c75646564756e636c6520616c726561647920696e636c75646564626164206f726967696e3a20657870656374656420746f206265206e6f206f726967696e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e64657873746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970650000e0c410001900000000c5100048000000420100000e00000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e727360c510000e0000006ec5100048000000400100004a0000006578706c696369742070616e69632f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e7273000060c510000e0000006ec5100048000000410100004a000000e8c51000340000001cc6100045000000ac0000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f657865632e72730000002f000000000000000100000093000000940000009500000096000000970000009800000053797374656d204e756d62657253797374656d2045787472696e73696373526f6f7453797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e636500000a68110028000000f4c610003f0000009d000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f626162652f7372632f6c69622e7273000a681100280000004cc7100041000000dd000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e7273000000f4c610003f0000009d0000000100000074696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c53797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0030c8100048000000880a00000e00000053797374656d204576656e747353797374656d204576656e74546f706963730000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000080c910000a00000000000000386b11000000000000000000000000008cc9100001000000000000000000000094c9100006000000000000009cc91000010000000000000000000000b4c91000010000000000000000000000bcc910000e00000000000000ccc91000010000000000000000000000e4c91000010000000000000000000000ecc910000800000000000000f4c910000100000000000000000000000cca100001000000000000000000000014ca10000b0000000000000020ca100001000000000000000000000038ca100001000000000000000000000040ca10000c000000000000004cca100001000000000000000000000064ca1000010000000000000066696c6c5f626c6f636b000045cb10004800000072656d61726b0000000000003ecb10000700000000000000d5ca10000700000023cb10001b0000007365745f686561705f70616765730000000000001bcb1000050000000000000020cb100003000000dcca10003f0000007365745f636f6465000000004b1c11000300000000000000d5ca100007000000c3ca1000120000007365745f73746f726167650000000000b1ca10000500000000000000b6ca10000d00000096ca10001b0000006b696c6c5f73746f72616765000000008aca100004000000000000008eca1000080000006cca10001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e5665633c75383e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b20412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e53797374656d0000000000bcd010000c0000000101000000000000423111000c00000000000000c8d0100008000000000000000000000000000000000000004081110048df10000000000000000000d0d0100001000000000000000100000000000000d8d010000e00000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110024d110000000000000000000e8d0100001000000000000000000000000000000f0d0100013000000000000000000000003d1100006000000000000000000000000000000000000000000000000000000000000004081110024d1100000000000000000000cd110000100000000000000000000000000000014d110001000000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110024d11000000000000000000034d11000010000000000000000000000000000003cd1100014000000000000000000000050d1100010000000000000000000000000000000000000000000000000000000000000004081110048df1000000000000000000060d110000200000000000000010000000000000070d110000900000001010000000000001bf610000e0000000000000005f4100007000000000000000000000000000000000000004081110020d2100000000000000000007cd110000100000000000000010000000000000084d110000d0000000101000000000000061111000300000000000000d5ca100007000000000000000000000000000000000000004081110094d110000000000000000000a4d1100001000000000000000100000000000000acd110000e0000000000000000000000bad11000120000000000000000000000000000000000000000000000000000000000000040811100ccd110000000000000000000dcd1100002000000000000000100000000000000ecd110000600000000000000000000001bf610000e000000000000000000000000000000000000000000000000000000000000004081110048df10000000000000000000f4d1100001000000000000000100000000000000fcd110000a000000000000000000000005f4100007000000000000000000000000000000000000000000000000000000000000004081110020d21000000000000000000008d210000100000000000000010000000000000010d210000e000000000000000000000005f4100007000000000000000000000000000000000000000000000000000000000000004081110020d21000000000000000000030d210000100000000000000010000000000000038d210000600000000000000000000003ed210000b00000000000000000000000000000000000000000000000000000000000000408111004cd2100000000000000000005cd210000100000000000000010000000000000064d210000600000000000000000000006ad2100023000000000000000000000000000000000000000000000000000000000000004081110090d210000000000000000000a0d2100001000000000000000100000000000000a8d210000a0000000000000000000000b2d210000a0000000000000000000000000000000000000000000000000000000000000040811100bcd210000000000000000000ccd2100001000000000000000100000000000000d4d210000b0000000201010000000000dfd21000020000000000000005f410000700000000000000e1d21000210000000000000040811100fcde1000000000000000000004d310000d00000000000000010000004163636f756e744e6f6e6365543a3a496e646578b1d910001f00000045787472696e736963436f756e74000083d910002e000000416c6c45787472696e736963735765696768745765696768740000003ed9100045000000416c6c45787472696e736963734c656e2f000000000000000100000036000000eed81000500000004e6578745765696768744d756c7469706c6965725765696768744d756c7469706c6965727ad8100059000000d3d810001b000000426c6f636b4861736800000054d810002600000045787472696e736963446174610000002f00000000000000010000003100000005d810004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e292f00000000000000010000009900000048d7100069000000b1d71000540000004e756d626572000006d7100042000000506172656e74486173680000ead610001c00000045787472696e73696373526f6f7400002f00000000000000010000009a000000a5d61000450000004469676573744469676573744f663c543e0000002f00000000000000010000003100000069d610003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000002f00000000000000010000003100000041d61000280000004576656e74436f756e744576656e74496e6465782f00000000000000010000004100000013d610002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e00006cd3100049000000b5d3100025000000386b110000000000dad310004b00000025d410002a000000386b1100000000004fd4100054000000a3d4100051000000f4d4100039000000386b1100000000002dd510005300000080d5100053000000d3d5100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546865206e65787420776569676874206d756c7469706c6965722e20546869732073686f756c6420626520757064617465642061742074686520656e64206f66206561636820626c6f636b206261736564206f6e207468652073617475726174696f6e206c6576656c2028776569676874292e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e53657373696f6e20486973746f726963616c53657373696f6e7365706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b20716564000000000000000000000000000000000000000000000000000000000000000072656163686564206d6178696d756d2064657074682c2063616e6e6f7420637265617465009b00000018000000040000009c0000009d0000009e0000009f000000a0000000a10000006e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665656e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c20666565636f6e747261637420686173206265656e206576696374656470726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165640000004cc7100041000000dd000000010000003a6865617070616765733a636f64657472616e73616374696f6e20626972746820626c6f636b20616e6369656e7442616265000000000000bcde10000a000000000000000000000020cb100003000000000000000000000000000000000000000000000000000000000000004081110048df10000000000000000000c8de100001000000000000000100000000000000d0de10000b0000000000000000000000dbde10001e0000000000000000000000000000000000000000000000000000000000000040811100fcde100000000000000000000cdf10000100000000000000010000000000000014df10000e000000000000000000000020cb100003000000000000000000000000000000000000000000000000000000000000004081110048df1000000000000000000024df1000030000000000000001000000000000003cdf10000b000000000000000000000020cb100003000000000000000000000000000000000000000000000000000000000000004081110048df1000000000000000000058df10000100000000000000010000000000000060df10000a00000000000000000000006adf1000080000000000000000000000000000000000000000000000000000000000000040811100f0df1000000000000000000074df10000a000000000000000100000000000000c4df10000e00000000000000000000006adf1000080000000000000000000000000000000000000000000000000000000000000040811100f0df10000000000000000000d4df100001000000000000000100000000000000dcdf10001100000000000000000000006adf1000080000000000000000000000000000000000000000000000000000000000000040811100f0df1000000000000000000000e0100001000000000000000100000045706f6368496e6465780000cde2100015000000417574686f7269746965735665633c28417574686f7269747949642c2042616265576569676874293e0000002f000000000000000100000031000000b2e210001b00000045706f63685374617274536c6f74000019e210004000000059e210003e00000097e210001b00000043757272656e74536c6f74002f00000000000000010000003500000004e210001500000052616e646f6d6e6573735b75383b2033325d00003ee010002e000000386b1100000000006ce010000b000000386b11000000000077e0100041000000b8e010003e000000f6e01000450000003be110004500000080e1100041000000c1e11000430000004e65787452616e646f6d6e657373000027e0100017000000556e646572436f6e737472756374696f6e0000002f0000000000000001000000a200000008e010001f0000002052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e204e6578742065706f63682072616e646f6d6e6573732e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e20536c6f74206174207768696368207468652063757272656e742065706f636820737461727465642e20497420697320706f737369626c652074686174206e6f20626c6f636b2077617320617574686f7265642061742074686520676976656e20736c6f7420616e64207468652065706f6368206368616e676520776173207369676e616c6c6564206c61746572207468616e20746869732e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e00000000000054e310000d0000000000000020cb100003000000000000004081110064e31000000000000000000074e3100002000000000000000000000084e31000110000000000000095e31000090000000000000040811100a0e310000000000000000000b0e31000050000000000000045706f63684475726174696f6e0000002f0000000000000001000000a300000008e51000430000004be510003f0000004578706563746564426c6f636b54696d65543a3a4d6f6d656e7400002f0000000000000001000000a4000000d8e310004100000019e41000440000005de41000410000009ee4100042000000e0e410002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e00000000000070e71000080000000000000078e71000020000000000000000000000386b110000000000000000000000000088e71000060000000000000090e71000030000000000000000000000386b1100000000000000000000000000a8e710000e00000000000000386b1100000000000000000000000000386b1100000000000000000000000000b6e710000700000000000000c0e71000020000000000000000000000386b1100000000000000000000000000d0e710000600000000000000d8e71000010000000000000000000000386b1100000000000000000000000000e0e710000900000000000000d8e71000010000000000000000000000386b1100000000000000000000000000e9e710000900000000000000d8e71000010000000000000000000000386b1100000000000000000000000000f2e710000800000000000000fce71000020000000000000000000000386b11000000000000000000000000000ce81000090000000000000018e81000020000000000000000000000386b110000000000000000000000000028e810000b0000000000000034e81000010000000000000000000000386b11000000000000000000000000003ce81000060000000000000044e81000030000000000000000000000386b1100000000000000000050726f706f73656487e81000090000006a101100070000005461626c6564000087e81000090000006a1011000700000090e810000e00000045787465726e616c5461626c6564537461727465640000006be810000f0000007ae810000d00000050617373656400006be810000f0000004e6f7450617373656443616e63656c6c6564457865637574656400006be810000f000000d33311000400000044656c65676174656400000061101100090000006110110009000000556e64656c6567617465640061101100090000005665746f6564000061101100090000005ce810000400000060e810000b00000048617368426c6f636b4e756d6265725265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e6465785665633c4163636f756e7449643e44656d6f637261637920566f74654f6644656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379205075626c696350726f7073c0e9100048000000880a00000e0000004e6f207075626c69632070726f706f73616c732077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d00002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e727344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6700000000000028ed1000070000000000000030ed100002000000000000000000000060ed100006000000000000000000000090ed1000060000000000000098ed1000010000000000000000000000b0ed1000060000000000000000000000e0ed10000400000000000000e4ed100002000000000000000000000014ee10000700000000000000000000004cee10000a00000000000000e4ed100002000000000000000000000058ee100007000000000000000000000090ee10001100000000000000a4ee100004000000000000000000000004ef100006000000000000000000000034ef1000100000000000000044ef10000100000000000000000000005cef10000200000000000000000000006cef100010000000000000007cef100001000000000000000000000094ef1000020000000000000000000000a4ef100019000000000000007cef1000010000000000000000000000c0ef1000020000000000000000000000d0ef10000d00000000000000e0ef100003000000000000000000000028f0100008000000000000000000000068f010000d0000000000000078f0100001000000000000000000000090f0100001000000000000000000000098f010001100000000000000acf01000010000000000000000000000c4f01000010000000000000000000000ccf010000d00000000000000dcf0100003000000000000000000000024f110000100000000000000000000002cf11000090000000000000038f1100001000000000000000000000050f1100005000000000000000000000078f110000c00000000000000386b110000000000000000000000000084f11000050000000000000000000000acf110000c0000000000000038f11000010000000000000000000000b8f11000050000000000000000000000e0f110000800000000000000e8f1100002000000000000000000000018f2100005000000000000000000000040f210000a00000000000000386b11000000000000000000000000004cf21000050000000000000070726f706f73650000000000f4f610000800000000000000fcf610001000000000000000ee2511000500000000000000f32511001500000099f9100028000000386b1100000000007e1b11000b0000002e27110008000000d3f91000200000001f1c11000c0000007365636f6e64000000000000f4f610000800000000000000c1f910001200000099f9100028000000386b1100000000007e1b11000b0000002e27110008000000d4251100100000001f1c11000c000000766f746500000000c0f31000090000000000000093f310001800000000000000e0ed1000040000000000000095f910000400000019f910004d00000066f910002f000000386b1100000000007e1b11000b0000002e27110008000000faf810001f0000001f1c11000c00000070726f78795f766f7465000068f8100054000000bcf810003e000000386b1100000000007e1b11000b0000002e27110008000000faf810001f0000001f1c11000c000000656d657267656e63795f70726f706f736500000000000000f4f610000800000000000000fcf6100010000000000000005ff8100009000000000000007ae810000d000000000000000ef610000d000000000000001bf610000e0000000000000029f6100005000000000000001bf610000e00000060f7100022000000386b11000000000082f7100058000000daf7100046000000386b11000000000020f810003f000000656d657267656e63795f63616e63656c00000000c0f3100009000000000000006be810000f0000000cf7100054000000e8f610000c00000065787465726e616c5f70726f706f736500000000f4f610000800000000000000fcf61000100000009cf610004c000000e8f610000c00000065787465726e616c5f70726f706f73655f6d616a6f726974790000002ef610005600000084f610001800000065787465726e616c5f7075736800000000000000f8f310000d0000000000000005f4100007000000000000000ef610000d000000000000001bf610000e0000000000000029f6100005000000000000001bf610000e0000000cf410005400000060f4100059000000b9f410003b000000386b110000000000f4f410003e00000032f510004b0000007df5100055000000d2f510003c0000007665746f5f65787465726e616c00000000000000f8f310000d0000000000000005f4100007000000c9f310002f00000063616e63656c5f7265666572656e64756d00000000000000c0f31000090000000000000093f3100018000000abf310001500000063616e63656c5f717565756564000000000000006ff31000040000000000000073f3100017000000000000008af3100005000000000000004e1c11000c000000000000008ff31000040000000000000093f310001800000047f31000280000007365745f70726f78790000000000000042f310000500000000000000423111000c0000001cf3100026000000386b1100000000007e1b11000b00000094f21000160000001f1c11000c00000072657369676e5f70726f7879f6f2100026000000386b1100000000007e1b11000b000000e6f21000100000001f1c11000c00000072656d6f76655f70726f7879c0f2100026000000386b1100000000007e1b11000b000000e6f21000100000001f1c11000c00000064656c656761746500000000aaf210000200000000000000423111000c00000000000000acf210000a00000000000000b6f210000a00000085f210000f000000386b1100000000007e1b11000b00000094f21000160000001f1c11000c000000756e64656c6567617465000074f2100011000000386b1100000000007e1b11000b0000002e271100080000001f1c11000c00000020556e64656c656761746520766f74652e2044656c656761746520766f74652e202d204f6e6520657874726120444220656e7472792e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e202d204f6e6520444220636c6561722e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e436f6d706163743c543a3a426c6f636b4e756d6265723e776869636877686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368543a3a48617368205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c656420696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e6520627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265202020656e61637465642e20496e6372656173656420746f2060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e766f74696e675f706572696f64543a3a426c6f636b4e756d62657264656c6179205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e70726f706f73616c426f783c543a3a50726f706f73616c3e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d65205363686564756c6520616e20656d657267656e6379207265666572656e64756d2e20546869732077696c6c206372656174652061206e6577207265666572656e64756d20666f7220746865206070726f706f73616c602c20617070726f766564206173206c6f6e6720617320636f756e74656420766f7465732065786365656420607468726573686f6c646020616e642c20696620617070726f7665642c20656e61637465642061667465722074686520676976656e206064656c6179602e204974206d61792062652063616c6c65642066726f6d206569746865722074686520526f6f74206f722074686520456d657267656e6379206f726967696e2e7468726573686f6c6420566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e44656d6f63726163790000000024ff10000f000000000000000000000087e81000090000000000000000000000000000000000000000000000000000000000000040811100e4ff1000000000000000000034ff1000010000000000000001000000000000003cff10000b000000000000000000000047ff10002b0000000000000000000000000000000000000000000000000000000000000040811100a0001100000000000000000074ff1000010000000000000001000000000000007cff100009000000010100000000000087e81000090000000000000085ff1000210000000000000000000000000000000000000040811100a8ff10000000000000000000b8ff100001000000000000000000000000000000c0ff10000f00000000000000000000006be810000f0000000000000000000000000000000000000000000000000000000000000040811100e4ff10000000000000000000d0ff100001000000000000000100000000000000d8ff10000900000000000000000000006be810000f0000000000000000000000000000000000000000000000000000000000000040811100e4ff10000000000000000000f4ff100001000000000000000100000000000000fcff10001000000001010000000000006be810000f000000000000000c0011002d00000000000000000000000000000000000000408111001801110000000000000000003c00110001000000000000000000000000000000440011000d00000001010000000000001bf610000e00000000000000510011002b00000000000000000000000000000000000000408111007c00110000000000000000008c00110001000000000000000100000000000000940011000900000001010000000000006be810000f00000000000000b11a1100110000000000000000000000000000000000000040811100a00011000000000000000000b000110001000000000000000100000000000000b8001100060000000101000000000000be0011001f0000000000000095f91000040000000000000000000000000000000000000040811100e00011000000000000000000f00011000400000000000000010000000000000010011100050000000101000000000000423111000c00000000000000423111000c00000000000000000000000000000000000000408111001801110000000000000000002801110002000000000000000000000000000000380111000b0000000101010000000000423111000c00000000000000430111001a0000000000000000000000000000000000000040811100600111000000000000000000700111000100000000000000010000000000000078011100150000000000000000000000d33311000400000000000000000000000000000000000000000000000000000000000000408111005402110000000000000000009001110002000000000000000100000000000000a00111000c0000000000000000000000ac0111001c0000000000000000000000000000000000000000000000000000000000000040811100c80111000000000000000000d801110004000000000000000000000000000000f801110009000000010100000000000005f410000700000000000000010211002300000000000000000000000000000000000000408111002402110000000000000000003402110002000000000000000000000000000000440211000d000000010100000000000005f410000700000000000000d3331100040000000000000000000000000000000000000040811100540211000000000000000000640211000100000000000000010000005075626c696350726f70436f756e7400d40711003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000b4071100200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900002f00000000000000010000003c00000093071100210000005265666572656e64756d436f756e7400470711004c0000004e65787454616c6c790000002f00000000000000010000004100000015071100320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000e80611002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e2f000000000000000100000031000000b806110030000000566f74657273466f720000002f0000000000000001000000310000008f06110029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e744964290000002f0000000000000001000000360000005005110058000000a805110053000000fb05110057000000520611003d00000050726f78790000002f000000000000000100000036000000e20411004c0000002e0511002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e290000002f0000000000000001000000a500000092041100500000004c6173745461626c656457617345787465726e616c0000003204110056000000880411000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c64292f0000000000000001000000a600000044031100560000009a03110055000000ef03110029000000180411001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e292f00000000000000010000003c000000b6021100540000000a0311003a00000043616e63656c6c6174696f6e730000002f0000000000000001000000360000006c0211004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e00000000000000640911000f000000000000001bf610000e00000000000000408111003c0a11000000000000000000740911000500000000000000000000009c0911000c000000000000001bf610000e0000000000000040811100bc0911000000000000000000a8091100010000000000000000000000b00911000c000000000000001bf610000e0000000000000040811100bc0911000000000000000000cc091100010000000000000000000000d40911000e000000000000001d3311000c0000000000000040811100e40911000000000000000000f4091100010000000000000000000000fc09110015000000000000001bf610000e0000000000000040811100140a11000000000000000000240a11000100000000000000000000002c0a11000d000000000000001bf610000e00000000000000408111003c0a110000000000000000004c0a11000100000000000000456e6163746d656e74506572696f64009b0b11005c000000386b110000000000f70b11004c000000430c11005a0000009d0c1100270000004c61756e6368506572696f64620b110039000000566f74696e67506572696f642f0000000000000001000000a7000000340b11002e0000004d696e696d756d4465706f73697400002f0000000000000001000000a8000000e70a11004d000000456d657267656e6379566f74696e67506572696f640000002f0000000000000001000000a9000000ac0a11003b000000436f6f6c6f6666506572696f640000002f0000000000000001000000aa000000540a11005800000020506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e20546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e2049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e73757265207468617420766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e0a68110028000000dc0c1100440000004b010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e7273dc0c1100440000004b0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7763616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f776e6f7420612070726f787944656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d616465696e76616c696420686173686e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974796e6f2070726f706f73616c206d61646544656d6f637261637920426c61636b6c6973746e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c6964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636544656d6f63726163792050726f7879616c726561647920612070726f787977726f6e672070726f78796e6f742064656c656761746564756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c20747769636570726f706f73616c206e6f7420666f756e64766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e00000000000000ac0f11000600000000000000b40f1100010000000000000000000000bc0f1100010000000000000000000000c40f11000e00000000000000d40f1100020000000000000000000000e40f1100020000000000000000000000f40f11000c000000000000000010110002000000000000000000000010101100010000000000000052657761726400006a1011000700000009111100380000004f66666c696e655761726e696e670000611011000900000006111100030000007110110052000000c3101100430000004f66666c696e65536c61736861101100090000006a101100070000001810110049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e4163636f756e74496442616c616e6365204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e75333220416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e672043757272656e7445726153746172745374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67205374616b6572735374616b696e67204c65646765725374616b696e672050617965655374616b696e6720536c617368436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72734c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f7273000000000000008c141100040000000000000090141100030000000000000000000000d81411000f0000000000000000000000501511000a000000000000005c151100010000000000000000000000741511000e0000000000000000000000e41511000600000000000000ec15110001000000000000000000000004161100170000000000000000000000bc1611001100000000000000386b1100000000000000000000000000d016110010000000000000000000000050171100080000000000000058171100010000000000000000000000701711000b0000000000000000000000c81711000800000000000000d0171100010000000000000000000000e81711000b0000000000000000000000401811000500000000000000386b1100000000000000000000000000481811000b0000000000000000000000a01811000900000000000000ac181100010000000000000000000000c41811000b00000000000000000000001c1911000e000000000000002c191100010000000000000000000000441911000b00000000000000000000009c1911001300000000000000b0191100010000000000000000000000c8191100010000000000000000000000d01911000d00000000000000386b1100000000000000000000000000e0191100080000000000000000000000201a11001700000000000000b0191100010000000000000000000000381a1100010000000000000000000000401a11001100000000000000541a11000100000000000000000000006c1a11000100000000000000626f6e6400000000a61d11000a00000000000000b01d11002300000000000000ee2511000500000000000000f32511001500000000000000281e110005000000000000002d1e11001100000044271100590000009d27110021000000386b110000000000be27110054000000386b1100000000001228110049000000386b1100000000007e1b11000b0000005b281100350000002e27110008000000902811001a000000386b110000000000aa2811005b00000005291100490000001f1c11000c000000626f6e645f6578747261000000000000362711000e00000000000000f3251100150000000826110059000000612611000d000000386b1100000000006e26110054000000c2261100590000001b27110013000000386b110000000000bf1c110055000000386b1100000000007e1b11000b000000141d11003a0000002e27110008000000d4251100100000001f1c11000c000000756e626f6e64000000000000ee2511000500000000000000f325110015000000ff211100550000005422110040000000942211004d000000386b110000000000e1221100520000003323110030000000386b110000000000632311004f000000b22311004f000000012411003f000000386b110000000000d31d110055000000386b1100000000004024110026000000386b1100000000007e1b11000b00000066241100500000004e1d110026000000b6241100590000000f2511005c0000006b25110069000000d425110010000000e42511000a00000077697468647261775f756e626f6e646564000000f81f11004b000000386b110000000000432011004d0000009020110013000000386b110000000000d31d110055000000386b110000000000a32011001b000000386b1100000000007e1b11000b000000be201100550000001321110051000000642111003d000000a12111005e000000741d1100320000001f1c11000c00000076616c696461746500000000d71f11000500000000000000dc1f11001c0000009d1f11003a000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000141d11003a0000004e1d110026000000741d1100320000001f1c11000c0000006e6f6d696e617465000000006e1f11000700000000000000751f110028000000851e110044000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000c91e110049000000121f110026000000381f1100360000001f1c11000c0000006368696c6c0000003e1e110032000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000141d11003a000000701e110015000000741d1100320000001f1c11000c0000007365745f706179656500000000000000281e110005000000000000002d1e1100110000005a1c11002e000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000141d11003a0000004e1d110026000000741d1100320000001f1c11000c0000007365745f636f6e74726f6c6c6572000000000000a61d11000a00000000000000b01d1100230000005a1c11002e000000386b110000000000881c110037000000386b110000000000bf1c110055000000386b1100000000007e1b11000b000000141d11003a0000004e1d110026000000741d1100320000001f1c11000c0000007365745f76616c696461746f725f636f756e7400000000004b1c110003000000000000004e1c11000c0000002b1c110020000000666f7263655f6e65775f657261000000e61a11004f000000351b110049000000386b1100000000007e1b11000b000000891b110020000000a91b110045000000ee1b1100310000001f1c11000c0000007365745f6f66666c696e655f736c6173685f677261636500c21a1100240000007365745f696e76756c6e657261626c657300000000000000a71a11000a00000000000000b11a110011000000741a11003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e2023203c7765696768743e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d205472696767657273207468652050687261676d656e20656c656374696f6e2e20457870656e7369766520627574206e6f7420757365722d636f6e74726f6c6c65642e202d20446570656e6473206f6e2073746174653a20604f287c65646765737c202a207c76616c696461746f72737c29602e2023203c2f7765696768743e2054686520696465616c206e756d626572206f662076616c696461746f72732e6e6577436f6d706163743c7533323e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c65723c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636520546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e2020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c2077686963682069732020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e203c2f7765696768743e76616c7565436f6d706163743c42616c616e63654f663c543e3e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e20556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e202d204f2831292e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e206076616c756560206d757374206265206d6f7265207468616e2074686520606578697374656e7469616c5f6465706f7369746020646566696e656420696e207468652042616c616e636573206d6f64756c652e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e5374616b696e6700000000000000903011000e000000000000000000000006111100030000000000000000000000000000000000000000000000000000000000000040811100603311000000000000000000a030110001000000000000000100000000000000a830110015000000000000000000000006111100030000000000000000000000000000000000000000000000000000000000000040811100c03011000000000000000000d030110001000000000000000100000000000000f40f11000c0000000000000000000000d8301100070000000000000000000000000000000000000000000000000000000000000040811100e03011000000000000000000f030110001000000000000000100000000000000f8301100110000000000000000000000061111000300000000000000000000000000000000000000000000000000000000000000408111006033110000000000000000000c31110001000000000000000100000000000000143111000d0000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110018341100000000000000000024311100030000000000000001000000000000003c311100060000000101000000000000423111000c00000000000000423111000c0000000000000000000000000000000000000040811100883111000000000000000000503111000100000000000000000000000000000058311100060000000101000000000000423111000c000000000000005e3111002900000000000000000000000000000000000000408111008831110000000000000000009831110001000000000000000000000000000000a0311100050000000101000000000000423111000c000000000000002d1e1100110000000000000000000000000000000000000040811100a83111000000000000000000b831110001000000000000000100000000000000c03111000a0000000101010000000000423111000c00000000000000dc1f11001c0000000000000000000000000000000000000040811100cc3111000000000000000000dc31110001000000000000000100000000000000e43111000a0000000101010000000000423111000c00000000000000b11a1100110000000000000000000000000000000000000040811100183411000000000000000000f031110001000000000000000100000000000000f8311100070000000101000000000000423111000c00000000000000ff3111002400000000000000000000000000000000000000408111002432110000000000000000003432110004000000000000000100000000000000543211000e0000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110018341100000000000000000064321100010000000000000001000000000000006c3211000a0000000000000000000000763211000800000000000000000000000000000000000000000000000000000000000000408111006033110000000000000000008032110001000000000000000100000000000000883211000f0000000000000000000000973211000b0000000000000000000000000000000000000000000000000000000000000040811100a43211000000000000000000b432110001000000000000000100000000000000bc3211001b0000000000000000000000136511000c0000000000000000000000000000000000000000000000000000000000000040811100603311000000000000000000d832110001000000000000000100000000000000e0321100110000000000000000000000f13211000a0000000000000000000000000000000000000000000000000000000000000040811100fc32110000000000000000000c33110001000000000000000100000000000000143311000900000000000000000000001d3311000c00000000000000000000000000000000000000000000000000000000000000408111002c33110000000000000000003c33110003000000000000000100000000000000543311000a0000000101000000000000423111000c00000000000000061111000300000000000000000000000000000000000000408111006033110000000000000000007033110002000000000000000100000000000000803311000f00000000000000000000008f331100280000000000000000000000000000000000000000000000000000000000000040811100183411000000000000000000b833110002000000000000000100000000000000c83311000b0000000000000000000000d3331100040000000000000000000000000000000000000000000000000000000000000040811100d83311000000000000000000e833110001000000000000000100000000000000f03311000a0000000000000000000000fa3311001d00000000000000000000000000000000000000000000000000000000000000408111001834110000000000000000002834110001000000000000000100000056616c696461746f72436f756e7400000e3b11002a0000004d696e696d756d56616c696461746f72436f756e740000002f0000000000000001000000ab000000be3a11005000000050657262696c6c002f0000000000000001000000ac0000006a3a1100540000004f66666c696e65536c61736847726163650000001c3a11004e000000496e76756c6e657261626c657300000048391100560000009e39110053000000f13911002b000000426f6e646564543a3a4163636f756e744964000008391100400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e002f000000000000000100000036000000b73811005100000050617965650000002f0000000000000001000000360000007e3811003900000056616c696461746f727300002f0000000000000001000000ad0000002d381100510000004e6f6d696e61746f72730000d4371100590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e002f0000000000000001000000ae00000017371100530000006a37110046000000386b110000000000b03711002400000043757272656e74456c65637465640000d83611003f00000043757272656e74457261457261496e6465780000c13611001700000043757272656e7445726153746172744d6f6d656e744f663c543e00002f000000000000000100000035000000a33611001e00000043757272656e74457261537461727453657373696f6e496e646578006f3611003400000043757272656e744572615265776172647345726152657761726473002f0000000000000001000000af0000002c36110043000000536c6f745374616b6542616c616e63654f663c543e0000002f000000000000000100000030000000b03511004c000000386b110000000000fc35110030000000536c617368436f756e7400002f0000000000000001000000410000003c35110057000000933511001d000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e00c0341100550000001535110027000000466f7263654e6577457261626f6f6c002f0000000000000001000000360000007934110047000000426f6e646564457261735665633c28457261496e6465782c2053657373696f6e496e646578293e002f00000000000000010000003100000030341100490000002041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e20546865207374617274206f66207468652063757272656e74206572612e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e00000000a83b11000e00000000000000136511000c0000000000000040811100b83b11000000000000000000c83b1100010000000000000000000000d03b11000f0000000000000076321100080000000000000040811100e03b11000000000000000000f03b1100010000000000000053657373696f6e7350657245726100002f000000000000000100000037000000313c11001c000000426f6e64696e674475726174696f6e002f0000000000000001000000b0000000f83b110039000000204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e204e756d626572206f662073657373696f6e7320706572206572612e5374616b696e672043757272656e74456c656374656400803c110048000000880a00000e0000000000000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72735374616b696e6720536c6f745374616b65000000003e110019000000203e110048000000bb0100002d000000b10000002800000004000000b2000000b30000000000000000000000b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f6f70732f61726974682e72730a68110028000000803e1100420000009f020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e727300009040110023000000664011002a000000803e1100420000009f02000001000000636f6e74726f6c6c657220616c72656164792070616972656463616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e6365737461736820616c726561647920626f6e6465646e6f74206120636f6e74726f6c6c65726e6f74206120737461736863616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d7074795374616b696e6720496e76756c6e657261626c6573696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e007041110048000000ab010000230000007041110048000000ac01000023000000494111001c000000646c110018000000df0300000d0000000041110049000000870200001d000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e727300411100490000009d0000003a0000000041110049000000a4000000300000004f6666636861696e206572726f723a207375626d697474696e67207472616e73616374696f6e206661696c6564214f6666636861696e206572726f723a206465636f64696e6720417574686f726974794964206661696c6564214f6666636861696e206572726f723a206465636f64696e6720576f726b6572537461747573206661696c6564214f6666636861696e206572726f723a2065787472696e736963206372656174696f6e206661696c6564214f6666636861696e206572726f723a207369676e696e67206661696c6564214f6666636861696e206572726f723a206665746368696e67206e6574776f726b207374617465206661696c656421496d4f6e6c696e65204c6173744e6577457261537461727454726561737572792050726f706f73616c436f756e74547265617375727920417070726f76616c73000000000000010000000200000004000000080000001000000044656d6f6372616379205075626c696350726f70436f756e7444656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204e65787454616c6c7944656d6f6372616379204c6173745461626c656457617345787465726e616c746f6f206d616e7920696e737472756374696f6e73000000c44311002400000059691100170000004102000009000000547269656420746f20736872696e6b20746f2061206c6172676572206361706163697479436f6e7472616374204761735370656e74436f6e74726163742043757272656e745363686564756c65436f6e7472616374204163636f756e74436f756e7465726578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f64697370617463685f63616c6c6578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6578745f626c6f636b5f6e756d6265724e6f6e2d656d7074792066756e6374696f6e20626f64792065787065637465640000264611000f000000354611000200000037461100030000009845110030000000c84511005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2052657475726e207479706573206c656e6774682073686f756c642062652030206f72203143616e2774206465636f6465207761736d20636f64654d6f64756c65206973206e6f742076616c69646d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72796d756c7469706c65207461626c6573206465636c617265647461626c652065786365656473206d6178696d756d2073697a6520616c6c6f776564757365206f6620666c6f6174696e6720706f696e74207479706520696e2066756e6374696f6e20747970657320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e206c6f63616c7320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e20676c6f62616c7320697320666f7262696464656e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c656463616c6c6465706c6f796465706c6f792066756e6374696f6e2069736e2774206578706f72746564756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e7366756e6374696f6e206861732061206e6f6e2d6578697374656e7420747970656578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e617475726563616c6c2066756e6374696f6e2069736e2774206578706f727465646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c65b44a11001e000000d24a11001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400009a4a11001a000000754a11000a0000007f4a11001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d000000644a110011000000444a110020000000244a110020000000fc491100280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f72742046756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320000000104b11001c0000002c4b11005a0000004d00000028000000ffffffff48617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72736d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b000000b50000000c00000004000000b6000000746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e00004c4d110047000000934d110005000000104d110037000000474d110005000000dd4c110017000000d44c110009000000264f110014000000bc4c110018000000d44c110009000000264f1100140000008c4c11001d000000a94c1100130000003781110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e79537065636966696300380000000400000004000000b70000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065a84d110018000000c04d11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000084e1100170000001f4e11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000404e110007000000537461636b3a200000000100ca4e110024000000a04e110006000000a64e11000e000000b44e1100160000007c4e110024000000a04e1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000004f110026000000264f110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e67746820324e6f6e20636f6e7374616e74206f70636f646520696e20696e69742065787072d14f110007000000e34f110022000000d14f110007000000d84f11000b00000045787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c20206973206d757461626c6520646f65736e277420657869737473206f72206e6f742079657420646566696e65640000001850110010000000285011000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300485011000f000000285011000f0000005461626c6520617420696e6465782000f957110012000000285011000f000000785011000e000000285011000f0000005479706520617420696e646578200000e650110010000000285011000f000000b850110010000000d85011000e000000b850110010000000c850110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b206578706563746564000020511100200000004051110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f7665007851110015000000657863656564656420737461636b206c696d697420000000380000000400000004000000b80000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765d851110022000000fa511100150000000f52110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c734672616d6569735f706f6c796d6f7270686963000000380000000400000004000000b9000000656e645f61726974790000003800000004000000040000001d0000006272616e63685f617269747973746172745f6865696768744e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e000000945511000a00000046756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64885511000c000000f05411000b000000737461636b206d757374206265206e6f6e2d656d70747900e55411000b0000009e54110006000000737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64009754110007000000905311006c000000c800000011000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e72736d61785f686569676874707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768742f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e72737472756e633a20707573683a20e054110005000000747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77706f703a20756e726561636861626c65706f705f6672616d653a20636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e64734055110048000000820a00000a000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e7273707573685f6672616d653a2066756e635f6964783a2066756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473a0561100650000002301000017000000785611002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a200000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a09090909716564f9571100120000000b5811000f000000cc5711000a000000d657110014000000ea5711000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173305811005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300b45811001c0000008858110013000000c604000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656ee85811001e0000008858110013000000b303000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e4e6f6e65536f6d650000380000000400000004000000ba000000e559110012000000f75911000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644636345265696e74657270726574493634556e726561636861626c654e6f70426c6f636b00380000000400000004000000bb0000004c6f6f704966456c7365456e644272003800000004000000040000001d0000004272496642725461626c6500380000000400000004000000bc00000052657475726e43616c6c43616c6c496e6469726563740000380000000400000004000000bd00000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e737400380000000400000004000000be000000493634436f6e7374380000000400000004000000bf000000463332436f6e7374463634436f6e73743800000004000000040000000400000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324e6f526573756c7456616c756500380000000400000004000000b7000000463634493332493634463332496e76616c696444617461547261696c696e6744617461556e6578706563746564456f66086011000b000000492f4f204572726f723a20000a681100280000002c6011005000000087000000090000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e72730a681100280000002c601100500000009000000009000000436f756e63696c20446573697265645365617473436f756e63696c20566f7465436f756e74436f756e63696c204e657874566f746572536574436f756e63696c20566f746572436f756e74436f756e63696c2043616e646964617465436f756e74000000000000007c6111000e000000000000008c611100010000000000000000000000946111000100000000000000000000009c6111000600000000000000386b1100000000000000000000000000a4611100010000000000000000000000ac6111000700000000000000386b1100000000000000000000000000b461110001000000000000004e6577417574686f72697469657300002f621100170000000b621100240000005061757365640000e461110027000000526573756d656400bc611100280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20753634293e4772616e64706146696e616c69747920417574686f72697469657354696d657374616d7020496e697469616c697a656462616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e64426162652045706f6368496e6465784261626520417574686f726974696573426162652045706f63685374617274536c6f74426162652043757272656e74536c6f74426162652052616e646f6d6e65737342616265204e65787452616e646f6d6e6573734261626520556e646572436f6e737472756374696f6e5374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e672043757272656e744572615374616b696e672043757272656e74457261537461727453657373696f6e496e6465785374616b696e672043757272656e74457261526577617264735374616b696e6720466f7263654e65774572615374616b696e6720426f6e64656445726173417574686f727368697020446964536574556e636c657353657373696f6e2043757272656e74496e64657853657373696f6e204368616e67656453657373696f6e205175657565644368616e6765640000000000786411000a00000000000000846411000100000000000000000000008c64110002000000000000004e657753657373696f6e0000136511000c0000009c64110055000000f164110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e64657853657373696f6e2053746f72656452616e676500002f0000000000000001000000c0000000c1000000c20000002f0000000000000001000000c0000000c1000000c200000074696d737461703054696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d702044696455706461746500000000286611001000000000000000386b110000000000000000000000000038661100010000000000000000000000406611000f00000000000000386b110000000000000000000000000050661100010000000000000045787472696e736963537563636573736d6611002500000045787472696e7369634661696c656400586611001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687453797374656d20416c6c45787472696e736963734c656e53797374656d204e6578745765696768744d756c7469706c69657253797374656d2045787472696e7369634461746153797374656d204576656e74436f756e7448617368206e6f7420657175616c0000406711001900000060671100500000005800000022000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e72736578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e67696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d342e312e332f7372632f636f6465632e7273000000a86811002d000000d56811000c000000e168110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20ec6811003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e67746873646c110018000000470800000900000048691100110000005969110017000000ed020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273e0691100460000006301000013000000380000000400000004000000c3000000c4000000c50000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72002f0000000000000001000000c6000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000486b110020000000686b1100120000002f0000000000000001000000c7000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900007c6c110006000000826c110022000000646c110018000000040a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820c46c110016000000da6c11000d000000646c1100180000000a0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d00ae6d11000b0000006280110016000000e76c110001000000986d110016000000e307000009000000408011000e0000004e801100040000005280110010000000e76c110001000000986d110016000000e707000005000000008011002b0000002b801100150000007a01000015000000ae6d11000b000000b96d110026000000df6d110008000000e76d110006000000e76c110001000000986d110016000000f4070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060000000366e110002000000206e1100160000005404000011000000206e110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20e07911004a000000307c110000020000307e11003a00000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e0d0f0410031212130916011705180219031a071c021d011f1620032b042c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f747596972f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b030740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880c73035040a06380846080c06740b1e035a0459098083181c0a16094808808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b02100111041205131114021502170219041c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f906fa020c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1ca8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d00c72a3a4cbcc6e6f5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a808617094e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b602048080a80a65e22450b0a060d1339070a362c041080c03c64530c0180a0451b4808531d398107460a1d03474937030e080a0639070a81361980c7320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140041c97f80882f3a50d811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a0d035d033d391d0d2c040907020e06809a83d60a0d030b05740c59070c140c0438080a0628081e527703310380a60c14040305030d06856a000000c0791100200000002700000019000000c0791100200000002800000020000000c0791100200000002a00000019000000c0791100200000002b00000018000000c0791100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21f003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000f0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c833000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d0000000000001e1f202100000000002200230024252600000000270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829000000000000000000000000000000002a2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000002d2e00002f0000000000000000000000000000000000000000000000000000000000003031320000000000000000000000000000000000000000003300000029000000000000340000000000000000000000000000000000000000000000350036000000000000000000000000000000000000000000000000000037380000383838390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff060000f00c01000000fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f0000800000000000000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db0700000000000000f0000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f66206066616c736574727565426f72726f774572726f72426f72726f774d75744572726f720000386b1100000000002b801100150000008e04000005000000386b110000000000c4801100020000003a200000d8801100150000003c040000050000007372632f6c6962636f72652f726573756c742e727320202020207b202c20207b0a000000c80000000c00000004000000c9000000ca000000cb0000002c0a0000380000000400000004000000cc000000cd000000ce000000207d7d28280a2c290a5d5b4572726f720041c082c6000b08000000000000000000d79003046e616d6501ce9003d704000e6578745f626c616b65325f323536011f6578745f6765745f616c6c6f63617465645f6368696c645f73746f7261676502176578745f636c6561725f6368696c645f73746f72616765030f6578745f7365745f73746f72616765040c6578745f74776f785f31323805196578745f6765745f616c6c6f63617465645f73746f7261676506166578745f73616e64626f785f6d656d6f72795f6e6577071b6578745f73616e64626f785f6d656d6f72795f74656172646f776e08176578745f73616e64626f785f696e7374616e746961746509126578745f73616e64626f785f696e766f6b650a1d6578745f73616e64626f785f696e7374616e63655f74656172646f776e0b146578745f6765745f73746f726167655f696e746f0c116578745f636c6561725f73746f726167650d166578745f6b696c6c5f6368696c645f73746f726167650e106578745f636c6561725f7072656669780f166578745f6368696c645f73746f726167655f726f6f74100e6578745f7072696e745f7574663811156578745f7365745f6368696c645f73746f7261676512166578745f73616e64626f785f6d656d6f72795f67657413166578745f73616e64626f785f6d656d6f72795f73657414126578745f737232353531395f76657269667915126578745f656432353531395f766572696679160d6578745f7072696e745f68657817156578745f6c6f63616c5f73746f726167655f67657418216578745f6c6f63616c5f73746f726167655f636f6d706172655f616e645f736574190a6578745f7075626b65791a116578745f6e6574776f726b5f73746174651b086578745f7369676e1c166578745f7375626d69745f7472616e73616374696f6e1d156578745f6c6f63616c5f73746f726167655f7365741e106578745f73746f726167655f726f6f741f186578745f73746f726167655f6368616e6765735f726f6f74200b6578745f74776f785f363421236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74220d6578745f7072696e745f6e756d230a6578745f6d616c6c6f6324086578745f6672656525693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686135376361333065383863303365303426693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6833373139666330653134623738636436270c5f5f727573745f616c6c6f63280e5f5f727573745f7265616c6c6f63290e5f5f727573745f6465616c6c6f632a08727573745f6f6f6d2b34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68336430333339633338393539363364642c693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68666465363930626535643534353335662d4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313930363035356636656634383237362e5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323435356333626435643931376463372f3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683830383935343231326364636362353530633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6861653539633130346438353133613637313d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861326361663333656666326237333732327c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a6835633263313064386662343437643537333d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861376564663762316162326163643437343d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6866613865343765633933663536666432353d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6866616630326139373163346561326261362d616c6c6f633a3a7665633a3a5665633c543e3a3a72657461696e3a3a68313264383737303031386466653032333736636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a683863356337376530636566356239316638443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68343262303431353366346265353836383948616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303161313636363462353235323061643a4b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68663764316263323333653933356434373b4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68326461353465626366663537666563623c796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a68393636393230613235616638643962363d30636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68343861333664316238316265333563653e36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68356364313639613635616238353965393f4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833363566626164393361653031316662404e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837316361626362323361376461623764414e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837366163313032323131663866333733424e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837366432313166353166623965376535434e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838356533343365643362656139623361444f3c616c6c6f633a3a7665633a3a5665633c75383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839653666323565383838303562306638454e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838653162663830323038623436323862464e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861656661353936643166623837656439474e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862616338653862656565356632616538484e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68663366396461396132336437353666354999013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383635343265656636313566636131354a513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68356130336335333262653737623464394b513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68383163363735636233376362643435384c513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68636637353230666433393733623732394d3373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a68613032373064313462303632633031664e2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68643935376630653162613762346162644f6c3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683530626630633838373135643038613150723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683432346533633966643965353666383051753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836303438386636313863323464616261525d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830363032666566393830393762343861535e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683366333530343539333033356663666354633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683038643361663639353837313639653555443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a686566323037386633376634356236613156303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838306262653634343531326431353032572d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68626563663738613764313663316663655829636f72653a3a70616e69636b696e673a3a70616e69633a3a683861643532323536383465376335666159643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68646262326435373236386334653436375a303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306663393031333831336461313064325b3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68383831313733353133393938363536355c3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68663565393639663138373231616135665d367061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68633433653166343632633166303232365e4473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a68393961636662653066623534346133385f4e73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3a3a636f6e766572745f66697273743a3a6864663130346139623139623564343238607a3c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a7b7b636c6f737572657d7d3a3a686464386166653364373833613466363561bc017375627374726174655f7072696d6974697665733a3a6f6666636861696e3a3a5f494d504c5f454e434f44455f464f525f4f70617175654e6574776f726b53746174653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a6f6666636861696e3a3a4f70617175654e6574776f726b53746174653e3a3a656e636f64655f746f3a3a683864653337646339656532636163646662593c73726d6c5f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732073726d6c5f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a683765333337393936323566663435303863663c73726d6c5f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732073726d6c5f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6864363435393936323564393661643362647d3c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68613365643138333131633165303431656589013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68643532333765626565386262646162346689013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68373830316462666232383639633365396782013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68613836663537336437383362323836346884013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68326132393766353731373666386361326984013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68356466383631343361653432386562366a84013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68386132303764613038646361303032386b85013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68393631313338353961323437343534396c87013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68663338646437666630316265323433666d86013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68653238626430613136333234663737636e85013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a68633235333030353435363561303231616f8f013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68373239396531613762306235393139397084013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a68386230343966393830626561396630347181013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6863356634376663366532666365326363728b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6839366164373461323632303534303837738a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6864363536323266343863303236666239748a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a6866623732393936366436646236353066758b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a68633864333539353230333061333532307690013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6865346536313364303366316231626364778c013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a68353239636230386335303534313937367885013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6836623535393535386661346339653736798a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f626c6f636b5f6e756d6265723a3a68316365326162663363373165346338657a3273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a68356134386464313632363132383634357b4573726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a68366565343861623838353831666630307c135f5f727573745f616c6c6f635f7a65726f65647da7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a68343530373665613734316439633232317e643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68303930356635623465623032383638317f34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68666661376637663531656636613535368001303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68303333356131383037343065326233648101303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68613432353462303530376636356239388201313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834336239616334336136363337613934830189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a686433613133633364616236393537616384013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a686261616264646563653365626462363885018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a683563616137313734316335333937353386013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a683464373234623632323533336661633887017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a686465373063346364396166633432623988014073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a686433643562663333343338323266626289013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a68373837306238356533356562373234328a013873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a68653364393136363537613365336232368b013673726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6b696c6c5f73746173683a3a68363338323138363461313337653137398c01453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a68393061613361653732633833656639338d01d5013c73726d6c5f73657373696f6e3a3a4e6578744b6579733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a67656e657261746f723a3a53746f72616765446f75626c654d61703c616c6c6f633a3a7665633a3a5665633c75383e2c3c542061732073726d6c5f73657373696f6e3a3a54726169743e3a3a56616c696461746f7249642c3c542061732073726d6c5f73657373696f6e3a3a54726169743e3a3a4b6579733e3e3a3a6b65795f666f723a3a68316239363465623039623463346132308e013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68633766633938653035376633333530628f01cf013c73726d6c5f73657373696f6e3a3a4b65794f776e65723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a67656e657261746f723a3a53746f72616765446f75626c654d61703c616c6c6f633a3a7665633a3a5665633c75383e2c287533322c20616c6c6f633a3a7665633a3a5665633c75383e292c3c542061732073726d6c5f73657373696f6e3a3a54726169743e3a3a56616c696461746f7249643e3e3a3a6b65795f666f723a3a6832353734656439663437656665366662900181013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a683765636562373662383465393430366691018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a683935333330336237353137646136643992013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a683038396261373831343933393664343293013473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a683864613465376434306434633132323094013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6862343536656135666434613534336564950186013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68376534653632323434633361613564659601653c73726d6c5f62616c616e6365733a3a54616b65466565733c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a683137353630656536396263363164333797014b73725f7072696d6974697665733a3a7472616974733a3a4163636f756e744964436f6e76657273696f6e3a3a696e746f5f6163636f756e743a3a686437643561323437653936343338323398013573726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a683339353630386434306535366633363899013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a68386630396366306366633562363166329a013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a68366338316362376438353434333664639b016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744672656542616c616e63653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68363634653735366135323539653534659c014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a68373633383762663065306136613933399d014873726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68363163646335643166613233316130619e01593c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f72616765446f75626c654d61703c4b312c4b322c563e3e3a3a72656d6f76655f7072656669783a3a68666332656331616339616533373238659f018e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6836343734656565626631616462323833a0014273726d6c5f636f6e7472616374733a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6838393064333938626561646466353532a101483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6864373666326632313961373465366630a2012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6837613261353064316536613633333539a3013c73726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835326137393065313637653833353630a4013e73726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837653761323665343030333039643361a5014773726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863393961633631393662646166633363a6018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6836663666396631663235363035646265a701483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6839643635656336376635656131633538a80189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6831376262623835373466386234353634a90149636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a6863623838333863316264623130623561aa012f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a6839663433396331306235306661323566ab0135636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a6838303465663539383063333530396330ac018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6832666663656134306236326365313862ad018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6835303762386634643561356339336231ae014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835353135623762323533613661313033af014e73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863353237363563363832333466303030b0019c013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a57696e646f7753697a6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865326138353762393238303937326531b101493c73726d6c5f696d5f6f6e6c696e653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643964303130633531373464376137b201c6013c73726d6c5f696d5f6f6e6c696e653a3a5265636569766564486561727462656174733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a67656e657261746f723a3a53746f72616765446f75626c654d61703c7533322c3c542061732073726d6c5f696d5f6f6e6c696e653a3a54726169743e3a3a417574686f7269747949642c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a6b65795f666f723a3a6839666162343066636163363438666538b3013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835636338646430373363316466383730b4018c013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6862353162313535666137343830656531b5013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6835636365313535316465373165343638b6014073726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6832373433366465363333363863636664b7013873726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a6865376465623636613036333563346364b8013a73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a6862356366623966646431326362343134b901ab023c73726d6c5f656c656374696f6e733a3a566f746572496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f656c656374696f6e733a3a566f746572496e666f3c3c3c542061732073726d6c5f656c656374696f6e733a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a6831326661383262363539366434343230ba018e013c73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6368616e67655f6d656d626572733a3a6863656133623466363866353031346137bb013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837366535353966323933386565373462bc01bc013c73726d6c5f656c656374696f6e733a3a566f746572733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3e3a3a6765743a3a6831656136663334656630636666373762bd013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832386162326161326664313362653432be013e73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838396534323930613036383532316361bf01713c73726d6c5f656c656374696f6e733a3a5f5f4765744279746553747275637443616e646964617465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834353035376464383562306231303133c0014773726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6836393765613834396437376665333936c10199013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a564f5445525f5345545f53495a4544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839666233326632353861666432393464c20197013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e67506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864323236346132656331623566666433c3019e013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a496e6163746976654772616365506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834343861363466376433346165346563c40195013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4361727279436f756e7444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833323038376632623932366330353438c50194013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e6746656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862666235346331666336643035383166c60195013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e67426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835396333333633306664303535383639c70198013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616e646964616379426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835306436353364353736306636663333c801493c73726d6c5f656c656374696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862313838373164656434333234353339c9015d3c73726d6c5f656c656374696f6e733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6865623237373936363537376332616332ca01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6831666533363132333331313638633334cb013e73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a6831623765636666336534616135336566cc013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6866613936323364346331613731636561cd013a73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a6839646330343430376563653138376565ce01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834346562313437633932326265303632cf01793c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6832663762353865313534386536353861d001793c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6866343935363530383330653161313765d1017b3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6866643430616431306566633961633266d2017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6863303037346238366565616666666133d30180013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6864393037393837623738363764356263d401743c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6865636138346635343737616165636630d501723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832666162346632393762633738393362d601613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833343835613264643835383431636332d701723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839656363306337636437383038323737d801483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6837363131623933613539323766346231d901613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6863646339396163383037623662316336da014d73726d6c5f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832386263643136653763303735623063db013173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6835626633356265346662393261616566dc0127636f72653a3a7374723a3a66726f6d5f757466383a3a6830386430613533636364333636383366dd017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6835303462306465336135333763313630de014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6838346466386135383335633337333363df0148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6830613564653661326333656633346165e0012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a6865616138303137356633383063613361e1014673726d6c5f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6861303336313832306535346562393361e2017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6832656534383537613666386661386334e3017f3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6865616365323935303530343734363264e40181013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6839626533333032656563316461643338e50184013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6837666339623464643564653636666165e601783c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6838356631373164656563363033336438e701367061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6865366538646366383963393164383733e8013a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835313661376532386333333139343162e9013c73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6835396665663231653832316339333063ea01663c73726d6c5f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837636539336431333136393762366139eb014173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6861393365353238393933316362383966ec013b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864316463633936373665393831316535ed013d73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862653963626362376434633964363963ee014673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6835333132373733363164353661346664ef018e013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4275726e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836306564613365323036363061346138f00195013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5370656e64506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863623665323938376635303361653937f10196013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f706f73616c426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834633263343366353835343865633133f2013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6837353937346665653933353466353965f3013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837626461616565326462313031336137f4014f73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6833383666633233353830333065353239f5015c3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6835303363326164363635633065383333f6013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6832633035326438376533663134326634f70130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6834353035636165666339373038373732f801633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830353463613161343333316134343562f901683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a6835346530646462616330383561633239fa013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6831623935356631303935383134306330fb01693c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862303434633932643539306564396465fc01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6839623462643566353137353466323766fd014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6838633162393638623437653339643037fe01aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6838663038613532313138663338346335ff013a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683834376431616439393133353538633780023c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683434313938383563633762383063623781024573726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6831653962326534666561326361353039820299013c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a44454455505f4b45595f50524546495844656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686639643163336137393264633134353083028c013c73726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a54776f783634436f6e6361742061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654861736865723e3a3a686173683a3a683164626261313264323064653436316184023973726d6c5f636f6e7472616374733a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a683264643638373532626636626134376585024273726d6c5f636f6e7472616374733a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a68306335343562343937666534366438628602a5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a68666538656361633632383338353936328702b3013c73726d6c5f73797374656d3a3a426c6f636b486173683c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173683e3e3a3a6765743a3a68343431663362346533343335343861358802cf017375627374726174655f636f6e73656e7375735f626162655f7072696d6974697665733a3a6469676573743a3a5f494d504c5f4445434f44455f464f525f526177426162655072654469676573743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f636f6e73656e7375735f626162655f7072696d6974697665733a3a6469676573743a3a526177426162655072654469676573743e3a3a6465636f64653a3a683037313535396534633038343031363689023573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a68393666656334636533303439306538668a023673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a68366231633530646430346231333463628b02673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a68323233383038663965353761356432338c023273726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a626f6e6465643a3a68386434613934326262666536326333618d02c9023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68373038356335343662636132396435658e026f3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68393162623365343663353534323132398f02800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a68653736633238363934363832396632309002840173726d6c5f636f6c6c6563746976653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a6465636f64653a3a68653231663834313361313066313634669102800173726d6c5f636f6e7472616374733a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e7472616374733a3a43616c6c3c543e3e3a3a6465636f64653a3a68366163336136623765636339306135359202870173726d6c5f636f6c6c6563746976653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a656e636f64655f746f3a3a68323335653561653030363565396561349302880173726d6c5f636f6e7472616374733a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e7472616374733a3a5363686564756c653e3a3a656e636f64655f746f3a3a686562633839646631373665653164653894022b616c6c6f633a3a736c6963653a3a6d657267655f736f72743a3a68313463626638636433356132306266319502443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68363865366439316135393139346230319602463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68386266663463613331373663343263639702443c73726d6c5f626162653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68663664393738646663633837376133659802473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68313663623861346338646234313334349902473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68373666633963373334666261336461359a02493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68303431353366306437383936366461329b024c3c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68326666376631336164376163353738649c02493c73726d6c5f636f6e7472616374733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68333135656332616632303137313131659d027e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a68643763656231616366303439653433329e029c0173726d6c5f636f6c6c6563746976653a3a5f494d504c5f454e434f44455f464f525f5261774576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6c6c6563746976653a3a5261774576656e743c486173682c4163636f756e7449642c493e3e3a3a656e636f64655f746f3a3a68386634353235316432393239363762389f023e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6830386133316462373566343330376236a002406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6864613235613331643933323561306635a102416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6830646162326362666463313439353061a202426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6838323134323562646137346134663963a302416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6839613264663133306238666132323335a402416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6831656130653737366464353437353263a502436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6864303336633430386134353234373864a6024e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6c6c6563746976655f496e7374616e6365313a3a6832396437623861636430646431663531a702436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f656c656374696f6e733a3a6864316262316639616565353031323836a802416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6839363135363934636266656563346462a902426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6866326661643637386264666634373730aa02436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e7472616374733a3a6865636666393337666661353935366132ab02436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696d5f6f6e6c696e653a3a6865396637336636353965323164343131ac02653c6e6f64655f72756e74696d653a3a43616c6c2061732073725f7072696d6974697665733a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6865366434613766316565633561663865ad02583c6e6f64655f72756e74696d653a3a43616c6c2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6862353331636238353865323938363930ae02583c73726d6c5f626162653a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6863353536316237633731306632633539af025e3c73726d6c5f617574686f72736869703a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6832646632666438336632656164396338b0025b3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6862376666346265626463386465616132b1025b3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6832303035636562333032366431636664b2025d3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6838656636323030356664393836613861b302603c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6863366537316138333437616237393437b402603c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6863623464333939326163376432636533b5025d3c73726d6c5f636f6e7472616374733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6835356337656461323135336366373732b6023973726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865366235396363376330656539613636b7023773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833366437346636343139653935303735b802613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830653237323634646338323863393962b9027173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a6830343433383838616235343662356438ba023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832613339366565346635393436316338bb0286013c28412c20422c20432c20442c20452c20462c20472c20482c20492c204a2c204b2c204c2c204d2c204e2c204f2c20502c2051292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6862643866356436373132643933333864bc027973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6837666661346335666566636666356439bd020c436f72655f76657273696f6ebe0212436f72655f657865637574655f626c6f636bbf024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6861343833323533633862386230396162c0026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a6835613864386165636232643332343062c1023873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6862306162646235623134643465353630c20282013c28412c20422c20432c20442c20452c20462c20472c20482c20492c204a2c204b2c204c2c204d2c204e2c204f2c20502c2051292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6834613038313634316331363332643861c3023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6863353864366166643031653665613764c40215436f72655f696e697469616c697a655f626c6f636bc502114d657461646174615f6d65746164617461c602603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862313136333934333262366238323036c702433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865326333656130663331616664363434c802623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865383930373662353839373366393932c902623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6831326337313436376537633230336666ca02623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6866356463356164333636313531353030cb02623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6835623233303931303264376564333539cc021c426c6f636b4275696c6465725f6170706c795f65787472696e736963cd021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bce0220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373cf023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6861663838366238613533323434616164d0021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473d10218426c6f636b4275696c6465725f72616e646f6d5f73656564d2022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6ed3025673725f7072696d6974697665733a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a6831333237373835313963356563373134d402214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572d502214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765d602204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765d7021e4772616e6470614170695f6772616e6470615f617574686f726974696573d80214426162654170695f737461727475705f64617461d9020d426162654170695f65706f6368da0218436f6e73656e7375734170695f617574686f726974696573db023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830626630326362356431343231643563dc023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833326332313137616131313964646462dd02be0173726d6c5f636f6e7472616374733a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e7472616374733a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6830333031396235396230633565303563de023c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835653738313263326535383766336138df023e73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6832653332306130366534306263373333e00230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830303138366630366366636233393965e1026b3c73726d6c5f636f6e7472616374733a3a5f5f4765744279746553747275637447617350726963653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831323937653934626234623331393138e202713c73726d6c5f636f6e7472616374733a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831356663633937373139383066663961e302723c73726d6c5f636f6e7472616374733a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830373336343365316532386638386636e4024773726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6830303134653761653838393666656431e50298013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b4761734c696d697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836323933353364633134333962386431e60297013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d617856616c756553697a6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831363531353935303832653862363433e70293013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178446570746844656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833633730323537643734663966303434e80296013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616c6c4261736546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837643534633062333230353030386132e90296013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a436f6e747261637446656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831383738366232346535343339303562ea029d013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864323130333138383966623833626166eb029a013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53757263686172676552657761726444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839643636363739303462633066303161ec029c013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a52656e744465706f7369744f666673657444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837303438303530373033373134653739ed0296013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a52656e744279746546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839653032303039643933303461333136ee029c013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53746f7261676553697a654f666673657444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836653631633863663736303163666534ef029b013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a546f6d6273746f6e654465706f73697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839376335613137306432663734346430f0029e013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5369676e6564436c61696d48616e646963617044656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833326135613063303533336232346537f102850173726d6c5f636f6e7472616374733a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e7472616374733a3a5363686564756c653e3a3a6465636f64653a3a6831383266623166313336663762316166f202cc013c73726d6c5f636f6c6c6563746976653a3a566f74696e673c542c493e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f6c6c6563746976653a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6837643339613135396634613638326239f3028c0173726d6c5f636f6c6c6563746976653a3a5f494d504c5f4445434f44455f464f525f566f7465733a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6c6c6563746976653a3a566f7465733c4163636f756e7449643e3e3a3a6465636f64653a3a6832643432393434303730333636636233f4023f73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6835323366313938366530646630643836f5024173726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6832653365636438323863383739393535f6024173726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6837336431363862656265313532663737f702463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643762653937613330343763653735f8023973726d6c5f636f6e7472616374733a3a6761733a3a726566756e645f756e757365645f6761733a3a6838313866393632316339316230343537f90234636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6831303365623135656535646564646531fa023873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6830383262663632343263306632623461fb02cc013c73726d6c5f636f6c6c6563746976653a3a566f74696e673c542c493e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f6c6c6563746976653a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6861656437373063336565313436653663fc026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6861643334666633636666366665316235fd023c73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862336662666537393032306265393735fe02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834386165363866363430643637633930ff024573726d6c5f636f6e7472616374733a3a7761736d3a3a707265706172653a3a436f6e74726163744d6f64756c653a3a6e65773a3a68373437356366353665323338356534318003467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6833326461336131663335633534626538810348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a683637346166653166306130323465343082033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a68336630636663326637346565656337618303537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a68383163333338666361303832363762378403a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a686664643761346163616662643161303785033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a686633303131633431356339376365353886032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a68363636643938316464366132376430638703507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6862613763333530303062636130303664880330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683932363665303964363138393234383089033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a68333739383539653330333963393636388a036b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68623164636337303363343663623964638b033c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68623635383930326631373535393638638c033e73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68663835666539373737653832616264358d03703c73726d6c5f617574686f72736869703a3a5f5f47657442797465537472756374446964536574556e636c65733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68343130303364663439323339376665318e034773726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68333034663035323735396230316264348f0398013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686239363539613438323161636661376490033d73726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683130663030303861393865653633333791033f73726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68663765613765666566616631393237359203423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68663965633961656539353233393630339303f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68663836376561643438393337303834339403b20173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a6465636f64653a3a686566626161663766313061613930656195036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a683136363036366137303432666462353096034a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6164645f7265776172645f706f696e74735f746f5f76616c696461746f723a3a683735656331323130653264613130363497033673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a686133343062373339343239343636396698038d0173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6831383165303465376138323761633563990330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68396130643239356566333862333764399a033973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68626338333337653864313264346236349b033b73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68386563303065326165306565653331659c03693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68356632616561336465623162303632369d036e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68613438386465323261623362626564359e034473726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68303539396532356662316566326537339f033873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6837356266613036323466393030326231a0035373725f7072696d6974697665733a3a50657262696c6c3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a7b7b636c6f737572657d7d3a3a6837346130386235616561303662323764a1035373725f7072696d6974697665733a3a50657262696c6c3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a7b7b636c6f737572657d7d3a3a6865383661363338393838616435346161a2033173726d6c5f636f6e7472616374733a3a657865633a3a7472616e736665723a3a6862663830353466313834383466353839a30330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6861666139633866303530303439646130a40386013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a6832613234666264303663303234333532a5033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a6833356531373132666666373466393063a6033b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6863383234336161666464663737653334a7033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6838313864663962306133383239316334a803a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6834613163653538373963373732656365a9033573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6861366663323631343066353861643433aa033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a6866636666623734373361373837333534ab033e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6836633962383630386238383461313433ac03ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6839623362646538623237313239353830ad0380023c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830376136373464663562323934383331ae03d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6833316131666565343761333837613666af036f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6865656561636265623434343731336162b0033973726d6c5f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6831613733373937373165363531313763b103683c73726d6c5f626162653a3a5f5f4765744279746553747275637452616e646f6d6e6573733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830313132633334653937373838386530b2034273726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864653837393762623036323933663036b30397013c73726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837636434663762376361666466653533b40393013c73726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861633339313932336630646561303562b5033f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a6864336565376466366531343632366162b6033873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6837626664333464323134343062343535b7033c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839623865373439303362613166616237b8033e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6866646263633263346636383265306163b9036f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836376437386435646631303632323731ba036e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834323930336365663137353532346361bb03703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835646562366164353830366265346539bc034773726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6865333836303831323234393138383538bd0398013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a436f6f6c6f6666506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830623839323664386236623263313030be03a0013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456d657267656e6379566f74696e67506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864643936336531386630643539383861bf0399013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d4465706f73697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839633266363034646662653561616232c00397013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4c61756e6368506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837393135616137323139326261653861c103443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836386536643931613539313934623031c203483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835323464656336313866386533363731c303b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6831633631616464346133306331626537c4033573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6862373137353137303439343332326261c503ef013c73726d6c5f64656d6f63726163793a3a426c61636b6c6973743c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c20616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e293e3e3a3a6765743a3a6865393534653832303430646532383064c603b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6833393463653862336266643631386531c7033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6832623333333738623965336532616637c8033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6836386433646164383736643865623336c903483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6862633938373830303863333662653266ca03483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6837623837323939626164376666626165cb033a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831303835663934326165613066666435cc033c73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6831653964613665663737636163653537cd03723c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637443757272656e74457261526577617264733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864616431343838363463326230643566ce03703c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637443757272656e7445726153746172743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832353861326566303936323932613339cf03683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833393533663133633365306439616438d0036b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834303432353238653931353637613536d1036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835376230323932323131336530373366d203763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832393237623461376534303233303233d3039e0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6837393139373261393137633237353836d4034573726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6831326164313066663466363966303438d50398013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426f6e64696e674475726174696f6e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836366661303833353962306264623630d6033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6836633933613435616433323637343635d70344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a6832663966333337663331346430346261d8033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6835323066333937386264646232376661d90330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832383162643565356463633363633865da033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6862653062383765616639383834363763db0334636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a6836316630353339376265346165306436dc032e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a6865656163363335353030636638613332dd033c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a6861386333323331343935333633336265de03683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832326536303831316239376361613731df036b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6833313464396364336663323362303032e0037d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6838343235363463313864343366306565e1036f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6834653832343164633166393264306465e2036f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831366430333464363864636137656264e3036c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6830336336396535656266353063313036e4036f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6862626263366232363139386264373031e503443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839313834613132386161616566393339e60325616c6c6f633a3a666d743a3a666f726d61743a3a6830316632616438366163393537313166e703793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6863326538613330646462656461613462e8036b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832306434326237363961666331303963e9032c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6861366438393436643533653864653566ea03713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6830313964323733313537306237653565eb03783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6866313935616364666237303034356435ec037c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6862376632633030343763366262323131ed0382017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a73657269616c697a653a3a6863303933363734393566363861636234ee0386017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6836326535643235666332313139663161ef03323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835353664376238663535366263363963f003743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6839666632356462616530336539636139f103713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6866386261353830386362663033336237f2036f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6831383061393939346363313364656166f303457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6833343661393063316433323836303565f4034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6838636363623736663163326366313235f503397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6834616434666439623033616666656132f603347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6833376565666538356536656134653533f703553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837663965313062313761383235343565f8034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6834383364653935633161363461363563f903473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832643737393163616533616639343330fa03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839343166666162333261613238643834fb03416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6839316131643832316165666561623462fc033e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6866376632653563623862643162646665fd03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6866646634393463363530663965333032fe0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836636266366564636435643764353661ff033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a68656134643838343239623565386631648004347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a68333962623464666565633865336163668104347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a68306265623663623063666264383362368204407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a68303962316539316364663361323835638304543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68353262373862613035393164313065378404537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a68643631653439363063383835366639338504547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a68366264383738653965643435643134308604557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a68656263623265346236356235623331398704547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a68313065643039346235616632313966358804537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a68633437663530396438376362323431338904547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a68623338343266346139323966303364388a04547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a68613836306461386336626537623066638b04553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68626334663039353163653636626333668c0439636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68386332653034306164313637313634348d0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68383833663961613434376433663434308e04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306562333530386131623964616565388f04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68656636633035343338663334333237369004453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830656338366664346535303535646566910423636f72653a3a666d743a3a77726974653a3a683263633535663738336132376161303292044c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68376434363565363939343931383362339304553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68343430663131396233306364383366329404303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683438373734633565333934323833323495043a636f72653a3a666d743a3a6275696c646572733a3a44656275675374727563743a3a6669656c643a3a6866326565303137626435353664666261960441707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a686535663861303461646332383866313297045a3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a4672616d6520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835626662636630363963393830393335980446707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a68646534363765613166633434376439399904453c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68623165623465333239306362663264349a044b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a68393230303336623534326131353238309b043f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a68336130383337643331383738633936629c0433636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a68373433326438386565653331353766649d04533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a68643630376234663532626135343434669e04323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68643466343861626239346363326466629f04613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831326332376662386135316161323330a004303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830376435323632303134396236393730a10430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830383334383934613965313131343030a204303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838393930636134353936346432353538a304303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864303639363464626265306635333034a404463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833363230363132373936373366363831a504303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837666638363233383562363432343436a604303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838306664323863366234313432386138a704303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862333333346337346662323765343063a804383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a6862356632376432643432633533313963a904343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a6864333732633038613461626365636263aa04363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a6835653133333330613631633430366531ab0411727573745f626567696e5f756e77696e64ac044e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6863343839343937333162663664613538ad04423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864646337663435393064333731386164ae04960173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f72616765456e747279547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f72616765456e747279547970653e3a3a656e636f64655f746f3a3a6861633536353632656363626263383462af04623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834626364303631653731303631316333b004623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6833646134366334313938313066326233b1040a5f5f72675f616c6c6f63b2040c5f5f72675f6465616c6c6f63b3040c5f5f72675f7265616c6c6f63b404115f5f72675f616c6c6f635f7a65726f6564b5043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839386630383364646366336530643539b6043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6861623731346430333235303038653933b7043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6838356462616235393333346166386562b804313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6838373362326233636138386434383161b90443636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6866353332373965323066353236636366ba042e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6865653139323635326330646133653662bb044a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831353934666636313964313766353962bc04323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837663466306566323134623135303866bd043d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6833333765663538373237613238613566be044e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68636238383338633162646231306235612e32343337bf0434636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6834343432343361643936333761656136c004453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839663861393035663061343166626565c104483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833623163616232626333636335643662c204303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837306365383064366362336331373736c3042e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6834653434386337323966353035343930c4048001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6865376338616134366434653933636435c504533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6831303966653662636331366463343332c60430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6863616233653737643232336562623862c7042f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6866353335666333343735643839373963c8042e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6838396132343964633663626538643835c9043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839643838613837643735393063376538ca043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6863626539656365346539623261666163cb043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6836383566373362343736636232376133cc043e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863616638613466613733323737393335cd04066d656d736574ce04066d656d637079cf04076d656d6d6f7665d004066d656d636d70d104095f5f6173686c746933d204095f5f6c736872746933d304085f5f6d756c746933d404095f5f75646976746933d504095f5f756d6f64746933d6040c5f5f756469766d6f64746934005f0970726f64756365727302086c616e677561676502045275737400045275737404323031380c70726f6365737365642d62790105727573746325312e33382e302d6e696768746c79202863373938646666616320323031392d30372d323729", "0x3ae31af9a378162eb2736f26855c9ad8": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", - "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", "0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000", - "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", - "0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000400000000000100100000000020000000", - "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", - "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", - "0x3229a363ad5159bc2c48c9558128f00d2646f3a058cadf32077e9c9d9cca483f": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", - "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", - "0xd8bc278604e9f924a948f47f58be8f89": "0x04000000000000000000000000000000", - "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", - "0xfa8e9950d581fc080f26110dde7c7fd8": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993327932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4403919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", - "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", - "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", - "0x5e0766c2f9e49ff3d748bdbde578a8fd": "0x0080f420e6b500000000000000000000", - "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", - "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", - "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", - "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", - "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", - "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", - "0xe7ea0ae62a742dc4e1a569cdb99af499": "0x0200000000000000", - "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", - "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", - "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000", - "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", - "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", - "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", - "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", - "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", - "0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000", - "0x579ab55d37b1220812be3c3df29d4858": "0x00000000", "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", - "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", - "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", - "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", - "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", - "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0x6c7945a333fd28e51af43324746da2a45fd6a74613dcd61c6430fee856b550f8": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", - "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", - "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", - "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", - "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", - "0x637414312dac3b280120bf15b4f66cee": "0x00000000", - "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", - "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", - "0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000", - "0x4517a8f9aafb0668d19c3cef51a8367afeda7eb83c7edcc4752585e5a496935e": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x90e2849b965314409e8bc00011f3004f": "0x04000000", + "0xeecb67c20ca6cc8ba4d4434687f61309": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe969933201000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000003919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", "0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809", - "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", - "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", + "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973f409469434914add1f77b486e5d845d79fb97e50667a4fd4066fc59fc02b72ff": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x637414312dac3b280120bf15b4f66cee": "0x00000000", + "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", + "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", + "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", + "0x77eef9fb1f954bfb3bbe274f703f6d00": "0x00000000", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973424b9d3c8374bdf058222242204c46ade91b3190a50218823d53e9814b9557f0": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x8cb577756012d928f17362e0741f9f2c": "0x0100000000000000", + "0x775f52f99da6e72a0984c26ae28fbfcd": "0x0000000000000000", + "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300", + "0x3a686561707061676573": "0x0800000000000000", "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0xe18ad90fcd74459141a97efeed86f463": "0x08000000", - "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", + "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", + "0x886726f904d8372fdabb7707870c2fad": "0x106e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f91060100000000000000482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e0100000000000000482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a010000000000000000299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f43780100000000000000", "0xa8e78ad25e03ac0281ec709fd3f128efb7e112239d0a7c3e1c86375109bff334": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", - "0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", - "0x8cb577756012d928f17362e0741f9f2c": "0x0100000000000000", - "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", - "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", - "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", - "0xbd393c7a86c2574659297d84a8c369613134cd3b80b8b92f816e3ff845991bf4": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993329becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", - "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", - "0x90e2849b965314409e8bc00011f3004f": "0x04000000", - "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300" + "0xc1bc13c775b3406279618b05c28523cb": "0x00", + "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", + "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", + "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", + "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", + "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", + "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b6579732a2afb49dfe38fc8b2b25f22f4b0d6acccac7d6d1b5fa7cd3852ad4dfabbcb6f": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b657973711590f60a214f6f06502eb29dd14f55aa04e72e2fa12c098ba4fa5a00c57fa9": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e", + "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", + "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0xf7327f83450f4e54b29a411237312742": "0x00", + "0x7e6064dc0e78ffebb59b3053826a9467": "0x109c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x717a2ee9c64ad3424e10e4461ec08296": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000008700000000000000af0000000000000001000000000000000100000000000000040000000000010010000000004000000020000000", + "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", + "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663" } } } diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index d2fd0cfbc5..6372146a45 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -61,8 +61,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), - // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC - hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), + // 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8 + hex!["6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), ),( @@ -70,8 +70,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), - // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE - hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), + // 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ + hex!["482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), ),( @@ -79,8 +79,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), - // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d - hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), + // 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH + hex!["482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), ),( @@ -88,8 +88,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), - // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 - hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), + // 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x + hex!["00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), )]; -- GitLab From fb28e11573f013adb3dc34bfadd796f9d081166b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 30 Jul 2019 23:46:05 +0200 Subject: [PATCH 067/151] Update schnorrkel to `0.7.0` (#3261) * Update schnorrkel to `0.7.0` * Apply suggestions from code review Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * Increase `spec_version` --- Cargo.lock | 27 +++++++--------- core/consensus/babe/Cargo.toml | 2 +- core/consensus/babe/primitives/Cargo.toml | 2 +- core/consensus/babe/src/lib.rs | 2 +- core/primitives/Cargo.toml | 4 +-- core/primitives/src/crypto.rs | 3 +- core/primitives/src/sr25519.rs | 39 +++++++++++++---------- node/runtime/src/lib.rs | 4 +-- subkey/Cargo.toml | 4 +-- 9 files changed, 46 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 191b308754..b657b5d699 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3261,19 +3261,16 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.1.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4138,11 +4135,11 @@ dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "srml-balances 2.0.0", "srml-system 2.0.0", - "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4176,12 +4173,12 @@ dependencies = [ [[package]] name = "substrate-bip39" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4334,7 +4331,7 @@ dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -4360,7 +4357,7 @@ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4663,11 +4660,11 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-serializer 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6241,7 +6238,7 @@ dependencies = [ "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" -"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" +"checksum schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a115d35c9d693bbea4c2b30132cd218c1af3e1adbc1b650855f8b816c81a3bc0" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" @@ -6280,7 +6277,7 @@ dependencies = [ "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d69ace596e9ca97837cc41f8edcfc4e0a997f227d5fc153d1010b60a0fe9acda" +"checksum substrate-bip39 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03c1026336961c7ad6d2777e649e0a8cc5db4fdfb84b317198a505ebfc552def" "checksum substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f52ecbff6cc3d6e5c6401828e15937b680f459d6803ce238f01fe615bc40d071" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 331c85dda8..367be4ce5a 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -28,7 +28,7 @@ futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" parking_lot = "0.8.0" log = "0.4.6" -schnorrkel = "0.1.1" +schnorrkel = "0.7.0" rand = "0.6.5" merlin = "1.0.3" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 2c6ba886f4..9122b48d9c 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -12,7 +12,7 @@ sr-primitives = { path = "../../../sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } parity-codec = { version = "4.1.1", default-features = false } -schnorrkel = { version = "0.1.1", optional = true } +schnorrkel = { version = "0.7.0", optional = true } [features] default = ["std"] diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index fae6fb3c32..d816c874a5 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -837,7 +837,7 @@ fn claim_slot( let threshold = calculate_threshold(c, authorities, authority_index); get_keypair(key) - .vrf_sign_n_check(transcript, |inout| check(inout, threshold)) + .vrf_sign_after_check(transcript, |inout| check(inout, threshold)) .map(|s|(s, authority_index)) } diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index fc18251f40..40bad62e41 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -19,10 +19,10 @@ hash256-std-hasher = { version = "0.14.0", default-features = false } ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } -schnorrkel = { version = "0.1.1", optional = true } +schnorrkel = { version = "0.7.0", optional = true } rand = { version = "0.6", optional = true } sha2 = { version = "0.8", optional = true } -substrate-bip39 = { version = "0.2.2", optional = true } +substrate-bip39 = { version = "0.3", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } regex = { version = "1.1", optional = true } diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 327a8a3eb1..dd40db0e21 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -38,7 +38,7 @@ use zeroize::Zeroize; pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; /// The address of the associated root phrase for our publicly known keys. -pub const DEV_ADDRESS: &str = "5DfhGyQdFobKM8NsWvEeAKk5EQQgYe9AydgJ7rMB6E1EqRzV"; +pub const DEV_ADDRESS: &str = "5H3ZzXYeCi95F7FUfMWdCVMoaXMbcWgi3E98TqcS18fZ3vn3"; /// The infallible type. #[derive(Debug)] @@ -400,6 +400,7 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { // Invalid checksum. return Err(PublicError::InvalidChecksum); } + res.as_mut().copy_from_slice(&d[1..len+1]); Ok((res, ver)) } diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index e01d989143..b862b4623c 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -56,7 +56,7 @@ pub struct Pair(Keypair); impl Clone for Pair { fn clone(&self) -> Self { Pair(schnorrkel::Keypair { - public: self.0.public.clone(), + public: self.0.public, secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..]) .expect("key is always the correct size; qed") }) @@ -112,14 +112,14 @@ impl UncheckedFrom for Public { } #[cfg(feature = "std")] -impl ::std::fmt::Display for Public { +impl std::fmt::Display for Public { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "{}", self.to_ss58check()) } } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Public { +impl std::fmt::Debug for Public { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) @@ -142,7 +142,7 @@ impl<'de> Deserialize<'de> for Public { } #[cfg(feature = "std")] -impl ::std::hash::Hash for Public { +impl std::hash::Hash for Public { fn hash(&self, state: &mut H) { self.0.hash(state); } @@ -170,7 +170,7 @@ impl Default for Signature { impl PartialEq for Signature { fn eq(&self, b: &Self) -> bool { - &self.0[..] == &b.0[..] + self.0[..] == b.0[..] } } @@ -376,7 +376,7 @@ impl AsRef for Pair { /// Derive a single hard junction. #[cfg(feature = "std")] fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> SecretKey { - secret.hard_derive_mini_secret_key(Some(ChainCode(cc.clone())), b"").0.expand() + secret.hard_derive_mini_secret_key(Some(ChainCode(*cc)), b"").0.expand() } /// The raw secret seed, which can be used to recreate the `Pair`. @@ -475,15 +475,20 @@ impl TraitPair for Pair { } /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { + fn verify, M: AsRef<[u8]>>( + sig: &Self::Signature, + message: M, + pubkey: P + ) -> bool { let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(&sig.as_ref()) { Ok(some_signature) => some_signature, Err(_) => return false }; match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature - ), + signing_context(SIGNING_CTX).bytes(message.as_ref()), + &signature, + ).is_ok(), Err(_) => false, } } @@ -496,8 +501,9 @@ impl TraitPair for Pair { }; match PublicKey::from_bytes(pubkey.as_ref()) { Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature - ), + signing_context(SIGNING_CTX).bytes(message.as_ref()), + &signature, + ).is_ok(), Err(_) => false, } } @@ -570,7 +576,7 @@ mod test { ); assert_eq!( Pair::from_string("/Alice", None).unwrap().public(), - Public::from_string("/Alice").unwrap() + Public::from_string("/Alice").unwrap(), ); } @@ -624,10 +630,11 @@ mod test { "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let public = pair.public(); + assert_eq!( public, Public::from_raw(hex!( - "44a996beb1eef7bdcab976ab6d2ca26104834164ecf28fb375600576fcc6eb0f" + "dad55a57ecb21977bebe0cbf898c3e3f7572207209b097db369282a0ef9f7354" )) ); let message = b""; @@ -646,13 +653,13 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); + assert_eq!( public, Public::from_raw(hex!( - "741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63" + "46ba66b7d19b0be8050209efe63264519327386425bd3c719e2a8925dfc4b052" )) ); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); @@ -680,7 +687,7 @@ mod test { ); let public = pk.public(); let js_signature = Signature::from_raw( - hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00") + hex!("d2b776d10d3ba8ea160df887fe1ade3c2a5d38cef72ec1ae58eb9a75017d954f6eaefc2ad6f94e5831f4298f974c98da76075f280769ceaf8b86b89deb028682") ); assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index af1812f34d..5df15187f5 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,8 +79,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 123, - impl_version: 125, + spec_version: 124, + impl_version: 124, apis: RUNTIME_API_VERSIONS, }; diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 3e0079cedf..c763f3f4c3 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -13,8 +13,8 @@ rand = "0.6" clap = { version = "~2.32", features = ["yaml"] } tiny-bip39 = "0.6.0" rustc-hex = "2.0" -substrate-bip39 = "0.2.2" -schnorrkel = "0.1.1" +substrate-bip39 = "0.3" +schnorrkel = "0.7.0" hex = "0.3" hex-literal = "0.2" parity-codec = "4.1.1" -- GitLab From e5dbdf5a0436fd14643cc40fce12386b1772666a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 31 Jul 2019 00:19:32 +0200 Subject: [PATCH 068/151] Revert "Update schnorrkel to `0.7.0` (#3261)" (#3264) This reverts commit fb28e11573f013adb3dc34bfadd796f9d081166b. --- Cargo.lock | 27 +++++++++------- core/consensus/babe/Cargo.toml | 2 +- core/consensus/babe/primitives/Cargo.toml | 2 +- core/consensus/babe/src/lib.rs | 2 +- core/primitives/Cargo.toml | 4 +-- core/primitives/src/crypto.rs | 3 +- core/primitives/src/sr25519.rs | 39 ++++++++++------------- node/runtime/src/lib.rs | 4 +-- subkey/Cargo.toml | 4 +-- 9 files changed, 41 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b657b5d699..191b308754 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3261,16 +3261,19 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.7.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4135,11 +4138,11 @@ dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "srml-balances 2.0.0", "srml-system 2.0.0", - "substrate-bip39 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4173,12 +4176,12 @@ dependencies = [ [[package]] name = "substrate-bip39" -version = "0.3.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4331,7 +4334,7 @@ dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -4357,7 +4360,7 @@ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4660,11 +4663,11 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-serializer 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6238,7 +6241,7 @@ dependencies = [ "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" -"checksum schnorrkel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a115d35c9d693bbea4c2b30132cd218c1af3e1adbc1b650855f8b816c81a3bc0" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" @@ -6277,7 +6280,7 @@ dependencies = [ "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03c1026336961c7ad6d2777e649e0a8cc5db4fdfb84b317198a505ebfc552def" +"checksum substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d69ace596e9ca97837cc41f8edcfc4e0a997f227d5fc153d1010b60a0fe9acda" "checksum substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f52ecbff6cc3d6e5c6401828e15937b680f459d6803ce238f01fe615bc40d071" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 367be4ce5a..331c85dda8 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -28,7 +28,7 @@ futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" parking_lot = "0.8.0" log = "0.4.6" -schnorrkel = "0.7.0" +schnorrkel = "0.1.1" rand = "0.6.5" merlin = "1.0.3" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 9122b48d9c..2c6ba886f4 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -12,7 +12,7 @@ sr-primitives = { path = "../../../sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } parity-codec = { version = "4.1.1", default-features = false } -schnorrkel = { version = "0.7.0", optional = true } +schnorrkel = { version = "0.1.1", optional = true } [features] default = ["std"] diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index d816c874a5..fae6fb3c32 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -837,7 +837,7 @@ fn claim_slot( let threshold = calculate_threshold(c, authorities, authority_index); get_keypair(key) - .vrf_sign_after_check(transcript, |inout| check(inout, threshold)) + .vrf_sign_n_check(transcript, |inout| check(inout, threshold)) .map(|s|(s, authority_index)) } diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 40bad62e41..fc18251f40 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -19,10 +19,10 @@ hash256-std-hasher = { version = "0.14.0", default-features = false } ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } -schnorrkel = { version = "0.7.0", optional = true } +schnorrkel = { version = "0.1.1", optional = true } rand = { version = "0.6", optional = true } sha2 = { version = "0.8", optional = true } -substrate-bip39 = { version = "0.3", optional = true } +substrate-bip39 = { version = "0.2.2", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } regex = { version = "1.1", optional = true } diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index dd40db0e21..327a8a3eb1 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -38,7 +38,7 @@ use zeroize::Zeroize; pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; /// The address of the associated root phrase for our publicly known keys. -pub const DEV_ADDRESS: &str = "5H3ZzXYeCi95F7FUfMWdCVMoaXMbcWgi3E98TqcS18fZ3vn3"; +pub const DEV_ADDRESS: &str = "5DfhGyQdFobKM8NsWvEeAKk5EQQgYe9AydgJ7rMB6E1EqRzV"; /// The infallible type. #[derive(Debug)] @@ -400,7 +400,6 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { // Invalid checksum. return Err(PublicError::InvalidChecksum); } - res.as_mut().copy_from_slice(&d[1..len+1]); Ok((res, ver)) } diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index b862b4623c..e01d989143 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -56,7 +56,7 @@ pub struct Pair(Keypair); impl Clone for Pair { fn clone(&self) -> Self { Pair(schnorrkel::Keypair { - public: self.0.public, + public: self.0.public.clone(), secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..]) .expect("key is always the correct size; qed") }) @@ -112,14 +112,14 @@ impl UncheckedFrom for Public { } #[cfg(feature = "std")] -impl std::fmt::Display for Public { +impl ::std::fmt::Display for Public { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "{}", self.to_ss58check()) } } #[cfg(feature = "std")] -impl std::fmt::Debug for Public { +impl ::std::fmt::Debug for Public { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) @@ -142,7 +142,7 @@ impl<'de> Deserialize<'de> for Public { } #[cfg(feature = "std")] -impl std::hash::Hash for Public { +impl ::std::hash::Hash for Public { fn hash(&self, state: &mut H) { self.0.hash(state); } @@ -170,7 +170,7 @@ impl Default for Signature { impl PartialEq for Signature { fn eq(&self, b: &Self) -> bool { - self.0[..] == b.0[..] + &self.0[..] == &b.0[..] } } @@ -376,7 +376,7 @@ impl AsRef for Pair { /// Derive a single hard junction. #[cfg(feature = "std")] fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> SecretKey { - secret.hard_derive_mini_secret_key(Some(ChainCode(*cc)), b"").0.expand() + secret.hard_derive_mini_secret_key(Some(ChainCode(cc.clone())), b"").0.expand() } /// The raw secret seed, which can be used to recreate the `Pair`. @@ -475,20 +475,15 @@ impl TraitPair for Pair { } /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>( - sig: &Self::Signature, - message: M, - pubkey: P - ) -> bool { + fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(&sig.as_ref()) { Ok(some_signature) => some_signature, Err(_) => return false }; match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), - &signature, - ).is_ok(), + signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature + ), Err(_) => false, } } @@ -501,9 +496,8 @@ impl TraitPair for Pair { }; match PublicKey::from_bytes(pubkey.as_ref()) { Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), - &signature, - ).is_ok(), + signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature + ), Err(_) => false, } } @@ -576,7 +570,7 @@ mod test { ); assert_eq!( Pair::from_string("/Alice", None).unwrap().public(), - Public::from_string("/Alice").unwrap(), + Public::from_string("/Alice").unwrap() ); } @@ -630,11 +624,10 @@ mod test { "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let public = pair.public(); - assert_eq!( public, Public::from_raw(hex!( - "dad55a57ecb21977bebe0cbf898c3e3f7572207209b097db369282a0ef9f7354" + "44a996beb1eef7bdcab976ab6d2ca26104834164ecf28fb375600576fcc6eb0f" )) ); let message = b""; @@ -653,13 +646,13 @@ mod test { #[test] fn seeded_pair_should_work() { + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); - assert_eq!( public, Public::from_raw(hex!( - "46ba66b7d19b0be8050209efe63264519327386425bd3c719e2a8925dfc4b052" + "741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63" )) ); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); @@ -687,7 +680,7 @@ mod test { ); let public = pk.public(); let js_signature = Signature::from_raw( - hex!("d2b776d10d3ba8ea160df887fe1ade3c2a5d38cef72ec1ae58eb9a75017d954f6eaefc2ad6f94e5831f4298f974c98da76075f280769ceaf8b86b89deb028682") + hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00") ); assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 5df15187f5..af1812f34d 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,8 +79,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 124, - impl_version: 124, + spec_version: 123, + impl_version: 125, apis: RUNTIME_API_VERSIONS, }; diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index c763f3f4c3..3e0079cedf 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -13,8 +13,8 @@ rand = "0.6" clap = { version = "~2.32", features = ["yaml"] } tiny-bip39 = "0.6.0" rustc-hex = "2.0" -substrate-bip39 = "0.3" -schnorrkel = "0.7.0" +substrate-bip39 = "0.2.2" +schnorrkel = "0.1.1" hex = "0.3" hex-literal = "0.2" parity-codec = "4.1.1" -- GitLab From d60cdba50b3b51dd13a5b7a2c4346dcf8263ea3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 31 Jul 2019 09:58:06 +0200 Subject: [PATCH 069/151] Don't set `HEAP_PAGES` in `BasicExternalities` (#3244) * Don't set `HEAP_PAGES` in `BasicExternalities` * Fix test --- core/state-machine/src/basic.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index e922db260c..0ed2598060 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -22,8 +22,7 @@ use crate::backend::{Backend, InMemory}; use hash_db::Hasher; use trie::trie_root; use primitives::offchain; -use primitives::storage::well_known_keys::{HEAP_PAGES, is_child_storage_key}; -use parity_codec::Encode; +use primitives::storage::well_known_keys::is_child_storage_key; use super::{ChildStorageKey, Externalities}; use log::warn; @@ -42,10 +41,9 @@ impl BasicExternalities { /// Create a new instance of `BasicExternalities` with children pub fn new_with_children( - mut top: HashMap, Vec>, + top: HashMap, Vec>, children: HashMap, HashMap, Vec>>, ) -> Self { - top.insert(HEAP_PAGES.to_vec(), 8u64.encode()); BasicExternalities { top, children, @@ -188,7 +186,7 @@ mod tests { ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("0b33ed94e74e0f8e92a55923bece1ed02d16cf424e124613ddebc53ac3eeeabe"); + const ROOT: [u8; 32] = hex!("0b41e488cccbd67d1f1089592c2c235f5c5399b053f7fe9152dd4b5f279914cd"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } @@ -231,4 +229,12 @@ mod tests { ext.kill_child_storage(child()); assert_eq!(ext.child_storage(child(), b"doe"), None); } + + #[test] + fn basic_externalities_is_empty() { + // Make sure no values are set by default in `BasicExternalities`. + let (storage, child_storage) = BasicExternalities::new(Default::default()).into_storages(); + assert!(storage.is_empty()); + assert!(child_storage.is_empty()); + } } -- GitLab From bc4940d60f78673e16a1674ac0951f20582bb5d7 Mon Sep 17 00:00:00 2001 From: ddorgan Date: Wed, 31 Jul 2019 17:49:04 +0100 Subject: [PATCH 070/151] Fix artifact location required for flaming fir deployments (#3268) --- scripts/flamingfir-deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/flamingfir-deploy.sh b/scripts/flamingfir-deploy.sh index 13be56dfbd..596bb04ece 100755 --- a/scripts/flamingfir-deploy.sh +++ b/scripts/flamingfir-deploy.sh @@ -4,7 +4,7 @@ RETRY_COUNT=10 RETRY_ATTEMPT=0 SLEEP_TIME=15 TARGET_HOST="$1" -COMMIT=$(cat artifacts/VERSION) +COMMIT=$(cat artifacts/substrate/VERSION) DOWNLOAD_URL="https://releases.parity.io/substrate/x86_64-debian:stretch/${COMMIT}/substrate" POST_DATA='{"extra_vars":{"artifact_path":"'${DOWNLOAD_URL}'","target_host":"'${TARGET_HOST}'"}}' -- GitLab From 21dc79268a0b1f01c9b393a756c24767124de492 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 31 Jul 2019 19:35:03 +0200 Subject: [PATCH 071/151] Fix infinite loop in telemetry (#3275) --- core/telemetry/src/worker/node.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs index fc09e90c7d..18b31304fc 100644 --- a/core/telemetry/src/worker/node.rs +++ b/core/telemetry/src/worker/node.rs @@ -112,7 +112,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, let mut socket = mem::replace(&mut self.socket, NodeSocket::Poisoned); self.socket = loop { match socket { - NodeSocket::Connected(mut conn) => + NodeSocket::Connected(mut conn) => match NodeSocketConnected::poll(Pin::new(&mut conn), cx, &self.addr) { Poll::Ready(Ok(v)) => match v {} Poll::Pending => break NodeSocket::Connected(conn), @@ -202,7 +202,7 @@ where TTrans::Output: Sink + Unpin { self.need_flush = true; } else if self.need_flush { match Sink::poll_flush(Pin::new(&mut self.sink), cx) { - Poll::Pending => {} + Poll::Pending => return Poll::Pending, Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), Poll::Ready(Ok(())) => self.need_flush = false, } -- GitLab From 08d8262557550a4162a0518352207e05853cbd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 1 Aug 2019 08:42:37 +0100 Subject: [PATCH 072/151] extend flaming fir version details on README (#3279) --- README.adoc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.adoc b/README.adoc index 89c042bb32..aaab6df3cc 100644 --- a/README.adoc +++ b/README.adoc @@ -329,13 +329,17 @@ be `NODE_RUNTIME`. [[flaming-fir]] === Joining the Flaming Fir Testnet -Flaming Fir is the new testnet for Substrate master (2.0). Please note that master is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Emberic-Elm testnets. Ensure you have the dependencies listed above before compiling. -The master branch might have breaking changes as development progresses, therefore you should make sure you have a reasonably updated client when trying to sync Flaming Fir. +Flaming Fir is the new testnet for Substrate master (2.0) to test the latest development features. Please note that master is not compatible with the BBQ Birch, Charred Cherry, Dried Danta or Emberic Elm testnets. Ensure you have the dependencies listed above before compiling. + +Since Flaming Fir is targeting the master branch we make absolutely no guarantees of stability and/or persistence of the network. We might reset the chain at any time if it is necessary to deploy new changes. Currently, the validators are running with a client built from `d013bd900`, if you build from this commit you should be able to successfully sync, later commits may not work as new breaking changes may be introduced in master. + +Latest known working version: `d013bd900` [source, shell] ---- git clone https://github.com/paritytech/substrate.git cd substrate +git checkout -b flaming-fir d013bd900 ---- You can run the tests if you like: @@ -362,7 +366,7 @@ If you are successful, you will see your node syncing at https://telemetry.polka === Joining the Emberic Elm Testnet -Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Flaming-Fir testnets. +Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ Birch, Charred Cherry, Dried Danta or Flaming Fir testnets. In order to join the Emberic Elm testnet you should build from the `v1.0` branch. Ensure you have the dependencies listed above before compiling. [source, shell] -- GitLab From f19b7e8460d61c6b18fe672d8792bc890afe38f9 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 1 Aug 2019 09:43:37 +0200 Subject: [PATCH 073/151] Replace the telemetry Mutex with a channel (#3266) * Replace the telemetry Mutex with a channel * Don't return Err() if channel is full * Change polling pattern * Add more issue numbers --- Cargo.lock | 28 ++++++++++ core/telemetry/Cargo.toml | 3 ++ core/telemetry/src/lib.rs | 106 +++++++++++++++++++++++++------------- 3 files changed, 100 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 191b308754..adb20893d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -517,6 +517,14 @@ dependencies = [ "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-channel" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-deque" version = "0.6.3" @@ -3442,6 +3450,17 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "slog-async" +version = "2.3.0" +source = "git+https://github.com/paritytech/slog-async#107848e7ded5e80dc43f6296c2b96039eb92c0a5" +dependencies = [ + "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "slog-json" version = "2.3.0" @@ -4838,6 +4857,7 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-async 2.3.0 (git+https://github.com/paritytech/slog-async)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5019,6 +5039,11 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "target_info" version = "0.1.0" @@ -5980,6 +6005,7 @@ dependencies = [ "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" "checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" +"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" "checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" "checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9" @@ -6262,6 +6288,7 @@ dependencies = [ "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" +"checksum slog-async 2.3.0 (git+https://github.com/paritytech/slog-async)" = "" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1d3ec6214d46e57a7ec87c1972bbca66c59172a0cfffa5233c54726afb946bf" "checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" @@ -6287,6 +6314,7 @@ dependencies = [ "checksum syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)" = "eadc09306ca51a40555dd6fc2b415538e9e18bc9f870e47b1a524a79fe2dcf5e" "checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum sysinfo 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3e2cab189e59f72710e3dd5e1e0d5be0f6c5c999c326f2fdcdf3bf4483ec9fd" +"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index 27c94f0656..540305435f 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -16,6 +16,9 @@ log = "0.4" rand = "0.6" serde = { version = "1.0.81", features = ["derive"] } slog = { version = "^2", features = ["nested-values"] } +# TODO: we're using slog-async just to be able to clone records; See https://github.com/slog-rs/slog/issues/221, +# https://github.com/paritytech/substrate/issues/2823 and https://github.com/paritytech/substrate/issues/3260 +slog-async = { git = "https://github.com/paritytech/slog-async", features = ["nested-values"] } slog-json = { version = "^2", features = ["nested-values"] } slog-scope = "^4" tokio-io = "0.1" diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index 88d515e538..71a86defb6 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -58,12 +58,12 @@ //! ``` //! -use futures::{prelude::*, task::AtomicWaker}; +use futures::{prelude::*, channel::mpsc}; use libp2p::{Multiaddr, wasm_ext}; use log::warn; use parking_lot::Mutex; use serde::{Serialize, Deserialize}; -use std::{pin::Pin, sync::{Arc, Weak}, task::{Context, Poll}, time::{Duration, Instant}}; +use std::{pin::Pin, sync::Arc, task::{Context, Poll}, time::{Duration, Instant}}; pub use slog_scope::with_logger; pub use slog; @@ -112,31 +112,32 @@ pub const CONSENSUS_INFO: &str = "1"; /// Telemetry object. Implements `Future` and must be polled regularly. /// Contains an `Arc` and can be cloned and pass around. Only one clone needs to be polled -/// regularly. +/// regularly and should be polled regularly. /// Dropping all the clones unregisters the telemetry. #[derive(Clone)] pub struct Telemetry { - inner: Arc, + inner: Arc>, /// Slog guard so that we don't get deregistered. _guard: Arc, } -// Implementation notes: considering that logging can happen at any moment, we only have two -// options: locking a mutex (which we currently do), or using a channel (which we should do). -// At the moment, `slog` doesn't provide any easy way to serialize records in order to send them -// over a channel, but ideally that's what should be done. - -/// Shared between `Telemetry` and `TelemetryDrain`. +/// Behind the `Mutex` in `Telemetry`. +/// +/// Note that ideally we wouldn't have to make the `Telemetry` clonable, as that would remove the +/// need for a `Mutex`. However there is currently a weird hack in place in `substrate-service` +/// where we extract the telemetry registration so that it continues running during the shutdown +/// process. struct TelemetryInner { /// Worker for the telemetry. - worker: Mutex, - /// Waker to wake up when we add a log entry to the worker. - polling_waker: AtomicWaker, + worker: worker::TelemetryWorker, + /// Receives log entries for them to be dispatched to the worker. + receiver: mpsc::Receiver, } /// Implements `slog::Drain`. struct TelemetryDrain { - inner: std::panic::AssertUnwindSafe>, + /// Sends log entries. + sender: std::panic::AssertUnwindSafe>, } /// Initializes the telemetry. See the crate root documentation for more information. @@ -153,19 +154,18 @@ pub fn init_telemetry(config: TelemetryConfig) -> Telemetry { } } - let inner = Arc::new(TelemetryInner { - worker: Mutex::new(worker::TelemetryWorker::new(endpoints, config.wasm_external_transport)), - polling_waker: AtomicWaker::new(), - }); - + let (sender, receiver) = mpsc::channel(16); let guard = { - let logger = TelemetryDrain { inner: std::panic::AssertUnwindSafe(Arc::downgrade(&inner)) }; + let logger = TelemetryDrain { sender: std::panic::AssertUnwindSafe(sender) }; let root = slog::Logger::root(slog::Drain::fuse(logger), slog::o!()); slog_scope::set_global_logger(root) }; Telemetry { - inner, + inner: Arc::new(Mutex::new(TelemetryInner { + worker: worker::TelemetryWorker::new(endpoints, config.wasm_external_transport), + receiver, + })), _guard: Arc::new(guard), } } @@ -184,12 +184,42 @@ impl Stream for Telemetry { fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { let before = Instant::now(); + // Because the `Telemetry` is clonable, we need to put the actual fields behind a `Mutex`. + // However, the user is only ever supposed to poll from one instance of `Telemetry`, while + // the other instances are used only for RAII purposes. + // We assume that the user is following this advice and therefore that the `Mutex` is only + // ever locked once at a time. + let mut inner = match self.inner.try_lock() { + Some(l) => l, + None => { + warn!( + target: "telemetry", + "The telemetry seems to be polled multiple times simultaneously" + ); + // Returning `Pending` here means that we may never get polled again, but this is + // ok because we're in a situation where something else is actually currently doing + // the polling. + return Poll::Pending; + } + }; + let mut has_connected = false; - while let Poll::Ready(event) = self.inner.worker.lock().poll(cx) { - // Right now we only have one possible event. This line is here in order to not - // forget to handle any possible new event type. - let worker::TelemetryWorkerEvent::Connected = event; - has_connected = true; + + // The polling pattern is: poll the worker so that it processes its queue, then add one + // message from the receiver (if possible), then poll the worker again, and so on. + loop { + while let Poll::Ready(event) = inner.worker.poll(cx) { + // Right now we only have one possible event. This line is here in order to not + // forget to handle any possible new event type. + let worker::TelemetryWorkerEvent::Connected = event; + has_connected = true; + } + + if let Poll::Ready(Some(log_entry)) = Stream::poll_next(Pin::new(&mut inner.receiver), cx) { + log_entry.as_record_values(|rec, val| { let _ = inner.worker.log(rec, val); }); + } else { + break; + } } if before.elapsed() > Duration::from_millis(200) { @@ -199,7 +229,6 @@ impl Stream for Telemetry { if has_connected { Poll::Ready(Some(TelemetryEvent::Connected)) } else { - self.inner.polling_waker.register(cx.waker()); Poll::Pending } } @@ -210,17 +239,20 @@ impl slog::Drain for TelemetryDrain { type Err = (); fn log(&self, record: &slog::Record, values: &slog::OwnedKVList) -> Result { - if let Some(inner) = self.inner.0.upgrade() { - let before = Instant::now(); - let result = inner.worker.lock().log(record, values); - inner.polling_waker.wake(); - if before.elapsed() > Duration::from_millis(50) { - warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); - } - result - } else { - Ok(()) + let before = Instant::now(); + + let serialized = slog_async::AsyncRecord::from(record, values); + // Note: interestingly, `try_send` requires a `&mut` because it modifies some internal value, while `clone()` + // is lock-free. + if let Err(err) = self.sender.clone().try_send(serialized) { + warn!(target: "telemetry", "Ignored telemetry message because of error on channel: {:?}", err); + } + + if before.elapsed() > Duration::from_millis(50) { + warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); } + + Ok(()) } } -- GitLab From a4b156c933f996d09c004edb3c08cac0f8f90509 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 1 Aug 2019 09:45:08 +0200 Subject: [PATCH 074/151] Telemetry connectivity issues are not WARN (#3274) --- core/telemetry/src/worker/node.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs index 18b31304fc..64d150a3be 100644 --- a/core/telemetry/src/worker/node.rs +++ b/core/telemetry/src/worker/node.rs @@ -117,7 +117,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, Poll::Ready(Ok(v)) => match v {} Poll::Pending => break NodeSocket::Connected(conn), Poll::Ready(Err(err)) => { - debug!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); + warn!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); let timeout = gen_rand_reconnect_delay(); self.socket = NodeSocket::WaitingReconnect(timeout); return Poll::Ready(NodeEvent::Disconnected(err)) @@ -132,7 +132,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, }, Poll::Pending => break NodeSocket::Dialing(s), Poll::Ready(Err(err)) => { - debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + warn!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); let timeout = gen_rand_reconnect_delay(); socket = NodeSocket::WaitingReconnect(timeout); } @@ -143,7 +143,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, socket = NodeSocket::Dialing(d.compat()); } Err(err) => { - debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + warn!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); let timeout = gen_rand_reconnect_delay(); socket = NodeSocket::WaitingReconnect(timeout); } -- GitLab From 7aa3f2c71c9766f770537106e055c5a72d23841f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 1 Aug 2019 09:45:29 +0200 Subject: [PATCH 075/151] Fix telemetry not responding to pings (#3272) --- core/telemetry/src/worker.rs | 19 +++++++++++++++++++ core/telemetry/src/worker/node.rs | 10 ++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/telemetry/src/worker.rs b/core/telemetry/src/worker.rs index e132709378..24a1de8ec4 100644 --- a/core/telemetry/src/worker.rs +++ b/core/telemetry/src/worker.rs @@ -187,6 +187,25 @@ impl TelemetryWorker { /// For some context, we put this object around the `wasm_ext::ExtTransport` in order to make sure /// that each telemetry message maps to one single call to `write` in the WASM FFI. struct StreamSink(T); + +impl futures01::Stream for StreamSink { + type Item = BytesMut; + type Error = io::Error; + + fn poll(&mut self) -> futures01::Poll, Self::Error> { + let mut buf = [0; 128]; + Ok(self.0.poll_read(&mut buf)? + .map(|n| + if n == 0 { + None + } else { + let buf: BytesMut = buf[..n].into(); + Some(buf) + } + )) + } +} + impl futures01::Sink for StreamSink { type SinkItem = BytesMut; type SinkError = io::Error; diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs index 64d150a3be..d6193d4cc6 100644 --- a/core/telemetry/src/worker/node.rs +++ b/core/telemetry/src/worker/node.rs @@ -87,7 +87,7 @@ impl Node { impl Node where TTrans: Clone + Unpin, TTrans::Dial: Unpin, - TTrans::Output: Sink + Unpin, TSinkErr: fmt::Debug { + TTrans::Output: Sink + Stream + Unpin, TSinkErr: fmt::Debug { /// Sends a WebSocket frame to the node. Returns an error if we are not connected to the node. /// /// After calling this method, you should call `poll` in order for it to be properly processed. @@ -175,7 +175,7 @@ fn gen_rand_reconnect_delay() -> Delay { } impl NodeSocketConnected -where TTrans::Output: Sink + Unpin { +where TTrans::Output: Sink + Stream + Unpin { /// Processes the queue of messages for the connected socket. /// /// The address is passed for logging purposes only. @@ -200,6 +200,7 @@ where TTrans::Output: Sink + Unpin { item_len, my_addr ); self.need_flush = true; + } else if self.need_flush { match Sink::poll_flush(Pin::new(&mut self.sink), cx) { Poll::Pending => return Poll::Pending, @@ -207,6 +208,11 @@ where TTrans::Output: Sink + Unpin { Poll::Ready(Ok(())) => self.need_flush = false, } + } else if let Poll::Ready(_) = Stream::poll_next(Pin::new(&mut self.sink), cx) { + // We poll the telemetry `Stream` because the underlying implementation relies on + // this in order to answer PINGs. + // We don't do anything with incoming messages, however. + } else { break } -- GitLab From 57d46b54f3e08b613beabb4088e4697176a44075 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Thu, 1 Aug 2019 09:52:59 +0200 Subject: [PATCH 076/151] srml-contracts: Deferred actions (#3255) * Switch to deferred actions * Make restore_to a deferred action. * Bump version. * Review fixes. --- node/runtime/src/lib.rs | 2 +- srml/contracts/src/exec.rs | 119 ++++++++++++++---- srml/contracts/src/lib.rs | 190 +++++++++++++++-------------- srml/contracts/src/tests.rs | 80 ++++-------- srml/contracts/src/wasm/mod.rs | 36 ++++++ srml/contracts/src/wasm/runtime.rs | 81 ++++++++++++ 6 files changed, 337 insertions(+), 171 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index af1812f34d..a8957e9016 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 123, + spec_version: 125, impl_version: 125, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contracts/src/exec.rs b/srml/contracts/src/exec.rs index 084558e76f..b27116a1ac 100644 --- a/srml/contracts/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -90,6 +90,15 @@ pub trait Ext { /// Notes a call dispatch. fn note_dispatch_call(&mut self, call: CallOf); + /// Notes a restoration request. + fn note_restore_to( + &mut self, + dest: AccountIdOf, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec, + ); + /// Returns a reference to the account id of the caller. fn caller(&self) -> &AccountIdOf; @@ -254,13 +263,41 @@ impl Token for ExecFeeToken { } } +#[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq, Clone))] +pub enum DeferredAction { + DepositEvent { + /// A list of topics this event will be deposited with. + topics: Vec, + /// The event to deposit. + event: Event, + }, + DispatchRuntimeCall { + /// The account id of the contract who dispatched this call. + origin: T::AccountId, + /// The call to dispatch. + call: T::Call, + }, + RestoreTo { + /// The account id of the contract which is removed during the restoration and transfers + /// its storage to the restored contract. + donor: T::AccountId, + /// The account id of the restored contract. + dest: T::AccountId, + /// The code hash of the restored contract. + code_hash: CodeHash, + /// The initial rent allowance to set. + rent_allowance: BalanceOf, + /// The keys to delete upon restoration. + delta: Vec, + }, +} + pub struct ExecutionContext<'a, T: Trait + 'a, V, L> { pub self_account: T::AccountId, pub self_trie_id: Option, pub overlay: OverlayAccountDb<'a, T>, pub depth: usize, - pub events: Vec>, - pub calls: Vec<(T::AccountId, T::Call)>, + pub deferred: Vec>, pub config: &'a Config, pub vm: &'a V, pub loader: &'a L, @@ -284,8 +321,7 @@ where self_account: origin, overlay: OverlayAccountDb::::new(&DirectAccountDb), depth: 0, - events: Vec::new(), - calls: Vec::new(), + deferred: Vec::new(), config: &cfg, vm: &vm, loader: &loader, @@ -302,8 +338,7 @@ where self_account: dest, overlay: OverlayAccountDb::new(&self.overlay), depth: self.depth + 1, - events: Vec::new(), - calls: Vec::new(), + deferred: Vec::new(), config: self.config, vm: self.vm, loader: self.loader, @@ -435,7 +470,7 @@ where .into_result()?; // Deposit an instantiation event. - nested.events.push(IndexedEvent { + nested.deferred.push(DeferredAction::DepositEvent { event: RawEvent::Instantiated(caller.clone(), dest.clone()), topics: Vec::new(), }); @@ -464,15 +499,14 @@ where -> Result, &'static str> where F: FnOnce(&mut ExecutionContext) -> Result, &'static str> { - let (output_data, change_set, events, calls) = { + let (output_data, change_set, deferred) = { let mut nested = self.nested(dest, trie_id); let output_data = func(&mut nested)?; - (output_data, nested.overlay.into_change_set(), nested.events, nested.calls) + (output_data, nested.overlay.into_change_set(), nested.deferred) }; self.overlay.commit(change_set); - self.events.extend(events); - self.calls.extend(calls); + self.deferred.extend(deferred); Ok(output_data) } @@ -592,7 +626,7 @@ fn transfer<'a, T: Trait, V: Vm, L: Loader>( if transactor != dest { ctx.overlay.set_balance(transactor, new_from_balance); ctx.overlay.set_balance(dest, new_to_balance); - ctx.events.push(IndexedEvent { + ctx.deferred.push(DeferredAction::DepositEvent { event: RawEvent::Transfer(transactor.clone(), dest.clone(), value), topics: Vec::new(), }); @@ -656,11 +690,27 @@ where .call(to.clone(), value, gas_meter, input_data, empty_output_buf) } - /// Notes a call dispatch. fn note_dispatch_call(&mut self, call: CallOf) { - self.ctx.calls.push( - (self.ctx.self_account.clone(), call) - ); + self.ctx.deferred.push(DeferredAction::DispatchRuntimeCall { + origin: self.ctx.self_account.clone(), + call, + }); + } + + fn note_restore_to( + &mut self, + dest: AccountIdOf, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec, + ) { + self.ctx.deferred.push(DeferredAction::RestoreTo { + donor: self.ctx.self_account.clone(), + dest, + code_hash, + rent_allowance, + delta, + }); } fn address(&self) -> &T::AccountId { @@ -688,7 +738,7 @@ where } fn deposit_event(&mut self, topics: Vec, data: Vec) { - self.ctx.events.push(IndexedEvent { + self.ctx.deferred.push(DeferredAction::DepositEvent { topics, event: RawEvent::Contract(self.ctx.self_account.clone(), data), }); @@ -724,7 +774,7 @@ where mod tests { use super::{ BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, - Vm, VmExecResult, InstantiateReceipt, RawEvent, IndexedEvent, + Vm, VmExecResult, InstantiateReceipt, RawEvent, DeferredAction, }; use crate::account_db::AccountDb; use crate::gas::GasMeter; @@ -741,6 +791,21 @@ mod tests { const BOB: u64 = 2; const CHARLIE: u64 = 3; + impl<'a, T, V, L> ExecutionContext<'a, T, V, L> + where T: crate::Trait + { + fn events(&self) -> Vec> { + self.deferred + .iter() + .filter(|action| match *action { + DeferredAction::DepositEvent { .. } => true, + _ => false, + }) + .cloned() + .collect() + } + } + struct MockCtx<'a> { ext: &'a mut dyn Ext, input_data: &'a [u8], @@ -1326,12 +1391,12 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); - assert_eq!(&ctx.events, &[ - IndexedEvent { + assert_eq!(&ctx.events(), &[ + DeferredAction::DepositEvent { event: RawEvent::Transfer(ALICE, created_contract_address, 100), topics: Vec::new(), }, - IndexedEvent { + DeferredAction::DepositEvent { event: RawEvent::Instantiated(ALICE, created_contract_address), topics: Vec::new(), } @@ -1384,16 +1449,16 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); - assert_eq!(&ctx.events, &[ - IndexedEvent { + assert_eq!(&ctx.events(), &[ + DeferredAction::DepositEvent { event: RawEvent::Transfer(ALICE, BOB, 20), topics: Vec::new(), }, - IndexedEvent { + DeferredAction::DepositEvent { event: RawEvent::Transfer(BOB, created_contract_address, 15), topics: Vec::new(), }, - IndexedEvent { + DeferredAction::DepositEvent { event: RawEvent::Instantiated(BOB, created_contract_address), topics: Vec::new(), }, @@ -1441,8 +1506,8 @@ mod tests { // The contract wasn't created so we don't expect to see an instantiation // event here. - assert_eq!(&ctx.events, &[ - IndexedEvent { + assert_eq!(&ctx.events(), &[ + DeferredAction::DepositEvent { event: RawEvent::Transfer(ALICE, BOB, 20), topics: Vec::new(), }, diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index c4e588e12e..15d7b37a45 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -621,84 +621,6 @@ decl_module! { } } - /// Allows a contract to restore a tombstone by giving its storage. - /// - /// The contract that wants to restore (i.e. origin of the call, or `msg.sender` in Solidity terms) will compute a - /// tombstone with its storage and the given code_hash. If the computed tombstone - /// match the destination one, the destination contract is restored with the rent_allowance` specified, - /// while the origin sends all its funds to the destination and is removed. - fn restore_to( - origin, - dest: T::AccountId, - code_hash: CodeHash, - rent_allowance: BalanceOf, - delta: Vec - ) { - let origin = ensure_signed(origin)?; - - let mut origin_contract = >::get(&origin) - .and_then(|c| c.get_alive()) - .ok_or("Cannot restore from inexisting or tombstone contract")?; - - let current_block = >::block_number(); - - if origin_contract.last_write == Some(current_block) { - return Err("Origin TrieId written in the current block"); - } - - let dest_tombstone = >::get(&dest) - .and_then(|c| c.get_tombstone()) - .ok_or("Cannot restore to inexisting or alive contract")?; - - let last_write = if !delta.is_empty() { - Some(current_block) - } else { - origin_contract.last_write - }; - - let key_values_taken = delta.iter() - .filter_map(|key| { - child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { - child::kill(&origin_contract.trie_id, &blake2_256(key)); - (key, value) - }) - }) - .collect::>(); - - let tombstone = >::new( - // This operation is cheap enough because last_write (delta not included) - // is not this block as it has been checked earlier. - &runtime_io::child_storage_root(&origin_contract.trie_id)[..], - code_hash, - ); - - if tombstone != dest_tombstone { - for (key, value) in key_values_taken { - child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); - } - - return Err("Tombstones don't match"); - } - - origin_contract.storage_size -= key_values_taken.iter() - .map(|(_, value)| value.len() as u32) - .sum::(); - - >::remove(&origin); - >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { - trie_id: origin_contract.trie_id, - storage_size: origin_contract.storage_size, - code_hash, - rent_allowance, - deduct_block: current_block, - last_write, - })); - - let origin_free_balance = T::Currency::free_balance(&origin); - T::Currency::make_free_balance_be(&origin, >::zero()); - T::Currency::deposit_creating(&dest, origin_free_balance); - } - fn on_finalize() { GasSpent::kill(); } @@ -727,14 +649,6 @@ impl Module { if result.is_ok() { // Commit all changes that made it thus far into the persistent storage. DirectAccountDb.commit(ctx.overlay.into_change_set()); - - // Then deposit all events produced. - ctx.events.into_iter().for_each(|indexed_event| { - >::deposit_event_indexed( - &*indexed_event.topics, - ::Event::from(indexed_event.event).into(), - ); - }); } // Refund cost of the unused gas. @@ -743,14 +657,110 @@ impl Module { // can alter the balance of the caller. gas::refund_unused_gas::(&origin, gas_meter, imbalance); - // Dispatch every recorded call with an appropriate origin. - ctx.calls.into_iter().for_each(|(who, call)| { - let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); - Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); + // Execute deferred actions. + ctx.deferred.into_iter().for_each(|deferred| { + use self::exec::DeferredAction::*; + match deferred { + DepositEvent { + topics, + event, + } => >::deposit_event_indexed( + &*topics, + ::Event::from(event).into(), + ), + DispatchRuntimeCall { + origin: who, + call, + } => { + let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); + Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); + } + RestoreTo { + donor, + dest, + code_hash, + rent_allowance, + delta, + } => { + let _result = Self::restore_to(donor, dest, code_hash, rent_allowance, delta); + } + } }); result } + + fn restore_to( + origin: T::AccountId, + dest: T::AccountId, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec + ) -> Result { + let mut origin_contract = >::get(&origin) + .and_then(|c| c.get_alive()) + .ok_or("Cannot restore from inexisting or tombstone contract")?; + + let current_block = >::block_number(); + + if origin_contract.last_write == Some(current_block) { + return Err("Origin TrieId written in the current block"); + } + + let dest_tombstone = >::get(&dest) + .and_then(|c| c.get_tombstone()) + .ok_or("Cannot restore to inexisting or alive contract")?; + + let last_write = if !delta.is_empty() { + Some(current_block) + } else { + origin_contract.last_write + }; + + let key_values_taken = delta.iter() + .filter_map(|key| { + child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { + child::kill(&origin_contract.trie_id, &blake2_256(key)); + (key, value) + }) + }) + .collect::>(); + + let tombstone = >::new( + // This operation is cheap enough because last_write (delta not included) + // is not this block as it has been checked earlier. + &runtime_io::child_storage_root(&origin_contract.trie_id)[..], + code_hash, + ); + + if tombstone != dest_tombstone { + for (key, value) in key_values_taken { + child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); + } + + return Err("Tombstones don't match"); + } + + origin_contract.storage_size -= key_values_taken.iter() + .map(|(_, value)| value.len() as u32) + .sum::(); + + >::remove(&origin); + >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { + trie_id: origin_contract.trie_id, + storage_size: origin_contract.storage_size, + code_hash, + rent_allowance, + deduct_block: current_block, + last_write, + })); + + let origin_free_balance = T::Currency::free_balance(&origin); + T::Currency::make_free_balance_be(&origin, >::zero()); + T::Currency::deposit_creating(&dest, origin_free_balance); + + Ok(()) + } } decl_event! { diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index f4699a8c1a..5a53d8426f 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -1256,17 +1256,24 @@ fn default_rent_allowance_on_create() { const CODE_RESTORATION: &str = r#" (module (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) - (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "ext_restore_to" (func $ext_restore_to (param i32 i32 i32 i32 i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "call") - (call $ext_dispatch_call - ;; Pointer to the start of the encoded call buffer - (i32.const 200) - ;; The length of the encoded call buffer. - ;; - ;; NB: This is required to keep in sync with the values in `restoration`. - (i32.const 115) + (call $ext_restore_to + ;; Pointer and length of the encoded dest buffer. + (i32.const 256) + (i32.const 8) + ;; Pointer and length of the encoded code hash buffer + (i32.const 264) + (i32.const 32) + ;; Pointer and length of the encoded rent_allowance buffer + (i32.const 296) + (i32.const 8) + ;; Pointer and number of items in the delta buffer. + ;; This buffer specifies multiple keys for removal before restoration. + (i32.const 100) + (i32.const 1) ) ) (func (export "deploy") @@ -1290,17 +1297,20 @@ const CODE_RESTORATION: &str = r#" ;; Data to restore (data (i32.const 0) "\28") - ;; ACL + ;; Buffer that has ACL storage keys. (data (i32.const 100) "\01") - ;; Serialized version of `T::Call` that encodes a call to `restore_to` function. For more - ;; details check out the `ENCODED_CALL_LITERAL`. - (data (i32.const 200) - "\01\05\02\00\00\00\00\00\00\00\69\ae\df\b4\f6\c1\c3\98\e9\7f\8a\52\04\de\0f\95\ad\5e\7d\c3" - "\54\09\60\be\ab\11\a8\6c\56\9f\bf\cf\32\00\00\00\00\00\00\00\08\01\00\00\00\00\00\00\00\00" - "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00" - "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + ;; Address of bob + (data (i32.const 256) "\02\00\00\00\00\00\00\00") + + ;; Code hash of SET_CODE + (data (i32.const 264) + "\69\ae\df\b4\f6\c1\c3\98\e9\7f\8a\52\04\de\0f\95" + "\ad\5e\7d\c3\54\09\60\be\ab\11\a8\6c\56\9f\bf\cf" ) + + ;; Rent allowance + (data (i32.const 296) "\32\00\00\00\00\00\00\00") ) "#; @@ -1325,45 +1335,9 @@ fn restoration_success() { } fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: bool) { + let (set_rent_wasm, set_rent_code_hash) = compile_module::(CODE_SET_RENT).unwrap(); let (restoration_wasm, restoration_code_hash) = compile_module::(CODE_RESTORATION).unwrap(); - let (set_rent_wasm, set_rent_code_hash) = compile_module::(CODE_SET_RENT).unwrap(); - - let acl_key = { - let mut s = [0u8; 32]; - s[0] = 1; - s - }; - - // This test can fail due to the encoding changes. In case it becomes too annoying - // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = hex::encode(Encode::encode(&Call::Contract(super::Call::restore_to( - BOB, - set_rent_code_hash.into(), - ::Balance::from(50u32), - vec![acl_key, acl_key], - )))); - - // `ENCODED_CALL_LITERAL` is encoded `T::Call` represented as a byte array. There is an exact - // same copy of this (modulo hex notation differences) in `CODE_RESTORATION`. - // - // When this assert is triggered make sure that you update the literals here and in - // `CODE_RESTORATION`. Hopefully, we switch to automatic injection of the code. - const ENCODED_CALL_LITERAL: &str = - "0105020000000000000069aedfb4f6c1c398e97f8a5204de0f95ad5e7dc3540960beab11a86c569fbfcf320000\ - 0000000000080100000000000000000000000000000000000000000000000000000000000000010000000000000\ - 0000000000000000000000000000000000000000000000000"; - assert_eq!( - encoded, - ENCODED_CALL_LITERAL, - "The literal was changed and requires updating here and in `CODE_RESTORATION`", - ); - assert_eq!( - hex::decode(ENCODED_CALL_LITERAL).unwrap().len(), - 115, - "The size of the literal was changed and requires updating in `CODE_RESTORATION`", - ); - with_externalities( &mut ExtBuilder::default().existential_deposit(50).build(), diff --git a/srml/contracts/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs index c832d324b3..2c29b1ead1 100644 --- a/srml/contracts/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -185,6 +185,13 @@ mod tests { #[derive(Debug, PartialEq, Eq)] struct DispatchEntry(Call); #[derive(Debug, PartialEq, Eq)] + struct RestoreEntry { + dest: u64, + code_hash: H256, + rent_allowance: u64, + delta: Vec, + } + #[derive(Debug, PartialEq, Eq)] struct CreateEntry { code_hash: H256, endowment: u64, @@ -205,6 +212,7 @@ mod tests { creates: Vec, transfers: Vec, dispatches: Vec, + restores: Vec, // (topics, data) events: Vec<(Vec, Vec)>, next_account_id: u64, @@ -262,6 +270,20 @@ mod tests { fn note_dispatch_call(&mut self, call: Call) { self.dispatches.push(DispatchEntry(call)); } + fn note_restore_to( + &mut self, + dest: u64, + code_hash: H256, + rent_allowance: u64, + delta: Vec, + ) { + self.restores.push(RestoreEntry { + dest, + code_hash, + rent_allowance, + delta, + }); + } fn caller(&self) -> &u64 { &42 } @@ -332,6 +354,20 @@ mod tests { fn note_dispatch_call(&mut self, call: Call) { (**self).note_dispatch_call(call) } + fn note_restore_to( + &mut self, + dest: u64, + code_hash: H256, + rent_allowance: u64, + delta: Vec, + ) { + (**self).note_restore_to( + dest, + code_hash, + rent_allowance, + delta, + ) + } fn caller(&self) -> &u64 { (**self).caller() } diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index 556aa829cd..fcbc113af9 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -586,6 +586,87 @@ define_env!(Env, , Ok(()) }, + // Record a request to restore the caller contract to the specified contract. + // + // At the finalization stage, i.e. when all changes from the extrinsic that invoked this + // contract are commited, this function will compute a tombstone hash from the caller's + // storage and the given code hash and if the hash matches the hash found in the tombstone at + // the specified address - kill the caller contract and restore the destination contract and set + // the specified `rent_allowance`. All caller's funds are transfered to the destination. + // + // This function doesn't perform restoration right away but defers it to the end of the + // transaction. If there is no tombstone in the destination address or if the hashes don't match + // then restoration is cancelled and no changes are made. + // + // `dest_ptr`, `dest_len` - the pointer and the length of a buffer that encodes `T::AccountId` + // with the address of the to be restored contract. + // `code_hash_ptr`, `code_hash_len` - the pointer and the length of a buffer that encodes + // a code hash of the to be restored contract. + // `rent_allowance_ptr`, `rent_allowance_len` - the pointer and the length of a buffer that + // encodes the rent allowance that must be set in the case of successful restoration. + // `delta_ptr` is the pointer to the start of a buffer that has `delta_count` storage keys + // laid out sequentially. + ext_restore_to( + ctx, + dest_ptr: u32, + dest_len: u32, + code_hash_ptr: u32, + code_hash_len: u32, + rent_allowance_ptr: u32, + rent_allowance_len: u32, + delta_ptr: u32, + delta_count: u32 + ) => { + let dest = { + let dest_buf = read_sandbox_memory(ctx, dest_ptr, dest_len)?; + <::T as system::Trait>::AccountId::decode(&mut &dest_buf[..]) + .ok_or_else(|| sandbox::HostError)? + }; + let code_hash = { + let code_hash_buf = read_sandbox_memory(ctx, code_hash_ptr, code_hash_len)?; + ::T>>::decode(&mut &code_hash_buf[..]) + .ok_or_else(|| sandbox::HostError)? + }; + let rent_allowance = { + let rent_allowance_buf = read_sandbox_memory( + ctx, + rent_allowance_ptr, + rent_allowance_len + )?; + BalanceOf::<::T>::decode(&mut &rent_allowance_buf[..]) + .ok_or_else(|| sandbox::HostError)? + }; + let delta = { + // We don't use `with_capacity` here to not eagerly allocate the user specified amount + // of memory. + let mut delta = Vec::new(); + let mut key_ptr = delta_ptr; + + for _ in 0..delta_count { + const KEY_SIZE: usize = 32; + + // Read the delta into the provided buffer and collect it into the buffer. + let mut delta_key: StorageKey = [0; KEY_SIZE]; + read_sandbox_memory_into_buf(ctx, key_ptr, &mut delta_key)?; + delta.push(delta_key); + + // Offset key_ptr to the next element. + key_ptr = key_ptr.checked_add(KEY_SIZE as u32).ok_or_else(|| sandbox::HostError)?; + } + + delta + }; + + ctx.ext.note_restore_to( + dest, + code_hash, + rent_allowance, + delta, + ); + + Ok(()) + }, + // Returns the size of the scratch buffer. // // For more details on the scratch buffer see `ext_scratch_copy`. -- GitLab From 89a56adaf8512ab55aabe4f1d9725e3a1baaba11 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 1 Aug 2019 09:53:53 +0200 Subject: [PATCH 077/151] Documentation and small cleanup in panic-handler (#3249) * Documentation and small cleanup in panic-handler * Apply suggestions from code review Co-Authored-By: Sergei Pepyakin --- core/executor/src/native_executor.rs | 2 +- core/panic-handler/src/lib.rs | 71 ++++++++++++++++++++++------ core/state-machine/src/ext.rs | 28 +++++------ 3 files changed, 72 insertions(+), 29 deletions(-) diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 10010ef166..f57c331668 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -34,7 +34,7 @@ fn safe_call(f: F) -> Result where F: UnwindSafe + FnOnce() -> U { // Substrate uses custom panic hook that terminates process on panic. Disable termination for the native call. - let _guard = panic_handler::AbortGuard::new(false); + let _guard = panic_handler::AbortGuard::force_unwind(); ::std::panic::catch_unwind(f).map_err(|_| Error::Runtime) } diff --git a/core/panic-handler/src/lib.rs b/core/panic-handler/src/lib.rs index b2fd7238e0..287ff72a6a 100644 --- a/core/panic-handler/src/lib.rs +++ b/core/panic-handler/src/lib.rs @@ -15,18 +15,31 @@ // along with Substrate. If not, see . //! Custom panic hook with bug report link +//! +//! This crate provides the [`set`] function, which wraps around [`std::panic::set_hook`] and +//! sets up a panic hook that prints a backtrace and invites the user to open an issue to the +//! given URL. +//! +//! By default, the panic handler aborts the process by calling [`std::process::exit`]. This can +//! temporarily be disabled by using an [`AbortGuard`]. use backtrace::Backtrace; use std::io::{self, Write}; +use std::marker::PhantomData; use std::panic::{self, PanicInfo}; use std::cell::Cell; use std::thread; thread_local! { - pub static ABORT: Cell = Cell::new(true); + static ABORT: Cell = Cell::new(true); } -/// Set the panic hook +/// Set the panic hook. +/// +/// Calls [`std::panic::set_hook`] to set up the panic hook. +/// +/// The `bug_url` parameter is an invitation for users to visit that URL to submit a bug report +/// in the case where a panic happens. pub fn set(bug_url: &'static str) { panic::set_hook(Box::new(move |c| panic_hook(c, bug_url))); } @@ -39,7 +52,7 @@ This is a bug. Please report it at: ")} /// Set aborting flag. Returns previous value of the flag. -pub fn set_abort(enabled: bool) -> bool { +fn set_abort(enabled: bool) -> bool { ABORT.with(|flag| { let prev = flag.get(); flag.set(enabled); @@ -47,22 +60,47 @@ pub fn set_abort(enabled: bool) -> bool { }) } -/// Abort flag guard. Sets abort on construction and reverts to previous setting when dropped. -pub struct AbortGuard(bool); +/// RAII guard for whether panics in the current thread should unwind or abort. +/// +/// Sets a thread-local abort flag on construction and reverts to the previous setting when dropped. +/// Does not implement `Send` on purpose. +/// +/// > **Note**: Because we restore the previous value when dropped, you are encouraged to leave +/// > the `AbortGuard` on the stack and let it destroy itself naturally. +pub struct AbortGuard { + /// Value that was in `ABORT` before we created this guard. + previous_val: bool, + /// Marker so that `AbortGuard` doesn't implement `Send`. + _not_send: PhantomData> +} impl AbortGuard { - /// Create a new guard and set abort flag to specified value. - pub fn new(enable: bool) -> AbortGuard { - AbortGuard(set_abort(enable)) + /// Create a new guard. While the guard is alive, panics that happen in the current thread will + /// unwind the stack (unless another guard is created afterwards). + pub fn force_unwind() -> AbortGuard { + AbortGuard { + previous_val: set_abort(false), + _not_send: PhantomData + } + } + + /// Create a new guard. While the guard is alive, panics that happen in the current thread will + /// abort the process (unless another guard is created afterwards). + pub fn force_abort() -> AbortGuard { + AbortGuard { + previous_val: set_abort(true), + _not_send: PhantomData + } } } impl Drop for AbortGuard { fn drop(&mut self) { - set_abort(self.0); + set_abort(self.previous_val); } } +/// Function being called when a panic happens. fn panic_hook(info: &PanicInfo, report_url: &'static str) { let location = info.location(); let file = location.as_ref().map(|l| l.file()).unwrap_or(""); @@ -102,9 +140,14 @@ fn panic_hook(info: &PanicInfo, report_url: &'static str) { }) } -#[test] -fn does_not_abort() { - set("test"); - let _guard = AbortGuard::new(false); - ::std::panic::catch_unwind(|| panic!()).ok(); +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn does_not_abort() { + set("test"); + let _guard = AbortGuard::force_unwind(); + ::std::panic::catch_unwind(|| panic!()).ok(); + } } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index f6369159ba..b910ddcaf6 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -173,35 +173,35 @@ where N: crate::changes_trie::BlockNumber, { fn storage(&self, key: &[u8]) -> Option> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.overlay.storage(key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn storage_hash(&self, key: &[u8]) -> Option { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.overlay.storage(key).map(|x| x.map(|x| H::hash(x))).unwrap_or_else(|| self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn original_storage(&self, key: &[u8]) -> Option> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } fn original_storage_hash(&self, key: &[u8]) -> Option { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.overlay.child_storage(storage_key.as_ref(), key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| self.backend.child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn exists_storage(&self, key: &[u8]) -> bool { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); match self.overlay.storage(key) { Some(x) => x.is_some(), _ => self.backend.exists_storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL), @@ -209,7 +209,7 @@ where } fn exists_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> bool { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); match self.overlay.child_storage(storage_key.as_ref(), key) { Some(x) => x.is_some(), @@ -218,7 +218,7 @@ where } fn place_storage(&mut self, key: Vec, value: Option>) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if is_child_storage_key(&key) { warn!(target: "trie", "Refuse to directly set child storage key"); return; @@ -229,14 +229,14 @@ where } fn place_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Option>) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.mark_dirty(); self.overlay.set_child_storage(storage_key.into_owned(), key, value); } fn kill_child_storage(&mut self, storage_key: ChildStorageKey) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.mark_dirty(); self.overlay.clear_child_storage(storage_key.as_ref()); @@ -246,7 +246,7 @@ where } fn clear_prefix(&mut self, prefix: &[u8]) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if is_child_storage_key(prefix) { warn!(target: "trie", "Refuse to directly clear prefix that is part of child storage key"); return; @@ -264,7 +264,7 @@ where } fn storage_root(&mut self) -> H::Out { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if let Some((_, ref root)) = self.storage_transaction { return root.clone(); } @@ -292,7 +292,7 @@ where } fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if self.storage_transaction.is_some() { self .storage(storage_key.as_ref()) @@ -319,7 +319,7 @@ where } fn storage_changes_root(&mut self, parent_hash: H::Out) -> Result, ()> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.changes_trie_transaction = build_changes_trie::<_, T, H, N>( self.backend, self.changes_trie_storage.clone(), -- GitLab From 04ef6fa2532c8cd34f737cdec200672bb8f40378 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Thu, 1 Aug 2019 09:55:28 +0200 Subject: [PATCH 078/151] Make staking add_reward_points_to_validator public (#3273) * make staking add_reward_points_to_validator public * make storage private * bump version --- node/runtime/src/lib.rs | 2 +- srml/staking/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index a8957e9016..d178eeff18 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 125, - impl_version: 125, + impl_version: 126, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index ade395ec1c..fa9a297f7a 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -594,7 +594,7 @@ decl_storage! { pub CurrentEraStartSessionIndex get(current_era_start_session_index): SessionIndex; /// Rewards for the current era. Using indices of current elected set. - pub CurrentEraRewards: EraRewards; + CurrentEraRewards get(current_era_reward): EraRewards; /// The amount of balance actively at stake for each validator slot, currently. /// @@ -1403,7 +1403,7 @@ impl Module { /// /// At the end of the era each the total payout will be distributed among validator /// relatively to their points. - fn add_reward_points_to_validator(validator: T::AccountId, points: u32) { + pub fn add_reward_points_to_validator(validator: T::AccountId, points: u32) { >::current_elected().iter() .position(|elected| *elected == validator) .map(|index| { -- GitLab From f8f906e3e898c9c0c954abc7a2402a6b52794758 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Thu, 1 Aug 2019 15:37:02 +0300 Subject: [PATCH 079/151] Slots should not try to catch panics. (#3281) --- core/consensus/slots/src/lib.rs | 36 +++++++++++---------------------- 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 854e9c8d8b..ae3dd265e9 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -32,12 +32,12 @@ pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; use codec::{Decode, Encode}; use consensus_common::{SyncOracle, SelectChain}; -use futures::{prelude::*, future::{self, Either}, task::Poll}; +use futures::{prelude::*, future::{self, Either}}; use inherents::{InherentData, InherentDataProviders}; use log::{debug, error, info, warn}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ApiRef, Block as BlockT, ProvideRuntimeApi}; -use std::{fmt::Debug, ops::Deref, panic, pin::Pin}; +use std::{fmt::Debug, ops::Deref}; /// A worker that should be invoked at every new slot. pub trait SlotWorker { @@ -86,7 +86,7 @@ where let SlotDuration(slot_duration) = slot_duration; // rather than use a timer interval, we schedule our waits ourselves - let mut authorship = Slots::::new( + Slots::::new( slot_duration.slot_duration(), inherent_data_providers, timestamp_extractor, @@ -109,28 +109,16 @@ where }; Either::Left(worker.on_slot(chain_head, slot_info).map_err( - |e| { warn!(target: "slots", "Encountered consensus error: {:?}", e); e } - )) - }); - - future::poll_fn(move |cx| { - loop { - match panic::catch_unwind(panic::AssertUnwindSafe(|| Future::poll(Pin::new(&mut authorship), cx))) { - Ok(Poll::Ready(Ok(()))) => - warn!(target: "slots", "Slots stream has terminated unexpectedly."), - Ok(Poll::Pending) => break Poll::Pending, - Ok(Poll::Ready(Err(_err))) => - warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), - Err(e) => { - if let Some(s) = e.downcast_ref::<&'static str>() { - warn!(target: "slots", "Authorship task panicked at {:?}", s); - } - - warn!(target: "slots", "Restarting authorship task"); - } + |e| { + warn!(target: "slots", "Encountered consensus error: {:?}", e); + }).or_else(|_| future::ready(Ok(()))) + ) + }).then(|res| { + if let Err(err) = res { + warn!(target: "slots", "Slots stream terminated with an error: {:?}", err); } - } - }) + future::ready(()) + }) } /// A header which has been checked -- GitLab From 311279449ee9d17b0cd8b2cb876326eebd3001e4 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 1 Aug 2019 16:01:22 +0200 Subject: [PATCH 080/151] Fix staking (#3284) * 6 second blocks. * Version bump * Add test for slashable_balance() --- node/runtime/src/lib.rs | 2 +- srml/staking/src/lib.rs | 2 +- srml/staking/src/phragmen.rs | 6 +++--- srml/staking/src/tests.rs | 13 +++++++++++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index d178eeff18..64b2d950b1 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 125, + spec_version: 126, impl_version: 126, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index fa9a297f7a..dd540e78b1 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -1202,7 +1202,7 @@ impl Module { } fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf { - Self::bonded(stash).and_then(Self::ledger).map(|l| l.total).unwrap_or_default() + Self::bonded(stash).and_then(Self::ledger).map(|l| l.active).unwrap_or_default() } /// Select a new validator set from the assembled stakers and their role preferences. diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index cce2a8e0a3..14b8a3845f 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -90,7 +90,7 @@ pub fn elect( minimum_validator_count: usize, validator_iter: FV, nominator_iter: FN, - stash_of: FS, + slashable_balance_of: FS, ) -> Option<(Vec, Vec<(T::AccountId, Vec>)>)> where FV: Iterator>)>, FN: Iterator)>, @@ -108,7 +108,7 @@ pub fn elect( let mut nominators: Vec> = Vec::with_capacity(validator_iter.size_hint().0 + nominator_iter.size_hint().0); let mut candidates = validator_iter.map(|(who, _)| { - let stash_balance = stash_of(&who); + let stash_balance = slashable_balance_of(&who); (Candidate { who, ..Default::default() }, stash_balance) }) .filter_map(|(mut c, s)| { @@ -135,7 +135,7 @@ pub fn elect( // 2- Collect the nominators with the associated votes. // Also collect approval stake along the way. nominators.extend(nominator_iter.map(|(who, nominees)| { - let nominator_stake = stash_of(&who); + let nominator_stake = slashable_balance_of(&who); let mut edges: Vec> = Vec::with_capacity(nominees.len()); for n in &nominees { if let Some(idx) = c_idx_cache.get(n) { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index 4f42f991a8..b1c638788b 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -2100,3 +2100,16 @@ fn reward_from_authorship_event_handler_works() { assert_eq!(CurrentEraRewards::get().total, 25); }) } + +#[test] +fn unbonded_balance_is_not_slashable() { + with_externalities(&mut ExtBuilder::default().build(), || { + // total amount staked is slashable. + assert_eq!(Staking::slashable_balance_of(&11), 1000); + + assert_ok!(Staking::unbond(Origin::signed(10), 800)); + + // only the active portion. + assert_eq!(Staking::slashable_balance_of(&11), 200); + }) +} -- GitLab From 223596811f38c1903d275d5d6a5a9bf492ee7156 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 2 Aug 2019 18:30:20 +0200 Subject: [PATCH 081/151] Check the genesis hash in transactions regardless of era. (#3286) * Check the genesis hash in transactions regardless of era. * Fix check-fees, too. * Undo. * Subkey supports new signing. * Remove unneeded type param. * Bump tx version * Build. * Another build fix * Build again * Cleanup * Another fix. * Fix * Fixes * 6 second blocks. * Fixes * Build fix * Fix * Fix. --- core/client/src/client.rs | 33 ++--------- core/finality-grandpa/src/environment.rs | 6 +- .../src/generic/unchecked_extrinsic.rs | 13 +---- core/sr-primitives/src/traits.rs | 26 --------- node/cli/src/factory_impl.rs | 6 +- node/cli/src/service.rs | 5 +- node/executor/src/lib.rs | 5 +- node/runtime/src/lib.rs | 1 + srml/executive/src/lib.rs | 2 +- srml/grandpa/src/lib.rs | 8 +-- srml/staking/src/tests.rs | 4 +- srml/system/src/lib.rs | 56 ++++++++++++------- subkey/src/main.rs | 28 +++++++--- .../transaction-factory/src/complex_mode.rs | 2 + test-utils/transaction-factory/src/lib.rs | 21 +++++-- .../transaction-factory/src/simple_modes.rs | 2 + 16 files changed, 102 insertions(+), 116 deletions(-) diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 444344c4fd..a056ec6c7b 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -35,9 +35,8 @@ use consensus::{ SelectChain, self, }; use sr_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, - BlockNumberToHash, ApiRef, ProvideRuntimeApi, - SaturatedConversion, One, DigestFor, + Block as BlockT, Header as HeaderT, Zero, NumberFor, + ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, }; use sr_primitives::generic::DigestItem; use sr_primitives::BuildStorage; @@ -1521,30 +1520,6 @@ impl consensus::BlockImport for Client } } -impl CurrentHeight for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type BlockNumber = ::Number; - fn current_height(&self) -> Self::BlockNumber { - self.backend.blockchain().info().best_number - } -} - -impl BlockNumberToHash for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type BlockNumber = ::Number; - type Hash = Block::Hash; - fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option { - self.block_hash(n).unwrap_or(None) - } -} - - impl BlockchainEvents for Client where E: CallExecutor, @@ -2698,7 +2673,7 @@ pub(crate) mod tests { let current_balance = || client.runtime_api().balance_of( - &BlockId::number(client.current_height()), AccountKeyring::Alice.into() + &BlockId::number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(); // G -> A1 -> A2 @@ -2745,7 +2720,7 @@ pub(crate) mod tests { let current_balance = || client.runtime_api().balance_of( - &BlockId::number(client.current_height()), AccountKeyring::Alice.into() + &BlockId::number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(); // G -> A1 diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index e82cc1f421..3090cff386 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -35,7 +35,7 @@ use grandpa::{ }; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ - Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, }; use primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; @@ -962,10 +962,10 @@ pub(crate) fn canonical_at_height, RA>( if base_is_canonical { return Ok(Some(base.0)); } else { - return Ok(client.block_number_to_hash(height)); + return Ok(client.block_hash(height).unwrap_or(None)); } } else if base_is_canonical { - return Ok(client.block_number_to_hash(height)); + return Ok(client.block_hash(height).unwrap_or(None)); } let one = NumberFor::::one(); diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index 092af6e6f3..b803a20397 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -25,7 +25,7 @@ use crate::codec::{Decode, Encode, Input}; use crate::traits::{self, Member, MaybeDisplay, SignedExtension, Checkable, Extrinsic}; use super::CheckedExtrinsic; -const TRANSACTION_VERSION: u8 = 2; +const TRANSACTION_VERSION: u8 = 3; /// A extrinsic right from the external world. This is unchecked and so /// can contain a signature. @@ -205,7 +205,7 @@ mod tests { use super::*; use runtime_io::blake2_256; use crate::codec::{Encode, Decode}; - use crate::traits::{SignedExtension, BlockNumberToHash, Lookup, CurrentHeight}; + use crate::traits::{SignedExtension, Lookup}; use serde::{Serialize, Deserialize}; struct TestContext; @@ -214,15 +214,6 @@ mod tests { type Target = u64; fn lookup(&self, s: u64) -> Result { Ok(s) } } - impl CurrentHeight for TestContext { - type BlockNumber = u64; - fn current_height(&self) -> u64 { 42 } - } - impl BlockNumberToHash for TestContext { - type BlockNumber = u64; - type Hash = u64; - fn block_number_to_hash(&self, n: u64) -> Option { Some(n) } - } #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] struct TestSig(u64, Vec); diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 2019bbf126..f7d55dda79 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -122,32 +122,6 @@ impl Lookup for IdentityLookup { fn lookup(&self, x: T) -> result::Result { Ok(x) } } -/// Get the "current" block number. -pub trait CurrentHeight { - /// The type of the block number. - type BlockNumber; - - /// Return the current block number. Not allowed to fail. - fn current_height(&self) -> Self::BlockNumber; -} - -/// Translate a block number into a hash. -pub trait BlockNumberToHash { - /// The type of the block number. - type BlockNumber: Zero; - - /// The type of the hash. - type Hash: Encode; - - /// Get the hash for a given block number, or `None` if unknown. - fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option; - - /// Get the genesis block hash; this should always be known. - fn genesis_hash(&self) -> Self::Hash { - self.block_number_to_hash(Zero::zero()).expect("All blockchains must know their genesis block hash; qed") - } -} - /// Extensible conversion trait. Generic over both source and destination types. pub trait Convert { /// Make conversion. diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index e902b45f35..dffd084c5f 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -54,9 +54,10 @@ type Number = <::Header as HeaderT>::Number; impl FactoryState { fn build_extra(index: node_primitives::Index, phase: u64) -> node_runtime::SignedExtra { ( + system::CheckGenesis::new(), system::CheckEra::from(Era::mortal(256, phase)), system::CheckNonce::from(index), - system::CheckWeight::from(), + system::CheckWeight::new(), balances::TakeFees::from(0) ) } @@ -134,6 +135,7 @@ impl RuntimeAdapter for FactoryState { key: &Self::Secret, destination: &Self::AccountId, amount: &Self::Balance, + genesis_hash: &::Hash, prior_block_hash: &::Hash, ) -> ::Extrinsic { let index = self.extract_index(&sender, prior_block_hash); @@ -147,7 +149,7 @@ impl RuntimeAdapter for FactoryState { (*amount).into() ) ) - }, key, (prior_block_hash.clone(), (), (), ())) + }, key, (genesis_hash.clone(), prior_block_hash.clone(), (), (), ())) } fn inherent_extrinsics(&self) -> InherentData { diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 6c45f45d00..3dbddd10f6 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -424,11 +424,12 @@ mod tests { let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); + let check_genesis = system::CheckGenesis::new(); let check_era = system::CheckEra::from(Era::Immortal); let check_nonce = system::CheckNonce::from(index); - let check_weight = system::CheckWeight::from(); + let check_weight = system::CheckWeight::new(); let take_fees = balances::TakeFees::from(0); - let extra = (check_era, check_nonce, check_weight, take_fees); + let extra = (check_genesis, check_era, check_nonce, check_weight, take_fees); let raw_payload = (function, extra.clone(), genesis_hash); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index fa3a5b08bd..e9c7f4e1cb 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -122,7 +122,7 @@ mod tests { fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { match xt.signed { Some((signed, extra)) => { - let payload = (xt.function, extra.clone(), GENESIS_HASH); + let payload = (xt.function, extra.clone(), GENESIS_HASH, GENESIS_HASH); let key = AccountKeyring::from_public(&signed).unwrap(); let signature = payload.using_encoded(|b| { if b.len() > 256 { @@ -145,9 +145,10 @@ mod tests { fn signed_extra(nonce: Index, extra_fee: Balance) -> SignedExtra { ( + system::CheckGenesis::new(), system::CheckEra::from(Era::mortal(256, 0)), system::CheckNonce::from(nonce), - system::CheckWeight::from(), + system::CheckWeight::new(), balances::TakeFees::from(extra_fee) ) } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 64b2d950b1..e9ae43be03 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -432,6 +432,7 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( + system::CheckGenesis, system::CheckEra, system::CheckNonce, system::CheckWeight, diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index b1368e8a28..835b167e3d 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -450,7 +450,7 @@ mod tests { ( system::CheckEra::from(Era::Immortal), system::CheckNonce::from(nonce), - system::CheckWeight::from(), + system::CheckWeight::new(), balances::TakeFees::from(fee) ) } diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index 6cde95d457..6f1c897e53 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -36,7 +36,7 @@ use srml_support::{ decl_event, decl_storage, decl_module, dispatch::Result, storage::StorageValue }; use sr_primitives::{ - generic::{DigestItem, OpaqueDigestItemId}, traits::{CurrentHeight, Zero}, + generic::{DigestItem, OpaqueDigestItemId}, traits::Zero, }; use fg_primitives::{ScheduledChange, ConsensusLog, GRANDPA_ENGINE_ID}; pub use fg_primitives::{AuthorityId, AuthorityWeight}; @@ -232,7 +232,7 @@ impl Module { pub fn schedule_pause(in_blocks: T::BlockNumber) -> Result { if let StoredState::Live = >::get() { - let scheduled_at = system::ChainContext::::default().current_height(); + let scheduled_at = >::block_number(); >::put(StoredState::PendingPause { delay: in_blocks, scheduled_at, @@ -247,7 +247,7 @@ impl Module { pub fn schedule_resume(in_blocks: T::BlockNumber) -> Result { if let StoredState::Paused = >::get() { - let scheduled_at = system::ChainContext::::default().current_height(); + let scheduled_at = >::block_number(); >::put(StoredState::PendingResume { delay: in_blocks, scheduled_at, @@ -280,7 +280,7 @@ impl Module { forced: Option, ) -> Result { if !>::exists() { - let scheduled_at = system::ChainContext::::default().current_height(); + let scheduled_at = >::block_number(); if let Some(_) = forced { if Self::next_forced().map_or(false, |next| next > scheduled_at) { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index b1c638788b..96c8b9d5f2 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -365,8 +365,8 @@ fn rewards_should_work() { >::add_reward_points_to_validator(1001, 10_000); // Compute total payout now for whole duration as other parameter won't change - let total_payout = current_total_payout_for_duration(9*5); - assert!(total_payout > 10); // Test is meaningfull if reward something + let total_payout = current_total_payout_for_duration(9 * 5); + assert!(total_payout > 10); // Test is meaningful if reward something // No reward yet assert_eq!(Balances::total_balance(&2), init_balance_2); diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 1d73567c77..ac8357f5ca 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -79,12 +79,15 @@ use rstd::map; use rstd::marker::PhantomData; use sr_primitives::generic::{self, Era}; use sr_primitives::Perbill; -use sr_primitives::weights::{Weight, DispatchInfo, DispatchClass, WeightMultiplier, SimpleDispatchInfo}; -use sr_primitives::transaction_validity::{ValidTransaction, TransactionPriority, TransactionLongevity}; +use sr_primitives::weights::{ + Weight, DispatchInfo, DispatchClass, WeightMultiplier, SimpleDispatchInfo +}; +use sr_primitives::transaction_validity::{ + ValidTransaction, TransactionPriority, TransactionLongevity +}; use sr_primitives::traits::{self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Convert, - SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, - Lookup, DispatchError, SaturatedConversion, + SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, DispatchError, SaturatedConversion, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup, }; use primitives::storage::well_known_keys; use srml_support::{ @@ -866,7 +869,7 @@ impl CheckWeight { /// Utility constructor for tests and client code. #[cfg(feature = "std")] - pub fn from() -> Self { + pub fn new() -> Self { Self(PhantomData) } } @@ -1012,6 +1015,32 @@ impl SignedExtension for CheckEra { } } +/// Nonce check and increment to give replay protection for transactions. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckGenesis(rstd::marker::PhantomData); + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckGenesis { + fn fmt(&self, _f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + Ok(()) + } +} + +#[cfg(feature = "std")] +impl CheckGenesis { + pub fn new() -> Self { + Self(std::marker::PhantomData) + } +} + +impl SignedExtension for CheckGenesis { + type AccountId = T::AccountId; + type AdditionalSigned = T::Hash; + fn additional_signed(&self) -> Result { + Ok(>::block_hash(T::BlockNumber::zero())) + } +} + pub struct ChainContext(::rstd::marker::PhantomData); impl Default for ChainContext { fn default() -> Self { @@ -1027,21 +1056,6 @@ impl Lookup for ChainContext { } } -impl CurrentHeight for ChainContext { - type BlockNumber = T::BlockNumber; - fn current_height(&self) -> Self::BlockNumber { - >::block_number() - } -} - -impl BlockNumberToHash for ChainContext { - type BlockNumber = T::BlockNumber; - type Hash = T::Hash; - fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option { - Some(>::block_hash(n)) - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 9ef3586ed0..4a63138bf6 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -92,9 +92,10 @@ fn execute(matches: clap::ArgMatches) where { let extra = |i: Index, f: Balance| { ( + system::CheckGenesis::::new(), system::CheckEra::::from(Era::Immortal), system::CheckNonce::::from(i), - system::CheckWeight::::from(), + system::CheckWeight::::new(), balances::TakeFees::::from(f), ) }; @@ -170,7 +171,11 @@ fn execute(matches: clap::ArgMatches) where println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); - let raw_payload = (function, extra(index, 0), genesis_hash); + let raw_payload = ( + function, + extra(index, 0), + (&genesis_hash, &genesis_hash), + ); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) } else { @@ -200,15 +205,20 @@ fn execute(matches: clap::ArgMatches) where let function: Call = hex::decode(&call).ok() .and_then(|x| Decode::decode(&mut &x[..])).unwrap(); - let h = matches.value_of("prior-block-hash") - .expect("prior-block-hash is required; thus it can't be None; qed"); - let prior_block_hash: Hash = hex::decode(h).ok() - .and_then(|x| Decode::decode(&mut &x[..])) - .expect("Invalid prior block hash"); + let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { + "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), + "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])) + .expect("Invalid genesis hash or unrecognised chain identifier"), + }; - let era = Era::immortal(); + println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); - let raw_payload = (function, era, prior_block_hash, extra(index, 0)); + let raw_payload = ( + function, + extra(index, 0), + (&genesis_hash, &genesis_hash), + ); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs index 66e209fc81..25170f8c18 100644 --- a/test-utils/transaction-factory/src/complex_mode.rs +++ b/test-utils/transaction-factory/src/complex_mode.rs @@ -54,6 +54,7 @@ use crate::{RuntimeAdapter, create_block}; pub fn next( factory_state: &mut RA, client: &Arc>>, + genesis_hash: ::Hash, prior_block_hash: ::Hash, prior_block_id: BlockId, ) -> Option<::Block> @@ -91,6 +92,7 @@ where &from.1, &to, &amount, + &genesis_hash, &prior_block_hash, ); diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index 747811433a..11b080f14f 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -77,6 +77,7 @@ pub trait RuntimeAdapter { key: &Self::Secret, destination: &Self::AccountId, amount: &Self::Balance, + genesis_hash: &::Hash, prior_block_hash: &::Hash, ) -> ::Extrinsic; @@ -118,12 +119,24 @@ where select_chain.best_chain().map_err(|e| format!("{:?}", e).into()); let mut best_hash = best_header?.hash(); let best_block_id = BlockId::::hash(best_hash); + let genesis_hash = client.block_hash(Zero::zero())? + .expect("Genesis block always exists; qed").into(); while let Some(block) = match factory_state.mode() { - Mode::MasterToNToM => - complex_mode::next::(&mut factory_state, &client, best_hash.into(), best_block_id), - _ => - simple_modes::next::(&mut factory_state, &client, best_hash.into(), best_block_id) + Mode::MasterToNToM => complex_mode::next::( + &mut factory_state, + &client, + genesis_hash, + best_hash.into(), + best_block_id, + ), + _ => simple_modes::next::( + &mut factory_state, + &client, + genesis_hash, + best_hash.into(), + best_block_id, + ), } { best_hash = block.header().hash(); import_block::(&client, block); diff --git a/test-utils/transaction-factory/src/simple_modes.rs b/test-utils/transaction-factory/src/simple_modes.rs index 4ce7b47e6f..0554678fbb 100644 --- a/test-utils/transaction-factory/src/simple_modes.rs +++ b/test-utils/transaction-factory/src/simple_modes.rs @@ -49,6 +49,7 @@ use crate::{Mode, RuntimeAdapter, create_block}; pub fn next( factory_state: &mut RA, client: &Arc>>, + genesis_hash: ::Hash, prior_block_hash: ::Hash, prior_block_id: BlockId, ) -> Option<::Block> @@ -82,6 +83,7 @@ where &from.1, &to, &amount, + &genesis_hash, &prior_block_hash, ); -- GitLab From ba281ecc43495f2f737909baeeef3550ace2948f Mon Sep 17 00:00:00 2001 From: cheme Date: Fri, 2 Aug 2019 19:51:59 +0200 Subject: [PATCH 082/151] Trie simplification. (#2815) * switch to simple codec, trie broken for now * Actualy use trie_root_noext * align some hash, failing test on EMCH comment * Fix trie code over layout instead of hash, revert legacy code for legacy mainnet ?? * stub behind LayOut * fix no_std * temp solution for legacy trie behind feature legacy-key in various crate * use remote project * rc client db need prefix * update trie deps * bum spec runtime version * Removing legacy as default. * Switch mode to non legacy. * bump runtime version * Remove legacy trie compatibility features. * fix warning * bump version * change hash on new test. * Move dependency (#11 trie PR) patched to a parity repo. Bench reverted to correct hasher. Some renaming and doc improvments. * ChildBitmap renaming to BitMap. * Renaming of LayOut to Layout. * formatting. * Removing abreviation such as _ix nb_ or bm. * Update deps and apply renaming 'Buff' -> 'Buffer'. * Align to latest trie crates naming changes. * Update trie dependency. * Update trie dependency. * change block_import test hash * update trie deps (trie use new scale codec but it does not seems to be an issue). * update to use latest trie version (no mgmt of multiple radix). * tabify * Restoring test to 10 000. * Use published crate, trie bench is currently down until publishing (require another pr to update version). * Update trie-bench. --- Cargo.lock | 163 ++++--- core/client/Cargo.toml | 2 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/lib.rs | 89 ++-- core/client/src/cht.rs | 3 +- core/client/src/client.rs | 4 +- core/client/src/genesis.rs | 5 +- core/client/src/in_mem.rs | 6 +- core/client/src/light/fetcher.rs | 9 +- core/executor/Cargo.toml | 2 +- core/executor/src/wasm_executor.rs | 7 +- core/keyring/Cargo.toml | 4 +- core/primitives/Cargo.toml | 4 +- core/sr-io/Cargo.toml | 2 +- core/sr-io/with_std.rs | 7 +- core/state-machine/Cargo.toml | 9 +- core/state-machine/src/backend.rs | 9 +- core/state-machine/src/basic.rs | 8 +- .../src/changes_trie/changes_iterator.rs | 4 +- core/state-machine/src/changes_trie/mod.rs | 9 +- .../state-machine/src/changes_trie/storage.rs | 8 +- core/state-machine/src/ext.rs | 11 +- core/state-machine/src/lib.rs | 5 +- core/state-machine/src/overlayed_changes.rs | 3 +- core/state-machine/src/proving_backend.rs | 38 +- core/state-machine/src/testing.rs | 2 +- core/state-machine/src/trie_backend.rs | 19 +- .../state-machine/src/trie_backend_essence.rs | 60 +-- core/test-client/Cargo.toml | 2 +- core/test-runtime/Cargo.toml | 4 +- core/test-runtime/src/lib.rs | 27 +- core/trie/Cargo.toml | 14 +- core/trie/benches/bench.rs | 6 +- core/trie/src/lib.rs | 427 +++++++++--------- core/trie/src/node_codec.rs | 244 +++++++--- core/trie/src/node_header.rs | 121 +++-- core/trie/src/trie_stream.rs | 119 +++-- node-template/Cargo.toml | 2 +- node/executor/Cargo.toml | 2 +- node/executor/src/lib.rs | 4 +- node/runtime/src/lib.rs | 4 +- srml/executive/src/lib.rs | 2 +- srml/session/src/historical.rs | 6 +- 43 files changed, 890 insertions(+), 588 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index adb20893d8..8810fc7ebb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -217,6 +217,11 @@ name = "bitvec" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bitvec" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "blake2" version = "0.8.0" @@ -302,6 +307,11 @@ name = "bumpalo" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "byte-slice-cast" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.2.0" @@ -685,19 +695,6 @@ dependencies = [ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "derive_more" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "difference" version = "2.0.0" @@ -1118,12 +1115,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1485,11 +1482,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "keccak-hasher" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2070,10 +2067,10 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2309,7 +2306,7 @@ dependencies = [ "substrate-state-machine 2.0.0", "substrate-test-client 2.0.0", "substrate-trie 2.0.0", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2404,7 +2401,7 @@ dependencies = [ "substrate-service 2.0.0", "substrate-transaction-pool 2.0.0", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2632,6 +2629,18 @@ dependencies = [ "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-scale-codec" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-slice-cast 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "vecarray 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-send-wrapper" version = "0.1.0" @@ -3570,7 +3579,7 @@ name = "sr-io" version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4131,12 +4140,12 @@ dependencies = [ [[package]] name = "strum" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "strum_macros" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4247,7 +4256,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -4274,7 +4283,7 @@ name = "substrate-client-db" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -4463,7 +4472,7 @@ version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4545,8 +4554,8 @@ version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", - "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum_macros 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4668,8 +4677,8 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4830,7 +4839,7 @@ dependencies = [ name = "substrate-state-machine" version = "2.0.0" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4839,8 +4848,8 @@ dependencies = [ "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4869,7 +4878,7 @@ name = "substrate-test-client" version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4887,6 +4896,7 @@ version = "2.0.0" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4910,7 +4920,7 @@ dependencies = [ "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", "substrate-wasm-builder-runner 1.0.2", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4962,17 +4972,17 @@ name = "substrate-trie" version = "2.0.0" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", - "trie-bench 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-bench 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5389,26 +5399,26 @@ dependencies = [ [[package]] name = "trie-bench" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-db" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5416,19 +5426,19 @@ dependencies = [ [[package]] name = "trie-root" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-standardmap" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5578,6 +5588,16 @@ name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "vecarray" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "vergen" version = "3.0.4" @@ -5971,6 +5991,7 @@ dependencies = [ "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum bitvec 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b67491e1cc6f37da6c4415cd743cb8d2e2c65388acc91ca3094a054cbf3cbd0c" +"checksum bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9633b74910e1870f50f5af189b08487195cdb83c0e27a71d6f64d5e09dd0538b" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" @@ -5981,6 +6002,7 @@ dependencies = [ "checksum bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e0a692f1c740e7e821ca71a22cf99b9b2322dfa94d10f71443befb1797b3946a" "checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" "checksum bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd43d82f27d68911e6ee11ee791fb248f138f5d69424dc02e098d4f152b0b05" +"checksum byte-slice-cast 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7cbcbf18128ec71d8d4a0d054461ec59fff5b75b7d10a4c9b7c7cb1a379c3e77" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" @@ -6024,7 +6046,6 @@ dependencies = [ "checksum curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d4b820e8711c211745880150f5fac78ab07d6e3851d8ce9f5a02cedc199174c" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" "checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" -"checksum derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" @@ -6073,8 +6094,8 @@ dependencies = [ "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" "checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -"checksum hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4a2710506bcc28e53b6d48d9686b233a31ad831597da7de91e6112a2fc8f260" -"checksum hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff4a5dcbaf4fe8977852851d137546bcad8679c9582f170032ca35b30701138e" +"checksum hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32c87fec93c4a2d264483ef843ac1930ae7c7999d97d73721305a5188b4c23a4" +"checksum hash256-std-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16293646125e09e5bc216d9f73fa81ab31c4f97007d56c036bbf15a58e970540" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" @@ -6112,7 +6133,7 @@ dependencies = [ "checksum jsonrpc-server-utils 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7aac8e0029d19582b68c9fd498d18bdcf0846612c968acc93b6e5ae67eea4e0" "checksum jsonrpc-ws-server 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "698fee4fcaf09a5927b7e39dd8a8136a102b343cebacaa351fc4def01a050a5b" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3767172fe16797c41f975f12f38247964ace8e5e1a2539b82d5e19f9106b1cb9" +"checksum keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bf18164fd7ce989041f8fc4a1ae72a8bd1bec3575f2aeaf1d4968fc053aabef" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" @@ -6157,7 +6178,7 @@ dependencies = [ "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" "checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f" -"checksum memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "896b24d1a9850e7a25b070d552f311cbb8735214456efa222dcc4c431073c215" +"checksum memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a688133a81c915553c1dd9c3e859949f43a854cb8f8773e690e849b53b1f89f0" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "66448a173ad394ef5ebf734efa724f3644dcffda083b1e89979da4461ddac079" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" @@ -6195,6 +6216,7 @@ dependencies = [ "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" +"checksum parity-scale-codec 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b72212671aded3ca515379ea16aa774289e06cd595c7e31f06afdc48d6516e3" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2005637ccf93dbb60c85081ccaaf3f945f573da48dcc79f27f9646caa3ec1dc" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" @@ -6305,8 +6327,8 @@ dependencies = [ "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" -"checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" -"checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" +"checksum strum 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1c33039533f051704951680f1adfd468fd37ac46816ded0d9ee068e60f05f" +"checksum strum_macros 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "47cd23f5c7dee395a00fa20135e2ec0fffcdfa151c56182966d7a3261343432e" "checksum substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d69ace596e9ca97837cc41f8edcfc4e0a997f227d5fc153d1010b60a0fe9acda" "checksum substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f52ecbff6cc3d6e5c6401828e15937b680f459d6803ce238f01fe615bc40d071" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" @@ -6345,10 +6367,10 @@ dependencies = [ "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "401abff5ad06075d2c65d1eedeaaa70616d0df268f3186a82cf1aa2d798977d7" -"checksum trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1803d8ff63ec3743bee883aacf3df74c524ffab188d9abebe18ded4da0dcd5d4" -"checksum trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "226f4b2e7bc6a71172ffe7f137385cf63833de7c684059dde7520ddbf1fb04f4" -"checksum trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b65b79aee5dcdcc7247fdd811f7e26b47e65ecc17f776ecf5db8e8fd46db3b54" +"checksum trie-bench 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1861db0e69cc3d650083ca1e70e6f5aeb871491409abc0efaf321dff48df24a" +"checksum trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b65d609ae631d808c6c1cc23a622733d5a0b66a7d67e9f5cd5171562a1f4cb5" +"checksum trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b0eaa64e50d686c89e6d4817ed33cb18cfa249e9071b7918b18ecfacc7867" +"checksum trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "64fda153c00484d640bc91334624be22ead0e5baca917d9fd53ff29bdebcf9b2" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2e8e773ac21d176ee05243456b9f1a942cd1a586dab188ced05b8e8d58dc635" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" @@ -6370,6 +6392,7 @@ dependencies = [ "checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde" "checksum vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "33dd455d0f96e90a75803cfeb7f948768c08d70a6de9a8d2362461935698bf95" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +"checksum vecarray 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d68a73b7d7d950c6558b6009e9fba229fb67562bda9fd02198f614f4ecf83f" "checksum vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6aba5e34f93dc7051dfad05b98a18e9156f27e7b431fe1d2398cb6061c0a1dba" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 704f1ebccb..6847e68d53 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -17,7 +17,7 @@ state-machine = { package = "substrate-state-machine", path = "../state-machine" keyring = { package = "substrate-keyring", path = "../keyring", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } substrate-telemetry = { path = "../telemetry", optional = true } -hash-db = { version = "0.14.0", default-features = false } +hash-db = { version = "0.15.0", default-features = false } kvdb = { git = "https://github.com/paritytech/parity-common", optional = true, rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 202b21558a..5c1a0de55c 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -12,7 +12,7 @@ kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } linked-hash-map = "0.5" -hash-db = { version = "0.14.0" } +hash-db = { version = "0.15.0" } primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } client = { package = "substrate-client", path = "../../client" } diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 906404e8fc..b22ffc50b5 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -43,7 +43,7 @@ use client::blockchain::HeaderBackend; use client::ExecutionStrategies; use client::backend::{StorageCollection, ChildStorageCollection}; use parity_codec::{Decode, Encode}; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use kvdb::{KeyValueDB, DBTransaction}; use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::{Mutex, RwLock}; @@ -507,7 +507,7 @@ struct StorageDb { } impl state_machine::Storage for StorageDb { - fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { let key = prefixed_key::(key, prefix); self.state_db.get(&key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) .map_err(|e| format!("Database backend error: {:?}", e)) @@ -535,7 +535,7 @@ impl DbGenesisStorage { } impl state_machine::Storage for DbGenesisStorage { - fn get(&self, _key: &H256, _prefix: &[u8]) -> Result, String> { + fn get(&self, _key: &H256, _prefix: Prefix) -> Result, String> { Ok(None) } } @@ -675,7 +675,7 @@ impl state_machine::ChangesTrieStorage> where Block: BlockT, { - fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H256, _prefix: Prefix) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) } @@ -1428,7 +1428,7 @@ where Block: BlockT {} #[cfg(test)] mod tests { - use hash_db::HashDB; + use hash_db::{HashDB, EMPTY_PREFIX}; use super::*; use crate::columns; use client::backend::Backend as BTrait; @@ -1654,7 +1654,7 @@ mod tests { op.reset_storage(storage.iter().cloned().collect(), Default::default()).unwrap(); - key = op.db_updates.insert(&[], b"hello"); + key = op.db_updates.insert(EMPTY_PREFIX, b"hello"); op.set_block_data( header, Some(vec![]), @@ -1663,8 +1663,10 @@ mod tests { ).unwrap(); backend.commit_operation(op).unwrap(); - - assert_eq!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().unwrap(), &b"hello"[..]); + assert_eq!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().unwrap(), &b"hello"[..]); hash }; @@ -1688,8 +1690,8 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.insert(&[], b"hello"); - op.db_updates.remove(&key, &[]); + op.db_updates.insert(EMPTY_PREFIX, b"hello"); + op.db_updates.remove(&key, EMPTY_PREFIX); op.set_block_data( header, Some(vec![]), @@ -1698,8 +1700,10 @@ mod tests { ).unwrap(); backend.commit_operation(op).unwrap(); - - assert_eq!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().unwrap(), &b"hello"[..]); + assert_eq!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().unwrap(), &b"hello"[..]); hash }; @@ -1723,7 +1727,7 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.remove(&key, &[]); + op.db_updates.remove(&key, EMPTY_PREFIX); op.set_block_data( header, Some(vec![]), @@ -1733,7 +1737,11 @@ mod tests { backend.commit_operation(op).unwrap(); - assert!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().is_some()); + + assert!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().is_some()); hash }; @@ -1764,14 +1772,19 @@ mod tests { ).unwrap(); backend.commit_operation(op).unwrap(); - - assert!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().is_none()); + assert!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().is_none()); } backend.finalize_block(BlockId::Number(1), None).unwrap(); backend.finalize_block(BlockId::Number(2), None).unwrap(); backend.finalize_block(BlockId::Number(3), None).unwrap(); - assert!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().is_none()); + assert!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().is_none()); } #[test] @@ -1789,7 +1802,7 @@ mod tests { assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); for (key, (val, _)) in changes_trie_update.drain() { - assert_eq!(backend.changes_trie_storage().unwrap().get(&key, &[]), Ok(Some(val))); + assert_eq!(backend.changes_trie_storage().unwrap().get(&key, EMPTY_PREFIX), Ok(Some(val))); } }; @@ -1915,23 +1928,23 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 12); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root4, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root4, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root6, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root7, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root8, EMPTY_PREFIX).unwrap().is_some()); // now simulate finalization of block#16, causing prune of tries at #5..#8 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 16); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root6, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root7, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root8, EMPTY_PREFIX).unwrap().is_none()); // now "change" pruning mode to archive && simulate finalization of block#20 // => no changes tries are pruned, because we never prune in archive mode @@ -1939,10 +1952,10 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 20); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root9, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root10, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root11, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root12, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root9, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root10, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root11, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root12, EMPTY_PREFIX).unwrap().is_some()); } #[test] @@ -1981,15 +1994,15 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, block5, 5); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_some()); // now simulate finalization of block#6, causing prune of tries at #2 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, block6, 6); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, EMPTY_PREFIX).unwrap().is_some()); } #[test] diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index 56803a9827..b328200923 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -78,7 +78,8 @@ pub fn compute_root( Hasher::Out: Ord, I: IntoIterator>>, { - Ok(trie::trie_root::( + use trie::TrieConfiguration; + Ok(trie::trie_types::Layout::::trie_root( build_pairs::(cht_size, cht_num, hashes)? )) } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index a056ec6c7b..64519b60dd 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -57,7 +57,7 @@ use state_machine::{ ChangesTrieRootsStorage, ChangesTrieStorage, key_changes, key_changes_proof, OverlayedChanges, NeverOffchainExt, }; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use crate::backend::{ self, BlockImportOperation, PrunableStateChangesTrieStorage, @@ -614,7 +614,7 @@ impl Client where } impl<'a, Block: BlockT> ChangesTrieStorage> for AccessedRootsRecorder<'a, Block> { - fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { self.storage.get(key, prefix) } } diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 719661e344..1a3ab4c1fa 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -71,11 +71,12 @@ mod tests { state_root: Hash, txs: Vec ) -> (Vec, Hash) { - use trie::ordered_trie_root; + use trie::{TrieConfiguration, trie_types::Layout}; let transactions = txs.into_iter().map(|tx| tx.into_signed_tx()).collect::>(); - let extrinsics_root = ordered_trie_root::(transactions.iter().map(Encode::encode)).into(); + let iter = transactions.iter().map(Encode::encode); + let extrinsics_root = Layout::::ordered_trie_root(iter).into(); let mut header = Header { parent_hash, diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index dd56c76a2b..d392fbe9b2 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -25,7 +25,7 @@ use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor} use sr_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use trie::MemoryDB; use consensus::well_known_cache_keys::Id as CacheKeyId; @@ -755,8 +755,8 @@ impl state_machine::ChangesTrieStorage> for Change Block: BlockT, H: Hasher, { - fn get(&self, _key: &H::Out, _prefix: &[u8]) -> Result, String> { - Err("Dummy implementation".into()) + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { + self.0.get(key, prefix) } } diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index e788b3594b..b83907c932 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -21,7 +21,7 @@ use std::collections::BTreeMap; use std::marker::PhantomData; use std::future::Future; -use hash_db::{HashDB, Hasher}; +use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; use parity_codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; use sr_primitives::traits::{ @@ -333,7 +333,7 @@ impl, F> LightDataChecker) -> Header { - let extrinsics_root = - trie::ordered_trie_root::(extrinsics.iter().map(Encode::encode)); + use trie::{TrieConfiguration, trie_types::Layout}; + let iter = extrinsics.iter().map(Encode::encode); + let extrinsics_root = Layout::::ordered_trie_root(iter); // only care about `extrinsics_root` Header::new(0, extrinsics_root, H256::zero(), H256::zero(), Default::default()) diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 23205e1e40..1f9f3947ac 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -derive_more = "0.15.0" +derive_more = "0.14.0" parity-codec = "4.1.1" runtime_io = { package = "sr-io", path = "../sr-io" } primitives = { package = "substrate-primitives", path = "../primitives" } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index d7a8640e32..b776a520d7 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -32,7 +32,7 @@ use primitives::offchain; use primitives::hexdisplay::HexDisplay; use primitives::sandbox as sandbox_primitives; use primitives::{H256, Blake2Hasher}; -use trie::ordered_trie_root; +use trie::{TrieConfiguration, trie_types::Layout}; use crate::sandbox; use crate::allocator; use log::trace; @@ -528,7 +528,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, ) ) .collect::>>()?; - let r = ordered_trie_root::(values.into_iter()); + let r = Layout::::ordered_trie_root(values.into_iter()); this.memory.set(result, &r[..]) .map_err(|_| "Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root")?; Ok(()) @@ -1629,10 +1629,11 @@ mod tests { #[test] fn enumerated_trie_root_should_work() { let mut ext = TestExternalities::::default(); + let trie_input = vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]; let test_code = WASM_BINARY; assert_eq!( WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), - ordered_trie_root::(vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()].iter()).as_fixed_bytes().encode() + Layout::::ordered_trie_root(trie_input.iter()).as_fixed_bytes().encode() ); } diff --git a/core/keyring/Cargo.toml b/core/keyring/Cargo.toml index 84d6f765b7..1a58dc133e 100644 --- a/core/keyring/Cargo.toml +++ b/core/keyring/Cargo.toml @@ -8,5 +8,5 @@ edition = "2018" primitives = { package = "substrate-primitives", path = "../primitives" } sr-primitives = { path = "../sr-primitives" } lazy_static = { version = "1.0" } -strum = "0.14.0" -strum_macros = "0.14.0" +strum = "0.15.0" +strum_macros = "0.15.0" diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index fc18251f40..d0cdf34141 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -14,8 +14,8 @@ byteorder = { version = "1.3.1", default-features = false } primitive-types = { version = "0.4.0", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.5.0", optional = true } -hash-db = { version = "0.14.0", default-features = false } -hash256-std-hasher = { version = "0.14.0", default-features = false } +hash-db = { version = "0.15.0", default-features = false } +hash256-std-hasher = { version = "0.15.0", default-features = false } ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index 0172d3ac75..a103245721 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -12,7 +12,7 @@ rustc_version = "0.2" rstd = { package = "sr-std", path = "../sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } codec = { package = "parity-codec", version = "4.1.1", default-features = false } -hash-db = { version = "0.14.0", default-features = false } +hash-db = { version = "0.15.0", default-features = false } libsecp256k1 = { version = "0.2.1", optional = true } tiny-keccak = { version = "1.4.2", optional = true } environmental = { version = "1.0.1", optional = true } diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 8c70efdcd8..9413673593 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -29,6 +29,7 @@ pub use substrate_state_machine::{ use environmental::environmental; use primitives::{offchain, hexdisplay::HexDisplay, H256}; +use trie::{TrieConfiguration, trie_types::Layout}; #[cfg(feature = "std")] use std::collections::HashMap; @@ -169,7 +170,7 @@ impl StorageApi for () { H: Hasher, H::Out: Ord, { - trie::ordered_trie_root::(input.iter()) + Layout::::ordered_trie_root(input) } fn trie_root(input: I) -> H::Out @@ -180,7 +181,7 @@ impl StorageApi for () { H: Hasher, H::Out: Ord, { - trie::trie_root::(input) + Layout::::trie_root(input) } fn ordered_trie_root(input: I) -> H::Out @@ -190,7 +191,7 @@ impl StorageApi for () { H: Hasher, H::Out: Ord, { - trie::ordered_trie_root::(input) + Layout::::ordered_trie_root(input) } } diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index bcb471d530..c7a15bf957 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -8,9 +8,9 @@ edition = "2018" [dependencies] log = "0.4" parking_lot = "0.8.0" -hash-db = "0.14.0" -trie-db = "0.14.0" -trie-root = "0.14.0" +hash-db = "0.15.0" +trie-db = "0.15.0" +trie-root = "0.15.0" trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } @@ -19,3 +19,6 @@ num-traits = "0.2" [dev-dependencies] hex-literal = "0.2.0" + +[features] +default = [] diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index c86c802bfb..795393f331 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -24,7 +24,8 @@ use log::warn; use hash_db::Hasher; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::TrieBackendStorage; -use trie::{TrieDBMut, TrieMut, MemoryDB, trie_root, child_trie_root, default_child_trie_root}; +use trie::{TrieMut, MemoryDB, child_trie_root, default_child_trie_root, TrieConfiguration}; +use trie::trie_types::{TrieDBMut, Layout}; /// A state backend is used to read state data and can have changes committed /// to it. @@ -315,7 +316,7 @@ impl Backend for InMemory { .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); - let root = trie_root::(existing_pairs.chain(transaction.iter().cloned()) + let root = Layout::::trie_root(existing_pairs.chain(transaction.iter().cloned()) .collect::>() .into_iter() .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) @@ -338,7 +339,7 @@ impl Backend for InMemory { .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); - let root = child_trie_root::( + let root = child_trie_root::, _, _, _>( &storage_key, existing_pairs.chain(transaction.iter().cloned()) .collect::>() @@ -348,7 +349,7 @@ impl Backend for InMemory { let full_transaction = transaction.into_iter().map(|(k, v)| (Some(storage_key.clone()), k, v)).collect(); - let is_default = root == default_child_trie_root::(&storage_key); + let is_default = root == default_child_trie_root::>(&storage_key); (root, is_default, full_transaction) } diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 0ed2598060..53ab731671 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -20,7 +20,8 @@ use std::collections::HashMap; use std::iter::FromIterator; use crate::backend::{Backend, InMemory}; use hash_db::Hasher; -use trie::trie_root; +use trie::TrieConfiguration; +use trie::trie_types::Layout; use primitives::offchain; use primitives::storage::well_known_keys::is_child_storage_key; use super::{ChildStorageKey, Externalities}; @@ -149,7 +150,7 @@ impl Externalities for BasicExternalities where H::Out: Ord { fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { - trie_root::(self.top.clone()) + Layout::::trie_root(self.top.clone()) } fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { @@ -186,7 +187,8 @@ mod tests { ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("0b41e488cccbd67d1f1089592c2c235f5c5399b053f7fe9152dd4b5f279914cd"); + const ROOT: [u8; 32] = hex!("39245109cef3758c2eed2ccba8d9b370a917850af3824bc8348d505df2c298fa"); + assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index ee4b9cc19b..66d09c98d4 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -20,7 +20,7 @@ use std::cell::RefCell; use std::collections::VecDeque; use parity_codec::{Decode, Encode}; -use hash_db::{HashDB, Hasher}; +use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; use num_traits::One; use trie::{Recorder, MemoryDB}; use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage, BlockNumber}; @@ -115,7 +115,7 @@ pub fn key_changes_proof_check, H: Hasher, Number: Bl let mut proof_db = MemoryDB::::default(); for item in proof { - proof_db.insert(&[], &item); + proof_db.insert(EMPTY_PREFIX, &item); } let proof_db = InMemoryStorage::with_db(proof_db); diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index ab36eb6423..48ba9eac95 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -46,14 +46,15 @@ pub use self::storage::InMemoryStorage; pub use self::changes_iterator::{key_changes, key_changes_proof, key_changes_proof_check}; pub use self::prune::{prune, oldest_non_pruned_trie}; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use crate::backend::Backend; use num_traits::{One, Zero}; use parity_codec::{Decode, Encode}; use primitives; use crate::changes_trie::build::prepare_input; use crate::overlayed_changes::OverlayedChanges; -use trie::{MemoryDB, TrieDBMut, TrieMut, DBValue}; +use trie::{MemoryDB, DBValue, TrieMut}; +use trie::trie_types::TrieDBMut; /// Changes that are made outside of extrinsics are marked with this index; pub const NO_EXTRINSIC_INDEX: u32 = 0xffffffff; @@ -108,7 +109,7 @@ pub trait RootsStorage: Send + Sync { /// Changes trie storage. Provides access to trie roots and trie nodes. pub trait Storage: RootsStorage { /// Get a trie node. - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; } /// Changes trie storage -> trie backend essence adapter. @@ -117,7 +118,7 @@ pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a impl<'a, H: Hasher, N: BlockNumber> crate::TrieBackendStorage for TrieBackendStorageAdapter<'a, H, N> { type Overlay = trie::MemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { self.0.get(key, prefix) } } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index 8da2052515..bb2256235a 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -17,7 +17,7 @@ //! Changes trie storage utilities. use std::collections::BTreeMap; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use trie::DBValue; use trie::MemoryDB; use parking_lot::RwLock; @@ -101,7 +101,7 @@ impl InMemoryStorage { pub fn remove_from_storage(&self, keys: &HashSet) { let mut data = self.data.write(); for key in keys { - data.mdb.remove_and_purge(key, &[]); + data.mdb.remove_and_purge(key, hash_db::EMPTY_PREFIX); } } @@ -132,7 +132,7 @@ impl RootsStorage for InMemoryStorage } impl Storage for InMemoryStorage { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { MemoryDB::::get(&self.data.read().mdb, key, prefix) } } @@ -151,7 +151,7 @@ impl<'a, H, Number, S> TrieBackendStorage for TrieBackendAdapter<'a, H, Numbe { type Overlay = MemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { self.storage.get(key, prefix) } } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index b910ddcaf6..7f0fa1de3f 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -25,6 +25,7 @@ use hash_db::Hasher; use primitives::offchain; use primitives::storage::well_known_keys::is_child_storage_key; use trie::{MemoryDB, default_child_trie_root}; +use trie::trie_types::Layout; const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; @@ -297,7 +298,7 @@ where self .storage(storage_key.as_ref()) .unwrap_or( - default_child_trie_root::(storage_key.as_ref()) + default_child_trie_root::>(storage_key.as_ref()) ) } else { let storage_key = storage_key.as_ref(); @@ -394,8 +395,10 @@ mod tests { let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let root = hex!("bb0c2ef6e1d36d5490f9766cfcc7dfe2a6ca804504c3bb206053890d6dd02376").into(); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), - Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into())); + Some(root)); } #[test] @@ -405,7 +408,9 @@ mod tests { let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let root = hex!("96f5aae4690e7302737b6f9b7f8567d5bbb9eac1c315f80101235a92d9ec27f4").into(); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), - Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into())); + Some(root)); } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 7b2eb07819..d2ffc23b78 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -38,7 +38,8 @@ mod trie_backend; mod trie_backend_essence; use overlayed_changes::OverlayedChangeSet; -pub use trie::{TrieMut, TrieDBMut, DBValue, MemoryDB}; +pub use trie::{TrieMut, DBValue, MemoryDB}; +pub use trie::trie_types::{Layout, TrieDBMut}; pub use testing::TestExternalities; pub use basic::BasicExternalities; pub use ext::Ext; @@ -71,7 +72,7 @@ pub struct ChildStorageKey<'a, H: Hasher> { impl<'a, H: Hasher> ChildStorageKey<'a, H> { fn new(storage_key: Cow<'a, [u8]>) -> Option { - if !trie::is_child_trie_key_valid::(&storage_key) { + if !trie::is_child_trie_key_valid::>(&storage_key) { return None; } diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index c6d7ab89d3..34bf8ca3c5 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -372,7 +372,8 @@ mod tests { Some(&changes_trie_storage), crate::NeverOffchainExt::new(), ); - const ROOT: [u8; 32] = hex!("0b41e488cccbd67d1f1089592c2c235f5c5399b053f7fe9152dd4b5f279914cd"); + const ROOT: [u8; 32] = hex!("39245109cef3758c2eed2ccba8d9b370a917850af3824bc8348d505df2c298fa"); + assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 19f779e067..5862c19e8d 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -18,13 +18,13 @@ use std::{cell::RefCell, rc::Rc}; use log::debug; -use hash_db::Hasher; -use hash_db::HashDB; +use hash_db::{Hasher, HashDB, EMPTY_PREFIX}; use trie::{ - MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, + MemoryDB, PrefixedMemoryDB, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys }; pub use trie::Recorder; +pub use trie::trie_types::{Layout, TrieError}; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; use crate::{Error, ExecutionError, Backend}; @@ -50,11 +50,21 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> let map_e = |e| format!("Trie lookup error: {}", e); - read_trie_value_with::>(&eph, self.backend.root(), key, &mut *self.proof_recorder).map_err(map_e) + read_trie_value_with::, _, Ephemeral>( + &eph, + self.backend.root(), + key, + &mut *self.proof_recorder + ).map_err(map_e) } - pub fn child_storage(&mut self, storage_key: &[u8], key: &[u8]) -> Result>, String> { - let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); + pub fn child_storage( + &mut self, + storage_key: &[u8], + key: &[u8] + ) -> Result>, String> { + let root = self.storage(storage_key)? + .unwrap_or(default_child_trie_root::>(storage_key)); let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( @@ -64,7 +74,13 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> let map_e = |e| format!("Trie lookup error: {}", e); - read_child_trie_value_with(storage_key, &eph, &root, key, &mut *self.proof_recorder).map_err(map_e) + read_child_trie_value_with::, _, _>( + storage_key, + &eph, + &root, + key, + &mut *self.proof_recorder + ).map_err(map_e) } pub fn record_all_keys(&mut self) { @@ -76,7 +92,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> let mut iter = move || -> Result<(), Box>> { let root = self.backend.root(); - record_all_keys::(&eph, root, &mut *self.proof_recorder) + record_all_keys::, _>(&eph, root, &mut *self.proof_recorder) }; if let Err(e) = iter() { @@ -199,7 +215,7 @@ where { let db = create_proof_check_backend_storage(proof); - if db.contains(&root, &[]) { + if db.contains(&root, EMPTY_PREFIX) { Ok(TrieBackend::new(db, root)) } else { Err(Box::new(ExecutionError::InvalidProof)) @@ -215,7 +231,7 @@ where { let mut db = MemoryDB::default(); for item in proof { - db.insert(&[], &item); + db.insert(EMPTY_PREFIX, &item); } db } @@ -307,7 +323,7 @@ mod tests { let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( ::std::iter::empty(), - in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) + in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) ).0; (0..64).for_each(|i| assert_eq!( in_memory.storage(&[i]).unwrap().unwrap(), diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index dc19dad7b3..73c0b38ef4 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -277,7 +277,7 @@ mod tests { ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("cc65c26c37ebd4abcdeb3f1ecd727527051620779a2f6c809bac0f8a87dbb816"); + const ROOT: [u8; 32] = hex!("2a340d3dfd52f5992c6b117e9e45f479e6da5afffafeb26ab619cf137a95aeb8"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 0c57cf3682..18c1b0eeca 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -18,7 +18,8 @@ use log::{warn, debug}; use hash_db::Hasher; -use trie::{TrieDB, TrieError, Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; +use trie::{Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; +use trie::trie_types::{TrieDB, TrieError, Layout}; use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; use crate::Backend; @@ -137,7 +138,7 @@ impl, H: Hasher> Backend for TrieBackend where &mut write_overlay, ); - match delta_trie_root::(&mut eph, root, delta) { + match delta_trie_root::, _, _, _, _>(&mut eph, root, delta) { Ok(ret) => root = ret, Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e), } @@ -151,11 +152,11 @@ impl, H: Hasher> Backend for TrieBackend where I: IntoIterator, Option>)>, H::Out: Ord { - let default_root = default_child_trie_root::(storage_key); + let default_root = default_child_trie_root::>(storage_key); let mut write_overlay = S::Overlay::default(); let mut root = match self.storage(storage_key) { - Ok(value) => value.unwrap_or(default_child_trie_root::(storage_key)), + Ok(value) => value.unwrap_or(default_child_trie_root::>(storage_key)), Err(e) => { warn!(target: "trie", "Failed to read child storage root: {}", e); default_root.clone() @@ -168,7 +169,12 @@ impl, H: Hasher> Backend for TrieBackend where &mut write_overlay, ); - match child_delta_trie_root::(storage_key, &mut eph, root.clone(), delta) { + match child_delta_trie_root::, _, _, _, _>( + storage_key, + &mut eph, + root.clone(), + delta + ) { Ok(ret) => root = ret, Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e), } @@ -189,7 +195,8 @@ pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; use parity_codec::Encode; - use trie::{TrieMut, TrieDBMut, PrefixedMemoryDB}; + use trie::{TrieMut, PrefixedMemoryDB}; + use trie::trie_types::TrieDBMut; use super::*; fn test_db() -> (PrefixedMemoryDB, H256) { diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index cad150d1bc..06ed92cbae 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -20,17 +20,17 @@ use std::ops::Deref; use std::sync::Arc; use log::{debug, warn}; -use hash_db::{self, Hasher}; -use trie::{ - TrieDB, Trie, MemoryDB, PrefixedMemoryDB, DBValue, TrieError, - default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie, -}; +use hash_db::{self, Hasher, EMPTY_PREFIX, Prefix}; +use trie::{Trie, MemoryDB, PrefixedMemoryDB, DBValue, + default_child_trie_root, read_trie_value, read_child_trie_value, + for_keys_in_child_trie}; +use trie::trie_types::{TrieDB, TrieError, Layout}; use crate::backend::Consolidate; /// Patricia trie-based storage trait. pub trait Storage: Send + Sync { /// Get a trie node. - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; } /// Patricia trie-based pairs storage essence. @@ -73,12 +73,13 @@ impl, H: Hasher> TrieBackendEssence { let map_e = |e| format!("Trie lookup error: {}", e); - read_trie_value(&eph, &self.root, key).map_err(map_e) + read_trie_value::, _>(&eph, &self.root, key).map_err(map_e) } /// Get the value of child storage at given key. pub fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, String> { - let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); + let root = self.storage(storage_key)? + .unwrap_or(default_child_trie_root::>(storage_key)); let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { @@ -88,13 +89,13 @@ impl, H: Hasher> TrieBackendEssence { let map_e = |e| format!("Trie lookup error: {}", e); - read_child_trie_value(storage_key, &eph, &root, key).map_err(map_e) + read_child_trie_value::, _>(storage_key, &eph, &root, key).map_err(map_e) } /// Retrieve all entries keys of child storage and call `f` for each of those keys. pub fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F) { let root = match self.storage(storage_key) { - Ok(v) => v.unwrap_or(default_child_trie_root::(storage_key)), + Ok(v) => v.unwrap_or(default_child_trie_root::>(storage_key)), Err(e) => { debug!(target: "trie", "Error while iterating child storage: {}", e); return; @@ -107,7 +108,12 @@ impl, H: Hasher> TrieBackendEssence { overlay: &mut read_overlay, }; - if let Err(e) = for_keys_in_child_trie::>(storage_key, &eph, &root, f) { + if let Err(e) = for_keys_in_child_trie::, _, Ephemeral>( + storage_key, + &eph, + &root, + f, + ) { debug!(target: "trie", "Error while iterating child storage: {}", e); } } @@ -186,10 +192,10 @@ impl<'a, for Ephemeral<'a, S, H> { fn get(&self, key: &H::Out) -> Option { - if let Some(val) = hash_db::HashDB::get(self.overlay, key, &[]) { + if let Some(val) = hash_db::HashDB::get(self.overlay, key, EMPTY_PREFIX) { Some(val) } else { - match self.storage.get(&key, &[]) { + match self.storage.get(&key, EMPTY_PREFIX) { Ok(x) => x, Err(e) => { warn!(target: "trie", "Failed to read from DB: {}", e); @@ -200,15 +206,15 @@ impl<'a, } fn contains(&self, key: &H::Out) -> bool { - hash_db::HashDB::get(self, key, &[]).is_some() + hash_db::HashDB::get(self, key, EMPTY_PREFIX).is_some() } fn emplace(&mut self, key: H::Out, value: DBValue) { - hash_db::HashDB::emplace(self.overlay, key, &[], value) + hash_db::HashDB::emplace(self.overlay, key, EMPTY_PREFIX, value) } fn remove(&mut self, key: &H::Out) { - hash_db::HashDB::remove(self.overlay, key, &[]) + hash_db::HashDB::remove(self.overlay, key, EMPTY_PREFIX) } } @@ -228,7 +234,7 @@ impl<'a, > hash_db::HashDB for Ephemeral<'a, S, H> { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { + fn get(&self, key: &H::Out, prefix: Prefix) -> Option { if let Some(val) = hash_db::HashDB::get(self.overlay, key, prefix) { Some(val) } else { @@ -242,19 +248,19 @@ impl<'a, } } - fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { + fn contains(&self, key: &H::Out, prefix: Prefix) -> bool { hash_db::HashDB::get(self, key, prefix).is_some() } - fn insert(&mut self, prefix: &[u8], value: &[u8]) -> H::Out { + fn insert(&mut self, prefix: Prefix, value: &[u8]) -> H::Out { hash_db::HashDB::insert(self.overlay, prefix, value) } - fn emplace(&mut self, key: H::Out, prefix: &[u8], value: DBValue) { + fn emplace(&mut self, key: H::Out, prefix: Prefix, value: DBValue) { hash_db::HashDB::emplace(self.overlay, key, prefix, value) } - fn remove(&mut self, key: &H::Out, prefix: &[u8]) { + fn remove(&mut self, key: &H::Out, prefix: Prefix) { hash_db::HashDB::remove(self.overlay, key, prefix) } } @@ -265,8 +271,8 @@ impl<'a, > hash_db::HashDBRef for Ephemeral<'a, S, H> { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { hash_db::HashDB::get(self, key, prefix) } - fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { hash_db::HashDB::contains(self, key, prefix) } + fn get(&self, key: &H::Out, prefix: Prefix) -> Option { hash_db::HashDB::get(self, key, prefix) } + fn contains(&self, key: &H::Out, prefix: Prefix) -> bool { hash_db::HashDB::contains(self, key, prefix) } } /// Key-value pairs storage that is used by trie backend essence. @@ -274,14 +280,14 @@ pub trait TrieBackendStorage: Send + Sync { /// Type of in-memory overlay. type Overlay: hash_db::HashDB + Default + Consolidate; /// Get the value stored at key. - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; } // This implementation is used by normal storage trie clients. impl TrieBackendStorage for Arc> { type Overlay = PrefixedMemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { Storage::::get(self.deref(), key, prefix) } } @@ -290,7 +296,7 @@ impl TrieBackendStorage for Arc> { impl TrieBackendStorage for PrefixedMemoryDB { type Overlay = PrefixedMemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { Ok(hash_db::HashDB::get(self, key, prefix)) } } @@ -298,7 +304,7 @@ impl TrieBackendStorage for PrefixedMemoryDB { impl TrieBackendStorage for MemoryDB { type Overlay = MemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { Ok(hash_db::HashDB::get(self, key, prefix)) } } diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index abb42daea2..bd3b0db2ce 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -10,7 +10,7 @@ client-db = { package = "substrate-client-db", path = "../client/db", features = consensus = { package = "substrate-consensus-common", path = "../consensus/common" } executor = { package = "substrate-executor", path = "../executor" } futures-preview = "0.3.0-alpha.17" -hash-db = "0.14.0" +hash-db = "0.15.0" keyring = { package = "substrate-keyring", path = "../keyring" } parity-codec = "4.1.1" primitives = { package = "substrate-primitives", path = "../primitives" } diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 532d5a4b38..03ba10c5fb 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -21,7 +21,8 @@ sr-primitives = { path = "../sr-primitives", default-features = false } runtime_version = { package = "sr-version", path = "../sr-version", default-features = false } runtime_support = { package = "srml-support", path = "../../srml/support", default-features = false } substrate-trie = { path = "../trie", default-features = false } -trie-db = { version = "0.14.0", default-features = false } +trie-db = { version = "0.15.0", default-features = false } +memory-db = { version = "0.15.0", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../offchain/primitives", default-features = false} executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" @@ -60,6 +61,7 @@ std = [ "primitives/std", "substrate-trie/std", "trie-db/std", + "memory-db/std", "offchain-primitives/std", "executive/std", "srml-babe/std", diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index e2cdcabd2b..98d2437059 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -27,7 +27,8 @@ use parity_codec::{Encode, Decode, Input}; use primitives::Blake2Hasher; use trie_db::{TrieMut, Trie}; -use substrate_trie::{TrieDB, TrieDBMut, PrefixedMemoryDB}; +use substrate_trie::PrefixedMemoryDB; +use substrate_trie::trie_types::{TrieDB, TrieDBMut}; use substrate_client::{ runtime_api as client_api, block_builder::api as block_builder_api, decl_runtime_apis, @@ -394,20 +395,24 @@ fn code_using_trie() -> u64 { for i in 0..v.len() { let key: &[u8]= &v[i].0; let val: &[u8] = &v[i].1; - t.insert(key, val).expect("static input"); + if !t.insert(key, val).is_ok() { + return 101; + } } t }; - let trie = TrieDB::::new(&mdb, &root).expect("on memory with static content"); - - let iter = trie.iter().expect("static input"); - let mut iter_pairs = Vec::new(); - for pair in iter { - let (key, value) = pair.expect("on memory with static content"); - iter_pairs.push((key, value.to_vec())); - } - iter_pairs.len() as u64 + if let Ok(trie) = TrieDB::::new(&mdb, &root) { + if let Ok(iter) = trie.iter() { + let mut iter_pairs = Vec::new(); + for pair in iter { + if let Ok((key, value)) = pair { + iter_pairs.push((key, value.to_vec())); + } + } + iter_pairs.len() as u64 + } else { 102 } + } else { 103 } } #[cfg(not(feature = "std"))] diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index d2ba352257..8659462bc4 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -14,16 +14,16 @@ harness = false [dependencies] codec = { package = "parity-codec", version = "4.1.1", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -hash-db = { version = "0.14.0", default-features = false } -trie-db = { version = "0.14.0", default-features = false } -trie-root = { version = "0.14.0", default-features = false } -memory-db = { version = "0.14.0", default-features = false } +hash-db = { version = "0.15.0", default-features = false } +trie-db = { version = "0.15.0", default-features = false } +trie-root = { version = "0.15.0", default-features = false } +memory-db = { version = "0.15.0", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } [dev-dependencies] -trie-bench = { version = "0.14.0" } -trie-standardmap = { version = "0.14.0" } -keccak-hasher = { version = "0.14.0" } +trie-bench = { version = "0.16.0" } +trie-standardmap = { version = "0.15.0" } +keccak-hasher = { version = "0.15.0" } criterion = "0.2" hex-literal = "0.2.0" diff --git a/core/trie/benches/bench.rs b/core/trie/benches/bench.rs index 176bf5971e..a8a4732222 100644 --- a/core/trie/benches/bench.rs +++ b/core/trie/benches/bench.rs @@ -20,13 +20,11 @@ criterion_main!(benches); fn benchmark(c: &mut Criterion) { trie_bench::standard_benchmark::< - primitives::Blake2Hasher, - substrate_trie::NodeCodec, + substrate_trie::Layout, substrate_trie::TrieStream, >(c, "substrate-blake2"); trie_bench::standard_benchmark::< - keccak_hasher::KeccakHasher, - substrate_trie::NodeCodec, + substrate_trie::Layout, substrate_trie::TrieStream, >(c, "substrate-keccak"); } diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 6e8adb4941..e526a27ebe 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -33,57 +33,104 @@ pub use trie_stream::TrieStream; /// The Substrate format implementation of `NodeCodec`. pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. -pub use trie_db::{Trie, TrieMut, DBValue, Recorder, Query}; +pub use trie_db::{Trie, TrieMut, DBValue, Recorder, CError, + Query, TrieLayout, TrieConfiguration, nibble_ops}; /// Various re-exports from the `memory-db` crate. -pub use memory_db::{KeyFunction, prefixed_key}; +pub use memory_db::KeyFunction; +pub use memory_db::prefixed_key; /// Various re-exports from the `hash-db` crate. -pub use hash_db::HashDB as HashDBT; +pub use hash_db::{HashDB as HashDBT, EMPTY_PREFIX}; -/// As in `trie_db`, but less generic, error type for the crate. -pub type TrieError = trie_db::TrieError; -/// As in `hash_db`, but less generic, trait exposed. + +#[derive(Default)] +/// substrate trie layout +pub struct Layout(rstd::marker::PhantomData); + +impl TrieLayout for Layout { + const USE_EXTENSION: bool = false; + type Hash = H; + type Codec = NodeCodec; +} + +impl TrieConfiguration for Layout { + fn trie_root(input: I) -> ::Out where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + { + trie_root::trie_root_no_extension::(input) + } + + fn trie_root_unhashed(input: I) -> Vec where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + { + trie_root::unhashed_trie_no_extension::(input) + } + + fn encode_index(input: u32) -> Vec { + codec::Encode::encode(&codec::Compact(input)) + } +} + +/// TrieDB error over `TrieConfiguration` trait. +pub type TrieError = trie_db::TrieError, CError>; +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub trait AsHashDB: hash_db::AsHashDB {} impl> AsHashDB for T {} -/// As in `hash_db`, but less generic, trait exposed. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub type HashDB<'a, H> = dyn hash_db::HashDB + 'a; -/// As in `hash_db`, but less generic, trait exposed. +/// Reexport from `hash_db`, with genericity set for key only. pub type PlainDB<'a, K> = dyn hash_db::PlainDB + 'a; -/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. +/// This uses a `KeyFunction` for prefixing keys internally (avoiding +/// key conflict for non random keys). pub type PrefixedMemoryDB = memory_db::MemoryDB, trie_db::DBValue>; -/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. +/// This uses the `KeyFunction` for prefixing keys internally (avoiding +/// This uses a noops `KeyFunction` (key addressing must be hashed or using +/// an encoding scheme that avoid key conflict). pub type MemoryDB = memory_db::MemoryDB, trie_db::DBValue>; -/// As in `memory_db`, but less generic, trait exposed. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub type GenericMemoryDB = memory_db::MemoryDB; /// Persistent trie database read-access interface for the a given hasher. -pub type TrieDB<'a, H> = trie_db::TrieDB<'a, H, NodeCodec>; +pub type TrieDB<'a, L> = trie_db::TrieDB<'a, L>; /// Persistent trie database write-access interface for the a given hasher. -pub type TrieDBMut<'a, H> = trie_db::TrieDBMut<'a, H, NodeCodec>; +pub type TrieDBMut<'a, L> = trie_db::TrieDBMut<'a, L>; /// Querying interface, as in `trie_db` but less generic. -pub type Lookup<'a, H, Q> = trie_db::Lookup<'a, H, NodeCodec, Q>; - -/// Determine a trie root given its ordered contents, closed form. -pub fn trie_root(input: I) -> H::Out where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, -{ - trie_root::trie_root::(input) +pub type Lookup<'a, L, Q> = trie_db::Lookup<'a, L, Q>; +/// Hash type for a trie layout. +pub type TrieHash = <::Hash as Hasher>::Out; + +/// This module is for non generic definition of trie type. +/// Only the `Hasher` trait is generic in this case. +pub mod trie_types { + pub type Layout = super::Layout; + /// Persistent trie database read-access interface for the a given hasher. + pub type TrieDB<'a, H> = super::TrieDB<'a, Layout>; + /// Persistent trie database write-access interface for the a given hasher. + pub type TrieDBMut<'a, H> = super::TrieDBMut<'a, Layout>; + /// Querying interface, as in `trie_db` but less generic. + pub type Lookup<'a, H, Q> = trie_db::Lookup<'a, Layout, Q>; + /// As in `trie_db`, but less generic, error type for the crate. + pub type TrieError = trie_db::TrieError; } /// Determine a trie root given a hash DB and delta values. -pub fn delta_trie_root( +pub fn delta_trie_root( db: &mut DB, - mut root: H::Out, + mut root: TrieHash, delta: I -) -> Result>> where +) -> Result, Box>> where I: IntoIterator)>, A: AsRef<[u8]> + Ord, B: AsRef<[u8]>, - DB: hash_db::HashDB, + DB: hash_db::HashDB, { { - let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; + let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; for (key, change) in delta { match change { @@ -97,45 +144,26 @@ pub fn delta_trie_root( } /// Read a value from the trie. -pub fn read_trie_value>( +pub fn read_trie_value>( db: &DB, - root: &H::Out, + root: &TrieHash, key: &[u8] -) -> Result>, Box>> { - Ok(TrieDB::::new(&*db, root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) +) -> Result>, Box>> { + Ok(TrieDB::::new(&*db, root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) } /// Read a value from the trie with given Query. -pub fn read_trie_value_with, DB: hash_db::HashDBRef>( +pub fn read_trie_value_with< + L: TrieConfiguration, + Q: Query, + DB: hash_db::HashDBRef +>( db: &DB, - root: &H::Out, + root: &TrieHash, key: &[u8], query: Q -) -> Result>, Box>> { - Ok(TrieDB::::new(&*db, root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) -} - -/// Determine a trie root node's data given its ordered contents, closed form. -pub fn unhashed_trie(input: I) -> Vec where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, -{ - trie_root::unhashed_trie::(input) -} - -/// A trie root formed from the items, with keys attached according to their -/// compact-encoded index (using `parity-codec` crate). -pub fn ordered_trie_root(input: I) -> H::Out -where - I: IntoIterator, - A: AsRef<[u8]>, -{ - trie_root::(input - .into_iter() - .enumerate() - .map(|(i, v)| (codec::Encode::encode(&codec::Compact(i as u32)), v)) - ) +) -> Result>, Box>> { + Ok(TrieDB::::new(&*db, root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) } /// Determine whether a child trie key is valid. @@ -143,7 +171,7 @@ where /// For now, the only valid child trie key is `:child_storage:default:`. /// /// `child_trie_root` and `child_delta_trie_root` can panic if invalid value is provided to them. -pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { +pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { use primitives::storage::well_known_keys; let has_right_prefix = storage_key.starts_with(b":child_storage:default:"); if has_right_prefix { @@ -158,37 +186,42 @@ pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { } /// Determine the default child trie root. -pub fn default_child_trie_root(_storage_key: &[u8]) -> Vec { - trie_root::, Vec>(core::iter::empty()).as_ref().iter().cloned().collect() +pub fn default_child_trie_root(_storage_key: &[u8]) -> Vec { + L::trie_root::<_, Vec, Vec>(core::iter::empty()).as_ref().iter().cloned().collect() } -/// Determine a child trie root given its ordered contents, closed form. H is the default hasher, but a generic -/// implementation may ignore this type parameter and use other hashers. -pub fn child_trie_root(_storage_key: &[u8], input: I) -> Vec where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, +/// Determine a child trie root given its ordered contents, closed form. H is the default hasher, +/// but a generic implementation may ignore this type parameter and use other hashers. +pub fn child_trie_root(_storage_key: &[u8], input: I) -> Vec + where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, { - trie_root::(input).as_ref().iter().cloned().collect() + L::trie_root(input).as_ref().iter().cloned().collect() } -/// Determine a child trie root given a hash DB and delta values. H is the default hasher, but a generic implementation may ignore this type parameter and use other hashers. -pub fn child_delta_trie_root( +/// Determine a child trie root given a hash DB and delta values. H is the default hasher, +/// but a generic implementation may ignore this type parameter and use other hashers. +pub fn child_delta_trie_root( _storage_key: &[u8], db: &mut DB, root_vec: Vec, delta: I -) -> Result, Box>> where - I: IntoIterator)>, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, - DB: hash_db::HashDB + hash_db::PlainDB, +) -> Result, Box>> + where + I: IntoIterator)>, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + DB: hash_db::HashDB + + hash_db::PlainDB, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(&root_vec); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(&root_vec); { - let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; + let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; for (key, change) in delta { match change { @@ -202,18 +235,21 @@ pub fn child_delta_trie_root( } /// Call `f` for all keys in a child trie. -pub fn for_keys_in_child_trie( +pub fn for_keys_in_child_trie( _storage_key: &[u8], db: &DB, root_slice: &[u8], mut f: F -) -> Result<(), Box>> where - DB: hash_db::HashDBRef + hash_db::PlainDBRef, +) -> Result<(), Box>> + where + DB: hash_db::HashDBRef + + hash_db::PlainDBRef, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(root_slice); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(root_slice); - let trie = TrieDB::::new(&*db, &root)?; + let trie = TrieDB::::new(&*db, &root)?; let iter = trie.iter()?; for x in iter { @@ -225,14 +261,14 @@ pub fn for_keys_in_child_trie( } /// Record all keys for a given root. -pub fn record_all_keys( +pub fn record_all_keys( db: &DB, - root: &H::Out, - recorder: &mut Recorder -) -> Result<(), Box>> where - DB: hash_db::HashDBRef + root: &TrieHash, + recorder: &mut Recorder> +) -> Result<(), Box>> where + DB: hash_db::HashDBRef { - let trie = TrieDB::::new(&*db, root)?; + let trie = TrieDB::::new(&*db, root)?; let iter = trie.iter()?; for x in iter { @@ -248,84 +284,49 @@ pub fn record_all_keys( } /// Read a value from the child trie. -pub fn read_child_trie_value( +pub fn read_child_trie_value( _storage_key: &[u8], db: &DB, root_slice: &[u8], key: &[u8] -) -> Result>, Box>> where - DB: hash_db::HashDBRef + hash_db::PlainDBRef, +) -> Result>, Box>> + where + DB: hash_db::HashDBRef + + hash_db::PlainDBRef, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(root_slice); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(root_slice); - Ok(TrieDB::::new(&*db, &root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) + Ok(TrieDB::::new(&*db, &root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) } /// Read a value from the child trie with given query. -pub fn read_child_trie_value_with, DB>( +pub fn read_child_trie_value_with, DB>( _storage_key: &[u8], db: &DB, root_slice: &[u8], key: &[u8], query: Q -) -> Result>, Box>> where - DB: hash_db::HashDBRef + hash_db::PlainDBRef, +) -> Result>, Box>> + where + DB: hash_db::HashDBRef + + hash_db::PlainDBRef, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(root_slice); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(root_slice); - Ok(TrieDB::::new(&*db, &root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) + Ok(TrieDB::::new(&*db, &root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) } -// Utilities (not exported): - -const EMPTY_TRIE: u8 = 0; -const LEAF_NODE_OFFSET: u8 = 1; -const LEAF_NODE_BIG: u8 = 127; -const EXTENSION_NODE_OFFSET: u8 = 128; -const EXTENSION_NODE_BIG: u8 = 253; -const BRANCH_NODE_NO_VALUE: u8 = 254; -const BRANCH_NODE_WITH_VALUE: u8 = 255; -const LEAF_NODE_THRESHOLD: u8 = LEAF_NODE_BIG - LEAF_NODE_OFFSET; -const EXTENSION_NODE_THRESHOLD: u8 = EXTENSION_NODE_BIG - EXTENSION_NODE_OFFSET; //125 -const LEAF_NODE_SMALL_MAX: u8 = LEAF_NODE_BIG - 1; -const EXTENSION_NODE_SMALL_MAX: u8 = EXTENSION_NODE_BIG - 1; - -fn take<'a>(input: &mut &'a[u8], count: usize) -> Option<&'a[u8]> { - if input.len() < count { - return None - } - let r = &(*input)[..count]; - *input = &(*input)[count..]; - Some(r) -} - -fn partial_to_key(partial: &[u8], offset: u8, big: u8) -> Vec { - let nibble_count = (partial.len() - 1) * 2 + if partial[0] & 16 == 16 { 1 } else { 0 }; - let (first_byte_small, big_threshold) = (offset, (big - offset) as usize); - let mut output = [first_byte_small + nibble_count.min(big_threshold) as u8].to_vec(); - if nibble_count >= big_threshold { output.push((nibble_count - big_threshold) as u8) } - if nibble_count % 2 == 1 { - output.push(partial[0] & 0x0f); - } - output.extend_from_slice(&partial[1..]); - output -} - -fn branch_node(has_value: bool, has_children: impl Iterator) -> [u8; 3] { - let first = if has_value { - BRANCH_NODE_WITH_VALUE - } else { - BRANCH_NODE_NO_VALUE - }; - let mut bitmap: u16 = 0; - let mut cursor: u16 = 1; - for v in has_children { - if v { bitmap |= cursor } - cursor <<= 1; - } - [first, (bitmap % 256 ) as u8, (bitmap / 256 ) as u8] +/// Constants used into trie simplification codec. +mod trie_constants { + pub const EMPTY_TRIE: u8 = 0; + pub const NIBBLE_SIZE_BOUND: usize = u16::max_value() as usize; + pub const LEAF_PREFIX_MASK: u8 = 0b_01 << 6; + pub const BRANCH_WITHOUT_MASK: u8 = 0b_10 << 6; + pub const BRANCH_WITH_MASK: u8 = 0b_11 << 6; } #[cfg(test)] @@ -334,19 +335,25 @@ mod tests { use codec::{Encode, Compact}; use primitives::Blake2Hasher; use hash_db::{HashDB, Hasher}; - use trie_db::{DBValue, TrieMut, Trie}; + use trie_db::{DBValue, TrieMut, Trie, NodeCodec as NodeCodecT}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; use hex_literal::hex; - fn check_equivalent(input: &Vec<(&[u8], &[u8])>) { + type Layout = super::Layout; + + fn hashed_null_node() -> TrieHash { + >::hashed_null_node() + } + + fn check_equivalent(input: &Vec<(&[u8], &[u8])>) { { - let closed_form = trie_root::(input.clone()); - let d = unhashed_trie::(input.clone()); + let closed_form = T::trie_root(input.clone()); + let d = T::trie_root_unhashed(input.clone()); println!("Data: {:#x?}, {:#x?}", d, Blake2Hasher::hash(&d[..])); let persistent = { let mut memdb = MemoryDB::default(); let mut root = Default::default(); - let mut t = TrieDBMut::::new(&mut memdb, &mut root); + let mut t = TrieDBMut::::new(&mut memdb, &mut root); for (x, y) in input.iter().rev() { t.insert(x, y).unwrap(); } @@ -356,20 +363,22 @@ mod tests { } } - fn check_iteration(input: &Vec<(&[u8], &[u8])>) { + fn check_iteration(input: &Vec<(&[u8], &[u8])>) { let mut memdb = MemoryDB::default(); let mut root = Default::default(); { - let mut t = TrieDBMut::::new(&mut memdb, &mut root); + let mut t = TrieDBMut::::new(&mut memdb, &mut root); for (x, y) in input.clone() { t.insert(x, y).unwrap(); } } { - let t = TrieDB::::new(&mut memdb, &root).unwrap(); + let t = TrieDB::::new(&mut memdb, &root).unwrap(); assert_eq!( input.iter().map(|(i, j)| (i.to_vec(), j.to_vec())).collect::>(), - t.iter().unwrap().map(|x| x.map(|y| (y.0, y.1.to_vec())).unwrap()).collect::>() + t.iter().unwrap() + .map(|x| x.map(|y| (y.0, y.1.to_vec())).unwrap()) + .collect::>() ); } } @@ -377,11 +386,11 @@ mod tests { #[test] fn default_trie_root() { let mut db = MemoryDB::default(); - let mut root = ::Out::default(); - let mut empty = TrieDBMut::::new(&mut db, &mut root); + let mut root = TrieHash::::default(); + let mut empty = TrieDBMut::::new(&mut db, &mut root); empty.commit(); let root1 = empty.root().as_ref().to_vec(); - let root2: Vec = trie_root::, Vec>( + let root2: Vec = Layout::trie_root::<_, Vec, Vec>( std::iter::empty(), ).as_ref().iter().cloned().collect(); @@ -391,29 +400,35 @@ mod tests { #[test] fn empty_is_equivalent() { let input: Vec<(&[u8], &[u8])> = vec![]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] fn leaf_is_equivalent() { let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &[0xbb][..])]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] fn branch_is_equivalent() { - let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &[0x10][..]), (&[0xba][..], &[0x11][..])]; - check_equivalent(&input); - check_iteration(&input); + let input: Vec<(&[u8], &[u8])> = vec![ + (&[0xaa][..], &[0x10][..]), + (&[0xba][..], &[0x11][..]), + ]; + check_equivalent::(&input); + check_iteration::(&input); } #[test] fn extension_and_branch_is_equivalent() { - let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &[0x10][..]), (&[0xab][..], &[0x11][..])]; - check_equivalent(&input); - check_iteration(&input); + let input: Vec<(&[u8], &[u8])> = vec![ + (&[0xaa][..], &[0x10][..]), + (&[0xab][..], &[0x11][..]), + ]; + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -428,8 +443,8 @@ mod tests { let mut d = st.make(); d.sort_unstable_by(|&(ref a, _), &(ref b, _)| a.cmp(b)); let dr = d.iter().map(|v| (&v.0[..], &v.1[..])).collect(); - check_equivalent(&dr); - check_iteration(&dr); + check_equivalent::(&dr); + check_iteration::(&dr); } #[test] @@ -439,8 +454,8 @@ mod tests { (&[0xaa, 0xaa][..], &[0xaa][..]), (&[0xaa, 0xbb][..], &[0xab][..]) ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -453,8 +468,8 @@ mod tests { (&[0xbb, 0xbb][..], &[0xbb][..]), (&[0xbb, 0xcc][..], &[0xbc][..]), ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -463,8 +478,8 @@ mod tests { (&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), (&[0xba][..], &[0x11][..]), ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -473,16 +488,16 @@ mod tests { (&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), (&[0xba][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]) ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } - fn populate_trie<'db>( - db: &'db mut dyn HashDB, - root: &'db mut ::Out, + fn populate_trie<'db, T: TrieConfiguration>( + db: &'db mut dyn HashDB, + root: &'db mut TrieHash, v: &[(Vec, Vec)] - ) -> TrieDBMut<'db, Blake2Hasher> { - let mut t = TrieDBMut::::new(db, root); + ) -> TrieDBMut<'db, T> { + let mut t = TrieDBMut::::new(db, root); for i in 0..v.len() { let key: &[u8]= &v[i].0; let val: &[u8] = &v[i].1; @@ -491,7 +506,10 @@ mod tests { t } - fn unpopulate_trie<'db>(t: &mut TrieDBMut<'db, Blake2Hasher>, v: &[(Vec, Vec)]) { + fn unpopulate_trie<'db, T: TrieConfiguration>( + t: &mut TrieDBMut<'db, T>, + v: &[(Vec, Vec)], + ) { for i in v { let key: &[u8]= &i.0; t.remove(key).unwrap(); @@ -513,10 +531,10 @@ mod tests { count: 100, }.make_with(seed.as_fixed_bytes_mut()); - let real = trie_root::(x.clone()); + let real = Layout::trie_root(x.clone()); let mut memdb = MemoryDB::default(); let mut root = Default::default(); - let mut memtrie = populate_trie(&mut memdb, &mut root, &x); + let mut memtrie = populate_trie::(&mut memdb, &mut root, &x); memtrie.commit(); if *memtrie.root() != real { @@ -528,17 +546,18 @@ mod tests { } } assert_eq!(*memtrie.root(), real); - unpopulate_trie(&mut memtrie, &x); + unpopulate_trie::(&mut memtrie, &x); memtrie.commit(); - if *memtrie.root() != as trie_db::NodeCodec>::hashed_null_node() { + let hashed_null_node = hashed_null_node::(); + if *memtrie.root() != hashed_null_node { println!("- TRIE MISMATCH"); println!(""); - println!("{:?} vs {:?}", memtrie.root(), as trie_db::NodeCodec>::hashed_null_node()); + println!("{:?} vs {:?}", memtrie.root(), hashed_null_node); for i in &x { println!("{:#x?} -> {:#x?}", i.0, i.1); } } - assert_eq!(*memtrie.root(), as trie_db::NodeCodec>::hashed_null_node()); + assert_eq!(*memtrie.root(), hashed_null_node); } } @@ -549,7 +568,7 @@ mod tests { #[test] fn codec_trie_empty() { let input: Vec<(&[u8], &[u8])> = vec![]; - let trie = unhashed_trie::(input); + let trie = Layout::trie_root_unhashed::<_, _, _>(input); println!("trie: {:#x?}", trie); assert_eq!(trie, vec![0x0]); } @@ -559,11 +578,10 @@ mod tests { let input = vec![ (vec![0xaa], vec![0xbb]) ]; - let trie = unhashed_trie::(input); + let trie = Layout::trie_root_unhashed::<_, _, _>(input); println!("trie: {:#x?}", trie); - assert_eq!(trie, vec![ - 0x03, // leaf (0x01) with (+) key of 2 nibbles (0x02) + 0x42, // leaf 0x40 (2^6) with (+) key of 2 nibbles (0x02) 0xaa, // key data to_compact(1), // length of value in bytes as Compact 0xbb // value data @@ -573,21 +591,20 @@ mod tests { #[test] fn codec_trie_two_tuples_disjoint_keys() { let input = vec![(&[0x48, 0x19], &[0xfe]), (&[0x13, 0x14], &[0xff])]; - let trie = unhashed_trie::(input); + let trie = Layout::trie_root_unhashed::<_, _, _>(input); println!("trie: {:#x?}", trie); - let mut ex = Vec::::new(); - ex.push(0xfe); // branch, no value + ex.push(0x80); // branch, no value (0b_10..) no nibble ex.push(0x12); // slots 1 & 4 are taken from 0-7 ex.push(0x00); // no slots from 8-15 ex.push(to_compact(0x05)); // first slot: LEAF, 5 bytes long. - ex.push(0x04); // leaf with 3 nibbles + ex.push(0x43); // leaf 0x40 with 3 nibbles ex.push(0x03); // first nibble ex.push(0x14); // second & third nibble ex.push(to_compact(0x01)); // 1 byte data ex.push(0xff); // value data ex.push(to_compact(0x05)); // second slot: LEAF, 5 bytes long. - ex.push(0x04); // leaf with 3 nibbles + ex.push(0x43); // leaf with 3 nibbles ex.push(0x08); // first nibble ex.push(0x19); // second & third nibble ex.push(to_compact(0x01)); // 1 byte data @@ -605,9 +622,9 @@ mod tests { let mut mdb = MemoryDB::default(); let mut root = Default::default(); - let _ = populate_trie(&mut mdb, &mut root, &pairs); + let _ = populate_trie::(&mut mdb, &mut root, &pairs); - let trie = TrieDB::::new(&mdb, &root).unwrap(); + let trie = TrieDB::::new(&mdb, &root).unwrap(); let iter = trie.iter().unwrap(); let mut iter_pairs = Vec::new(); diff --git a/core/trie/src/node_codec.rs b/core/trie/src/node_codec.rs index 1b0d2be652..8c01beda6b 100644 --- a/core/trie/src/node_codec.rs +++ b/core/trie/src/node_codec.rs @@ -18,72 +18,95 @@ use rstd::marker::PhantomData; use rstd::vec::Vec; +use rstd::borrow::Borrow; use codec::{Encode, Decode, Compact}; use hash_db::Hasher; -use trie_db::{self, DBValue, NibbleSlice, node::Node, ChildReference}; +use trie_db::{self, NibbleSlice, node::Node, ChildReference, + nibble_ops, Partial, NodeCodec as NodeCodecT}; use crate::error::Error; -use super::{EMPTY_TRIE, LEAF_NODE_OFFSET, LEAF_NODE_BIG, EXTENSION_NODE_OFFSET, - EXTENSION_NODE_BIG, take, partial_to_key, node_header::NodeHeader, branch_node}; +use crate::trie_constants; +use super::{node_header::{NodeHeader, NodeKind}}; + +fn take<'a>(input: &mut &'a[u8], count: usize) -> Option<&'a[u8]> { + if input.len() < count { + return None + } + let r = &(*input)[..count]; + *input = &(*input)[count..]; + Some(r) +} /// Concrete implementation of a `NodeCodec` with Parity Codec encoding, generic over the `Hasher` #[derive(Default, Clone)] -pub struct NodeCodec(PhantomData); +pub struct NodeCodec(PhantomData); -impl trie_db::NodeCodec for NodeCodec { +impl NodeCodecT for NodeCodec { type Error = Error; - fn hashed_null_node() -> H::Out { - H::hash(&[0u8][..]) + fn hashed_null_node() -> ::Out { + H::hash(>::empty_node()) } - fn decode(data: &[u8]) -> ::rstd::result::Result { - use Error::BadFormat; + fn decode(data: &[u8]) -> rstd::result::Result { let input = &mut &*data; - match NodeHeader::decode(input).ok_or(BadFormat)? { + let head = NodeHeader::decode(input).ok_or(Error::BadFormat)?; + match head { NodeHeader::Null => Ok(Node::Empty), - NodeHeader::Branch(has_value) => { - let bitmap = u16::decode(input).ok_or(BadFormat)?; + NodeHeader::Branch(has_value, nibble_count) => { + let padding = nibble_count % nibble_ops::NIBBLE_PER_BYTE != 0; + // check that the padding is valid (if any) + if padding && nibble_ops::pad_left(input[0]) != 0 { + return Err(Error::BadFormat); + } + let nibble_data = take( + input, + (nibble_count + (nibble_ops::NIBBLE_PER_BYTE - 1)) / nibble_ops::NIBBLE_PER_BYTE, + ).ok_or(Error::BadFormat)?; + let nibble_slice = NibbleSlice::new_offset( + nibble_data, + nibble_ops::number_padding(nibble_count), + ); + let bitmap_slice = take(input, BITMAP_LENGTH).ok_or(Error::BadFormat)?; + let bitmap = Bitmap::decode(&bitmap_slice[..])?; let value = if has_value { - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - Some(take(input, count).ok_or(BadFormat)?) + let count = >::decode(input).ok_or(Error::BadFormat)?.0 as usize; + Some(take(input, count).ok_or(Error::BadFormat)?) } else { None }; let mut children = [None; 16]; - let mut pot_cursor = 1; - for i in 0..16 { - if bitmap & pot_cursor != 0 { - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - children[i] = Some(take(input, count).ok_or(BadFormat)?); + + for i in 0..nibble_ops::NIBBLE_LENGTH { + if bitmap.value_at(i) { + let count = >::decode(input).ok_or(Error::BadFormat)?.0 as usize; + children[i] = Some(take(input, count).ok_or(Error::BadFormat)?); } - pot_cursor <<= 1; } - Ok(Node::Branch(children, value)) - } - NodeHeader::Extension(nibble_count) => { - if nibble_count % 2 == 1 && input[0] & 0xf0 != 0x00 { - return Err(BadFormat); - } - let nibble_data = take(input, (nibble_count + 1) / 2).ok_or(BadFormat)?; - let nibble_slice = NibbleSlice::new_offset(nibble_data, nibble_count % 2); - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - Ok(Node::Extension(nibble_slice, take(input, count).ok_or(BadFormat)?)) + Ok(Node::NibbledBranch(nibble_slice, children, value)) } NodeHeader::Leaf(nibble_count) => { - if nibble_count % 2 == 1 && input[0] & 0xf0 != 0x00 { - return Err(BadFormat); + let padding = nibble_count % nibble_ops::NIBBLE_PER_BYTE != 0; + // check that the padding is valid (if any) + if padding && nibble_ops::pad_left(input[0]) != 0 { + return Err(Error::BadFormat); } - let nibble_data = take(input, (nibble_count + 1) / 2).ok_or(BadFormat)?; - let nibble_slice = NibbleSlice::new_offset(nibble_data, nibble_count % 2); - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - Ok(Node::Leaf(nibble_slice, take(input, count).ok_or(BadFormat)?)) + let nibble_data = take( + input, + (nibble_count + (nibble_ops::NIBBLE_PER_BYTE - 1)) / nibble_ops::NIBBLE_PER_BYTE, + ).ok_or(Error::BadFormat)?; + let nibble_slice = NibbleSlice::new_offset( + nibble_data, + nibble_ops::number_padding(nibble_count), + ); + let count = >::decode(input).ok_or(Error::BadFormat)?.0 as usize; + Ok(Node::Leaf(nibble_slice, take(input, count).ok_or(Error::BadFormat)?)) } } } - fn try_decode_hash(data: &[u8]) -> Option { + fn try_decode_hash(data: &[u8]) -> Option<::Out> { if data.len() == H::LENGTH { - let mut r = H::Out::default(); + let mut r = ::Out::default(); r.as_mut().copy_from_slice(data); Some(r) } else { @@ -92,53 +115,140 @@ impl trie_db::NodeCodec for NodeCodec { } fn is_empty_node(data: &[u8]) -> bool { - data == &[EMPTY_TRIE][..] + data == >::empty_node() } - fn empty_node() -> Vec { - [EMPTY_TRIE].to_vec() + + fn empty_node() -> &'static [u8] { + &[trie_constants::EMPTY_TRIE] } - // FIXME: refactor this so that `partial` isn't already encoded with HPE. Should just be an `impl Iterator`. - fn leaf_node(partial: &[u8], value: &[u8]) -> Vec { - let mut output = partial_to_key(partial, LEAF_NODE_OFFSET, LEAF_NODE_BIG); + fn leaf_node(partial: Partial, value: &[u8]) -> Vec { + let mut output = partial_encode(partial, NodeKind::Leaf); value.encode_to(&mut output); output } - // FIXME: refactor this so that `partial` isn't already encoded with HPE. Should just be an `impl Iterator`. - fn ext_node(partial: &[u8], child: ChildReference) -> Vec { - let mut output = partial_to_key(partial, EXTENSION_NODE_OFFSET, EXTENSION_NODE_BIG); - match child { - ChildReference::Hash(h) => - h.as_ref().encode_to(&mut output), - ChildReference::Inline(inline_data, len) => - (&AsRef::<[u8]>::as_ref(&inline_data)[..len]).encode_to(&mut output), - }; - output + fn extension_node( + _partial: impl Iterator, + _nbnibble: usize, + _child: ChildReference<::Out>, + ) -> Vec { + unreachable!() + } + + fn branch_node( + _children: impl Iterator::Out>>>>, + _maybe_value: Option<&[u8]>, + ) -> Vec { + unreachable!() } - fn branch_node(children: I, maybe_value: Option) -> Vec - where I: IntoIterator>> + Iterator>> - { - let mut output = [0, 0, 0].to_vec(); - let have_value = if let Some(value) = maybe_value { - (&*value).encode_to(&mut output); - true + fn branch_node_nibbled( + partial: impl Iterator, + number_nibble: usize, + children: impl Iterator::Out>>>>, + maybe_value: Option<&[u8]>, + ) -> Vec { + let mut output = if maybe_value.is_some() { + partial_from_iterator_encode(partial, number_nibble, NodeKind::BranchWithValue) } else { - false + partial_from_iterator_encode(partial, number_nibble, NodeKind::BranchNoValue) }; - let prefix = branch_node(have_value, children.map(|maybe_child| match maybe_child { + let bitmap_index = output.len(); + let mut bitmap: [u8; BITMAP_LENGTH] = [0; BITMAP_LENGTH]; + (0..BITMAP_LENGTH).for_each(|_|output.push(0)); + if let Some(value) = maybe_value { + value.encode_to(&mut output); + }; + Bitmap::encode(children.map(|maybe_child| match maybe_child.borrow() { Some(ChildReference::Hash(h)) => { h.as_ref().encode_to(&mut output); true } - Some(ChildReference::Inline(inline_data, len)) => { - (&AsRef::<[u8]>::as_ref(&inline_data)[..len]).encode_to(&mut output); + &Some(ChildReference::Inline(inline_data, len)) => { + inline_data.as_ref()[..len].encode_to(&mut output); true } None => false, - })); - output[0..3].copy_from_slice(&prefix[..]); + }), bitmap.as_mut()); + output[bitmap_index..bitmap_index + BITMAP_LENGTH] + .copy_from_slice(&bitmap.as_ref()[..BITMAP_LENGTH]); output } + +} + +// utils + +/// Encode and allocate node type header (type and size), and partial value. +/// It uses an iterator over encoded partial bytes as input. +fn partial_from_iterator_encode>( + partial: I, + nibble_count: usize, + node_kind: NodeKind, +) -> Vec { + let nibble_count = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, nibble_count); + + let mut output = Vec::with_capacity(3 + (nibble_count / nibble_ops::NIBBLE_PER_BYTE)); + match node_kind { + NodeKind::Leaf => NodeHeader::Leaf(nibble_count).encode_to(&mut output), + NodeKind::BranchWithValue => NodeHeader::Branch(true, nibble_count).encode_to(&mut output), + NodeKind::BranchNoValue => NodeHeader::Branch(false, nibble_count).encode_to(&mut output), + }; + output.extend(partial); + output } + +/// Encode and allocate node type header (type and size), and partial value. +/// Same as `partial_from_iterator_encode` but uses non encoded `Partial` as input. +fn partial_encode(partial: Partial, node_kind: NodeKind) -> Vec { + let number_nibble_encoded = (partial.0).0 as usize; + let nibble_count = partial.1.len() * nibble_ops::NIBBLE_PER_BYTE + number_nibble_encoded; + + let nibble_count = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, nibble_count); + + let mut output = Vec::with_capacity(3 + partial.1.len()); + match node_kind { + NodeKind::Leaf => NodeHeader::Leaf(nibble_count).encode_to(&mut output), + NodeKind::BranchWithValue => NodeHeader::Branch(true, nibble_count).encode_to(&mut output), + NodeKind::BranchNoValue => NodeHeader::Branch(false, nibble_count).encode_to(&mut output), + }; + if number_nibble_encoded > 0 { + output.push(nibble_ops::pad_right((partial.0).1)); + } + output.extend_from_slice(&partial.1[..]); + output +} + +const BITMAP_LENGTH: usize = 2; + +/// Radix 16 trie, bitmap encoding implementation, +/// it contains children mapping information for a branch +/// (children presence only), it encodes into +/// a compact bitmap encoding representation. +pub(crate) struct Bitmap(u16); + +impl Bitmap { + + pub fn decode(data: &[u8]) -> Result { + u16::decode(&mut &data[..]) + .ok_or(Error::BadFormat) + .map(|v|Bitmap(v)) + } + + pub fn value_at(&self, i: usize) -> bool { + self.0 & (1u16 << i) != 0 + } + + pub fn encode>(has_children: I , dest: &mut [u8]) { + let mut bitmap: u16 = 0; + let mut cursor: u16 = 1; + for v in has_children { + if v { bitmap |= cursor } + cursor <<= 1; + } + dest[0] = (bitmap % 256) as u8; + dest[1] = (bitmap / 256) as u8; + } +} + diff --git a/core/trie/src/node_header.rs b/core/trie/src/node_header.rs index 2c01189f8a..e4c38bd075 100644 --- a/core/trie/src/node_header.rs +++ b/core/trie/src/node_header.rs @@ -16,62 +16,105 @@ //! The node header. +use crate::trie_constants; use codec::{Encode, Decode, Input, Output}; -use super::{EMPTY_TRIE, LEAF_NODE_OFFSET, LEAF_NODE_BIG, EXTENSION_NODE_OFFSET, - EXTENSION_NODE_BIG, BRANCH_NODE_NO_VALUE, BRANCH_NODE_WITH_VALUE, LEAF_NODE_THRESHOLD, - EXTENSION_NODE_THRESHOLD, LEAF_NODE_SMALL_MAX, EXTENSION_NODE_SMALL_MAX}; +use rstd::iter::once; -/// A node header. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum NodeHeader { +/// A node header +#[derive(Copy, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub(crate) enum NodeHeader { Null, - Branch(bool), - Extension(usize), + Branch(bool, usize), Leaf(usize), } +/// NodeHeader without content +pub(crate) enum NodeKind { + Leaf, + BranchNoValue, + BranchWithValue, +} + impl Encode for NodeHeader { fn encode_to(&self, output: &mut T) { match self { - NodeHeader::Null => output.push_byte(EMPTY_TRIE), - - NodeHeader::Branch(true) => output.push_byte(BRANCH_NODE_WITH_VALUE), - NodeHeader::Branch(false) => output.push_byte(BRANCH_NODE_NO_VALUE), - - NodeHeader::Leaf(nibble_count) if *nibble_count < LEAF_NODE_THRESHOLD as usize => - output.push_byte(LEAF_NODE_OFFSET + *nibble_count as u8), - NodeHeader::Leaf(nibble_count) => { - output.push_byte(LEAF_NODE_BIG); - output.push_byte((*nibble_count - LEAF_NODE_THRESHOLD as usize) as u8); - } - - NodeHeader::Extension(nibble_count) if *nibble_count < EXTENSION_NODE_THRESHOLD as usize => - output.push_byte(EXTENSION_NODE_OFFSET + *nibble_count as u8), - NodeHeader::Extension(nibble_count) => { - output.push_byte(EXTENSION_NODE_BIG); - output.push_byte((*nibble_count - EXTENSION_NODE_THRESHOLD as usize) as u8); - } + NodeHeader::Null => output.push_byte(trie_constants::EMPTY_TRIE), + NodeHeader::Branch(true, nibble_count) => + encode_size_and_prefix(*nibble_count, trie_constants::BRANCH_WITH_MASK, output), + NodeHeader::Branch(false, nibble_count) => + encode_size_and_prefix(*nibble_count, trie_constants::BRANCH_WITHOUT_MASK, output), + NodeHeader::Leaf(nibble_count) => + encode_size_and_prefix(*nibble_count, trie_constants::LEAF_PREFIX_MASK, output), } } } impl Decode for NodeHeader { fn decode(input: &mut I) -> Option { - Some(match input.read_byte()? { - EMPTY_TRIE => NodeHeader::Null, // 0 + let i = input.read_byte()?; + if i == trie_constants::EMPTY_TRIE { + return Some(NodeHeader::Null); + } + match i & (0b11 << 6) { + trie_constants::LEAF_PREFIX_MASK => Some(NodeHeader::Leaf(decode_size(i, input)?)), + trie_constants::BRANCH_WITHOUT_MASK => Some(NodeHeader::Branch(false, decode_size(i, input)?)), + trie_constants::BRANCH_WITH_MASK => Some(NodeHeader::Branch(true, decode_size(i, input)?)), + // do not allow any special encoding + _ => None, + } + } +} - i @ LEAF_NODE_OFFSET ..= LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) - NodeHeader::Leaf((i - LEAF_NODE_OFFSET) as usize), - LEAF_NODE_BIG => // 127 - NodeHeader::Leaf(input.read_byte()? as usize + LEAF_NODE_THRESHOLD as usize), +/// Returns an iterator over encoded bytes for node header and size. +/// Size encoding allows unlimited, length unefficient, representation, but +/// is bounded to 16 bit maximum value to avoid possible DOS. +pub(crate) fn size_and_prefix_iterator(size: usize, prefix: u8) -> impl Iterator { + let size = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, size); - i @ EXTENSION_NODE_OFFSET ..= EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) - NodeHeader::Extension((i - EXTENSION_NODE_OFFSET) as usize), - EXTENSION_NODE_BIG => // 253 - NodeHeader::Extension(input.read_byte()? as usize + EXTENSION_NODE_THRESHOLD as usize), + let l1 = rstd::cmp::min(62, size); + let (first_byte, mut rem) = if size == l1 { + (once(prefix + l1 as u8), 0) + } else { + (once(prefix + 63), size - l1) + }; + let next_bytes = move || { + if rem > 0 { + if rem < 256 { + let result = rem - 1; + rem = 0; + Some(result as u8) + } else { + rem = rem.saturating_sub(255); + Some(255) + } + } else { + None + } + }; + first_byte.chain(rstd::iter::from_fn(next_bytes)) +} - BRANCH_NODE_NO_VALUE => NodeHeader::Branch(false), // 254 - BRANCH_NODE_WITH_VALUE => NodeHeader::Branch(true), // 255 - }) +/// Encodes size and prefix to a stream output. +fn encode_size_and_prefix(size: usize, prefix: u8, out: &mut impl Output) { + for b in size_and_prefix_iterator(size, prefix) { + out.push_byte(b) + } +} + +/// Decode size only from stream input and header byte. +fn decode_size(first: u8, input: &mut impl Input) -> Option { + let mut result = (first & 255u8 >> 2) as usize; + if result < 63 { + return Some(result); + } + result -= 1; + while result <= trie_constants::NIBBLE_SIZE_BOUND { + let n = input.read_byte()? as usize; + if n < 255 { + return Some(result + n + 1); + } + result += 255; } + Some(trie_constants::NIBBLE_SIZE_BOUND) } diff --git a/core/trie/src/trie_stream.rs b/core/trie/src/trie_stream.rs index 913cff2c5a..2629cefac8 100644 --- a/core/trie/src/trie_stream.rs +++ b/core/trie/src/trie_stream.rs @@ -16,16 +16,19 @@ //! `TrieStream` implementation for Substrate's trie format. -use rstd::iter::once; use hash_db::Hasher; use trie_root; use codec::Encode; use rstd::vec::Vec; +use crate::trie_constants; +use crate::node_header::{NodeKind, size_and_prefix_iterator}; +use crate::node_codec::Bitmap; -use super::{EMPTY_TRIE, LEAF_NODE_OFFSET, LEAF_NODE_BIG, EXTENSION_NODE_OFFSET, - EXTENSION_NODE_BIG, branch_node}; +const BRANCH_NODE_NO_VALUE: u8 = 254; +const BRANCH_NODE_WITH_VALUE: u8 = 255; -/// Codec-flavored TrieStream +#[derive(Default, Clone)] +/// Codec-flavored TrieStream. pub struct TrieStream { buffer: Vec, } @@ -35,62 +38,102 @@ impl TrieStream { pub fn as_raw(&self) -> &[u8] { &self.buffer } } -/// Create a leaf/extension node, encoding a number of nibbles. Note that this -/// cannot handle a number of nibbles that is zero or greater than 127 and if -/// you attempt to do so *IT WILL PANIC*. -fn fuse_nibbles_node<'a>(nibbles: &'a [u8], leaf: bool) -> impl Iterator + 'a { - debug_assert!(nibbles.len() < 255 + 126, "nibbles length too long. what kind of size of key are you trying to include in the trie!?!"); - // We use two ranges of possible values; one for leafs and the other for extensions. - // Each range encodes zero following nibbles up to some maximum. If the maximum is - // reached, then it is considered "big" and a second byte follows it in order to - // encode a further offset to the number of nibbles of up to 255. Beyond that, we - // cannot encode. This shouldn't be a problem though since that allows for keys of - // up to 380 nibbles (190 bytes) and we expect key sizes to be generally 128-bit (16 - // bytes) or, at a push, 384-bit (48 bytes). - - let (first_byte_small, big_threshold) = if leaf { - (LEAF_NODE_OFFSET, (LEAF_NODE_BIG - LEAF_NODE_OFFSET) as usize) - } else { - (EXTENSION_NODE_OFFSET, (EXTENSION_NODE_BIG - EXTENSION_NODE_OFFSET) as usize) +fn branch_node_bit_mask(has_children: impl Iterator) -> (u8, u8) { + let mut bitmap: u16 = 0; + let mut cursor: u16 = 1; + for v in has_children { + if v { bitmap |= cursor } + cursor <<= 1; + } + ((bitmap % 256 ) as u8, (bitmap / 256 ) as u8) +} + + +/// Create a leaf/branch node, encoding a number of nibbles. +fn fuse_nibbles_node<'a>(nibbles: &'a [u8], kind: NodeKind) -> impl Iterator + 'a { + let size = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, nibbles.len()); + + let iter_start = match kind { + NodeKind::Leaf => size_and_prefix_iterator(size, trie_constants::LEAF_PREFIX_MASK), + NodeKind::BranchNoValue => size_and_prefix_iterator(size, trie_constants::BRANCH_WITHOUT_MASK), + NodeKind::BranchWithValue => size_and_prefix_iterator(size, trie_constants::BRANCH_WITH_MASK), }; - let first_byte = first_byte_small + nibbles.len().min(big_threshold) as u8; - once(first_byte) - .chain(if nibbles.len() >= big_threshold { Some((nibbles.len() - big_threshold) as u8) } else { None }) + iter_start .chain(if nibbles.len() % 2 == 1 { Some(nibbles[0]) } else { None }) .chain(nibbles[nibbles.len() % 2..].chunks(2).map(|ch| ch[0] << 4 | ch[1])) } + impl trie_root::TrieStream for TrieStream { - fn new() -> Self { Self {buffer: Vec::new() } } + + fn new() -> Self { + TrieStream { + buffer: Vec::new() + } + } + fn append_empty_data(&mut self) { - self.buffer.push(EMPTY_TRIE); + self.buffer.push(trie_constants::EMPTY_TRIE); } fn append_leaf(&mut self, key: &[u8], value: &[u8]) { - self.buffer.extend(fuse_nibbles_node(key, true)); + self.buffer.extend(fuse_nibbles_node(key, NodeKind::Leaf)); value.encode_to(&mut self.buffer); } - fn begin_branch(&mut self, maybe_value: Option<&[u8]>, has_children: impl Iterator) { - self.buffer.extend(&branch_node(maybe_value.is_some(), has_children)); - // Push the value if one exists. + + fn begin_branch( + &mut self, + maybe_partial: Option<&[u8]>, + maybe_value: Option<&[u8]>, + has_children: impl Iterator, + ) { + if let Some(partial) = maybe_partial { + if maybe_value.is_some() { + self.buffer.extend(fuse_nibbles_node(partial, NodeKind::BranchWithValue)); + } else { + self.buffer.extend(fuse_nibbles_node(partial, NodeKind::BranchNoValue)); + } + let bm = branch_node_bit_mask(has_children); + self.buffer.extend([bm.0,bm.1].iter()); + } else { + debug_assert!(false, "trie stream codec only for no extension trie"); + self.buffer.extend(&branch_node(maybe_value.is_some(), has_children)); + } if let Some(value) = maybe_value { value.encode_to(&mut self.buffer); } } - fn append_extension(&mut self, key: &[u8]) { - self.buffer.extend(fuse_nibbles_node(key, false)); + + fn append_extension(&mut self, _key: &[u8]) { + debug_assert!(false, "trie stream codec only for no extension trie"); } + fn append_substream(&mut self, other: Self) { let data = other.out(); match data.len() { - 0..=31 => { - data.encode_to(&mut self.buffer) - }, - _ => { - H::hash(&data).as_ref().encode_to(&mut self.buffer) - } + 0..=31 => data.encode_to(&mut self.buffer), + _ => H::hash(&data).as_ref().encode_to(&mut self.buffer), } } fn out(self) -> Vec { self.buffer } } + +fn branch_node(has_value: bool, has_children: impl Iterator) -> [u8; 3] { + let mut result = [0, 0, 0]; + branch_node_buffered(has_value, has_children, &mut result[..]); + result +} + +fn branch_node_buffered(has_value: bool, has_children: I, output: &mut[u8]) + where + I: Iterator, +{ + let first = if has_value { + BRANCH_NODE_WITH_VALUE + } else { + BRANCH_NODE_NO_VALUE + }; + output[0] = first; + Bitmap::encode(has_children, &mut output[1..]); +} diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index 4c85ef3817..ad626beb0b 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -18,7 +18,7 @@ tokio = "0.1" exit-future = "0.1" parking_lot = "0.8.0" parity-codec = "4.1.1" -trie-root = "0.14.0" +trie-root = "0.15.0" sr-io = { path = "../core/sr-io" } substrate-cli = { path = "../core/cli" } primitives = { package = "substrate-primitives", path = "../core/primitives" } diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 1849e1eeed..44a56ee4a6 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -6,7 +6,7 @@ description = "Substrate node implementation in Rust." edition = "2018" [dependencies] -trie-root = "0.14.0" +trie-root = "0.15.0" parity-codec = "4.1.1" runtime_io = { package = "sr-io", path = "../../core/sr-io" } state_machine = { package = "substrate-state-machine", path = "../../core/state-machine" } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index e9c7f4e1cb..572d0ca149 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -403,13 +403,13 @@ mod tests { parent_hash: Hash, extrinsics: Vec, ) -> (Vec, Hash) { - use trie::ordered_trie_root; + use trie::{TrieConfiguration, trie_types::Layout}; // sign extrinsics. let extrinsics = extrinsics.into_iter().map(sign).collect::>(); // calculate the header fields that we can. - let extrinsics_root = ordered_trie_root::( + let extrinsics_root = Layout::::ordered_trie_root( extrinsics.iter().map(Encode::encode) ).to_fixed_bytes() .into(); diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index e9ae43be03..c6b74293b8 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,8 +79,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 126, - impl_version: 126, + spec_version: 127, + impl_version: 127, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 835b167e3d..062badd932 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -500,7 +500,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("ba811447b8ae3bf798a07a18f5355ea59926917c8a9cc7527ede20b261aacfdf").into(), + state_root: hex!("3e51b47b6cc8449eece93eee4b01f03b00a0ca7981c0b6c0447b6e0d50ca886d").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, diff --git a/srml/session/src/historical.rs b/srml/session/src/historical.rs index 402a73adf3..1e8e7faaaf 100644 --- a/srml/session/src/historical.rs +++ b/srml/session/src/historical.rs @@ -33,8 +33,8 @@ use srml_support::{ StorageValue, StorageMap, decl_module, decl_storage, }; use srml_support::{Parameter, print}; -use substrate_trie::{MemoryDB, Trie, TrieMut, TrieDBMut, TrieDB, Recorder}; - +use substrate_trie::{MemoryDB, Trie, TrieMut, Recorder, EMPTY_PREFIX}; +use substrate_trie::trie_types::{TrieDBMut, TrieDB}; use super::{SessionIndex, Module as SessionModule}; /// Trait necessary for the historical module. @@ -219,7 +219,7 @@ impl ProvingTrie { let mut memory_db = MemoryDB::default(); for node in nodes { - HashDBT::insert(&mut memory_db, &[], &node[..]); + HashDBT::insert(&mut memory_db, EMPTY_PREFIX, &node[..]); } ProvingTrie { -- GitLab From 3181e0cb14f665de2f8b3999d42b64132f894360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 2 Aug 2019 18:52:36 +0100 Subject: [PATCH 083/151] node: use BABE predigest data to find authorship (#3293) * node: use BABE predigest data to find authorship * node: bump spec_version * babe: use u32 for authority index --- core/consensus/babe/primitives/src/lib.rs | 2 +- core/consensus/babe/src/lib.rs | 6 +++--- node/runtime/src/lib.rs | 3 +-- srml/babe/src/lib.rs | 6 +++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 9d69fb14bb..d169406b33 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -53,7 +53,7 @@ pub const VRF_PROOF_LENGTH: usize = 64; pub const PUBLIC_KEY_LENGTH: usize = 32; /// The index of an authority. -pub type AuthorityIndex = u64; +pub type AuthorityIndex = u32; /// A slot number. pub type SlotNumber = u64; diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index fae6fb3c32..50271b0d45 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -321,7 +321,7 @@ impl SlotWorker for BabeWorker w let inherent_digest = BabePreDigest { vrf_proof, vrf_output: inout.to_output(), - authority_index: authority_index as u64, + authority_index: authority_index as u32, slot_number, }; @@ -491,7 +491,7 @@ fn check_header( if slot_number > slot_now { header.digest_mut().push(seal); Ok(CheckedHeader::Deferred(header, slot_number)) - } else if authority_index > authorities.len() as u64 { + } else if authority_index > authorities.len() as u32 { Err(babe_err!("Slot author not found")) } else { let (pre_hash, author) = (header.hash(), &authorities[authority_index as usize].0); @@ -1219,7 +1219,7 @@ pub mod test_helpers { BabePreDigest { vrf_proof, vrf_output: inout.to_output(), - authority_index: authority_index as u64, + authority_index: authority_index as u32, slot_number, } }) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c6b74293b8..5b83ccf679 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -180,9 +180,8 @@ parameter_types! { pub const UncleGenerations: u64 = 0; } -// TODO: #2986 implement this properly impl authorship::Trait for Runtime { - type FindAuthor = (); + type FindAuthor = session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = Staking; diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index 91ad5f3a85..a47fb04c2f 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -202,8 +202,8 @@ impl RandomnessBeacon for Module { /// A BABE public key pub type BabeKey = [u8; PUBLIC_KEY_LENGTH]; -impl FindAuthor for Module { - fn find_author<'a, I>(digests: I) -> Option where +impl FindAuthor for Module { + fn find_author<'a, I>(digests: I) -> Option where I: 'a + IntoIterator { for (id, mut data) in digests.into_iter() { @@ -341,7 +341,7 @@ impl session::OneSessionHandler for Mod } fn on_disabled(i: usize) { - Self::deposit_consensus(ConsensusLog::OnDisabled(i as u64)) + Self::deposit_consensus(ConsensusLog::OnDisabled(i as u32)) } } -- GitLab From 523e2575143c4b72f3968a086ea5e975d296df29 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 2 Aug 2019 19:52:55 +0200 Subject: [PATCH 084/151] Switch RPCs to stable futures (#3287) --- core/rpc/src/helpers.rs | 5 +++-- core/rpc/src/system/mod.rs | 8 ++++---- core/rpc/src/system/tests.rs | 6 +++--- core/service/src/components.rs | 3 ++- core/service/src/lib.rs | 8 ++++++-- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/core/rpc/src/helpers.rs b/core/rpc/src/helpers.rs index ccfde6afb5..2c69ead76c 100644 --- a/core/rpc/src/helpers.rs +++ b/core/rpc/src/helpers.rs @@ -14,11 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use futures::{prelude::*, sync::oneshot}; +use futures::prelude::*; +use futures03::{channel::oneshot, compat::Compat}; /// Wraps around `oneshot::Receiver` and adjusts the error type to produce an internal error if the /// sender gets dropped. -pub struct Receiver(pub oneshot::Receiver); +pub struct Receiver(pub Compat>); impl Future for Receiver { type Item = T; diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index c8cf97c658..59ed73b588 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -23,7 +23,7 @@ pub mod helpers; mod tests; use crate::helpers::Receiver; -use futures::sync::{mpsc, oneshot}; +use futures03::{channel::{mpsc, oneshot}, compat::Compat}; use jsonrpc_derive::rpc; use network; use sr_primitives::traits::{self, Header as HeaderT}; @@ -124,18 +124,18 @@ impl SystemApi::Number> for Sy fn system_health(&self) -> Receiver { let (tx, rx) = oneshot::channel(); let _ = self.send_back.unbounded_send(Request::Health(tx)); - Receiver(rx) + Receiver(Compat::new(rx)) } fn system_peers(&self) -> Receiver::Number>>> { let (tx, rx) = oneshot::channel(); let _ = self.send_back.unbounded_send(Request::Peers(tx)); - Receiver(rx) + Receiver(Compat::new(rx)) } fn system_network_state(&self) -> Receiver { let (tx, rx) = oneshot::channel(); let _ = self.send_back.unbounded_send(Request::NetworkState(tx)); - Receiver(rx) + Receiver(Compat::new(rx)) } } diff --git a/core/rpc/src/system/tests.rs b/core/rpc/src/system/tests.rs index 2dc4139da3..70e8b4b95b 100644 --- a/core/rpc/src/system/tests.rs +++ b/core/rpc/src/system/tests.rs @@ -20,7 +20,7 @@ use network::{self, PeerId}; use network::config::Roles; use test_client::runtime::Block; use assert_matches::assert_matches; -use futures::{prelude::*, sync::mpsc}; +use futures03::{prelude::*, channel::mpsc}; use std::thread; struct Status { @@ -46,7 +46,7 @@ fn api>>(sync: T) -> System { let should_have_peers = !status.is_dev; let (tx, rx) = mpsc::unbounded(); thread::spawn(move || { - tokio::run(rx.for_each(move |request| { + futures03::executor::block_on(rx.for_each(move |request| { match request { Request::Health(sender) => { let _ = sender.send(Health { @@ -82,7 +82,7 @@ fn api>>(sync: T) -> System { } }; - Ok(()) + future::ready(()) })) }); System::new(SystemInfo { diff --git a/core/service/src/components.rs b/core/service/src/components.rs index dff6161f16..570e894c39 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -32,7 +32,8 @@ use sr_primitives::{ use crate::config::Configuration; use primitives::{Blake2Hasher, H256, Pair}; use rpc::{self, apis::system::SystemInfo}; -use futures::{prelude::*, future::Executor, sync::mpsc}; +use futures::{prelude::*, future::Executor}; +use futures03::channel::mpsc; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 9f5de4de1b..cd904156c5 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -407,7 +407,7 @@ impl Service { let _ = to_spawn_tx.unbounded_send(Box::new(tel_task)); // RPC - let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded(); + let (system_rpc_tx, system_rpc_rx) = futures03::channel::mpsc::unbounded(); let gen_handler = || { let system_info = rpc::apis::system::SystemInfo { chain_name: config.chain_spec.name().into(), @@ -635,9 +635,13 @@ fn build_network_future< mut network: network::NetworkWorker, S, H>, client: Arc>, status_sinks: Arc>, NetworkState)>>>>, - mut rpc_rx: mpsc::UnboundedReceiver>>, + rpc_rx: futures03::channel::mpsc::UnboundedReceiver>>, should_have_peers: bool, ) -> impl Future { + // Compatibility shim while we're transitionning to stable Futures. + // See https://github.com/paritytech/substrate/issues/3099 + let mut rpc_rx = futures03::compat::Compat::new(rpc_rx.map(|v| Ok::<_, ()>(v))); + // Interval at which we send status updates on the status stream. const STATUS_INTERVAL: Duration = Duration::from_millis(5000); let mut status_interval = tokio_timer::Interval::new_interval(STATUS_INTERVAL); -- GitLab From 805cd6b03e2efb530764f4a2a082918144a04609 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Fri, 2 Aug 2019 19:53:33 +0200 Subject: [PATCH 085/151] srml-contracts: Minor fixes to docs. (#3262) * Adjust documentation. * Bump impl_version. * Update srml/contracts/src/wasm/runtime.rs Co-Authored-By: Hero Bird * Remove incorrect doc. --- node/runtime/src/lib.rs | 2 +- srml/contracts/src/wasm/runtime.rs | 26 ++++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 5b83ccf679..9ab7b84853 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 127, - impl_version: 127, + impl_version: 128, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index fcbc113af9..006ec5aad2 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -300,9 +300,8 @@ define_env!(Env, , // Make a call to another contract. // - // Returns 0 on the successful execution and puts the result data returned - // by the callee into the scratch buffer. Otherwise, returns 1 and clears the scratch - // buffer. + // Returns 0 on the successful execution and puts the result data returned by the callee into + // the scratch buffer. Otherwise, returns a non-zero value and clears the scratch buffer. // // - callee_ptr: a pointer to the address of the callee contract. // Should be decodable as an `T::AccountId`. Traps otherwise. @@ -372,17 +371,16 @@ define_env!(Env, , } }, - // Instantiate a contract with code returned by the specified initializer code. + // Instantiate a contract with the specified code hash. // - // This function creates an account and executes initializer code. After the execution, - // the returned buffer is saved as the code of the created account. + // This function creates an account and executes the constructor defined in the code specified + // by the code hash. // - // Returns 0 on the successful contract creation and puts the address - // of the created contract into the scratch buffer. - // Otherwise, returns 1 and clears the scratch buffer. + // Returns 0 on the successful contract creation and puts the address of the created contract + // into the scratch buffer. Otherwise, returns non-zero value and clears the scratch buffer. // - // - init_code_ptr: a pointer to the buffer that contains the initializer code. - // - init_code_len: length of the initializer code buffer. + // - code_hash_ptr: a pointer to the buffer that contains the initializer code. + // - code_hash_len: length of the initializer code buffer. // - gas: how much gas to devote to the execution of the initializer code. // - value_ptr: a pointer to the buffer with value, how much value to send. // Should be decodable as a `T::Balance`. Traps otherwise. @@ -391,8 +389,8 @@ define_env!(Env, , // - input_data_len: length of the input data buffer. ext_create( ctx, - init_code_ptr: u32, - init_code_len: u32, + code_hash_ptr: u32, + code_hash_len: u32, gas: u64, value_ptr: u32, value_len: u32, @@ -400,7 +398,7 @@ define_env!(Env, , input_data_len: u32 ) -> u32 => { let code_hash = { - let code_hash_buf = read_sandbox_memory(ctx, init_code_ptr, init_code_len)?; + let code_hash_buf = read_sandbox_memory(ctx, code_hash_ptr, code_hash_len)?; ::T>>::decode(&mut &code_hash_buf[..]).ok_or_else(|| sandbox::HostError)? }; let value = { -- GitLab From 9ede42b1d21e16265172d647eab5146e308e6436 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sat, 3 Aug 2019 10:33:53 +0200 Subject: [PATCH 086/151] Mention that in_mem::Backend doesn't work (#3250) * Mention that in_mem::Backend doesn't work * Bigger warning --- core/client/src/in_mem.rs | 5 ++++- core/client/src/lib.rs | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index d392fbe9b2..c43c4e3197 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -532,7 +532,10 @@ where } } -/// In-memory backend. Keeps all states and blocks in memory. Useful for testing. +/// In-memory backend. Keeps all states and blocks in memory. +/// +/// > **Warning**: Doesn't support all the features necessary for a proper database. Only use this +/// > struct for testing purposes. Do **NOT** use in production. pub struct Backend where Block: BlockT, diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index a1351f20e4..aa16e20cd8 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -28,8 +28,7 @@ //! Creating a [`Client`] is done by calling the `new` method and passing to it a //! [`Backend`](backend::Backend) and an [`Executor`](CallExecutor). //! -//! The former is typically provided by the `substrate-client-db` crate, but [`in_mem::Backend`] -//! can be used for testing purposes. +//! The former is typically provided by the `substrate-client-db` crate. //! //! The latter typically requires passing one of: //! -- GitLab From a39e9ea986b80d92178a9260f22feb78140fe18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 5 Aug 2019 21:56:26 +0200 Subject: [PATCH 087/151] node: fix integration test transaction format (#3306) --- node/cli/src/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 3dbddd10f6..8fbd425da3 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -431,7 +431,7 @@ mod tests { let take_fees = balances::TakeFees::from(0); let extra = (check_genesis, check_era, check_nonce, check_weight, take_fees); - let raw_payload = (function, extra.clone(), genesis_hash); + let raw_payload = (function, extra.clone(), genesis_hash, genesis_hash); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) } else { -- GitLab From 4408fa7d17c4a25e859411dd1d046b86d5b0a339 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 6 Aug 2019 02:50:37 +0200 Subject: [PATCH 088/151] fix BABE randomness calculation (#3305) --- node/runtime/src/lib.rs | 4 +-- srml/babe/src/lib.rs | 56 +++++++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 9ab7b84853..06285571ba 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,8 +79,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 127, - impl_version: 128, + spec_version: 129, + impl_version: 129, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index a47fb04c2f..8e72fdffd4 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -22,7 +22,7 @@ pub use timestamp; use rstd::{result, prelude::*}; -use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get}; +use srml_support::{decl_storage, decl_module, StorageValue, StorageMap, traits::FindAuthor, traits::Get}; use timestamp::{OnTimestampSet}; use sr_primitives::{generic::DigestItem, ConsensusEngineId}; use sr_primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; @@ -115,6 +115,8 @@ pub trait Trait: timestamp::Trait { /// The length of the BABE randomness pub const RANDOMNESS_LENGTH: usize = 32; +const UNDER_CONSTRUCTION_SEGMENT_LENGTH: usize = 256; + decl_storage! { trait Store for Module as Babe { /// Current epoch index. @@ -150,7 +152,16 @@ decl_storage! { NextRandomness: [u8; 32 /* RANDOMNESS_LENGTH */]; /// Randomness under construction. - UnderConstruction: [u8; 32 /* VRF_OUTPUT_LENGTH */]; + /// + /// We make a tradeoff between storage accesses and list length. + /// We store the under-construction randomness in segments of up to + /// `UNDER_CONSTRUCTION_SEGMENT_LENGTH`. + /// + /// Once a segment reaches this length, we begin the next one. + /// We reset all segments and return to `0` at the beginning of every + /// epoch. + SegmentIndex build(|_| 0): u32; + UnderConstruction: map u32 => Vec<[u8; 32 /* VRF_OUTPUT_LENGTH */]>; } } @@ -248,19 +259,35 @@ impl Module { } fn deposit_vrf_output(vrf_output: &[u8; VRF_OUTPUT_LENGTH]) { - UnderConstruction::mutate(|z| z.iter_mut().zip(vrf_output).for_each(|(x, y)| *x^=y)) + let segment_idx = ::get(); + let mut segment = ::get(&segment_idx); + if segment.len() < UNDER_CONSTRUCTION_SEGMENT_LENGTH { + // push onto current segment: not full. + segment.push(*vrf_output); + ::insert(&segment_idx, &segment); + } else { + // move onto the next segment and update the index. + let segment_idx = segment_idx + 1; + ::insert(&segment_idx, vec![*vrf_output].as_ref()); + ::put(&segment_idx); + } } /// Call this function exactly once when an epoch changes, to update the /// randomness. Returns the new randomness. fn randomness_change_epoch(next_epoch_index: u64) -> [u8; RANDOMNESS_LENGTH] { let this_randomness = NextRandomness::get(); + let segment_idx: u32 = ::mutate(|s| rstd::mem::replace(s, 0)); + + // overestimate to the segment being full. + let rho_size = segment_idx.saturating_add(1) as usize * UNDER_CONSTRUCTION_SEGMENT_LENGTH; + let next_randomness = compute_randomness( this_randomness, next_epoch_index, - UnderConstruction::get(), + (0..segment_idx).flat_map(|i| ::take(&i)), + Some(rho_size), ); - UnderConstruction::put(&[0; RANDOMNESS_LENGTH]); NextRandomness::put(&next_randomness); this_randomness } @@ -345,15 +372,24 @@ impl session::OneSessionHandler for Mod } } +// compute randomness for a new epoch. rho is the concatenation of all +// VRF outputs in the prior epoch. +// +// an optional size hint as to how many VRF outputs there were may be provided. fn compute_randomness( last_epoch_randomness: [u8; RANDOMNESS_LENGTH], epoch_index: u64, - rho: [u8; VRF_OUTPUT_LENGTH], + rho: impl Iterator, + rho_size_hint: Option, ) -> [u8; RANDOMNESS_LENGTH] { - let mut s = [0; 40 + VRF_OUTPUT_LENGTH]; - s[..32].copy_from_slice(&last_epoch_randomness); - s[32..40].copy_from_slice(&epoch_index.to_le_bytes()); - s[40..].copy_from_slice(&rho); + let mut s = Vec::with_capacity(40 + rho_size_hint.unwrap_or(0) * VRF_OUTPUT_LENGTH); + s.extend_from_slice(&last_epoch_randomness); + s.extend_from_slice(&epoch_index.to_le_bytes()); + + for vrf_output in rho { + s.extend_from_slice(&vrf_output[..]); + } + runtime_io::blake2_256(&s) } -- GitLab From 5342c6309490aa37de3a5a3dbc19c4542294bc91 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Tue, 6 Aug 2019 10:12:53 +0200 Subject: [PATCH 089/151] Improve internal doc of inflation module (#3288) * improve internal doc * Apply suggestions from code review Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * correct spelling * Apply suggestions from code review Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * improve not confusing expression * improve general doc --- srml/staking/src/inflation.rs | 87 ++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/srml/staking/src/inflation.rs b/srml/staking/src/inflation.rs index f80e94f7c4..80065886d7 100644 --- a/srml/staking/src/inflation.rs +++ b/srml/staking/src/inflation.rs @@ -14,21 +14,61 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! http://research.web3.foundation/en/latest/polkadot/Token%20Economics/#inflation-model +//! This module expose one function `P_NPoS` (Payout NPoS) or `compute_total_payout` which returns +//! the total payout for the era given the era duration and the staking rate in NPoS. +//! The staking rate in NPoS is the total amount of tokens staked by nominators and validators, +//! divided by the total token supply. +//! +//! This payout is computed from the desired yearly inflation `I_NPoS`. +//! +//! `I_NPoS` is defined as such: +//! +//! let's introduce some constant: +//! * `I0` represents a tight upper-bound on our estimate of the operational costs of all +//! validators, expressed as a fraction of the total token supply. I_NPoS must be always +//! superior or equal to this value. +//! * `x_ideal` the ideal staking rate in NPoS. +//! * `i_ideal` the ideal yearly interest rate: the ideal total yearly amount of tokens minted to +//! pay all validators and nominators for NPoS, divided by the total amount of tokens staked by +//! them. `i(x) = I(x)/x` and `i(x_ideal) = i_deal` +//! * `d` decay rate. +//! +//! We define I_NPoS as a linear function from 0 to `x_ideal` and an exponential decrease after +//! `x_ideal` to 1. We choose exponential decrease for `I_NPoS` because this implies an exponential +//! decrease for the yearly interest rate as well, and we want the interest rate to fall sharply +//! beyond `x_ideal` to avoid illiquidity. +//! +//! Function is defined as such: +//! ```nocompile +//! for 0 < x < x_ideal: I_NPoS(x) = I0 + x*(i_ideal - I0/x_ideal) +//! for x_ideal < x < 1: I_NPoS(x) = I0 + (i_ideal*x_ideal - I0)*2^((x_ideal-x)/d) +//! ``` +//! +//! Thus we have the following properties: +//! * `I_NPoS > I0` +//! * `I_NPoS(0) = I0` +//! * `I_NPoS(x_ideal) = max(I_NPoS) = x_ideal*i_ideal` +//! * `i(x)` is monotone decreasing +//! +//! More details can be found [here](http://research.web3.foundation/en/latest/polkadot/Token%20Eco +//! nomics/#inflation-model) + use sr_primitives::{Perbill, traits::SimpleArithmetic}; -/// Linear function truncated to positive part `y = max(0, b [+ or -] a*x)` for PNPoS usage +/// Linear function truncated to positive part `y = max(0, b [+ or -] a*x)` for `P_NPoS` usage. #[derive(Debug, PartialEq, Eq, Clone, Copy)] struct Linear { + // Negate the `a*x` term. negative_a: bool, - // Perbill + // Per-billion representation of `a`, the x coefficient. a: u32, - // Perbill + // Per-billion representation of `b`, the intercept. b: u32, } impl Linear { + /// Compute `f(n/d)*d`. This is useful to avoid loss of precision. fn calculate_for_fraction_times_denominator(&self, n: N, d: N) -> N where N: SimpleArithmetic + Clone @@ -41,22 +81,28 @@ impl Linear { } } -/// Piecewise Linear function for PNPoS usage +/// Piecewise Linear function for `P_NPoS` usage #[derive(Debug, PartialEq, Eq)] struct PiecewiseLinear { - /// Array of tuple of Abscisse in Perbill and Linear. + /// Array of tuples of an abscissa in a per-billion representation and a linear function. + /// + /// Abscissas in the array must be in order from the lowest to the highest. /// - /// Each piece start with at the abscisse up to the abscisse of the next piece. + /// The array defines a piecewise linear function as such: + /// * the n-th segment starts at the abscissa of the n-th element until the abscissa of the + /// n-th + 1 element, and is defined by the linear function of the n-th element + /// * last segment doesn't end pieces: [(u32, Linear); 20], } impl PiecewiseLinear { + /// Compute `f(n/d)*d`. This is useful to avoid loss of precision. fn calculate_for_fraction_times_denominator(&self, n: N, d: N) -> N where N: SimpleArithmetic + Clone { let part = self.pieces.iter() - .take_while(|(abscisse, _)| n > Perbill::from_parts(*abscisse) * d.clone()) + .take_while(|(abscissa, _)| n > Perbill::from_parts(*abscissa) * d.clone()) .last() .unwrap_or(&self.pieces[0]); @@ -64,7 +110,16 @@ impl PiecewiseLinear { } } -// Piecewise linear approximation of I_NPoS. +/// Piecewise linear approximation of `I_NPoS`. +/// +/// Using the constants: +/// * `I_0` = 0.025; +/// * `i_ideal` = 0.2; +/// * `x_ideal` = 0.5; +/// * `d` = 0.05; +/// +/// This approximation is tested to be close to real one by an error less than 1% see +/// `i_npos_precision` test. const I_NPOS: PiecewiseLinear = PiecewiseLinear { pieces: [ (0, Linear { negative_a: false, a: 150000000, b: 25000000 }), @@ -90,7 +145,7 @@ const I_NPOS: PiecewiseLinear = PiecewiseLinear { ] }; -/// Second per year for the Julian year (365.25 days) +/// Second per year for the Julian year (365.25 days). const SECOND_PER_YEAR: u32 = 3600*24*36525/100; /// The total payout to all validators (and their nominators) per era. @@ -147,19 +202,19 @@ mod test_inflation { const x_ideal: f64 = 0.5; const d: f64 = 0.05; - // Part left to 0.5 + // Left part from `x_ideal` fn I_left(x: f64) -> f64 { I_0 + x * (i_ideal - I_0/x_ideal) } - // Part right to 0.5 + // Right part from `x_ideal` fn I_right(x: f64) -> f64 { I_0 + (i_ideal*x_ideal - I_0) * 2_f64.powf((x_ideal-x)/d) } // Definition of I_NPoS in float fn I_full(x: f64) -> f64 { - if x <= 0.5 { + if x <= x_ideal { I_left(x) } else { I_right(x) @@ -172,11 +227,11 @@ mod test_inflation { // Points for left part points.push((0.0, I_0)); - points.push((0.5, I_left(0.5))); + points.push((x_ideal, I_left(x_ideal))); // Approximation for right part. // - // We start from 0.5 (x0) and we try to find the next point (x1) for which the linear + // We start from x_ideal (x0) and we try to find the next point (x1) for which the linear // approximation of (x0, x1) doesn't deviate from float definition by an error of // GEN_ERROR. @@ -186,7 +241,7 @@ mod test_inflation { // Max error used for generating points. const GEN_ERROR: f64 = 0.000_1; - let mut x0: f64 = 0.5; + let mut x0: f64 = x_ideal; let mut x1: f64 = x0; // This is just a step used to find next x1: -- GitLab From 3198388248bbcbad019a5810a36523bc60b0e47f Mon Sep 17 00:00:00 2001 From: thiolliere Date: Tue, 6 Aug 2019 19:36:23 +0200 Subject: [PATCH 090/151] Update to parity-scale-codec (#3232) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP: update codec * WIP * compiling * WIP * rename parity-scale-codec to codec * WIP * fix * remove old comments * use published crates * fix expected error msg * bump version * fmt and fix * remove old comment * fix wrong decoding impl * implement encode like for structures * undo removal of old pending changes * trailingzeroinput * Apply suggestions from code review Co-Authored-By: Bastian Köcher Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * update codec * fmt * version is 1.0.0 * show more error * fmt --- Cargo.lock | 233 ++++++++++-------- core/basic-authorship/Cargo.toml | 2 +- core/basic-authorship/src/basic_authorship.rs | 2 +- core/cli/src/lib.rs | 17 +- core/client/Cargo.toml | 4 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/cache/list_entry.rs | 2 +- core/client/db/src/cache/list_storage.rs | 8 +- core/client/db/src/cache/mod.rs | 2 +- core/client/db/src/lib.rs | 16 +- core/client/db/src/light.rs | 7 +- core/client/db/src/utils.rs | 14 +- .../client/src/block_builder/block_builder.rs | 2 +- core/client/src/call_executor.rs | 2 +- core/client/src/children.rs | 6 +- core/client/src/cht.rs | 2 +- core/client/src/client.rs | 4 +- core/client/src/error.rs | 6 +- core/client/src/genesis.rs | 2 +- core/client/src/leaves.rs | 10 +- core/client/src/light/call_executor.rs | 4 +- core/client/src/light/fetcher.rs | 6 +- core/client/src/runtime_api.rs | 2 +- core/consensus/aura/Cargo.toml | 2 +- core/consensus/aura/primitives/Cargo.toml | 4 +- core/consensus/aura/primitives/src/lib.rs | 2 +- core/consensus/aura/src/digest.rs | 2 +- core/consensus/aura/src/lib.rs | 6 +- core/consensus/babe/Cargo.toml | 4 +- core/consensus/babe/primitives/Cargo.toml | 4 +- core/consensus/babe/primitives/src/digest.rs | 54 +++- core/consensus/babe/primitives/src/lib.rs | 2 +- core/consensus/babe/src/aux_schema.rs | 8 +- core/consensus/babe/src/lib.rs | 6 +- core/consensus/babe/src/tests.rs | 6 - core/consensus/common/Cargo.toml | 2 +- core/consensus/common/primitives/Cargo.toml | 4 +- core/consensus/common/primitives/src/lib.rs | 2 +- core/consensus/common/src/evaluation.rs | 8 +- core/consensus/rhd/Cargo.toml | 4 +- core/consensus/rhd/src/lib.rs | 2 +- core/consensus/slots/Cargo.toml | 2 +- core/consensus/slots/src/aux_schema.rs | 4 +- core/consensus/slots/src/lib.rs | 2 +- core/executor/Cargo.toml | 2 +- core/executor/src/lib.rs | 2 +- core/executor/src/native_executor.rs | 2 +- core/executor/src/sandbox.rs | 6 +- core/executor/src/wasm_executor.rs | 10 +- core/executor/src/wasm_runtimes_cache.rs | 6 +- core/finality-grandpa/Cargo.toml | 6 +- core/finality-grandpa/primitives/Cargo.toml | 4 +- core/finality-grandpa/primitives/src/lib.rs | 2 +- core/finality-grandpa/src/authorities.rs | 6 +- core/finality-grandpa/src/aux_schema.rs | 6 +- .../src/communication/gossip.rs | 34 +-- .../finality-grandpa/src/communication/mod.rs | 14 +- .../src/communication/periodic.rs | 2 +- .../src/communication/tests.rs | 2 +- .../finality-grandpa/src/consensus_changes.rs | 2 +- core/finality-grandpa/src/environment.rs | 6 +- core/finality-grandpa/src/finality_proof.rs | 21 +- core/finality-grandpa/src/import.rs | 2 +- core/finality-grandpa/src/justification.rs | 4 +- core/finality-grandpa/src/lib.rs | 2 +- core/finality-grandpa/src/light_import.rs | 2 +- core/finality-grandpa/src/tests.rs | 4 +- core/inherents/Cargo.toml | 4 +- core/inherents/src/lib.rs | 5 +- core/network/Cargo.toml | 2 +- core/network/src/config.rs | 13 +- core/network/src/custom_proto/upgrade.rs | 13 +- core/network/src/protocol/message.rs | 10 +- core/offchain/Cargo.toml | 2 +- core/offchain/src/api.rs | 16 +- core/primitives/Cargo.toml | 6 +- core/primitives/src/changes_trie.rs | 2 +- core/primitives/src/crypto.rs | 2 +- core/primitives/src/ed25519.rs | 2 +- core/primitives/src/lib.rs | 21 +- core/primitives/src/offchain.rs | 4 +- core/primitives/src/sandbox.rs | 4 +- core/primitives/src/sr25519.rs | 2 +- core/primitives/src/uint.rs | 6 +- core/rpc/Cargo.toml | 2 +- core/rpc/src/author/error.rs | 9 +- core/rpc/src/author/mod.rs | 9 +- core/rpc/src/author/tests.rs | 2 +- core/service/Cargo.toml | 2 +- core/service/src/chain_ops.rs | 63 ++--- core/service/src/lib.rs | 45 ++-- core/sr-api-macros/Cargo.toml | 2 +- core/sr-api-macros/src/decl_runtime_apis.rs | 6 +- core/sr-api-macros/src/impl_runtime_apis.rs | 4 +- core/sr-io/Cargo.toml | 2 +- core/sr-io/src/lib.rs | 2 +- core/sr-io/without_std.rs | 4 +- core/sr-primitives/Cargo.toml | 4 +- core/sr-primitives/src/generic/digest.rs | 20 +- core/sr-primitives/src/generic/era.rs | 12 +- core/sr-primitives/src/generic/header.rs | 12 +- .../src/generic/unchecked_extrinsic.rs | 14 +- core/sr-primitives/src/lib.rs | 4 + core/sr-primitives/src/testing.rs | 10 +- core/sr-primitives/src/traits.rs | 43 +++- .../sr-primitives/src/transaction_validity.rs | 16 +- core/sr-sandbox/Cargo.toml | 2 +- core/sr-sandbox/without_std.rs | 2 +- core/sr-version/Cargo.toml | 4 +- core/sr-version/src/lib.rs | 4 +- core/state-db/Cargo.toml | 2 +- core/state-db/src/lib.rs | 11 +- core/state-db/src/noncanonical.rs | 6 +- core/state-db/src/pruning.rs | 6 +- core/state-machine/Cargo.toml | 2 +- core/state-machine/src/changes_trie/build.rs | 8 +- .../src/changes_trie/changes_iterator.rs | 8 +- core/state-machine/src/changes_trie/input.rs | 14 +- core/state-machine/src/changes_trie/mod.rs | 2 +- core/state-machine/src/ext.rs | 2 +- core/state-machine/src/lib.rs | 6 +- core/state-machine/src/overlayed_changes.rs | 6 +- core/state-machine/src/testing.rs | 2 +- core/state-machine/src/trie_backend.rs | 5 +- core/test-client/Cargo.toml | 2 +- core/test-client/src/client_ext.rs | 2 +- core/test-runtime/Cargo.toml | 4 +- core/test-runtime/src/genesismap.rs | 2 +- core/test-runtime/src/lib.rs | 9 +- core/test-runtime/src/system.rs | 2 +- core/transaction-pool/Cargo.toml | 2 +- core/transaction-pool/graph/Cargo.toml | 2 +- core/transaction-pool/graph/src/pool.rs | 2 +- core/transaction-pool/src/api.rs | 2 +- core/transaction-pool/src/tests.rs | 2 +- core/trie/Cargo.toml | 4 +- core/trie/src/error.rs | 20 +- core/trie/src/node_codec.rs | 13 +- core/trie/src/node_header.rs | 22 +- core/utils/fork-tree/Cargo.toml | 2 +- core/utils/fork-tree/src/lib.rs | 2 +- node-template/Cargo.toml | 2 +- node-template/runtime/Cargo.toml | 4 +- node/cli/Cargo.toml | 2 +- node/cli/src/factory_impl.rs | 3 +- node/cli/src/service.rs | 2 +- node/executor/Cargo.toml | 2 +- node/executor/src/lib.rs | 2 +- node/primitives/Cargo.toml | 4 +- node/runtime/Cargo.toml | 4 +- node/runtime/src/lib.rs | 2 +- srml/assets/Cargo.toml | 4 +- srml/aura/Cargo.toml | 4 +- srml/aura/src/lib.rs | 6 +- srml/authorship/Cargo.toml | 4 +- srml/authorship/src/lib.rs | 8 +- srml/babe/Cargo.toml | 4 +- srml/babe/src/lib.rs | 8 +- srml/balances/Cargo.toml | 4 +- srml/balances/src/lib.rs | 2 +- srml/collective/Cargo.toml | 4 +- srml/contracts/Cargo.toml | 4 +- srml/contracts/src/lib.rs | 2 +- srml/contracts/src/tests.rs | 2 +- srml/contracts/src/wasm/mod.rs | 2 +- srml/contracts/src/wasm/runtime.rs | 22 +- srml/democracy/Cargo.toml | 4 +- srml/democracy/src/lib.rs | 11 +- srml/democracy/src/vote_threshold.rs | 2 +- srml/elections/Cargo.toml | 4 +- srml/elections/src/lib.rs | 2 +- srml/example/Cargo.toml | 4 +- srml/executive/Cargo.toml | 4 +- srml/executive/src/lib.rs | 2 +- srml/finality-tracker/Cargo.toml | 4 +- srml/finality-tracker/src/lib.rs | 4 +- srml/generic-asset/Cargo.toml | 4 +- srml/generic-asset/src/lib.rs | 10 +- srml/grandpa/Cargo.toml | 4 +- srml/grandpa/src/lib.rs | 6 +- srml/grandpa/src/mock.rs | 2 +- srml/im-online/Cargo.toml | 4 +- srml/im-online/src/lib.rs | 6 +- srml/indices/Cargo.toml | 4 +- srml/indices/src/address.rs | 22 +- srml/indices/src/lib.rs | 2 +- srml/metadata/Cargo.toml | 4 +- srml/metadata/src/lib.rs | 22 +- srml/session/Cargo.toml | 4 +- srml/session/src/historical.rs | 10 +- srml/session/src/lib.rs | 2 +- srml/staking/Cargo.toml | 4 +- srml/staking/src/lib.rs | 2 +- srml/sudo/Cargo.toml | 4 +- srml/support/Cargo.toml | 2 +- srml/support/src/storage/hashed/generator.rs | 4 +- .../support/src/storage/unhashed/generator.rs | 2 +- srml/support/test/Cargo.toml | 4 +- srml/support/test/tests/final_keys.rs | 2 +- srml/support/test/tests/genesisconfig.rs | 4 +- srml/support/test/tests/instance.rs | 2 +- srml/system/Cargo.toml | 4 +- srml/system/src/lib.rs | 8 +- srml/timestamp/Cargo.toml | 4 +- srml/timestamp/src/lib.rs | 6 +- srml/treasury/Cargo.toml | 4 +- srml/treasury/src/lib.rs | 2 +- subkey/Cargo.toml | 2 +- subkey/src/main.rs | 10 +- test-utils/transaction-factory/Cargo.toml | 4 +- test-utils/transaction-factory/src/lib.rs | 2 +- 211 files changed, 867 insertions(+), 682 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8810fc7ebb..3b101fb31b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -833,15 +833,15 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -892,7 +892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "fork-tree" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1300,10 +1300,10 @@ dependencies = [ [[package]] name = "impl-codec" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2010,6 +2010,14 @@ dependencies = [ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -2249,7 +2257,7 @@ dependencies = [ "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -2287,7 +2295,7 @@ version = "2.0.0" dependencies = [ "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -2314,7 +2322,7 @@ dependencies = [ name = "node-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -2342,7 +2350,7 @@ version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2387,7 +2395,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "substrate-basic-authorship 2.0.0", @@ -2409,7 +2417,7 @@ dependencies = [ name = "node-template-runtime" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -2583,21 +2591,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parity-codec-derive" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parity-multiaddr" version = "0.5.0" @@ -2631,16 +2627,28 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "byte-slice-cast 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec-derive 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "vecarray 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-scale-codec-derive" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-send-wrapper" version = "0.1.0" @@ -2701,6 +2709,16 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -2751,6 +2769,20 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "paste" version = "0.1.5" @@ -2827,11 +2859,11 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fixed-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-codec 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-codec 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3159,13 +3191,13 @@ dependencies = [ [[package]] name = "rhododendron" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3559,7 +3591,7 @@ version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3581,7 +3613,7 @@ dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-offchain 2.0.0", @@ -3598,9 +3630,9 @@ dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3613,7 +3645,7 @@ name = "sr-sandbox" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -3633,7 +3665,7 @@ name = "sr-version" version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3643,7 +3675,7 @@ dependencies = [ name = "srml-assets" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3658,7 +3690,7 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3678,7 +3710,7 @@ dependencies = [ name = "srml-authorship" version = "0.1.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3693,7 +3725,7 @@ version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3713,7 +3745,7 @@ dependencies = [ name = "srml-balances" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3730,7 +3762,7 @@ name = "srml-collective" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3749,7 +3781,7 @@ dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3770,7 +3802,7 @@ dependencies = [ name = "srml-democracy" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3787,7 +3819,7 @@ name = "srml-elections" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3803,7 +3835,7 @@ dependencies = [ name = "srml-example" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3818,7 +3850,7 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3834,7 +3866,7 @@ dependencies = [ name = "srml-finality-tracker" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3849,7 +3881,7 @@ dependencies = [ name = "srml-generic-asset" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3863,7 +3895,7 @@ dependencies = [ name = "srml-grandpa" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3880,7 +3912,7 @@ dependencies = [ name = "srml-im-online" version = "0.1.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3895,7 +3927,7 @@ dependencies = [ name = "srml-indices" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3912,7 +3944,7 @@ dependencies = [ name = "srml-metadata" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -3923,7 +3955,7 @@ name = "srml-session" version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -3940,7 +3972,7 @@ dependencies = [ name = "srml-staking" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3961,7 +3993,7 @@ dependencies = [ name = "srml-sudo" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3978,7 +4010,7 @@ version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4027,7 +4059,7 @@ dependencies = [ name = "srml-support-test" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4042,7 +4074,7 @@ name = "srml-system" version = "2.0.0" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4056,7 +4088,7 @@ dependencies = [ name = "srml-timestamp" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4071,7 +4103,7 @@ dependencies = [ name = "srml-treasury" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4163,7 +4195,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4191,7 +4223,7 @@ version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -4261,7 +4293,7 @@ dependencies = [ "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", @@ -4289,7 +4321,7 @@ dependencies = [ "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4312,7 +4344,7 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4338,7 +4370,7 @@ dependencies = [ name = "substrate-consensus-aura-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4359,7 +4391,7 @@ dependencies = [ "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4387,7 +4419,7 @@ dependencies = [ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4405,7 +4437,7 @@ dependencies = [ "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4419,7 +4451,7 @@ dependencies = [ name = "substrate-consensus-common-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4433,9 +4465,9 @@ dependencies = [ "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rhododendron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rhododendron 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -4456,7 +4488,7 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4477,7 +4509,7 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4500,12 +4532,12 @@ name = "substrate-finality-grandpa" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "finality-grandpa 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "finality-grandpa 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4530,7 +4562,7 @@ dependencies = [ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4542,7 +4574,7 @@ dependencies = [ name = "substrate-inherents" version = "2.0.0" dependencies = [ - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4592,7 +4624,7 @@ dependencies = [ "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4626,7 +4658,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4684,10 +4716,10 @@ dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4716,7 +4748,7 @@ dependencies = [ "jsonrpc-derive 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4779,8 +4811,8 @@ dependencies = [ "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4830,7 +4862,7 @@ version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4843,7 +4875,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", @@ -4879,7 +4911,7 @@ version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", @@ -4897,7 +4929,7 @@ dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4942,7 +4974,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4957,7 +4989,7 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4976,7 +5008,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", "trie-bench 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5388,7 +5420,7 @@ name = "transaction-factory" version = "0.0.1" dependencies = [ "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", @@ -5406,7 +5438,7 @@ dependencies = [ "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6063,7 +6095,7 @@ dependencies = [ "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" -"checksum finality-grandpa 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e7cba2aaadf09932452a4fc054a77451b31eb99bc0b42bf54bd44f01a9daf4" +"checksum finality-grandpa 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9681c1f75941ea47584573dd2bc10558b2067d460612945887e00744e43393be" "checksum fixed-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "516877b7b9a1cc2d0293cbce23cd6203f0edbfd4090e6ca4489fecb5aa73050e" "checksum flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "550934ad4808d5d39365e5d61727309bf18b3b02c6c56b729cb92e7dd84bc3d8" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" @@ -6113,7 +6145,7 @@ dependencies = [ "checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" "checksum hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)" = "7cb44cbce9d8ee4fb36e4c0ad7b794ac44ebaad924b9c8291a63215bb44c2c8f" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum impl-codec 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62ed8ff267bc916dd848a800b96d3129aec73d5b23a5e3d018c83655d0c55371" +"checksum impl-codec 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "78c441b3d2b5e24b407161e76d482b7bbd29b5da357707839ac40d95152f031f" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" "checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" @@ -6171,6 +6203,7 @@ dependencies = [ "checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" +"checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c275b6ad54070ac2d665eef9197db647b32239c9d244bfb6f041a766d00da5b3" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" @@ -6213,10 +6246,10 @@ dependencies = [ "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2900f06356edf90de66a2922db622b36178dca71e85625eae58d0d9cc6cff2ac" -"checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" -"checksum parity-scale-codec 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b72212671aded3ca515379ea16aa774289e06cd595c7e31f06afdc48d6516e3" +"checksum parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "00fd14ff806ad82cea9a8f909bb116443d92efda7c9acd4502690af64741ad81" +"checksum parity-scale-codec-derive 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a81f3cd93ed368a8e41c4e79538e99ca6e8f536096de23e3a0bc3e782093ce28" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2005637ccf93dbb60c85081ccaaf3f945f573da48dcc79f27f9646caa3ec1dc" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" @@ -6224,10 +6257,12 @@ dependencies = [ "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" +"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" "checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" "checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" @@ -6238,7 +6273,7 @@ dependencies = [ "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -"checksum primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "366ef730e56c11fd21ab3e518866cf7feb0fdf7f7c16ddc68485579e9d802787" +"checksum primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e44400d651ca5276415dc8e00541c5c9d03844f1f0a87ad28f0a8fadcb2300bc" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "982a35d1194084ba319d65c4a68d24ca28f5fdb5b8bc20899e4eef8641ea5178" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" @@ -6275,7 +6310,7 @@ dependencies = [ "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" "checksum regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5485bf1523a9ed51c4964273f22f63f24e31632adb5dad134f488f86a3875c" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum rhododendron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "057fecd57cc69e24d9d215c9f283a42133c3f48952e4fc06b088ecf3ce3d90bb" +"checksum rhododendron 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "36542aafc2429a4c010fafa079a20dee953b663cb2427f51d86cf1d436846b4d" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" "checksum rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34fa7bcae7fca3c8471e8417088bbc3ad9af8066b0ecf4f3c0d98a0d772716e" diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index 9463e3c07f..e21c0abe68 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] log = "0.4" futures-preview = "0.3.0-alpha.17" -codec = { package = "parity-codec", version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } client = { package = "substrate-client", path = "../../core/client" } diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 2a3fe8dab8..2030f2be5a 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -213,7 +213,7 @@ impl Proposer, A> wh "hash" => ?::Hash::from(block.header().hash()), ); - if Decode::decode(&mut block.encode().as_slice()).as_ref() != Some(&block) { + if Decode::decode(&mut block.encode().as_slice()).as_ref() != Ok(&block) { error!("Failed to verify block encoding/decoding"); } diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 7cd7db8897..eb0e443a57 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -37,8 +37,8 @@ use network::{ use primitives::H256; use std::{ - io::{Write, Read, stdin, stdout, ErrorKind}, iter, fs::{self, File}, net::{Ipv4Addr, SocketAddr}, - path::{Path, PathBuf}, str::FromStr, + io::{Write, Read, Seek, Cursor, stdin, stdout, ErrorKind}, iter, fs::{self, File}, + net::{Ipv4Addr, SocketAddr}, path::{Path, PathBuf}, str::FromStr, }; use names::{Generator, Name}; @@ -628,6 +628,11 @@ where ).map_err(Into::into) } +/// Internal trait used to cast to a dynamic type that implements Read and Seek. +trait ReadPlusSeek: Read + Seek {} + +impl ReadPlusSeek for T {} + fn import_blocks( cli: ImportBlocksCmd, spec_factory: S, @@ -646,9 +651,13 @@ where ..Default::default() }; - let file: Box = match cli.input { + let file: Box = match cli.input { Some(filename) => Box::new(File::open(filename)?), - None => Box::new(stdin()), + None => { + let mut buffer = Vec::new(); + stdin().read_to_end(&mut buffer)?; + Box::new(Cursor::new(buffer)) + }, }; let fut = service::chain_ops::import_blocks::(config, exit.into_exit(), file)?; diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 6847e68d53..5848c67349 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -19,7 +19,7 @@ trie = { package = "substrate-trie", path = "../trie", optional = true } substrate-telemetry = { path = "../telemetry", optional = true } hash-db = { version = "0.15.0", default-features = false } kvdb = { git = "https://github.com/paritytech/parity-common", optional = true, rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } sr-primitives = { path = "../sr-primitives", default-features = false } runtime-version = { package = "sr-version", path = "../sr-version", default-features = false } @@ -36,7 +36,7 @@ kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b031 default = ["std"] std = [ "rstd/std", - "parity-codec/std", + "codec/std", "primitives/std", "inherents/std", "sr-primitives/std", diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 5c1a0de55c..5df825fe12 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -17,7 +17,7 @@ primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } client = { package = "substrate-client", path = "../../client" } state-machine = { package = "substrate-state-machine", path = "../../state-machine" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } executor = { package = "substrate-executor", path = "../../executor" } state_db = { package = "substrate-state-db", path = "../../state-db" } trie = { package = "substrate-trie", path = "../../trie" } diff --git a/core/client/db/src/cache/list_entry.rs b/core/client/db/src/cache/list_entry.rs index 2ec5f01a44..6de369ecf5 100644 --- a/core/client/db/src/cache/list_entry.rs +++ b/core/client/db/src/cache/list_entry.rs @@ -18,7 +18,7 @@ use client::error::Result as ClientResult; use sr_primitives::traits::{Block as BlockT, NumberFor}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::cache::{CacheItemT, ComplexBlockId}; use crate::cache::list_storage::{Storage}; diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index 3c4a7252f3..a7bfc4dd58 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use kvdb::{KeyValueDB, DBTransaction}; use client::error::{Error as ClientError, Result as ClientResult}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use crate::utils::{self, db_err, meta_keys}; @@ -151,7 +151,7 @@ impl Storage for DbStorage { .map_err(db_err) .and_then(|entry| match entry { Some(entry) => StorageEntry::::decode(&mut &entry[..]) - .ok_or_else(|| ClientError::Backend("Failed to decode cache entry".into())) + .map_err(|_| ClientError::Backend("Failed to decode cache entry".into())) .map(Some), None => Ok(None), }) @@ -236,9 +236,9 @@ mod meta { pub fn decode(encoded: &[u8]) -> ClientResult> { let input = &mut &*encoded; let finalized: Option> = Decode::decode(input) - .ok_or_else(|| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; + .map_err(|_| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; let unfinalized: Vec> = Decode::decode(input) - .ok_or_else(|| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; + .map_err(|_| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; Ok(Metadata { finalized, unfinalized }) } diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index a7632d6aeb..4d452b37d9 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -23,7 +23,7 @@ use kvdb::{KeyValueDB, DBTransaction}; use client::blockchain::Cache as BlockchainCache; use client::error::Result as ClientResult; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus_common::well_known_cache_keys::Id as CacheKeyId; diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index b22ffc50b5..a25ded0db3 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -42,7 +42,7 @@ use client::backend::NewBlockState; use client::blockchain::HeaderBackend; use client::ExecutionStrategies; use client::backend::{StorageCollection, ChildStorageCollection}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use hash_db::{Hasher, Prefix}; use kvdb::{KeyValueDB, DBTransaction}; use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; @@ -338,8 +338,10 @@ impl client::blockchain::Backend for BlockchainDb { fn body(&self, id: BlockId) -> Result>, client::error::Error> { match read_db(&*self.db, columns::KEY_LOOKUP, columns::BODY, id)? { Some(body) => match Decode::decode(&mut &body[..]) { - Some(body) => Ok(Some(body)), - None => return Err(client::error::Error::Backend("Error decoding body".into())), + Ok(body) => Ok(Some(body)), + Err(err) => return Err(client::error::Error::Backend( + format!("Error decoding body: {}", err) + )), } None => Ok(None), } @@ -348,8 +350,10 @@ impl client::blockchain::Backend for BlockchainDb { fn justification(&self, id: BlockId) -> Result, client::error::Error> { match read_db(&*self.db, columns::KEY_LOOKUP, columns::JUSTIFICATION, id)? { Some(justification) => match Decode::decode(&mut &justification[..]) { - Some(justification) => Ok(Some(justification)), - None => return Err(client::error::Error::Backend("Error decoding justification".into())), + Ok(justification) => Ok(Some(justification)), + Err(err) => return Err(client::error::Error::Backend( + format!("Error decoding justification: {}", err) + )), } None => Ok(None), } @@ -838,7 +842,7 @@ impl> Backend { let changes_trie_config = self .state_at(BlockId::Hash(block))? .storage(well_known_keys::CHANGES_TRIE_CONFIG)? - .and_then(|v| Decode::decode(&mut &*v)); + .and_then(|v| Decode::decode(&mut &*v).ok()); *cached_changes_trie_config = Some(changes_trie_config.clone()); Ok(changes_trie_config) }, diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 3714338fad..4ce0d0498c 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -29,7 +29,7 @@ use client::cht; use client::leaves::{LeafSet, FinalizationDisplaced}; use client::error::{Error as ClientError, Result as ClientResult}; use client::light::blockchain::Storage as LightBlockchainStorage; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::Blake2Hasher; use sr_primitives::generic::{DigestItem, BlockId}; use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; @@ -360,7 +360,7 @@ impl LightStorage { let cht_start = cht::start_number(cht_size, cht_number); self.db.get(columns::CHT, &cht_key(cht_type, cht_start)?).map_err(db_err)? .ok_or_else(no_cht_for_block) - .and_then(|hash| Block::Hash::decode(&mut &*hash).ok_or_else(no_cht_for_block)) + .and_then(|hash| Block::Hash::decode(&mut &*hash).map_err(|_| no_cht_for_block())) } } @@ -887,7 +887,8 @@ pub(crate) mod tests { } fn get_authorities(cache: &dyn BlockchainCache, at: BlockId) -> Option> { - cache.get_at(&well_known_cache_keys::AUTHORITIES, &at).and_then(|val| Decode::decode(&mut &val[..])) + cache.get_at(&well_known_cache_keys::AUTHORITIES, &at) + .and_then(|val| Decode::decode(&mut &val[..]).ok()) } let auth1 = || AuthorityId::from_raw([1u8; 32]); diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index a2dd144c89..70f0ff2058 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -27,7 +27,7 @@ use kvdb_rocksdb::{Database, DatabaseConfig}; use log::debug; use client; -use parity_codec::Decode; +use codec::Decode; use trie::DBValue; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ @@ -260,8 +260,8 @@ pub fn read_header( ) -> client::error::Result> { match read_db(db, col_index, col, id)? { Some(header) => match Block::Header::decode(&mut &header[..]) { - Some(header) => Ok(Some(header)), - None => return Err( + Ok(header) => Ok(Some(header)), + Err(_) => return Err( client::error::Error::Backend("Error decoding header".into()) ), } @@ -290,8 +290,10 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: { let genesis_hash: Block::Hash = match db.get(col_meta, meta_keys::GENESIS_HASH).map_err(db_err)? { Some(h) => match Decode::decode(&mut &h[..]) { - Some(h) => h, - None => return Err(client::error::Error::Backend("Error decoding genesis hash".into())), + Ok(h) => h, + Err(err) => return Err(client::error::Error::Backend( + format!("Error decoding genesis hash: {}", err) + )), }, None => return Ok(Meta { best_hash: Default::default(), @@ -305,7 +307,7 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: let load_meta_block = |desc, key| -> Result<_, client::error::Error> { if let Some(Some(header)) = db.get(col_meta, key).and_then(|id| match id { - Some(id) => db.get(col_header, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]))), + Some(id) => db.get(col_header, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]).ok())), None => Ok(None), }).map_err(db_err)? { diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 5e836b6bc2..22aac577e3 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -16,7 +16,7 @@ use super::api::BlockBuilder as BlockBuilderApi; use std::vec::Vec; -use parity_codec::Encode; +use codec::Encode; use sr_primitives::ApplyOutcome; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index 1b41cc3aa3..bd00b33e4a 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result, cell::RefCell, rc::Rc}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::{ generic::BlockId, traits::Block as BlockT, }; diff --git a/core/client/src/children.rs b/core/client/src/children.rs index 4423ad8939..3128f86086 100644 --- a/core/client/src/children.rs +++ b/core/client/src/children.rs @@ -17,7 +17,7 @@ //! Functionality for reading and storing children hashes from db. use kvdb::{KeyValueDB, DBTransaction}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::error; use std::hash::Hash; @@ -41,8 +41,8 @@ pub fn read_children< }; let children: Vec = match Decode::decode(&mut &raw_val[..]) { - Some(children) => children, - None => return Err(error::Error::Backend("Error decoding children".into())), + Ok(children) => children, + Err(_) => return Err(error::Error::Backend("Error decoding children".into())), }; Ok(children) diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index b328200923..37462851a9 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -26,7 +26,7 @@ use std::collections::HashSet; use hash_db; -use parity_codec::Encode; +use codec::Encode; use trie; use primitives::{H256, convert_hash}; diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 64519b60dd..cd6c2d63b7 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -50,7 +50,7 @@ use primitives::{ }; use primitives::storage::{StorageKey, StorageData}; use primitives::storage::well_known_keys; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use state_machine::{ DBValue, Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, ExecutionStrategy, ExecutionManager, prove_read, prove_child_read, @@ -1327,7 +1327,7 @@ impl Client where Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info().best_number))? .storage(well_known_keys::CHANGES_TRIE_CONFIG) .map_err(|e| error::Error::from_state(Box::new(e)))? - .and_then(|c| Decode::decode(&mut &*c))) + .and_then(|c| Decode::decode(&mut &*c).ok())) } /// Prepare in-memory header that is used in execution environment. diff --git a/core/client/src/error.rs b/core/client/src/error.rs index d95263abce..6f087df9de 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -74,11 +74,11 @@ pub enum Error { #[display(fmt = "Remote data fetch has been failed")] RemoteFetchFailed, /// Error decoding call result. - #[display(fmt = "Error decoding call result of {}", _0)] - CallResultDecode(&'static str), + #[display(fmt = "Error decoding call result of {}: {}", _0, _1)] + CallResultDecode(&'static str, codec::Error), /// Error converting a parameter between runtime and node. #[display(fmt = "Error converting `{}` between runtime and node", _0)] - RuntimeParamConversion(&'static str), + RuntimeParamConversion(String), /// Changes tries are not supported. #[display(fmt = "Changes tries are not supported by the runtime")] ChangesTriesNotSupported, diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 1a3ab4c1fa..bc401c8cd9 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -40,7 +40,7 @@ pub fn construct_genesis_block< #[cfg(test)] mod tests { use super::*; - use parity_codec::{Encode, Decode, Joiner}; + use codec::{Encode, Decode, Joiner}; use executor::native_executor_instance; use state_machine::{self, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage}; use state_machine::backend::InMemory; diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index ed2cde6d5e..825c1bf7c0 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -20,7 +20,7 @@ use std::collections::BTreeMap; use std::cmp::Reverse; use kvdb::{KeyValueDB, DBTransaction}; use sr_primitives::traits::SimpleArithmetic; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::error; #[derive(Debug, Clone, PartialEq, Eq)] @@ -84,12 +84,12 @@ impl LeafSet where if !key.starts_with(prefix) { break } let raw_hash = &mut &key[prefix.len()..]; let hash = match Decode::decode(raw_hash) { - Some(hash) => hash, - None => return Err(error::Error::Backend("Error decoding hash".into())), + Ok(hash) => hash, + Err(_) => return Err(error::Error::Backend("Error decoding hash".into())), }; let number = match Decode::decode(&mut &value[..]) { - Some(number) => number, - None => return Err(error::Error::Backend("Error decoding number".into())), + Ok(number) => number, + Err(_) => return Err(error::Error::Backend("Error decoding number".into())), }; storage.entry(Reverse(number)).or_insert_with(Vec::new).push(hash); } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 5cd630ed79..9d8df1c541 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -22,7 +22,7 @@ use std::{ marker::PhantomData, cell::RefCell, rc::Rc, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use primitives::{offchain, H256, Blake2Hasher, convert_hash, NativeOrEncoded}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{One, Block as BlockT, Header as HeaderT}; @@ -149,7 +149,7 @@ where fn runtime_version(&self, id: &BlockId) -> ClientResult { let call_result = self.call(id, "Core_version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; RuntimeVersion::decode(&mut call_result.as_slice()) - .ok_or_else(|| ClientError::VersionInvalid.into()) + .map_err(|_| ClientError::VersionInvalid.into()) } fn call_at_state< diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index b83907c932..e80541a096 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -22,7 +22,7 @@ use std::marker::PhantomData; use std::future::Future; use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, @@ -486,7 +486,7 @@ impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a pub mod tests { use futures::future::Ready; use parking_lot::Mutex; - use parity_codec::Decode; + use codec::Decode; use crate::client::tests::prepare_client_with_key_changes; use executor::{self, NativeExecutor}; use crate::error::Error as ClientError; @@ -566,7 +566,7 @@ pub mod tests { // 'fetch' read proof from remote node let heap_pages = remote_client.storage(&remote_block_id, &StorageKey(well_known_keys::HEAP_PAGES.to_vec())) .unwrap() - .and_then(|v| Decode::decode(&mut &v.0[..])).unwrap(); + .and_then(|v| Decode::decode(&mut &v.0[..]).ok()).unwrap(); let remote_read_proof = remote_client.read_proof(&remote_block_id, well_known_keys::HEAP_PAGES).unwrap(); // check remote read proof locally diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index 890e265878..ed5c9fad48 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -39,7 +39,7 @@ pub use rstd::{slice, mem}; #[cfg(feature = "std")] use rstd::result; #[doc(hidden)] -pub use parity_codec::{Encode, Decode}; +pub use codec::{Encode, Decode}; #[cfg(feature = "std")] use crate::error; use sr_api_macros::decl_runtime_apis; diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index e7a5007e22..98f233b8f4 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -6,7 +6,7 @@ description = "Aura consensus algorithm for substrate" edition = "2018" [dependencies] -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_support = { package = "srml-support", path = "../../../srml/support" } runtime_version = { package = "sr-version", path = "../../sr-version" } diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index cbebd10a4d..ea8ffb4200 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -6,7 +6,7 @@ description = "Primitives for Aura consensus" edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } substrate-client = { path = "../../../client", default-features = false } primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } @@ -16,7 +16,7 @@ sr-primitives = { path = "../../../sr-primitives", default-features = false } default = ["std"] std = [ "rstd/std", - "parity-codec/std", + "codec/std", "sr-primitives/std", "substrate-client/std", "primitives/std", diff --git a/core/consensus/aura/primitives/src/lib.rs b/core/consensus/aura/primitives/src/lib.rs index 10c3c96e4f..1a0aa5583f 100644 --- a/core/consensus/aura/primitives/src/lib.rs +++ b/core/consensus/aura/primitives/src/lib.rs @@ -18,7 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use parity_codec::{Encode, Decode, Codec}; +use codec::{Encode, Decode, Codec}; use substrate_client::decl_runtime_apis; use rstd::vec::Vec; use sr_primitives::ConsensusEngineId; diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs index 82fd0cf655..3baa18587b 100644 --- a/core/consensus/aura/src/digest.rs +++ b/core/consensus/aura/src/digest.rs @@ -22,7 +22,7 @@ use primitives::Pair; use aura_primitives::AURA_ENGINE_ID; use sr_primitives::generic::{DigestItem, OpaqueDigestItemId}; -use parity_codec::{Encode, Codec}; +use codec::{Encode, Codec}; use std::fmt::Debug; type Signature

=

::Signature; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index a08dcdf1d4..15966c611d 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -30,7 +30,7 @@ #![forbid(missing_docs, unsafe_code)] use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug, pin::Pin}; -use parity_codec::{Encode, Decode, Codec}; +use codec::{Encode, Decode, Codec}; use consensus_common::{self, BlockImport, Environment, Proposer, ForkChoiceStrategy, BlockImportParams, BlockOrigin, Error as ConsensusError, SelectChain, well_known_cache_keys::{self, Id as CacheKeyId} @@ -623,7 +623,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusErro let genesis_id = BlockId::Number(Zero::zero()); let genesis_authorities: Option> = cache .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) - .and_then(|v| Decode::decode(&mut &v[..])); + .and_then(|v| Decode::decode(&mut &v[..]).ok()); if genesis_authorities.is_some() { return Ok(()); } @@ -651,7 +651,7 @@ fn authorities(client: &C, at: &BlockId) -> Result, Consensus .cache() .and_then(|cache| cache .get_at(&well_known_cache_keys::AUTHORITIES, at) - .and_then(|v| Decode::decode(&mut &v[..])) + .and_then(|v| Decode::decode(&mut &v[..]).ok()) ) .or_else(|| AuraApi::authorities(&*client.runtime_api(), at).ok()) .ok_or_else(|| consensus_common::Error::InvalidAuthoritiesSet.into()) diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 331c85dda8..855daab1e0 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -6,8 +6,8 @@ description = "BABE consensus algorithm for substrate" edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", features = ["derive"] } -babe-primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } +babe_primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } primitives = { package = "substrate-primitives", path = "../../primitives" } num-bigint = "0.2" num-rational = "0.2" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 2c6ba886f4..cf52d270c7 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -11,7 +11,7 @@ rstd = { package = "sr-std", path = "../../../sr-std", default-features = false sr-primitives = { path = "../../../sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } schnorrkel = { version = "0.1.1", optional = true } [features] @@ -20,7 +20,7 @@ std = [ "rstd/std", "sr-primitives/std", "substrate-client/std", - "parity-codec/std", + "codec/std", "schnorrkel", "slots", ] diff --git a/core/consensus/babe/primitives/src/digest.rs b/core/consensus/babe/primitives/src/digest.rs index 6266b828fb..52e7e26e52 100644 --- a/core/consensus/babe/primitives/src/digest.rs +++ b/core/consensus/babe/primitives/src/digest.rs @@ -27,11 +27,14 @@ use super::SlotNumber; use sr_primitives::{DigestItem, generic::OpaqueDigestItemId}; #[cfg(feature = "std")] use std::fmt::Debug; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; #[cfg(feature = "std")] -use parity_codec::{Codec, Input}; +use codec::{Codec, Input, Error}; #[cfg(feature = "std")] -use schnorrkel::vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}; +use schnorrkel::{ + SignatureError, errors::MultiSignatureStage, + vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH} +}; /// A BABE pre-digest #[cfg(feature = "std")] @@ -72,21 +75,26 @@ impl Encode for BabePreDigest { authority_index: self.authority_index, slot_number: self.slot_number, }; - parity_codec::Encode::encode(&tmp) + codec::Encode::encode(&tmp) } } +#[cfg(feature = "std")] +impl codec::EncodeLike for BabePreDigest {} + #[cfg(feature = "std")] impl Decode for BabePreDigest { - fn decode(i: &mut R) -> Option { + fn decode(i: &mut R) -> Result { let RawBabePreDigest { vrf_output, vrf_proof, authority_index, slot_number } = Decode::decode(i)?; // Verify (at compile time) that the sizes in babe_primitives are correct let _: [u8; super::VRF_OUTPUT_LENGTH] = vrf_output; let _: [u8; super::VRF_PROOF_LENGTH] = vrf_proof; - Some(BabePreDigest { - vrf_proof: VRFProof::from_bytes(&vrf_proof).ok()?, - vrf_output: VRFOutput::from_bytes(&vrf_output).ok()?, + Ok(BabePreDigest { + vrf_proof: VRFProof::from_bytes(&vrf_proof) + .map_err(convert_error)?, + vrf_output: VRFOutput::from_bytes(&vrf_output) + .map_err(convert_error)?, authority_index, slot_number, }) @@ -136,3 +144,33 @@ impl CompatibleDigestItem for DigestItem where self.try_to(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID)) } } + +#[cfg(feature = "std")] +fn convert_error(e: SignatureError) -> codec::Error { + use SignatureError::*; + use MultiSignatureStage::*; + match e { + EquationFalse => "Signature error: `EquationFalse`".into(), + PointDecompressionError => "Signature error: `PointDecompressionError`".into(), + ScalarFormatError => "Signature error: `ScalarFormatError`".into(), + BytesLengthError { .. } => "Signature error: `BytesLengthError`".into(), + MuSigAbsent { musig_stage: Commitment } => + "Signature error: `MuSigAbsent` at stage `Commitment`".into(), + MuSigAbsent { musig_stage: Reveal } => + "Signature error: `MuSigAbsent` at stage `Reveal`".into(), + MuSigAbsent { musig_stage: Cosignature } => + "Signature error: `MuSigAbsent` at stage `Commitment`".into(), + MuSigInconsistent { musig_stage: Commitment, duplicate: true } => + "Signature error: `MuSigInconsistent` at strage `Commitment` on duplicate".into(), + MuSigInconsistent { musig_stage: Commitment, duplicate: false } => + "Signature error: `MuSigInconsistent` at strage `Commitment` on not duplicate".into(), + MuSigInconsistent { musig_stage: Reveal, duplicate: true } => + "Signature error: `MuSigInconsistent` at strage `Reveal` on duplicate".into(), + MuSigInconsistent { musig_stage: Reveal, duplicate: false } => + "Signature error: `MuSigInconsistent` at strage `Reveal` on not duplicate".into(), + MuSigInconsistent { musig_stage: Cosignature, duplicate: true } => + "Signature error: `MuSigInconsistent` at strage `Cosignature` on duplicate".into(), + MuSigInconsistent { musig_stage: Cosignature, duplicate: false } => + "Signature error: `MuSigInconsistent` at strage `Cosignature` on not duplicate".into(), + } +} diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index d169406b33..f076c3ae2a 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -21,7 +21,7 @@ mod digest; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use rstd::vec::Vec; use sr_primitives::ConsensusEngineId; use primitives::sr25519; diff --git a/core/consensus/babe/src/aux_schema.rs b/core/consensus/babe/src/aux_schema.rs index 91764839fb..ac90b4ce52 100644 --- a/core/consensus/babe/src/aux_schema.rs +++ b/core/consensus/babe/src/aux_schema.rs @@ -17,7 +17,7 @@ //! Schema for BABE epoch changes in the aux-db. use log::info; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; @@ -32,10 +32,12 @@ fn load_decode(backend: &B, key: &[u8]) -> ClientResult> B: AuxStore, T: Decode, { - let corrupt = || ClientError::Backend(format!("BABE DB is corrupted.")).into(); + let corrupt = |e: codec::Error| { + ClientError::Backend(format!("BABE DB is corrupted. Decode error: {}", e.what())).into() + }; match backend.get_aux(key)? { None => Ok(None), - Some(t) => T::decode(&mut &t[..]).ok_or_else(corrupt).map(Some) + Some(t) => T::decode(&mut &t[..]).map(Some).map_err(corrupt) } } diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 50271b0d45..e61fb04062 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -33,7 +33,7 @@ use sr_primitives::traits::{ }; use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, pin::Pin, time::{Instant, Duration}}; use runtime_support::serde::{Serialize, Deserialize}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use parking_lot::{Mutex, MutexGuard}; use primitives::{Blake2Hasher, H256, Pair, Public, sr25519}; use merlin::Transcript; @@ -733,7 +733,7 @@ fn epoch(client: &C, at: &BlockId) -> Result whe client .cache() .and_then(|cache| cache.get_at(&well_known_cache_keys::EPOCH, at) - .and_then(|v| Decode::decode(&mut &v[..]))) + .and_then(|v| Decode::decode(&mut &v[..]).ok())) .or_else(|| { if client.runtime_api().has_api::>(at).unwrap_or(false) { let s = BabeApi::epoch(&*client.runtime_api(), at).ok()?; @@ -856,7 +856,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> let genesis_id = BlockId::Number(Zero::zero()); let genesis_epoch: Option = cache .get_at(&well_known_cache_keys::EPOCH, &genesis_id) - .and_then(|v| Decode::decode(&mut &v[..])); + .and_then(|v| Decode::decode(&mut &v[..]).ok()); if genesis_epoch.is_some() { return Ok(()); } diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index f9a2360210..a0e59e3e80 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -165,12 +165,6 @@ impl TestNetFactory for BabeTestNet { } } -#[test] -fn can_serialize_block() { - let _ = env_logger::try_init(); - assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); -} - #[test] #[should_panic] fn rejects_empty_block() { diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index c4731ce2a5..b327e9456a 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -16,7 +16,7 @@ futures-timer = "0.2.1" rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } sr-primitives = { path = "../../sr-primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } parking_lot = "0.8.0" [dev-dependencies] diff --git a/core/consensus/common/primitives/Cargo.toml b/core/consensus/common/primitives/Cargo.toml index df44db2f34..de59c3723d 100644 --- a/core/consensus/common/primitives/Cargo.toml +++ b/core/consensus/common/primitives/Cargo.toml @@ -6,7 +6,7 @@ description = "Common consensus primitives" edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", default-features = false, version = "1.0.3" } client = { package = "substrate-client", path = "../../../client", default-features = false } sr-primitives = { path = "../../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } @@ -16,6 +16,6 @@ default = ["std"] std = [ "rstd/std", "client/std", - "parity-codec/std", + "codec/std", "sr-primitives/std" ] diff --git a/core/consensus/common/primitives/src/lib.rs b/core/consensus/common/primitives/src/lib.rs index 47c4371721..f6c1800081 100644 --- a/core/consensus/common/primitives/src/lib.rs +++ b/core/consensus/common/primitives/src/lib.rs @@ -18,7 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use parity_codec::Codec; +use codec::Codec; use client::decl_runtime_apis; use rstd::vec::Vec; diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index 940728bc83..7a3e565aa0 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -18,7 +18,7 @@ use super::MAX_BLOCK_SIZE; -use parity_codec::Encode; +use codec::Encode; use sr_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; // This is just a best effort to encode the number. None indicated that it's too big to encode @@ -32,8 +32,8 @@ pub type Result = std::result::Result; #[derive(Debug, derive_more::Display)] pub enum Error { /// Proposal provided not a block. - #[display(fmt="Proposal provided not a block.")] - BadProposalFormat, + #[display(fmt="Proposal provided not a block: decoding error: {}", _0)] + BadProposalFormat(codec::Error), /// Proposal had wrong parent hash. #[display(fmt="Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got)] WrongParentHash { expected: String, got: String }, @@ -60,7 +60,7 @@ pub fn evaluate_initial( let encoded = Encode::encode(proposal); let proposal = Block::decode(&mut &encoded[..]) - .ok_or_else(|| Error::BadProposalFormat)?; + .map_err(|e| Error::BadProposalFormat(e))?; if encoded.len() > MAX_BLOCK_SIZE { return Err(Error::ProposalTooLarge(encoded.len())) diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index b973e02c60..3f6fef71a3 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1.17" -codec = { package = "parity-codec", version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../primitives" } consensus = { package = "substrate-consensus-common", path = "../common" } client = { package = "substrate-client", path = "../../client" } @@ -21,7 +21,7 @@ runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" parking_lot = "0.8.0" log = "0.4" -rhododendron = { version = "0.6.0", features = ["codec"] } +rhododendron = { version = "0.7.0", features = ["codec"] } exit-future = "0.1" [dev-dependencies] diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 94e25dfc91..3bcd1346d4 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -40,7 +40,7 @@ use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::{self, Instant, Duration}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use consensus::offline_tracker::OfflineTracker; use consensus::error::{ErrorKind as CommonErrorKind}; use consensus::{Authorities, BlockImport, Environment, Proposer as BaseProposer}; diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 8d73c44b2b..30e3eb654c 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -6,7 +6,7 @@ description = "Generic slots-based utilities for consensus" edition = "2018" [dependencies] -codec = { package = "parity-codec", version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } client = { package = "substrate-client", path = "../../client" } primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs index 193c9f9b9d..1d54cb5c2e 100644 --- a/core/consensus/slots/src/aux_schema.rs +++ b/core/consensus/slots/src/aux_schema.rs @@ -37,8 +37,8 @@ fn load_decode(backend: &C, key: &[u8]) -> ClientResult> match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) - .ok_or_else( - || ClientError::Backend(format!("Slots DB is corrupted.")).into(), + .map_err( + |e| ClientError::Backend(format!("Slots DB is corrupted. Decode error: {}", e.what())).into(), ) .map(Some) } diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index ae3dd265e9..fc0134f746 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -188,7 +188,7 @@ impl SlotDuration { match client.get_aux(T::SLOT_KEY)? { Some(v) => ::decode(&mut &v[..]) .map(SlotDuration) - .ok_or_else(|| { + .map_err(|_| { ::client::error::Error::Backend({ error!(target: "slots", "slot duration kept in invalid format"); format!("slot duration kept in invalid format") diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 1f9f3947ac..c5b296b866 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } runtime_io = { package = "sr-io", path = "../sr-io" } primitives = { package = "substrate-primitives", path = "../primitives" } trie = { package = "substrate-trie", path = "../trie" } diff --git a/core/executor/src/lib.rs b/core/executor/src/lib.rs index a6147a320a..065de451c1 100644 --- a/core/executor/src/lib.rs +++ b/core/executor/src/lib.rs @@ -44,7 +44,7 @@ pub use native_executor::{with_native_environment, NativeExecutor, NativeExecuti pub use wasm_runtimes_cache::RuntimesCache; pub use state_machine::Externalities; pub use runtime_version::{RuntimeVersion, NativeVersion}; -pub use parity_codec::Codec; +pub use codec::Codec; #[doc(hidden)] pub use primitives::Blake2Hasher; diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index f57c331668..765b9f076e 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -19,7 +19,7 @@ use crate::error::{Error, Result}; use state_machine::{CodeExecutor, Externalities}; use crate::wasm_executor::WasmExecutor; use runtime_version::{NativeVersion, RuntimeVersion}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use crate::RuntimeInfo; use primitives::{Blake2Hasher, NativeOrEncoded}; use log::trace; diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs index 1ce300c38a..6687738abc 100644 --- a/core/executor/src/sandbox.rs +++ b/core/executor/src/sandbox.rs @@ -20,7 +20,7 @@ use crate::error::{Result, Error}; use std::{collections::HashMap, rc::Rc}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::sandbox as sandbox_primitives; use wasmi::{ Externals, FuncRef, ImportResolver, MemoryInstance, MemoryRef, Module, ModuleInstance, @@ -193,7 +193,7 @@ fn trap(msg: &'static str) -> Trap { fn deserialize_result(serialized_result: &[u8]) -> std::result::Result, Trap> { use self::sandbox_primitives::{HostError, ReturnValue}; let result_val = std::result::Result::::decode(&mut &serialized_result[..]) - .ok_or_else(|| trap("Decoding Result failed!"))?; + .map_err(|_| trap("Decoding Result failed!"))?; match result_val { Ok(return_value) => Ok(match return_value { @@ -361,7 +361,7 @@ fn decode_environment_definition( memories: &[Option], ) -> std::result::Result<(Imports, GuestToSupervisorFunctionMapping), InstantiationError> { let env_def = sandbox_primitives::EnvironmentDefinition::decode(&mut &raw_env_def[..]) - .ok_or_else(|| InstantiationError::EnvironmentDefinitionCorrupted)?; + .map_err(|_| InstantiationError::EnvironmentDefinitionCorrupted)?; let mut func_map = HashMap::new(); let mut memories_map = HashMap::new(); diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index b776a520d7..637390b2c7 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -26,7 +26,7 @@ use wasmi::{ }; use state_machine::{Externalities, ChildStorageKey}; use crate::error::{Error, Result}; -use parity_codec::Encode; +use codec::Encode; use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; use primitives::offchain; use primitives::hexdisplay::HexDisplay; @@ -1081,7 +1081,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, request_id: u32, written_out: *mut u32 ) -> *mut u8 => { - use parity_codec::Encode; + use codec::Encode; let headers = this.ext.offchain() .map(|api| api.http_response_headers(offchain::HttpRequestId(request_id as u16))) @@ -1172,7 +1172,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, return_val_len: usize, state: usize ) -> u32 => { - use parity_codec::{Decode, Encode}; + use codec::{Decode, Encode}; trace!(target: "sr-sandbox", "invoke, instance_idx={}", instance_idx); let export = this.memory.get(export_ptr, export_len as usize) @@ -1186,7 +1186,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let serialized_args = this.memory.get(args_ptr, args_len as usize) .map_err(|_| "OOB while ext_sandbox_invoke: args")?; let args = Vec::::decode(&mut &serialized_args[..]) - .ok_or_else(|| "Can't decode serialized arguments for the invocation")? + .map_err(|_| "Can't decode serialized arguments for the invocation")? .into_iter() .map(Into::into) .collect::>(); @@ -1443,7 +1443,7 @@ impl WasmExecutor { mod tests { use super::*; - use parity_codec::Encode; + use codec::Encode; use state_machine::TestExternalities as CoreTestExternalities; use hex_literal::hex; diff --git a/core/executor/src/wasm_runtimes_cache.rs b/core/executor/src/wasm_runtimes_cache.rs index a1540204c7..812638126d 100644 --- a/core/executor/src/wasm_runtimes_cache.rs +++ b/core/executor/src/wasm_runtimes_cache.rs @@ -19,7 +19,7 @@ use crate::error::Error; use crate::wasm_executor::WasmExecutor; use log::{trace, warn}; -use parity_codec::Decode; +use codec::Decode; use parity_wasm::elements::{deserialize_buffer, DataSegment, Instruction, Module as RawModule}; use primitives::storage::well_known_keys; use primitives::Blake2Hasher; @@ -288,7 +288,7 @@ impl RuntimesCache { let heap_pages = ext .storage(well_known_keys::HEAP_PAGES) - .and_then(|pages| u64::decode(&mut &pages[..])) + .and_then(|pages| u64::decode(&mut &pages[..]).ok()) .or(default_heap_pages) .unwrap_or(DEFAULT_HEAP_PAGES); @@ -308,7 +308,7 @@ impl RuntimesCache { let version = wasm_executor .call_in_wasm_module(ext, &instance, "Core_version", &[]) .ok() - .and_then(|v| RuntimeVersion::decode(&mut v.as_slice())); + .and_then(|v| RuntimeVersion::decode(&mut v.as_slice()).ok()); Ok(Rc::new(CachedRuntime { instance, version, diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 8477f75edd..04f9e7162c 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -13,7 +13,7 @@ parking_lot = "0.8.0" tokio-executor = "0.1.7" tokio-timer = "0.2.11" rand = "0.6" -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } sr-primitives = { path = "../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } primitives = { package = "substrate-primitives", path = "../primitives" } @@ -25,10 +25,10 @@ network = { package = "substrate-network", path = "../network" } service = { package = "substrate-service", path = "../service", optional = true } srml-finality-tracker = { path = "../../srml/finality-tracker" } fg_primitives = { package = "substrate-finality-grandpa-primitives", path = "primitives" } -grandpa = { package = "finality-grandpa", version = "0.8.1", features = ["derive-codec"] } +grandpa = { package = "finality-grandpa", version = "0.9.0", features = ["derive-codec"] } [dev-dependencies] -grandpa = { package = "finality-grandpa", version = "0.8.1", features = ["derive-codec", "test-helpers"] } +grandpa = { package = "finality-grandpa", version = "0.9.0", features = ["derive-codec", "test-helpers"] } network = { package = "substrate-network", path = "../network", features = ["test-helpers"] } keyring = { package = "substrate-keyring", path = "../keyring" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client"} diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index 75e6b5f608..1c17639a2a 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../client", default-features = false } primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../sr-std", default-features = false } serde = { version = "1.0", optional = true, features = ["derive"] } @@ -17,7 +17,7 @@ default = ["std"] std = [ "primitives/std", "client/std", - "parity-codec/std", + "codec/std", "sr-primitives/std", "rstd/std", "serde", diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index b60acffc6c..25f8b802ce 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -23,7 +23,7 @@ extern crate alloc; #[cfg(feature = "std")] use serde::Serialize; -use parity_codec::{Encode, Decode, Codec}; +use codec::{Encode, Decode, Codec}; use sr_primitives::{ConsensusEngineId, traits::{DigestFor, NumberFor}}; use client::decl_runtime_apis; use rstd::vec::Vec; diff --git a/core/finality-grandpa/src/authorities.rs b/core/finality-grandpa/src/authorities.rs index 8b329d4116..27b9c57073 100644 --- a/core/finality-grandpa/src/authorities.rs +++ b/core/finality-grandpa/src/authorities.rs @@ -19,7 +19,7 @@ use fork_tree::ForkTree; use parking_lot::RwLock; use grandpa::voter_set::VoterSet; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use log::{debug, info}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use fg_primitives::AuthorityId; @@ -403,7 +403,7 @@ pub(crate) struct PendingChange { } impl Decode for PendingChange { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> Result { let next_authorities = Decode::decode(value)?; let delay = Decode::decode(value)?; let canon_height = Decode::decode(value)?; @@ -411,7 +411,7 @@ impl Decode for PendingChange { let delay_kind = DelayKind::decode(value).unwrap_or(DelayKind::Finalized); - Some(PendingChange { + Ok(PendingChange { next_authorities, delay, canon_height, diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 528a221c35..5f430b17fe 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -18,7 +18,7 @@ use std::fmt::Debug; use std::sync::Arc; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; use fork_tree::ForkTree; @@ -108,8 +108,8 @@ pub(crate) fn load_decode(backend: &B, key: &[u8]) -> Cl match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) - .ok_or_else( - || ClientError::Backend(format!("GRANDPA DB is corrupted.")), + .map_err( + |e| ClientError::Backend(format!("GRANDPA DB is corrupted: {}", e.what())), ) .map(Some) } diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index 3d14381e72..e51e23254c 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -85,7 +85,7 @@ use sr_primitives::traits::{NumberFor, Block as BlockT, Zero}; use network::consensus_gossip::{self as network_gossip, MessageIntent, ValidatorContext}; use network::{config::Roles, PeerId}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::ed25519::Public as AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG}; @@ -977,10 +977,10 @@ impl GossipValidator { let action = { match GossipMessage::::decode(&mut data) { - Some(GossipMessage::VoteOrPrecommit(ref message)) + Ok(GossipMessage::VoteOrPrecommit(ref message)) => self.inner.write().validate_round_message(who, message), - Some(GossipMessage::Commit(ref message)) => self.inner.write().validate_commit_message(who, message), - Some(GossipMessage::Neighbor(update)) => { + Ok(GossipMessage::Commit(ref message)) => self.inner.write().validate_commit_message(who, message), + Ok(GossipMessage::Neighbor(update)) => { let (topics, action, catch_up, report) = self.inner.write().import_neighbor_message( who, update.into_neighbor_packet(), @@ -994,9 +994,9 @@ impl GossipValidator { peer_reply = catch_up; action } - Some(GossipMessage::CatchUp(ref message)) + Ok(GossipMessage::CatchUp(ref message)) => self.inner.write().validate_catch_up_message(who, message), - Some(GossipMessage::CatchUpRequest(request)) => { + Ok(GossipMessage::CatchUpRequest(request)) => { let (reply, action) = self.inner.write().handle_catch_up_request( who, request, @@ -1006,8 +1006,8 @@ impl GossipValidator { peer_reply = reply; action } - None => { - debug!(target: "afg", "Error decoding message"); + Err(e) => { + debug!(target: "afg", "Error decoding message: {}", e.what()); telemetry!(CONSENSUS_DEBUG; "afg.err_decoding_msg"; "" => ""); let len = std::cmp::min(i32::max_value() as usize, data.len()) as i32; @@ -1127,17 +1127,17 @@ impl network_gossip::Validator for GossipValidator let peer_best_commit = peer.view.last_commit; match GossipMessage::::decode(&mut data) { - None => false, - Some(GossipMessage::Commit(full)) => { + Err(_) => false, + Ok(GossipMessage::Commit(full)) => { // we only broadcast our best commit and only if it's // better than last received by peer. Some(full.message.target_number) == our_best_commit && Some(full.message.target_number) > peer_best_commit } - Some(GossipMessage::Neighbor(_)) => false, - Some(GossipMessage::CatchUpRequest(_)) => false, - Some(GossipMessage::CatchUp(_)) => false, - Some(GossipMessage::VoteOrPrecommit(_)) => false, // should not be the case. + Ok(GossipMessage::Neighbor(_)) => false, + Ok(GossipMessage::CatchUpRequest(_)) => false, + Ok(GossipMessage::CatchUp(_)) => false, + Ok(GossipMessage::VoteOrPrecommit(_)) => false, // should not be the case. } }) } @@ -1162,10 +1162,10 @@ impl network_gossip::Validator for GossipValidator let best_commit = local_view.last_commit; match GossipMessage::::decode(&mut data) { - None => true, - Some(GossipMessage::Commit(full)) + Err(_) => true, + Ok(GossipMessage::Commit(full)) => Some(full.message.target_number) != best_commit, - Some(_) => true, + Ok(_) => true, } }) } diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index e9be187eac..607dba486d 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -35,7 +35,7 @@ use futures::prelude::*; use futures::sync::{oneshot, mpsc}; use log::{debug, trace}; use tokio_executor::Executor; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use primitives::{ed25519, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; @@ -367,10 +367,10 @@ impl> NetworkBridge { let incoming = self.service.messages_for(topic) .filter_map(|notification| { let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); - if decoded.is_none() { - debug!(target: "afg", "Skipping malformed message {:?}", notification); + if let Err(ref e) = decoded { + debug!(target: "afg", "Skipping malformed message {:?}: {}", notification, e); } - decoded + decoded.ok() }) .and_then(move |msg| { match msg { @@ -583,10 +583,10 @@ fn incoming_global>( .filter_map(|notification| { // this could be optimized by decoding piecewise. let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); - if decoded.is_none() { - trace!(target: "afg", "Skipping malformed commit message {:?}", notification); + if let Err(ref e) = decoded { + trace!(target: "afg", "Skipping malformed commit message {:?}: {}", notification, e); } - decoded.map(move |d| (notification, d)) + decoded.map(move |d| (notification, d)).ok() }) .filter_map(move |(notification, msg)| { match msg { diff --git a/core/finality-grandpa/src/communication/periodic.rs b/core/finality-grandpa/src/communication/periodic.rs index cae42d0dc7..7265fe34a2 100644 --- a/core/finality-grandpa/src/communication/periodic.rs +++ b/core/finality-grandpa/src/communication/periodic.rs @@ -23,7 +23,7 @@ use sr_primitives::traits::{NumberFor, Block as BlockT}; use network::PeerId; use tokio_timer::Delay; use log::warn; -use parity_codec::Encode; +use codec::Encode; use std::time::{Instant, Duration}; diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index cfe41acb3c..f1473e9863 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -24,7 +24,7 @@ use network_gossip::Validator; use tokio::runtime::current_thread; use std::sync::Arc; use keyring::Ed25519Keyring; -use parity_codec::Encode; +use codec::Encode; use crate::environment::SharedVoterSetState; use super::gossip::{self, GossipValidator}; diff --git a/core/finality-grandpa/src/consensus_changes.rs b/core/finality-grandpa/src/consensus_changes.rs index 02ac951241..4d94224892 100644 --- a/core/finality-grandpa/src/consensus_changes.rs +++ b/core/finality-grandpa/src/consensus_changes.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::sync::Arc; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; /// Consensus-related data changes tracker. #[derive(Clone, Debug, Encode, Decode)] diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 3090cff386..1949fd25a1 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use log::{debug, warn, info}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use futures::prelude::*; use tokio_timer::Delay; use parking_lot::RwLock; @@ -95,8 +95,10 @@ impl Encode for CompletedRounds { } } +impl codec::EncodeLike for CompletedRounds {} + impl Decode for CompletedRounds { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> Result { <(Vec>, u64, Vec)>::decode(value) .map(|(rounds, set_id, voters)| CompletedRounds { rounds: rounds.into(), diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index f174fb04f6..830383ffca 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -43,7 +43,7 @@ use client::{ light::fetcher::{FetchChecker, RemoteCallRequest}, ExecutionStrategy, NeverOffchainExt, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use grandpa::BlockNumberOps; use sr_primitives::{Justification, generic::BlockId}; use sr_primitives::traits::{ @@ -81,8 +81,8 @@ impl, RA> AuthoritySetForFinalityProver fo ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new(), ).and_then(|call_result| Decode::decode(&mut &call_result[..]) - .ok_or_else(|| ClientError::CallResultDecode( - "failed to decode GRANDPA authorities set proof".into(), + .map_err(|err| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), err ))) } @@ -121,8 +121,8 @@ impl AuthoritySetForFinalityChecker for Arc = Decode::decode(&mut &authorities[..]) - .ok_or_else(|| ClientError::CallResultDecode( - "failed to decode GRANDPA authorities set proof".into(), + .map_err(|err| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), err ))?; Ok(authorities.into_iter().collect()) }) @@ -167,8 +167,8 @@ impl network::FinalityProofProvider for FinalityProofPro request: &[u8], ) -> Result>, ClientError> { let request: FinalityProofRequest = Decode::decode(&mut &request[..]) - .ok_or_else(|| { - warn!(target: "finality", "Unable to decode finality proof request."); + .map_err(|e| { + warn!(target: "finality", "Unable to decode finality proof request: {}", e.what()); ClientError::Backend(format!("Invalid finality proof request")) })?; match request { @@ -445,7 +445,7 @@ fn do_check_finality_proof, B, J>( { // decode finality proof let proof = FinalityProof::::decode(&mut &remote_proof[..]) - .ok_or_else(|| ClientError::BadJustification("failed to decode finality proof".into()))?; + .map_err(|_| ClientError::BadJustification("failed to decode finality proof".into()))?; // empty proof can't prove anything if proof.is_empty() { @@ -500,7 +500,7 @@ fn check_finality_proof_fragment, B, J>( // verify justification using previous authorities set let (mut current_set_id, mut current_authorities) = authority_set.extract_authorities(); let justification: J = Decode::decode(&mut &proof_fragment.justification[..]) - .ok_or_else(|| ClientError::JustificationDecode)?; + .map_err(|_| ClientError::JustificationDecode)?; justification.verify(current_set_id, ¤t_authorities)?; // and now verify new authorities proof (if provided) @@ -560,7 +560,8 @@ pub(crate) trait ProvableJustification: Encode + Decode { set_id: u64, authorities: &[(AuthorityId, u64)], ) -> ClientResult { - let justification = Self::decode(&mut &**justification).ok_or(ClientError::JustificationDecode)?; + let justification = Self::decode(&mut &**justification) + .map_err(|_| ClientError::JustificationDecode)?; justification.verify(set_id, authorities)?; Ok(justification) } diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 91e2b92182..4144a279c5 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -17,7 +17,7 @@ use std::{sync::Arc, collections::HashMap}; use log::{debug, trace, info}; -use parity_codec::Encode; +use codec::Encode; use futures::sync::mpsc; use parking_lot::RwLockWriteGuard; diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 59a3d2166c..a6554b1e90 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -20,7 +20,7 @@ use client::{CallExecutor, Client}; use client::backend::Backend; use client::blockchain::HeaderBackend; use client::error::Error as ClientError; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use grandpa::voter_set::VoterSet; use grandpa::{Error as GrandpaError}; use sr_primitives::generic::BlockId; @@ -104,7 +104,7 @@ impl> GrandpaJustification { { let justification = GrandpaJustification::::decode(&mut &*encoded) - .ok_or(ClientError::JustificationDecode)?; + .map_err(|_| ClientError::JustificationDecode)?; if (justification.commit.target_hash, justification.commit.target_number) != finalized_target { let msg = "invalid commit target in grandpa justification".to_string(); diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 2e688ed952..0d04e964e2 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -57,7 +57,7 @@ use log::{debug, info, warn}; use futures::sync::mpsc; use client::{BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError}; use client::blockchain::HeaderBackend; -use parity_codec::Encode; +use codec::Encode; use sr_primitives::traits::{ NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, }; diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index abc98976fd..3fec523dcb 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -25,7 +25,7 @@ use client::{ blockchain::HeaderBackend, error::Error as ClientError, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use consensus_common::{ import_queue::Verifier, well_known_cache_keys, BlockOrigin, BlockImport, FinalityProofImport, BlockImportParams, ImportResult, ImportedAux, diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 797463f5de..38a5dd5441 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -34,7 +34,7 @@ use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImport use consensus_common::import_queue::{BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport}; use std::collections::{HashMap, HashSet}; use std::result; -use parity_codec::Decode; +use codec::Decode; use sr_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; use sr_primitives::generic::BlockId; use primitives::{NativeOrEncoded, ExecutionContext}; @@ -336,7 +336,7 @@ impl AuthoritySetForFinalityChecker for TestApi { proof: Vec>, ) -> Result> { Decode::decode(&mut &proof[0][..]) - .ok_or_else(|| unreachable!("incorrect value is passed as GRANDPA authorities proof")) + .map_err(|_| unreachable!("incorrect value is passed as GRANDPA authorities proof")) } } diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index 7174b7acea..f89288578a 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] parking_lot = { version = "0.8.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../sr-primitives", default-features = false } [features] @@ -15,6 +15,6 @@ default = [ "std" ] std = [ "parking_lot", "rstd/std", - "parity-codec/std", + "codec/std", "sr-primitives/std", ] diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index a5dcfdffcf..f7363b483b 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -33,7 +33,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] -use parity_codec as codec; use codec::{Encode, Decode}; use rstd::{collections::btree_map::{BTreeMap, IntoIter, Entry}, vec::Vec}; @@ -52,7 +51,7 @@ pub type InherentIdentifier = [u8; 8]; /// Inherent data to include in a block. #[derive(Clone, Default, Encode, Decode)] pub struct InherentData { - /// All inherent data encoded with parity-codec and an identifier. + /// All inherent data encoded with parity-scale-codec and an identifier. data: BTreeMap> } @@ -111,7 +110,7 @@ impl InherentData { match self.data.get(identifier) { Some(inherent) => I::decode(&mut &inherent[..]) - .ok_or_else(|| { + .map_err(|_| { "Could not decode requested inherent type!".into() }) .map(Some), diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 3d687486c0..383fc29fc6 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -28,7 +28,7 @@ consensus = { package = "substrate-consensus-common", path = "../../core/consens client = { package = "substrate-client", path = "../../core/client" } sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } peerset = { package = "substrate-peerset", path = "../../core/peerset" } serde = { version = "1.0.70", features = ["derive"] } serde_json = "1.0.24" diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 13e9a0d3a5..c05c127d83 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -27,7 +27,6 @@ use crate::on_demand_layer::OnDemand; use crate::service::{ExHashT, TransactionPool}; use bitflags::bitflags; use consensus::import_queue::ImportQueue; -use parity_codec; use sr_primitives::traits::{Block as BlockT}; use std::sync::Arc; use libp2p::identity::{Keypair, secp256k1, ed25519}; @@ -109,15 +108,17 @@ impl Roles { } } -impl parity_codec::Encode for Roles { - fn encode_to(&self, dest: &mut T) { +impl codec::Encode for Roles { + fn encode_to(&self, dest: &mut T) { dest.push_byte(self.bits()) } } -impl parity_codec::Decode for Roles { - fn decode(input: &mut I) -> Option { - Self::from_bits(input.read_byte()?) +impl codec::EncodeLike for Roles {} + +impl codec::Decode for Roles { + fn decode(input: &mut I) -> Result { + Self::from_bits(input.read_byte()?).ok_or_else(|| codec::Error::from("Invalid bytes")) } } diff --git a/core/network/src/custom_proto/upgrade.rs b/core/network/src/custom_proto/upgrade.rs index 1959ca2883..ebd9c431e0 100644 --- a/core/network/src/custom_proto/upgrade.rs +++ b/core/network/src/custom_proto/upgrade.rs @@ -22,7 +22,7 @@ use libp2p::tokio_codec::Framed; use log::warn; use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use sr_primitives::traits::Block as BlockT; use tokio_io::{AsyncRead, AsyncWrite}; use unsigned_varint::codec::UviBytes; @@ -179,7 +179,7 @@ where TSubstream: AsyncRead + AsyncWrite, B: BlockT { self.clogged_fuse = true; return Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages: self.send_queue.iter() - .map(|m| Decode::decode(&mut &m[..]).ok_or(())) + .map(|m| Decode::decode(&mut &m[..])) .filter_map(Result::ok) .collect(), }))) @@ -199,9 +199,12 @@ where TSubstream: AsyncRead + AsyncWrite, B: BlockT { // Note that `inner` is wrapped in a `Fuse`, therefore we can poll it forever. match self.inner.poll()? { Async::Ready(Some(data)) => { - let message = as Decode>::decode(&mut &data[..]).ok_or(()) - .map_err(|()| { - warn!(target: "sub-libp2p", "Couldn't decode packet sent by the remote: {:?}", data); + let message = as Decode>::decode(&mut &data[..]) + .map_err(|err| { + warn!( + target: "sub-libp2p", + "Couldn't decode packet sent by the remote: {:?}: {}", data, err.what(), + ); io::ErrorKind::InvalidData })?; Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) diff --git a/core/network/src/protocol/message.rs b/core/network/src/protocol/message.rs index def9d4c225..4110970f99 100644 --- a/core/network/src/protocol/message.rs +++ b/core/network/src/protocol/message.rs @@ -18,7 +18,7 @@ use bitflags::bitflags; use sr_primitives::{ConsensusEngineId, traits::{Block as BlockT, Header as HeaderT}}; -use parity_codec::{Encode, Decode, Input, Output}; +use codec::{Encode, Decode, Input, Output, Error}; pub use self::generic::{ BlockAnnounce, RemoteCallRequest, RemoteReadRequest, RemoteHeaderRequest, RemoteHeaderResponse, @@ -90,9 +90,11 @@ impl Encode for BlockAttributes { } } +impl codec::EncodeLike for BlockAttributes {} + impl Decode for BlockAttributes { - fn decode(input: &mut I) -> Option { - Self::from_bits(input.read_byte()?) + fn decode(input: &mut I) -> Result { + Self::from_bits(input.read_byte()?).ok_or_else(|| Error::from("Invalid bytes")) } } @@ -125,7 +127,7 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { - use parity_codec::{Encode, Decode}; + use codec::{Encode, Decode}; use sr_primitives::Justification; use crate::config::Roles; use super::{ diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 694ce38663..97a6fd3d2d 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -11,7 +11,7 @@ client = { package = "substrate-client", path = "../../core/client" } futures = "0.1.25" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } parking_lot = "0.8.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } sr-primitives = { path = "../../core/sr-primitives" } diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 8af7b333f5..8733f3699a 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -25,7 +25,7 @@ use client::backend::OffchainStorage; use crate::AuthorityKeyProvider; use futures::{Stream, Future, sync::mpsc}; use log::{info, debug, warn, error}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use primitives::offchain::{ Timestamp, HttpRequestId, HttpRequestStatus, HttpError, @@ -219,7 +219,7 @@ impl Api where match key { CryptoKey::LocalKey { id, kind } => { let key = self.db.get(KEYS_PREFIX, &id.encode()) - .and_then(|key| StoredKey::decode(&mut &*key)) + .and_then(|key| StoredKey::decode(&mut &*key).ok()) .ok_or(())?; if key.kind != kind { warn!( @@ -266,7 +266,7 @@ where let (id, id_encoded) = loop { let encoded = self.db.get(KEYS_PREFIX, NEXT_ID); let encoded_slice = encoded.as_ref().map(|x| x.as_slice()); - let new_id = encoded_slice.and_then(|mut x| u16::decode(&mut x)).unwrap_or_default() + let new_id = encoded_slice.and_then(|mut x| u16::decode(&mut x).ok()).unwrap_or_default() .checked_add(1) .ok_or(())?; let new_id_encoded = new_id.encode(); @@ -473,14 +473,14 @@ impl TryFrom for NetworkState { fn try_from(state: OpaqueNetworkState) -> Result { let inner_vec = state.peer_id.0; - let bytes: Vec = Decode::decode(&mut &inner_vec[..]).ok_or(())?; + let bytes: Vec = Decode::decode(&mut &inner_vec[..]).map_err(|_| ())?; let peer_id = PeerId::from_bytes(bytes).map_err(|_| ())?; let external_addresses: Result, Self::Error> = state.external_addresses .iter() .map(|enc_multiaddr| -> Result { let inner_vec = &enc_multiaddr.0; - let bytes = >::decode(&mut &inner_vec[..]).ok_or(())?; + let bytes = >::decode(&mut &inner_vec[..]).map_err(|_| ())?; let multiaddr_str = String::from_utf8(bytes).map_err(|_| ())?; let multiaddr = Multiaddr::from_str(&multiaddr_str).map_err(|_| ())?; Ok(multiaddr) @@ -548,9 +548,9 @@ impl AsyncApi { fn submit_extrinsic(&mut self, ext: Vec) { let xt = match ::Extrinsic::decode(&mut &*ext) { - Some(xt) => xt, - None => { - warn!("Unable to decode extrinsic: {:?}", ext); + Ok(xt) => xt, + Err(e) => { + warn!("Unable to decode extrinsic: {:?}: {}", ext, e.what()); return }, }; diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index d0cdf34141..c927ddfeb6 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -6,12 +6,12 @@ edition = "2018" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rustc-hex = { version = "2.0", default-features = false } serde = { version = "1.0", optional = true, features = ["derive"] } twox-hash = { version = "1.2.0", optional = true } byteorder = { version = "1.3.1", default-features = false } -primitive-types = { version = "0.4.0", default-features = false, features = ["codec"] } +primitive-types = { version = "0.5.0", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.5.0", optional = true } hash-db = { version = "0.15.0", default-features = false } @@ -57,7 +57,7 @@ std = [ "primitive-types/rustc-hex", "primitive-types/libc", "impl-serde", - "parity-codec/std", + "codec/std", "hash256-std-hasher/std", "hash-db/std", "rstd/std", diff --git a/core/primitives/src/changes_trie.rs b/core/primitives/src/changes_trie.rs index eb6a75454f..fb7791f0a0 100644 --- a/core/primitives/src/changes_trie.rs +++ b/core/primitives/src/changes_trie.rs @@ -18,7 +18,7 @@ #[cfg(any(feature = "std", test))] use serde::{Serialize, Deserialize}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use num_traits::Zero; /// Substrate changes trie configuration. diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 327a8a3eb1..b3469e09b8 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -25,7 +25,7 @@ use parking_lot::Mutex; #[cfg(feature = "std")] use rand::{RngCore, rngs::OsRng}; #[cfg(feature = "std")] -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use regex::Regex; #[cfg(feature = "std")] diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 5d1fe884a5..0ff0042911 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -20,7 +20,7 @@ use crate::{hash::H256, hash::H512}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use blake2_rfc; diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index 4fabb04ccb..bf1911dad9 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -33,7 +33,7 @@ macro_rules! map { use rstd::prelude::*; use rstd::ops::Deref; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use std::borrow::Cow; #[cfg(feature = "std")] @@ -138,14 +138,14 @@ pub enum NativeOrEncoded { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for NativeOrEncoded { +impl ::std::fmt::Debug for NativeOrEncoded { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { self.as_encoded().as_ref().fmt(f) } } #[cfg(feature = "std")] -impl NativeOrEncoded { +impl NativeOrEncoded { /// Return the value as the encoded format. pub fn as_encoded<'a>(&'a self) -> Cow<'a, [u8]> { match self { @@ -164,13 +164,13 @@ impl NativeOrEncoded { } #[cfg(feature = "std")] -impl PartialEq for NativeOrEncoded { +impl PartialEq for NativeOrEncoded { fn eq(&self, other: &Self) -> bool { match (self, other) { (NativeOrEncoded::Native(l), NativeOrEncoded::Native(r)) => l == r, (NativeOrEncoded::Native(n), NativeOrEncoded::Encoded(e)) | (NativeOrEncoded::Encoded(e), NativeOrEncoded::Native(n)) => - Some(n) == parity_codec::Decode::decode(&mut &e[..]).as_ref(), + Some(n) == codec::Decode::decode(&mut &e[..]).ok().as_ref(), (NativeOrEncoded::Encoded(l), NativeOrEncoded::Encoded(r)) => l == r, } } @@ -183,7 +183,7 @@ impl PartialEq for NativeOrEncoded { pub enum NeverNativeValue {} #[cfg(feature = "std")] -impl parity_codec::Encode for NeverNativeValue { +impl codec::Encode for NeverNativeValue { fn encode(&self) -> Vec { // The enum is not constructable, so this function should never be callable! unreachable!() @@ -191,8 +191,11 @@ impl parity_codec::Encode for NeverNativeValue { } #[cfg(feature = "std")] -impl parity_codec::Decode for NeverNativeValue { - fn decode(_: &mut I) -> Option { - None +impl codec::EncodeLike for NeverNativeValue {} + +#[cfg(feature = "std")] +impl codec::Decode for NeverNativeValue { + fn decode(_: &mut I) -> Result { + Err("`NeverNativeValue` should never be decoded".into()) } } diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index 5b6f8f5c22..a0ee1c34d1 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -17,7 +17,7 @@ //! Offchain workers types use crate::crypto; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use rstd::prelude::{Vec, Box}; use rstd::convert::TryFrom; @@ -397,7 +397,7 @@ pub trait Externalities { /// Initiates a http request given HTTP verb and the URL. /// - /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Meta is a future-reserved field containing additional, parity-scale-codec encoded parameters. /// Returns the id of newly started request. fn http_request_start( &mut self, diff --git a/core/primitives/src/sandbox.rs b/core/primitives/src/sandbox.rs index 773a6b4893..e47a30ca5b 100644 --- a/core/primitives/src/sandbox.rs +++ b/core/primitives/src/sandbox.rs @@ -16,7 +16,7 @@ //! Definition of a sandbox environment. -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use rstd::vec::Vec; /// Error error that can be returned from host function. @@ -184,7 +184,7 @@ pub const ERR_EXECUTION: u32 = -3i32 as u32; mod tests { use super::*; use std::fmt; - use parity_codec::Codec; + use codec::Codec; fn roundtrip(s: S) { let encoded = s.encode(); diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index e01d989143..f87a0078ef 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -33,7 +33,7 @@ use bip39::{Mnemonic, Language, MnemonicType}; use crate::crypto::{Pair as TraitPair, DeriveJunction, Infallible, SecretStringError, Derive, Ss58Codec}; use crate::crypto::{key_types, KeyTypeId, Public as TraitPublic, TypedKey, UncheckedFrom}; use crate::hash::{H256, H512}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; diff --git a/core/primitives/src/uint.rs b/core/primitives/src/uint.rs index dfea51921d..b41596a910 100644 --- a/core/primitives/src/uint.rs +++ b/core/primitives/src/uint.rs @@ -21,7 +21,7 @@ pub use primitive_types::U256; #[cfg(test)] mod tests { use super::*; - use parity_codec::{Encode, Decode}; + use codec::{Encode, Decode}; use substrate_serializer as ser; macro_rules! test { @@ -78,10 +78,10 @@ mod tests { res2); assert_eq!( U256::decode(&mut &res1[..]), - Some(U256::from(120))); + Ok(U256::from(120))); assert_eq!( U256::decode(&mut &res2[..]), - Some(U256::max_value())); + Ok(U256::max_value())); } #[test] diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index a94b410775..cf129a03e6 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -14,7 +14,7 @@ jsonrpc-pubsub = "12.0.0" jsonrpc-derive = "12.0.0" log = "0.4" parking_lot = "0.8.0" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" client = { package = "substrate-client", path = "../client" } diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 82ace88b84..769f111105 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -19,7 +19,6 @@ use client; use transaction_pool::txpool; use crate::rpc; - use crate::errors; /// Author RPC Result type. @@ -36,8 +35,8 @@ pub enum Error { #[display(fmt="Extrinsic verification error: {}", _0)] Verification(Box), /// Incorrect extrinsic format. - #[display(fmt="Invalid extrinsic format")] - BadFormat, + #[display(fmt="Invalid extrinsic format: {}", _0)] + BadFormat(codec::Error), } impl std::error::Error for Error { @@ -78,9 +77,9 @@ impl From for rpc::Error { use txpool::error::{Error as PoolError}; match e { - Error::BadFormat => rpc::Error { + Error::BadFormat(e) => rpc::Error { code: rpc::ErrorCode::ServerError(BAD_FORMAT), - message: "Extrinsic has invalid format.".into(), + message: format!("Extrinsic has invalid format: {}", e).into(), data: None, }, Error::Verification(e) => rpc::Error { diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 4e64ff0ce2..aa238aeb70 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -30,7 +30,7 @@ use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use log::warn; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use primitives::{Bytes, Blake2Hasher, H256}; use sr_primitives::{generic, traits}; use self::error::Result; @@ -110,7 +110,7 @@ impl AuthorApi, BlockHash

> for Author whe type Metadata = crate::metadata::Metadata; fn submit_extrinsic(&self, ext: Bytes) -> Result> { - let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::BadFormat)?; + let xt = Decode::decode(&mut &ext[..])?; let best_block_hash = self.client.info().chain.best_hash; self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) @@ -129,7 +129,7 @@ impl AuthorApi, BlockHash

> for Author whe .map(|x| match x { hash::ExtrinsicOrHash::Hash(h) => Ok(h), hash::ExtrinsicOrHash::Extrinsic(bytes) => { - let xt = Decode::decode(&mut &bytes[..]).ok_or(error::Error::BadFormat)?; + let xt = Decode::decode(&mut &bytes[..])?; Ok(self.pool.hash_of(&xt)) }, }) @@ -146,8 +146,7 @@ impl AuthorApi, BlockHash

> for Author whe fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: Subscriber, BlockHash

>>, xt: Bytes) { let submit = || -> Result<_> { let best_block_hash = self.client.info().chain.best_hash; - let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]) - .ok_or(error::Error::BadFormat)?; + let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..])?; self.pool .submit_and_watch(&generic::BlockId::hash(best_block_hash), dxt) .map_err(|e| e.into_pool_error() diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index cf320ee144..6295220820 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -18,7 +18,7 @@ use super::*; use std::sync::Arc; use assert_matches::assert_matches; -use parity_codec::Encode; +use codec::Encode; use transaction_pool::{ txpool::Pool, ChainApi, diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 4ce3facb52..dcb47bbbfb 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -27,7 +27,7 @@ consensus_common = { package = "substrate-consensus-common", path = "../../core/ network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } client_db = { package = "substrate-client-db", path = "../../core/client/db", features = ["kvdb-rocksdb"] } -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } substrate-executor = { path = "../../core/executor" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } rpc = { package = "substrate-rpc-servers", path = "../../core/rpc-servers" } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 19666c090c..c977b265bb 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -16,7 +16,7 @@ //! Chain utilities. -use std::{self, io::{Read, Write}}; +use std::{self, io::{Read, Write, Seek}}; use futures::prelude::*; use futures03::TryFutureExt as _; use log::{info, warn}; @@ -29,7 +29,7 @@ use network::message; use consensus_common::BlockOrigin; use crate::components::{self, Components, ServiceFactory, FactoryFullConfiguration, FactoryBlockNumber, RuntimeGenesis}; use crate::new_client; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode, IoReader}; use crate::error; use crate::chain_spec::ChainSpec; @@ -136,9 +136,9 @@ impl Link for WaitLink { pub fn import_blocks( mut config: FactoryFullConfiguration, exit: E, - mut input: R + input: R ) -> error::Result> - where F: ServiceFactory, E: Future + Send + 'static, R: Read, + where F: ServiceFactory, E: Future + Send + 'static, R: Read + Seek, { let client = new_client::(&config)?; // FIXME #1134 this shouldn't need a mutable config. @@ -155,37 +155,42 @@ pub fn import_blocks( let _ = exit_send.send(()); }); - let count: u64 = Decode::decode(&mut input).ok_or("Error reading file")?; + let mut io_reader_input = IoReader(input); + let count: u64 = Decode::decode(&mut io_reader_input) + .map_err(|e| format!("Error reading file: {}", e))?; info!("Importing {} blocks", count); let mut block_count = 0; for b in 0 .. count { if exit_recv.try_recv().is_ok() { break; } - if let Some(signed) = SignedBlock::::decode(&mut input) { - let (header, extrinsics) = signed.block.deconstruct(); - let hash = header.hash(); - let block = message::BlockData:: { - hash, - justification: signed.justification, - header: Some(header), - body: Some(extrinsics), - receipt: None, - message_queue: None - }; - // import queue handles verification and importing it into the client - queue.import_blocks(BlockOrigin::File, vec![ - IncomingBlock::{ - hash: block.hash, - header: block.header, - body: block.body, - justification: block.justification, - origin: None, - } - ]); - } else { - warn!("Error reading block data at {}.", b); - break; + match SignedBlock::::decode(&mut io_reader_input) { + Ok(signed) => { + let (header, extrinsics) = signed.block.deconstruct(); + let hash = header.hash(); + let block = message::BlockData:: { + hash, + justification: signed.justification, + header: Some(header), + body: Some(extrinsics), + receipt: None, + message_queue: None + }; + // import queue handles verification and importing it into the client + queue.import_blocks(BlockOrigin::File, vec![ + IncomingBlock:: { + hash: block.hash, + header: block.header, + body: block.body, + justification: block.justification, + origin: None, + } + ]); + } + Err(e) => { + warn!("Error reading block data at {}: {}", b, e); + break; + } } block_count = b; diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index cd904156c5..bcb5cfa3b8 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -40,7 +40,7 @@ use futures03::stream::{StreamExt as _, TryStreamExt as _}; use keystore::Store as Keystore; use network::{NetworkState, NetworkStateInfo}; use log::{log, info, warn, debug, error, Level}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use primitives::{Pair, ed25519, sr25519, crypto}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{Header, NumberFor, SaturatedConversion, Zero}; @@ -877,28 +877,31 @@ impl network::TransactionPool, ComponentBlock< } let encoded = transaction.encode(); - if let Some(uxt) = Decode::decode(&mut &encoded[..]) { - let best_block_id = self.best_block_id()?; - match self.pool.submit_one(&best_block_id, uxt) { - Ok(hash) => Some(hash), - Err(e) => match e.into_pool_error() { - Ok(txpool::error::Error::AlreadyImported(hash)) => { - hash.downcast::>().ok() - .map(|x| x.as_ref().clone()) - }, - Ok(e) => { - debug!("Error adding transaction to the pool: {:?}", e); - None - }, - Err(e) => { - debug!("Error converting pool error: {:?}", e); - None - }, + match Decode::decode(&mut &encoded[..]) { + Ok(uxt) => { + let best_block_id = self.best_block_id()?; + match self.pool.submit_one(&best_block_id, uxt) { + Ok(hash) => Some(hash), + Err(e) => match e.into_pool_error() { + Ok(txpool::error::Error::AlreadyImported(hash)) => { + hash.downcast::>().ok() + .map(|x| x.as_ref().clone()) + }, + Ok(e) => { + debug!("Error adding transaction to the pool: {:?}", e); + None + }, + Err(e) => { + debug!("Error converting pool error: {:?}", e); + None + }, + } } } - } else { - debug!("Error decoding transaction"); - None + Err(e) => { + debug!("Error decoding transaction {}", e); + None + } } } diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index aed1c022da..3301b2fdc7 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -23,7 +23,7 @@ sr-version = { path = "../sr-version" } primitives = { package = "substrate-primitives", path = "../primitives" } criterion = "0.2" consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } -codec = { package = "parity-codec", version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } trybuild = "1.0" [[bench]] diff --git a/core/sr-api-macros/src/decl_runtime_apis.rs b/core/sr-api-macros/src/decl_runtime_apis.rs index c2501220b6..27f102740b 100644 --- a/core/sr-api-macros/src/decl_runtime_apis.rs +++ b/core/sr-api-macros/src/decl_runtime_apis.rs @@ -192,7 +192,7 @@ fn generate_native_call_generators(decl: &ItemTrait) -> Result { { ::decode( &mut &#crate_::runtime_api::Encode::encode(input)[..] - ).ok_or_else(|| error_desc) + ).map_err(|_| error_desc) } )); @@ -682,9 +682,9 @@ impl<'a> ToClientSideDecl<'a> { }, #crate_::runtime_api::NativeOrEncoded::Encoded(r) => { <#ret_type as #crate_::runtime_api::Decode>::decode(&mut &r[..]) - .ok_or_else(|| + .map_err(|err| #crate_::error::Error::CallResultDecode( - #function_name + #function_name, err ).into() ) } diff --git a/core/sr-api-macros/src/impl_runtime_apis.rs b/core/sr-api-macros/src/impl_runtime_apis.rs index 530405068a..973fa0558a 100644 --- a/core/sr-api-macros/src/impl_runtime_apis.rs +++ b/core/sr-api-macros/src/impl_runtime_apis.rs @@ -77,8 +77,8 @@ fn generate_impl_call( quote!( #( let #pnames : #ptypes = match #c_iter::runtime_api::Decode::decode(&mut #input) { - Some(input) => input, - None => panic!("Bad input data provided to {}", #fn_name_str), + Ok(input) => input, + Err(e) => panic!("Bad input data provided to {}: {}", #fn_name_str, e.what()), }; )* diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index a103245721..0e6fba5bd7 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -11,7 +11,7 @@ rustc_version = "0.2" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } -codec = { package = "parity-codec", version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } hash-db = { version = "0.15.0", default-features = false } libsecp256k1 = { version = "0.2.1", optional = true } tiny-keccak = { version = "1.4.2", optional = true } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 7729a1e573..ac4799513d 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -324,7 +324,7 @@ export_api! { /// Initiates a http request given HTTP verb and the URL. /// - /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Meta is a future-reserved field containing additional, parity-scale-codec encoded parameters. /// Returns the id of newly started request. fn http_request_start( method: &str, diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 861f94ced5..4dc28f0471 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -529,7 +529,7 @@ pub mod ext { /// Initiates a http request. /// - /// `meta` is parity-codec encoded additional parameters to the request (like redirection policy, + /// `meta` is parity-scale-codec encoded additional parameters to the request (like redirection policy, /// timeouts, certificates policy, etc). The format is not yet specified and the field is currently /// only reserved for future use. /// @@ -596,7 +596,7 @@ pub mod ext { /// /// # Returns /// - /// - A pointer to parity-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. + /// - A pointer to parity-scale-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. /// - In case invalid `id` is passed it returns a pointer to parity-encoded empty vector. fn ext_http_response_headers( id: u32, diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index f736df0e01..e161d5b887 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" num-traits = { version = "0.2", default-features = false } integer-sqrt = { version = "0.1.2" } serde = { version = "1.0", optional = true, features = ["derive"] } -codec = { package = "parity-codec", version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } @@ -17,7 +17,7 @@ paste = { version = "0.1"} [dev-dependencies] serde_json = "1.0" -primitive-types = "0.4" +primitive-types = "0.5.0" [features] default = ["std"] diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 9d18f67f4c..b6d72dddf7 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -22,7 +22,7 @@ use serde::Serialize; use rstd::prelude::*; use crate::ConsensusEngineId; -use crate::codec::{Decode, Encode, Input}; +use crate::codec::{Decode, Encode, Input, Error}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode)] @@ -221,27 +221,29 @@ impl Encode for DigestItem { } } +impl codec::EncodeLike for DigestItem {} + impl Decode for DigestItem { #[allow(deprecated)] - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { let item_type: DigestItemType = Decode::decode(input)?; match item_type { - DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( + DigestItemType::ChangesTrieRoot => Ok(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), DigestItemType::PreRuntime => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::PreRuntime(vals.0, vals.1)) + Ok(DigestItem::PreRuntime(vals.0, vals.1)) }, DigestItemType::Consensus => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::Consensus(vals.0, vals.1)) + Ok(DigestItem::Consensus(vals.0, vals.1)) } DigestItemType::Seal => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::Seal(vals.0, vals.1)) + Ok(DigestItem::Seal(vals.0, vals.1)) }, - DigestItemType::Other => Some(DigestItem::Other( + DigestItemType::Other => Ok(DigestItem::Other( Decode::decode(input)?, )), } @@ -305,7 +307,7 @@ impl<'a, Hash> DigestItemRef<'a, Hash> { /// Try to match this digest item to the given opaque item identifier; if it matches, then /// try to cast to the given datatype; if that works, return it. pub fn try_to(&self, id: OpaqueDigestItemId) -> Option { - self.try_as_raw(id).and_then(|mut x| Decode::decode(&mut x)) + self.try_as_raw(id).and_then(|mut x| Decode::decode(&mut x).ok()) } } @@ -340,6 +342,8 @@ impl<'a, Hash: Encode> Encode for DigestItemRef<'a, Hash> { } } +impl<'a, Hash: Encode> codec::EncodeLike for DigestItemRef<'a, Hash> {} + #[cfg(test)] mod tests { use super::*; diff --git a/core/sr-primitives/src/generic/era.rs b/core/sr-primitives/src/generic/era.rs index c41d3eedfc..7308a8adc5 100644 --- a/core/sr-primitives/src/generic/era.rs +++ b/core/sr-primitives/src/generic/era.rs @@ -19,7 +19,7 @@ #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -use crate::codec::{Decode, Encode, Input, Output}; +use crate::codec::{Decode, Encode, Input, Output, Error}; /// Era period pub type Period = u64; @@ -111,20 +111,22 @@ impl Encode for Era { } } +impl codec::EncodeLike for Era {} + impl Decode for Era { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { let first = input.read_byte()?; if first == 0 { - Some(Era::Immortal) + Ok(Era::Immortal) } else { let encoded = first as u64 + ((input.read_byte()? as u64) << 8); let period = 2 << (encoded % (1 << 4)); let quantize_factor = (period >> 12).max(1); let phase = (encoded >> 4) * quantize_factor; if period >= 4 && phase < period { - Some(Era::Mortal(period, phase)) + Ok(Era::Mortal(period, phase)) } else { - None + Err("Invalid period and phase".into()) } } } diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index 66d226b2c4..e8f40bb7b6 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -20,7 +20,7 @@ use serde::Serialize; #[cfg(feature = "std")] use log::debug; -use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef}; +use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef, Error}; use crate::traits::{ self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Hash as HashT, MaybeSerializeDebug, MaybeSerializeDebugButNotDeserialize @@ -60,8 +60,8 @@ impl Decode for Header where Hash: HashT, Hash::Output: Decode, { - fn decode(input: &mut I) -> Option { - Some(Header { + fn decode(input: &mut I) -> Result { + Ok(Header { parent_hash: Decode::decode(input)?, number: <::Type>::decode(input)?.into(), state_root: Decode::decode(input)?, @@ -85,6 +85,12 @@ impl Encode for Header where } } +impl codec::EncodeLike for Header where + Number: HasCompact + Copy + Into, + Hash: HashT, + Hash::Output: Encode, +{} + impl traits::Header for Header where Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + MaybeDisplay + SimpleArithmetic + Codec + Copy + Into, Hash: HashT, diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index b803a20397..d87c9e045f 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -21,7 +21,7 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; -use crate::codec::{Decode, Encode, Input}; +use crate::codec::{Decode, Encode, Input, Error}; use crate::traits::{self, Member, MaybeDisplay, SignedExtension, Checkable, Extrinsic}; use super::CheckedExtrinsic; @@ -131,7 +131,7 @@ where Call: Decode, Extra: SignedExtension, { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { // This is a little more complicated than usual since the binary format must be compatible // with substrate's generic `Vec` type. Basically this just means accepting that there // will be a prefix of vector length (we don't need @@ -143,10 +143,10 @@ where let is_signed = version & 0b1000_0000 != 0; let version = version & 0b0111_1111; if version != TRANSACTION_VERSION { - return None + return Err("Invalid transaction version".into()); } - Some(UncheckedExtrinsic { + Ok(UncheckedExtrinsic { signature: if is_signed { Some(Decode::decode(input)?) } else { None }, function: Decode::decode(input)?, }) @@ -245,7 +245,7 @@ mod tests { fn unsigned_codec_should_work() { let ux = Ex::new_unsigned(vec![0u8; 0]); let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); + assert_eq!(Ex::decode(&mut &encoded[..]), Ok(ux)); } #[test] @@ -257,7 +257,7 @@ mod tests { TestExtra ); let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); + assert_eq!(Ex::decode(&mut &encoded[..]), Ok(ux)); } #[test] @@ -270,7 +270,7 @@ mod tests { TestExtra ); let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); + assert_eq!(Ex::decode(&mut &encoded[..]), Ok(ux)); } #[test] diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 08cd4d1a05..1c9def98c1 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -694,6 +694,8 @@ impl codec::Encode for ApplyOutcome { } } +impl codec::EncodeLike for ApplyOutcome {} + #[derive(Eq, PartialEq, Clone, Copy, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[repr(u8)] @@ -717,6 +719,8 @@ impl codec::Encode for ApplyError { } } +impl codec::EncodeLike for ApplyError {} + /// Result from attempt to apply an extrinsic. pub type ApplyResult = Result; diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 0986c4f81a..3d55e9c4b9 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -70,7 +70,9 @@ impl OpaqueKeys for UintAuthorityId { ) } } - fn get(&self, _: KeyTypeId) -> Option { self.0.using_encoded(|mut x| T::decode(&mut x)) } + fn get(&self, _: KeyTypeId) -> Option { + self.0.using_encoded(|mut x| T::decode(&mut x)).ok() + } } /// Digest item @@ -136,7 +138,8 @@ impl traits::Header for Header { impl<'a> Deserialize<'a> for Header { fn deserialize>(de: D) -> Result { let r = >::deserialize(de)?; - Decode::decode(&mut &r[..]).ok_or(DeError::custom("Invalid value passed into decode")) + Decode::decode(&mut &r[..]) + .map_err(|e| DeError::custom(format!("Invalid value passed into decode: {}", e.what()))) } } @@ -204,7 +207,8 @@ impl Deserialize<'a> for Block where Block: Decode { fn deserialize>(de: D) -> Result { let r = >::deserialize(de)?; - Decode::decode(&mut &r[..]).ok_or(DeError::custom("Invalid value passed into decode")) + Decode::decode(&mut &r[..]) + .map_err(|e| DeError::custom(format!("Invalid value passed into decode: {}", e.what()))) } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index f7d55dda79..ce67a888bc 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -1029,21 +1029,30 @@ pub trait OpaqueKeys: Clone { /// Get the raw bytes of key with key-type ID `i`. fn get_raw(&self, i: super::KeyTypeId) -> &[u8]; /// Get the decoded key with index `i`. - fn get(&self, i: super::KeyTypeId) -> Option { T::decode(&mut self.get_raw(i)) } + fn get(&self, i: super::KeyTypeId) -> Option { + T::decode(&mut self.get_raw(i)).ok() + } /// Verify a proof of ownership for the keys. fn ownership_proof_is_valid(&self, _proof: &[u8]) -> bool { true } } +/// Input that adds infinite number of zero after wrapped input. struct TrailingZeroInput<'a>(&'a [u8]); + impl<'a> codec::Input for TrailingZeroInput<'a> { - fn read(&mut self, into: &mut [u8]) -> usize { - let len = into.len().min(self.0.len()); - into[..len].copy_from_slice(&self.0[..len]); - for i in &mut into[len..] { + fn remaining_len(&mut self) -> Result, codec::Error> { + Ok(None) + } + + fn read(&mut self, into: &mut [u8]) -> Result<(), codec::Error> { + let len_from_inner = into.len().min(self.0.len()); + into[..len_from_inner].copy_from_slice(&self.0[..len_from_inner]); + for i in &mut into[len_from_inner..] { *i = 0; } - self.0 = &self.0[len..]; - into.len() + self.0 = &self.0[len_from_inner..]; + + Ok(()) } } @@ -1091,7 +1100,7 @@ impl AccountIdConver x.using_encoded(|d| { if &d[0..4] != Id::TYPE_ID { return None } let mut cursor = &d[4..]; - let result = Decode::decode(&mut cursor)?; + let result = Decode::decode(&mut cursor).ok()?; if cursor.iter().all(|x| *x == 0) { Some(result) } else { @@ -1104,7 +1113,7 @@ impl AccountIdConver #[cfg(test)] mod tests { use super::AccountIdConversion; - use crate::codec::{Encode, Decode}; + use crate::codec::{Encode, Decode, Input}; #[derive(Encode, Decode, Default, PartialEq, Debug)] struct U32Value(u32); @@ -1153,6 +1162,22 @@ mod tests { let r = U16Value::try_from_account(&0x0100_c0da_f00dcafe_u64); assert!(r.is_none()); } + + #[test] + fn trailing_zero_should_work() { + let mut t = super::TrailingZeroInput(&[1, 2, 3]); + assert_eq!(t.remaining_len(), Ok(None)); + let mut buffer = [0u8; 2]; + assert_eq!(t.read(&mut buffer), Ok(())); + assert_eq!(t.remaining_len(), Ok(None)); + assert_eq!(buffer, [1, 2]); + assert_eq!(t.read(&mut buffer), Ok(())); + assert_eq!(t.remaining_len(), Ok(None)); + assert_eq!(buffer, [3, 0]); + assert_eq!(t.read(&mut buffer), Ok(())); + assert_eq!(t.remaining_len(), Ok(None)); + assert_eq!(buffer, [0, 0]); + } } /// Calls a given macro a number of times with a set of fixed params and an incrementing numeral. diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index a6cc43c5a3..4d5d53baf1 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -17,7 +17,7 @@ //! Transaction validity interface. use rstd::prelude::*; -use crate::codec::{Encode, Decode}; +use crate::codec::{Encode, Decode, Error}; use crate::traits::DispatchError; /// Priority for a transaction. Additive. Higher is better. @@ -113,9 +113,9 @@ impl ValidTransaction { } impl Decode for TransactionValidity { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> Result { match value.read_byte()? { - 0 => Some(TransactionValidity::Invalid(i8::decode(value)?)), + 0 => Ok(TransactionValidity::Invalid(i8::decode(value)?)), 1 => { let priority = TransactionPriority::decode(value)?; let requires = Vec::decode(value)?; @@ -123,12 +123,12 @@ impl Decode for TransactionValidity { let longevity = TransactionLongevity::decode(value)?; let propagate = bool::decode(value).unwrap_or(true); - Some(TransactionValidity::Valid(ValidTransaction { + Ok(TransactionValidity::Valid(ValidTransaction { priority, requires, provides, longevity, propagate, })) }, - 2 => Some(TransactionValidity::Unknown(i8::decode(value)?)), - _ => None, + 2 => Ok(TransactionValidity::Unknown(i8::decode(value)?)), + _ => Err("Invalid transaction validity variant".into()), } } } @@ -143,7 +143,7 @@ mod tests { 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0 ]; - assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid(ValidTransaction { + assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Ok(TransactionValidity::Valid(ValidTransaction { priority: 5, requires: vec![vec![1, 2, 3, 4]], provides: vec![vec![4, 5, 6]], @@ -169,6 +169,6 @@ mod tests { ); // decode back - assert_eq!(TransactionValidity::decode(&mut &*encoded), Some(v)); + assert_eq!(TransactionValidity::decode(&mut &*encoded), Ok(v)); } } diff --git a/core/sr-sandbox/Cargo.toml b/core/sr-sandbox/Cargo.toml index 5e3aabfd23..da80b2f213 100755 --- a/core/sr-sandbox/Cargo.toml +++ b/core/sr-sandbox/Cargo.toml @@ -12,7 +12,7 @@ rustc_version = "0.2" wasmi = { version = "0.5.0", optional = true } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -codec = { package = "parity-codec", version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } [dev-dependencies] wabt = "~0.7.4" diff --git a/core/sr-sandbox/without_std.rs b/core/sr-sandbox/without_std.rs index 9fb255a523..ee5f7697fe 100755 --- a/core/sr-sandbox/without_std.rs +++ b/core/sr-sandbox/without_std.rs @@ -304,7 +304,7 @@ impl Instance { match result { sandbox_primitives::ERR_OK => { let return_val = sandbox_primitives::ReturnValue::decode(&mut &return_val[..]) - .ok_or(Error::Execution)?; + .map_err(|_| Error::Execution)?; Ok(return_val) } sandbox_primitives::ERR_EXECUTION => Err(Error::Execution), diff --git a/core/sr-version/Cargo.toml b/core/sr-version/Cargo.toml index e7ce3327a0..a83d1f6415 100644 --- a/core/sr-version/Cargo.toml +++ b/core/sr-version/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] impl-serde = { version = "0.1", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../sr-std", default-features = false } sr-primitives = { path = "../sr-primitives", default-features = false } @@ -16,7 +16,7 @@ default = ["std"] std = [ "impl-serde", "serde", - "parity-codec/std", + "codec/std", "rstd/std", "sr-primitives/std", ] diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 12998cecbc..cf96fe70e2 100644 --- a/core/sr-version/src/lib.rs +++ b/core/sr-version/src/lib.rs @@ -27,9 +27,9 @@ use std::collections::HashSet; #[cfg(feature = "std")] use sr_primitives::traits::RuntimeApiInfo; -use parity_codec::Encode; +use codec::Encode; #[cfg(feature = "std")] -use parity_codec::Decode; +use codec::Decode; use sr_primitives::RuntimeString; pub use sr_primitives::create_runtime_str; diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index a8dad1e84e..55d66ea5f8 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" parking_lot = "0.8.0" log = "0.4" primitives = { package = "substrate-primitives", path = "../../core/primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } [dev-dependencies] env_logger = "0.6" diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 4434fa4ef6..43820529d4 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -35,7 +35,6 @@ mod pruning; use std::fmt; use parking_lot::RwLock; -use parity_codec as codec; use codec::Codec; use std::collections::{VecDeque, HashMap, hash_map::Entry}; use noncanonical::NonCanonicalOverlay; @@ -71,7 +70,7 @@ pub enum Error { /// Database backend error. Db(E), /// `Codec` decoding error. - Decoding, + Decoding(codec::Error), /// Trying to canonicalize invalid block. InvalidBlock, /// Trying to insert block with invalid number. @@ -82,11 +81,17 @@ pub enum Error { DiscardingPinned, } +impl From for Error { + fn from(x: codec::Error) -> Self { + Error::Decoding(x) + } +} + impl fmt::Debug for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Error::Db(e) => e.fmt(f), - Error::Decoding => write!(f, "Error decoding slicable value"), + Error::Decoding(e) => write!(f, "Error decoding slicable value: {}", e.what()), Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index 0d43389a0b..1017b8a211 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -23,7 +23,7 @@ use std::fmt; use std::collections::{HashMap, VecDeque, hash_map::Entry}; use super::{Error, DBValue, ChangeSet, CommitSet, MetaDb, Hash, to_meta_key}; -use crate::codec::{Encode, Decode}; +use codec::{Encode, Decode}; use log::trace; const NON_CANONICAL_JOURNAL: &[u8] = b"noncanonical_journal"; @@ -116,7 +116,7 @@ impl NonCanonicalOverlay { let last_canonicalized = db.get_meta(&to_meta_key(LAST_CANONICAL, &())) .map_err(|e| Error::Db(e))?; let last_canonicalized = match last_canonicalized { - Some(buffer) => Some(<(BlockHash, u64)>::decode(&mut buffer.as_slice()).ok_or(Error::Decoding)?), + Some(buffer) => Some(<(BlockHash, u64)>::decode(&mut buffer.as_slice())?), None => None, }; let mut levels = VecDeque::new(); @@ -134,7 +134,7 @@ impl NonCanonicalOverlay { let journal_key = to_journal_key(block, index); match db.get_meta(&journal_key).map_err(|e| Error::Db(e))? { Some(record) => { - let record: JournalRecord = Decode::decode(&mut record.as_slice()).ok_or(Error::Decoding)?; + let record: JournalRecord = Decode::decode(&mut record.as_slice())?; let inserted = record.inserted.iter().map(|(k, _)| k.clone()).collect(); let overlay = BlockOverlay { hash: record.hash.clone(), diff --git a/core/state-db/src/pruning.rs b/core/state-db/src/pruning.rs index 078745c7a2..21f472fe69 100644 --- a/core/state-db/src/pruning.rs +++ b/core/state-db/src/pruning.rs @@ -23,7 +23,7 @@ //! The changes are journaled in the DB. use std::collections::{HashMap, HashSet, VecDeque}; -use crate::codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::{CommitSet, Error, MetaDb, to_meta_key, Hash}; use log::{trace, warn}; @@ -69,7 +69,7 @@ impl RefWindow { let last_pruned = db.get_meta(&to_meta_key(LAST_PRUNED, &())) .map_err(|e| Error::Db(e))?; let pending_number: u64 = match last_pruned { - Some(buffer) => u64::decode(&mut buffer.as_slice()).ok_or(Error::Decoding)? + 1, + Some(buffer) => u64::decode(&mut buffer.as_slice())? + 1, None => 0, }; let mut block = pending_number; @@ -86,7 +86,7 @@ impl RefWindow { let journal_key = to_journal_key(block); match db.get_meta(&journal_key).map_err(|e| Error::Db(e))? { Some(record) => { - let record: JournalRecord = Decode::decode(&mut record.as_slice()).ok_or(Error::Decoding)?; + let record: JournalRecord = Decode::decode(&mut record.as_slice())?; trace!(target: "state-db", "Pruning journal entry {} ({} inserted, {} deleted)", block, record.inserted.len(), record.deleted.len()); pruning.import(&record.hash, journal_key, record.inserted.into_iter(), record.deleted); }, diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index c7a15bf957..bb00cfcbb7 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -14,7 +14,7 @@ trie-root = "0.15.0" trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } num-traits = "0.2" [dev-dependencies] diff --git a/core/state-machine/src/changes_trie/build.rs b/core/state-machine/src/changes_trie/build.rs index d32d28906f..e1e3f6a808 100644 --- a/core/state-machine/src/changes_trie/build.rs +++ b/core/state-machine/src/changes_trie/build.rs @@ -18,7 +18,7 @@ use std::collections::BTreeMap; use std::collections::btree_map::Entry; -use parity_codec::Decode; +use codec::Decode; use hash_db::Hasher; use num_traits::One; use crate::backend::Backend; @@ -156,13 +156,13 @@ fn prepare_digest_input<'a, S, H, Number>( let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&extrinsic_prefix, |key| - if let Some(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { + if let Ok(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { insert_to_map(trie_key.key); }); let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&digest_prefix, |key| - if let Some(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { + if let Ok(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { insert_to_map(trie_key.key); }); @@ -173,7 +173,7 @@ fn prepare_digest_input<'a, S, H, Number>( #[cfg(test)] mod test { - use parity_codec::Encode; + use codec::Encode; use primitives::Blake2Hasher; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; use crate::backend::InMemory; diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index 66d09c98d4..f7342cc60f 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -19,7 +19,7 @@ use std::cell::RefCell; use std::collections::VecDeque; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; use num_traits::One; use trie::{Recorder, MemoryDB}; @@ -249,8 +249,7 @@ impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> let extrinsics_key = ExtrinsicIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let extrinsics = trie_reader(&self.storage, trie_root, &extrinsics_key); if let Some(extrinsics) = extrinsics? { - let extrinsics: Option = Decode::decode(&mut &extrinsics[..]); - if let Some(extrinsics) = extrinsics { + if let Ok(extrinsics) = ExtrinsicIndexValue::decode(&mut &extrinsics[..]) { self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block.clone(), e))); } } @@ -259,8 +258,7 @@ impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> let blocks_key = DigestIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let blocks = trie_reader(&self.storage, trie_root, &blocks_key); if let Some(blocks) = blocks? { - let blocks: Option> = Decode::decode(&mut &blocks[..]); - if let Some(blocks) = blocks { + if let Ok(blocks) = >::decode(&mut &blocks[..]) { // filter level0 blocks here because we tend to use digest blocks, // AND digest block changes could also include changes for out-of-range blocks let begin = self.begin.clone(); diff --git a/core/state-machine/src/changes_trie/input.rs b/core/state-machine/src/changes_trie/input.rs index ae939c028b..8da4f1a386 100644 --- a/core/state-machine/src/changes_trie/input.rs +++ b/core/state-machine/src/changes_trie/input.rs @@ -16,7 +16,7 @@ //! Different types of changes trie input pairs. -use parity_codec::{Decode, Encode, Input, Output}; +use codec::{Decode, Encode, Input, Output, Error}; use crate::changes_trie::BlockNumber; /// Key of { changed key => set of extrinsic indices } mapping. @@ -95,6 +95,8 @@ impl Encode for ExtrinsicIndex { } } +impl codec::EncodeLike for ExtrinsicIndex {} + impl DigestIndex { pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![2]; @@ -112,18 +114,20 @@ impl Encode for DigestIndex { } } +impl codec::EncodeLike for DigestIndex {} + impl Decode for InputKey { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { match input.read_byte()? { - 1 => Some(InputKey::ExtrinsicIndex(ExtrinsicIndex { + 1 => Ok(InputKey::ExtrinsicIndex(ExtrinsicIndex { block: Decode::decode(input)?, key: Decode::decode(input)?, })), - 2 => Some(InputKey::DigestIndex(DigestIndex { + 2 => Ok(InputKey::DigestIndex(DigestIndex { block: Decode::decode(input)?, key: Decode::decode(input)?, })), - _ => None, + _ => Err("Invalid input key variant".into()), } } } diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index 48ba9eac95..b29a515d74 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -49,7 +49,7 @@ pub use self::prune::{prune, oldest_non_pruned_trie}; use hash_db::{Hasher, Prefix}; use crate::backend::Backend; use num_traits::{One, Zero}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives; use crate::changes_trie::build::prepare_input; use crate::overlayed_changes::OverlayedChanges; diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 7f0fa1de3f..8c54806dd9 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -338,7 +338,7 @@ where #[cfg(test)] mod tests { use hex_literal::hex; - use parity_codec::Encode; + use codec::Encode; use primitives::{Blake2Hasher}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; use crate::backend::InMemory; diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index d2ffc23b78..b98228e9b2 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -22,7 +22,7 @@ use std::{fmt, panic::UnwindSafe, result, marker::PhantomData}; use std::borrow::Cow; use log::warn; use hash_db::Hasher; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::{ storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain, }; @@ -938,7 +938,7 @@ pub(crate) fn set_changes_trie_config( ) -> Result<(), Box> { let config = match config { Some(v) => Some(Decode::decode(&mut &v[..]) - .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), + .map_err(|_| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), None => None, }; @@ -972,7 +972,7 @@ where #[cfg(test)] mod tests { use std::collections::HashMap; - use parity_codec::Encode; + use codec::Encode; use overlayed_changes::OverlayedValue; use super::*; use super::backend::InMemory; diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index 34bf8ca3c5..8c4160760b 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -18,7 +18,7 @@ #[cfg(test)] use std::iter::FromIterator; use std::collections::{HashMap, BTreeSet}; -use parity_codec::Decode; +use codec::Decode; use crate::changes_trie::{NO_EXTRINSIC_INDEX, Configuration as ChangesTrieConfig}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; @@ -267,7 +267,7 @@ impl OverlayedChanges { /// Inserts storage entry responsible for current extrinsic index. #[cfg(test)] pub(crate) fn set_extrinsic_index(&mut self, extrinsic_index: u32) { - use parity_codec::Encode; + use codec::Encode; self.prospective.top.insert(EXTRINSIC_INDEX.to_vec(), OverlayedValue { value: Some(extrinsic_index.encode()), extrinsics: None, @@ -284,7 +284,7 @@ impl OverlayedChanges { match self.changes_trie_config.is_some() { true => Some( self.storage(EXTRINSIC_INDEX) - .and_then(|idx| idx.and_then(|idx| Decode::decode(&mut &*idx))) + .and_then(|idx| idx.and_then(|idx| Decode::decode(&mut &*idx).ok())) .unwrap_or(NO_EXTRINSIC_INDEX)), false => None, } diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 73c0b38ef4..89290a59e2 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -27,7 +27,7 @@ use crate::changes_trie::{ }; use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; -use parity_codec::Encode; +use codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 18c1b0eeca..739044dd50 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -194,9 +194,8 @@ impl, H: Hasher> Backend for TrieBackend where pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; - use parity_codec::Encode; - use trie::{TrieMut, PrefixedMemoryDB}; - use trie::trie_types::TrieDBMut; + use codec::Encode; + use trie::{TrieMut, PrefixedMemoryDB, trie_types::TrieDBMut}; use super::*; fn test_db() -> (PrefixedMemoryDB, H256) { diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index bd3b0db2ce..163cc2ab14 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -12,7 +12,7 @@ executor = { package = "substrate-executor", path = "../executor" } futures-preview = "0.3.0-alpha.17" hash-db = "0.15.0" keyring = { package = "substrate-keyring", path = "../keyring" } -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } primitives = { package = "substrate-primitives", path = "../primitives" } sr-primitives = { path = "../sr-primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index a256dd8be5..b29a7db471 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -26,7 +26,7 @@ use sr_primitives::Justification; use sr_primitives::traits::{Block as BlockT}; use sr_primitives::generic::BlockId; use primitives::Blake2Hasher; -use parity_codec::alloc::collections::hash_map::HashMap; +use codec::alloc::collections::hash_map::HashMap; /// Extension trait for a test client. pub trait ClientExt: Sized { diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 03ba10c5fb..03c95a5c27 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] log = { version = "0.4", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } keyring = { package = "substrate-keyring", path = "../keyring", optional = true } substrate-client = { path = "../client", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } @@ -48,7 +48,7 @@ std = [ "serde", "substrate-client/std", "keyring", - "parity-codec/std", + "codec/std", "rstd/std", "runtime_io/std", "runtime_support/std", diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index da7d9cf4ef..8d5be8355e 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -19,7 +19,7 @@ use std::collections::HashMap; use runtime_io::{blake2_256, twox_128}; use super::{AuthorityId, AccountId, WASM_BINARY}; -use parity_codec::{Encode, KeyedVec, Joiner}; +use codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; use sr_primitives::traits::Block; diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 98d2437059..6492d27bbe 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -23,7 +23,7 @@ pub mod genesismap; pub mod system; use rstd::{prelude::*, marker::PhantomData}; -use parity_codec::{Encode, Decode, Input}; +use codec::{Encode, Decode, Input, Error}; use primitives::Blake2Hasher; use trie_db::{TrieMut, Trie}; @@ -214,6 +214,8 @@ impl Encode for DecodeFails { } } +impl codec::EncodeLike for DecodeFails {} + impl DecodeFails { /// Create a new instance. pub fn new() -> DecodeFails { @@ -224,9 +226,8 @@ impl DecodeFails { } impl Decode for DecodeFails { - fn decode(_: &mut I) -> Option { - // decoding always fails - None + fn decode(_: &mut I) -> Result { + Err("DecodeFails always fails".into()) } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 30cd105328..c108672c83 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -25,7 +25,7 @@ use sr_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; use sr_primitives::generic; use sr_primitives::{ApplyError, ApplyOutcome, ApplyResult}; use sr_primitives::transaction_validity::{TransactionValidity, ValidTransaction}; -use parity_codec::{KeyedVec, Encode}; +use codec::{KeyedVec, Encode}; use super::{ AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId }; diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index 6d2465922b..c18a50778d 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" derive_more = "0.14.0" futures = "0.1" log = "0.4" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } parking_lot = "0.8.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 2ecb6ab188..8010b07ac4 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -16,5 +16,5 @@ sr-primitives = { path = "../../sr-primitives" } [dev-dependencies] assert_matches = "1.3.0" env_logger = "0.6.1" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } test_runtime = { package = "substrate-test-runtime", path = "../../test-runtime" } diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 8f76a17ed9..6eec0d222f 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -454,7 +454,7 @@ mod tests { use super::*; use sr_primitives::transaction_validity::ValidTransaction; use futures::Stream; - use parity_codec::Encode; + use codec::Encode; use test_runtime::{Block, Extrinsic, Transfer, H256, AccountId}; use assert_matches::assert_matches; use crate::watcher; diff --git a/core/transaction-pool/src/api.rs b/core/transaction-pool/src/api.rs index 668a9b8013..c0c4c787a5 100644 --- a/core/transaction-pool/src/api.rs +++ b/core/transaction-pool/src/api.rs @@ -21,7 +21,7 @@ use std::{ marker::PhantomData, }; use client::{runtime_api::TaggedTransactionQueue, blockchain::HeaderBackend}; -use parity_codec::Encode; +use codec::Encode; use txpool; use primitives::{ H256, diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index 7fb94936d2..71ed988e5e 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -17,7 +17,7 @@ use super::*; -use parity_codec::Encode; +use codec::Encode; use txpool::{self, Pool}; use test_client::{runtime::{AccountId, Block, Hash, Index, Extrinsic, Transfer}, AccountKeyring::{self, *}}; use sr_primitives::{ diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index 8659462bc4..82945d90f3 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -2,7 +2,7 @@ name = "substrate-trie" version = "2.0.0" authors = ["Parity Technologies "] -description = "Patricia trie stuff using a parity-codec node format" +description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/parity-common" license = "GPL-3.0" edition = "2018" @@ -12,7 +12,7 @@ name = "bench" harness = false [dependencies] -codec = { package = "parity-codec", version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } hash-db = { version = "0.15.0", default-features = false } trie-db = { version = "0.15.0", default-features = false } diff --git a/core/trie/src/error.rs b/core/trie/src/error.rs index 1e386146d3..c18db37f35 100644 --- a/core/trie/src/error.rs +++ b/core/trie/src/error.rs @@ -12,22 +12,36 @@ use std::fmt; use std::error::Error as StdError; #[derive(Debug, PartialEq, Eq, Clone)] -/// Error concerning the Parity-Codec based decoder. +/// Error for trie node decoding. pub enum Error { /// Bad format. BadFormat, + /// Decoding error. + Decode(codec::Error) +} + +impl From for Error { + fn from(x: codec::Error) -> Self { + Error::Decode(x) + } } #[cfg(feature="std")] impl StdError for Error { fn description(&self) -> &str { - "codec error" + match self { + Error::BadFormat => "Bad format error", + Error::Decode(_) => "Decoding error", + } } } #[cfg(feature="std")] impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(&self, f) + match self { + Error::Decode(e) => write!(f, "Decode error: {}", e.what()), + Error::BadFormat => write!(f, "Bad format"), + } } } diff --git a/core/trie/src/node_codec.rs b/core/trie/src/node_codec.rs index 8c01beda6b..950f0c726f 100644 --- a/core/trie/src/node_codec.rs +++ b/core/trie/src/node_codec.rs @@ -49,7 +49,7 @@ impl NodeCodecT for NodeCodec { fn decode(data: &[u8]) -> rstd::result::Result { let input = &mut &*data; - let head = NodeHeader::decode(input).ok_or(Error::BadFormat)?; + let head = NodeHeader::decode(input)?; match head { NodeHeader::Null => Ok(Node::Empty), NodeHeader::Branch(has_value, nibble_count) => { @@ -69,7 +69,7 @@ impl NodeCodecT for NodeCodec { let bitmap_slice = take(input, BITMAP_LENGTH).ok_or(Error::BadFormat)?; let bitmap = Bitmap::decode(&bitmap_slice[..])?; let value = if has_value { - let count = >::decode(input).ok_or(Error::BadFormat)?.0 as usize; + let count = >::decode(input)?.0 as usize; Some(take(input, count).ok_or(Error::BadFormat)?) } else { None @@ -78,7 +78,7 @@ impl NodeCodecT for NodeCodec { for i in 0..nibble_ops::NIBBLE_LENGTH { if bitmap.value_at(i) { - let count = >::decode(input).ok_or(Error::BadFormat)?.0 as usize; + let count = >::decode(input)?.0 as usize; children[i] = Some(take(input, count).ok_or(Error::BadFormat)?); } } @@ -98,7 +98,7 @@ impl NodeCodecT for NodeCodec { nibble_data, nibble_ops::number_padding(nibble_count), ); - let count = >::decode(input).ok_or(Error::BadFormat)?.0 as usize; + let count = >::decode(input)?.0 as usize; Ok(Node::Leaf(nibble_slice, take(input, count).ok_or(Error::BadFormat)?)) } } @@ -229,11 +229,8 @@ const BITMAP_LENGTH: usize = 2; pub(crate) struct Bitmap(u16); impl Bitmap { - pub fn decode(data: &[u8]) -> Result { - u16::decode(&mut &data[..]) - .ok_or(Error::BadFormat) - .map(|v|Bitmap(v)) + Ok(Bitmap(u16::decode(&mut &data[..])?)) } pub fn value_at(&self, i: usize) -> bool { diff --git a/core/trie/src/node_header.rs b/core/trie/src/node_header.rs index e4c38bd075..50d3d87250 100644 --- a/core/trie/src/node_header.rs +++ b/core/trie/src/node_header.rs @@ -50,18 +50,20 @@ impl Encode for NodeHeader { } } +impl codec::EncodeLike for NodeHeader {} + impl Decode for NodeHeader { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { let i = input.read_byte()?; if i == trie_constants::EMPTY_TRIE { - return Some(NodeHeader::Null); + return Ok(NodeHeader::Null); } match i & (0b11 << 6) { - trie_constants::LEAF_PREFIX_MASK => Some(NodeHeader::Leaf(decode_size(i, input)?)), - trie_constants::BRANCH_WITHOUT_MASK => Some(NodeHeader::Branch(false, decode_size(i, input)?)), - trie_constants::BRANCH_WITH_MASK => Some(NodeHeader::Branch(true, decode_size(i, input)?)), + trie_constants::LEAF_PREFIX_MASK => Ok(NodeHeader::Leaf(decode_size(i, input)?)), + trie_constants::BRANCH_WITHOUT_MASK => Ok(NodeHeader::Branch(false, decode_size(i, input)?)), + trie_constants::BRANCH_WITH_MASK => Ok(NodeHeader::Branch(true, decode_size(i, input)?)), // do not allow any special encoding - _ => None, + _ => Err("Unallowed encoding".into()), } } } @@ -103,18 +105,18 @@ fn encode_size_and_prefix(size: usize, prefix: u8, out: &mut impl Output) { } /// Decode size only from stream input and header byte. -fn decode_size(first: u8, input: &mut impl Input) -> Option { +fn decode_size(first: u8, input: &mut impl Input) -> Result { let mut result = (first & 255u8 >> 2) as usize; if result < 63 { - return Some(result); + return Ok(result); } result -= 1; while result <= trie_constants::NIBBLE_SIZE_BOUND { let n = input.read_byte()? as usize; if n < 255 { - return Some(result + n + 1); + return Ok(result + n + 1); } result += 255; } - Some(trie_constants::NIBBLE_SIZE_BOUND) + Ok(trie_constants::NIBBLE_SIZE_BOUND) } diff --git a/core/utils/fork-tree/Cargo.toml b/core/utils/fork-tree/Cargo.toml index c41914e07a..fa37161dc2 100644 --- a/core/utils/fork-tree/Cargo.toml +++ b/core/utils/fork-tree/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/core/utils/fork-tree/src/lib.rs b/core/utils/fork-tree/src/lib.rs index c6debe859a..5a7480e065 100644 --- a/core/utils/fork-tree/src/lib.rs +++ b/core/utils/fork-tree/src/lib.rs @@ -20,7 +20,7 @@ #![warn(missing_docs)] use std::fmt; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; /// Error occured when iterating with the tree. #[derive(Clone, Debug, PartialEq)] diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index ad626beb0b..ea48ff7f68 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -17,7 +17,7 @@ log = "0.4" tokio = "0.1" exit-future = "0.1" parking_lot = "0.8.0" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } trie-root = "0.15.0" sr-io = { path = "../core/sr-io" } substrate-cli = { path = "../core/cli" } diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 1bde247930..878374cf6a 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default_features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default_features = false } version = { package = "sr-version", path = "../../core/sr-version", default_features = false } @@ -31,7 +31,7 @@ wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1. [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "client/std", "rstd/std", "runtime-io/std", diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index d3d48ebe01..f95f688ac3 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -12,7 +12,7 @@ tokio = "0.1.7" futures = "0.1" exit-future = "0.1" cli = { package = "substrate-cli", path = "../../core/cli" } -parity-codec = { version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } sr-io = { path = "../../core/sr-io" } client = { package = "substrate-client", path = "../../core/client" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index dffd084c5f..41ac992abb 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -21,11 +21,10 @@ use rand::{Rng, SeedableRng}; use rand::rngs::StdRng; -use parity_codec::Decode; +use codec::{Encode, Decode}; use keyring::sr25519::Keyring; use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall, ExistentialDeposit}; use primitives::{sr25519, crypto::Pair}; -use parity_codec::Encode; use sr_primitives::{generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension}}; use substrate_service::ServiceFactory; use transaction_factory::RuntimeAdapter; diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 8fbd425da3..0b887bb55a 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -265,7 +265,7 @@ mod tests { use node_primitives::DigestItem; use node_runtime::{BalancesCall, Call, UncheckedExtrinsic}; use node_runtime::constants::{currency::CENTS, time::SLOT_DURATION}; - use parity_codec::{Encode, Decode}; + use codec::{Encode, Decode}; use primitives::{ crypto::Pair as CryptoPair, blake2_256, sr25519::Public as AddressPublic, H256, diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 44a56ee4a6..d1886c2ab6 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] trie-root = "0.15.0" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } state_machine = { package = "substrate-state-machine", path = "../../core/state-machine" } substrate-executor = { path = "../../core/executor" } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 572d0ca149..711fdcdb69 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -40,7 +40,7 @@ mod tests { use {balances, contracts, indices, staking, system, timestamp}; use runtime_io; use substrate_executor::WasmExecutor; - use parity_codec::{Encode, Decode, Joiner}; + use codec::{Encode, Decode, Joiner}; use keyring::{AccountKeyring, Ed25519Keyring, Sr25519Keyring}; use runtime_support::{Hashable, StorageValue, StorageMap, assert_eq_error_rate, traits::Currency}; use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index 36ea1eb414..05fb231205 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -18,7 +18,7 @@ pretty_assertions = "0.5" [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", "sr-primitives/std", diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index c40e6d7796..da6180889e 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] integer-sqrt = { version = "0.1.2" } safe-mix = { version = "1.0", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } client = { package = "substrate-client", path = "../../core/client", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -50,7 +50,7 @@ no_std = [ "contracts/core", ] std = [ - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", "sr-primitives/std", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 06285571ba..f89e1f4a86 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 129, - impl_version: 129, + impl_version: 130, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/assets/Cargo.toml b/srml/assets/Cargo.toml index d1526c8be8..2badb46130 100644 --- a/srml/assets/Cargo.toml +++ b/srml/assets/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } # Needed for various traits. In our case, `OnFinalize`. sr-primitives = { path = "../../core/sr-primitives", default-features = false } # Needed for type-safe access to storage DB. @@ -23,7 +23,7 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "sr-primitives/std", "srml-support/std", "system/std", diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index 9ce3658283..6ce9c87c5c 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -27,7 +27,7 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", "sr-primitives/std", diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 1402cb1d9e..a79b5c46a5 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -51,7 +51,7 @@ pub use timestamp; use rstd::{result, prelude::*}; -use parity_codec::Encode; +use codec::Encode; use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue, traits::Get}; use sr_primitives::{ traits::{SaturatedConversion, Saturating, Zero, One, Member, IsMember, TypedKey}, @@ -65,7 +65,7 @@ use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent use inherents::{InherentDataProviders, ProvideInherentData}; use substrate_consensus_aura_primitives::{AURA_ENGINE_ID, ConsensusLog}; #[cfg(feature = "std")] -use parity_codec::Decode; +use codec::Decode; mod mock; mod tests; @@ -138,7 +138,7 @@ impl ProvideInherentData for InherentDataProvider { } fn error_to_string(&self, error: &[u8]) -> Option { - RuntimeString::decode(&mut &error[..]).map(Into::into) + RuntimeString::decode(&mut &error[..]).map(Into::into).ok() } } diff --git a/srml/authorship/Cargo.toml b/srml/authorship/Cargo.toml index 29de88ba2c..f470675b4b 100644 --- a/srml/authorship/Cargo.toml +++ b/srml/authorship/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } @@ -17,7 +17,7 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "primitives/std", "sr-primitives/std", "rstd/std", diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 2325dac5f3..e46e2f232d 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -25,7 +25,7 @@ use rstd::collections::btree_set::BTreeSet; use srml_support::{decl_module, decl_storage, for_each_tuple, StorageValue}; use srml_support::traits::{FindAuthor, VerifySeal, Get}; use srml_support::dispatch::Result as DispatchResult; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use system::ensure_none; use sr_primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; use sr_primitives::weights::SimpleDispatchInfo; @@ -382,7 +382,7 @@ mod tests { { for (id, data) in digests { if id == TEST_ID { - return u64::decode(&mut &data[..]); + return u64::decode(&mut &data[..]).ok(); } } @@ -409,8 +409,8 @@ mod tests { for (id, seal) in seals { if id == TEST_ID { match u64::decode(&mut &seal[..]) { - None => return Err("wrong seal"), - Some(a) => { + Err(_) => return Err("wrong seal"), + Ok(a) => { if a != author { return Err("wrong author in seal"); } diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index ba47d8e278..2e2d3c84b0 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] hex-literal = "0.2" -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.93", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -28,7 +28,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", "sr-primitives/std", diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index 8e72fdffd4..02099aace8 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -28,7 +28,7 @@ use sr_primitives::{generic::DigestItem, ConsensusEngineId}; use sr_primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; @@ -103,7 +103,7 @@ impl ProvideInherentData for InherentDataProvider { } fn error_to_string(&self, error: &[u8]) -> Option { - RuntimeString::decode(&mut &error[..]).map(Into::into) + RuntimeString::decode(&mut &error[..]).map(Into::into).ok() } } @@ -186,7 +186,7 @@ decl_module! { .iter() .filter_map(|s| s.as_pre_runtime()) .filter_map(|(id, mut data)| if id == BABE_ENGINE_ID { - RawBabePreDigest::decode(&mut data) + RawBabePreDigest::decode(&mut data).ok() } else { None }) @@ -219,7 +219,7 @@ impl FindAuthor for Module { { for (id, mut data) in digests.into_iter() { if id == BABE_ENGINE_ID { - return Some(RawBabePreDigest::decode(&mut data)?.authority_index); + return Some(RawBabePreDigest::decode(&mut data).ok()?.authority_index); } } return None; diff --git a/srml/balances/Cargo.toml b/srml/balances/Cargo.toml index f096d506a4..d3ac0c96b3 100644 --- a/srml/balances/Cargo.toml +++ b/srml/balances/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -24,7 +24,7 @@ std = [ "serde", "safe-mix/std", "substrate-keyring", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", "sr-primitives/std", diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index bff5e90c32..b1aefccc67 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -151,7 +151,7 @@ use rstd::prelude::*; use rstd::{cmp, result, mem}; -use parity_codec::{Codec, Encode, Decode}; +use codec::{Codec, Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module}; use srml_support::traits::{ UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnUnbalanced, diff --git a/srml/collective/Cargo.toml b/srml/collective/Cargo.toml index 83d25593e4..7aaba7c29f 100644 --- a/srml/collective/Cargo.toml +++ b/srml/collective/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -23,7 +23,7 @@ balances = { package = "srml-balances", path = "../balances" } default = ["std"] std = [ "safe-mix/std", - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", "serde", diff --git a/srml/contracts/Cargo.toml b/srml/contracts/Cargo.toml index 33c32c8ea2..a013571edf 100644 --- a/srml/contracts/Cargo.toml +++ b/srml/contracts/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } pwasm-utils = { version = "0.6.1", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } parity-wasm = { version = "0.31", default-features = false } wasmi-validation = { version = "0.1", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } @@ -33,7 +33,7 @@ core = [ ] std = [ "serde", - "parity-codec/std", + "codec/std", "primitives/std", "sr-primitives/std", "runtime-io/std", diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index 15d7b37a45..d28ee362eb 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -98,7 +98,7 @@ use crate::wasm::{WasmLoader, WasmVm}; use serde::{Serialize, Deserialize}; use primitives::crypto::UncheckedFrom; use rstd::{prelude::*, marker::PhantomData}; -use parity_codec::{Codec, Encode, Decode}; +use codec::{Codec, Encode, Decode}; use runtime_io::blake2_256; use sr_primitives::traits::{ Hash, StaticLookup, Zero, MaybeSerializeDebug, Member diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index 5a53d8426f..80bb7af518 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -26,7 +26,7 @@ use crate::{ }; use assert_matches::assert_matches; use hex_literal::*; -use parity_codec::{Decode, Encode, KeyedVec}; +use codec::{Decode, Encode, KeyedVec}; use runtime_io; use runtime_io::with_externalities; use sr_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; diff --git a/srml/contracts/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs index 2c29b1ead1..f1db63870b 100644 --- a/srml/contracts/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -23,7 +23,7 @@ use crate::exec::{Ext, EmptyOutputBuf, VmExecResult}; use crate::gas::GasMeter; use rstd::prelude::*; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sandbox; #[macro_use] diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index 006ec5aad2..2c631d71d5 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -26,7 +26,7 @@ use sandbox; use system; use rstd::prelude::*; use rstd::mem; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use sr_primitives::traits::{Bounded, SaturatedConversion}; /// Enumerates all possible *special* trap conditions. @@ -325,12 +325,12 @@ define_env!(Env, , let callee = { let callee_buf = read_sandbox_memory(ctx, callee_ptr, callee_len)?; <::T as system::Trait>::AccountId::decode(&mut &callee_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; let value = { let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; BalanceOf::<::T>::decode(&mut &value_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; @@ -399,12 +399,12 @@ define_env!(Env, , ) -> u32 => { let code_hash = { let code_hash_buf = read_sandbox_memory(ctx, code_hash_ptr, code_hash_len)?; - ::T>>::decode(&mut &code_hash_buf[..]).ok_or_else(|| sandbox::HostError)? + ::T>>::decode(&mut &code_hash_buf[..]).map_err(|_| sandbox::HostError)? }; let value = { let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; BalanceOf::<::T>::decode(&mut &value_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; @@ -569,7 +569,7 @@ define_env!(Env, , let call = { let call_buf = read_sandbox_memory(ctx, call_ptr, call_len)?; <<::T as Trait>::Call>::decode(&mut &call_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; // Charge gas for dispatching this call. @@ -618,12 +618,12 @@ define_env!(Env, , let dest = { let dest_buf = read_sandbox_memory(ctx, dest_ptr, dest_len)?; <::T as system::Trait>::AccountId::decode(&mut &dest_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; let code_hash = { let code_hash_buf = read_sandbox_memory(ctx, code_hash_ptr, code_hash_len)?; ::T>>::decode(&mut &code_hash_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; let rent_allowance = { let rent_allowance_buf = read_sandbox_memory( @@ -632,7 +632,7 @@ define_env!(Env, , rent_allowance_len )?; BalanceOf::<::T>::decode(&mut &rent_allowance_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; let delta = { // We don't use `with_capacity` here to not eagerly allocate the user specified amount @@ -717,7 +717,7 @@ define_env!(Env, , _ => { let topics_buf = read_sandbox_memory(ctx, topics_ptr, topics_len)?; Vec::::T>>::decode(&mut &topics_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? } }; @@ -757,7 +757,7 @@ define_env!(Env, , let value = { let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; BalanceOf::<::T>::decode(&mut &value_buf[..]) - .ok_or_else(|| sandbox::HostError)? + .map_err(|_| sandbox::HostError)? }; ctx.ext.set_rent_allowance(value); diff --git a/srml/democracy/Cargo.toml b/srml/democracy/Cargo.toml index baf1488d42..b6341a8225 100644 --- a/srml/democracy/Cargo.toml +++ b/srml/democracy/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -23,7 +23,7 @@ default = ["std"] std = [ "serde", "safe-mix/std", - "parity-codec/std", + "codec/std", "rstd/std", "runtime_io/std", "srml-support/std", diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index ae53a53bb8..332ad91358 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -22,7 +22,7 @@ use rstd::prelude::*; use rstd::{result, convert::TryFrom}; use sr_primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; use sr_primitives::weights::SimpleDispatchInfo; -use parity_codec::{Encode, Decode, Input, Output}; +use codec::{Encode, Decode, Input, Output, Error}; use srml_support::{ decl_module, decl_storage, decl_event, ensure, StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap, @@ -154,12 +154,15 @@ impl Encode for Vote { } } +impl codec::EncodeLike for Vote {} + impl Decode for Vote { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> core::result::Result { let b = input.read_byte()?; - Some(Vote { + Ok(Vote { aye: (b & 0b1000_0000) == 0b1000_0000, - conviction: Conviction::try_from(b & 0b0111_1111).ok()?, + conviction: Conviction::try_from(b & 0b0111_1111) + .map_err(|_| Error::from("Invalid conviction"))?, }) } } diff --git a/srml/democracy/src/vote_threshold.rs b/srml/democracy/src/vote_threshold.rs index 96e5849e43..d304c36f32 100644 --- a/srml/democracy/src/vote_threshold.rs +++ b/srml/democracy/src/vote_threshold.rs @@ -18,7 +18,7 @@ #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::traits::{Zero, IntegerSquareRoot}; use rstd::ops::{Add, Mul, Div, Rem}; diff --git a/srml/elections/Cargo.toml b/srml/elections/Cargo.toml index dc004471d5..d6043bb2d0 100644 --- a/srml/elections/Cargo.toml +++ b/srml/elections/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -23,7 +23,7 @@ balances = { package = "srml-balances", path = "../balances" } default = ["std"] std = [ "safe-mix/std", - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", "serde", diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 0e761c94c8..e8fbb75dc3 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -35,7 +35,7 @@ use srml_support::{ OnUnbalanced, ReservableCurrency, WithdrawReason, WithdrawReasons, ChangeMembers } }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use system::{self, ensure_signed, ensure_root}; // no polynomial attacks: diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index 2cbd707f18..87069a487a 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } balances = { package = "srml-balances", path = "../balances", default-features = false } @@ -20,7 +20,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "sr-primitives/std", "srml-support/std", "system/std", diff --git a/srml/executive/Cargo.toml b/srml/executive/Cargo.toml index e732c9b636..e398a95189 100644 --- a/srml/executive/Cargo.toml +++ b/srml/executive/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -25,7 +25,7 @@ std = [ "rstd/std", "srml-support/std", "serde", - "parity-codec/std", + "codec/std", "sr-primitives/std", "runtime_io/std", "system/std", diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 062badd932..54ea3a3f14 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -82,7 +82,7 @@ use sr_primitives::{generic::Digest, traits::{ OnInitialize, NumberFor, Block as BlockT, OffchainWorker, ValidateUnsigned }}; use srml_support::Dispatchable; -use parity_codec::{Codec, Encode}; +use codec::{Codec, Encode}; use system::{extrinsics_root, DigestOf}; use sr_primitives::{ApplyOutcome, ApplyError}; use sr_primitives::transaction_validity::TransactionValidity; diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml index 3dfd453c75..65ac540b6b 100644 --- a/srml/finality-tracker/Cargo.toml +++ b/srml/finality-tracker/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", default-features = false, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -21,7 +21,7 @@ sr-io = { path = "../../core/sr-io", default-features = false } default = ["std"] std = [ "serde/std", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", "sr-primitives/std", diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index f0e2ae0f54..4c3d975d7e 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -25,13 +25,13 @@ use inherents::{ use srml_support::StorageValue; use sr_primitives::traits::{One, Zero, SaturatedConversion}; use rstd::{prelude::*, result, cmp, vec}; -use parity_codec::Decode; +use codec::Decode; use srml_support::{decl_module, decl_storage, for_each_tuple}; use srml_support::traits::Get; use srml_system::{ensure_none, Trait as SystemTrait}; #[cfg(feature = "std")] -use parity_codec::Encode; +use codec::Encode; /// The identifier for the `finalnum` inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"finalnum"; diff --git a/srml/generic-asset/Cargo.toml b/srml/generic-asset/Cargo.toml index 0e10e15590..65e21c3b11 100644 --- a/srml/generic-asset/Cargo.toml +++ b/srml/generic-asset/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } support = { package = "srml-support", path = "../support", default-features = false } @@ -20,7 +20,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" default = ["std"] std =[ "serde/std", - "parity-codec/std", + "codec/std", "rstd/std", "sr-primitives/std", "support/std", diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 60d1f0a3ff..57369b100e 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -151,7 +151,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use parity_codec::{Decode, Encode, HasCompact, Input, Output}; +use codec::{Decode, Encode, HasCompact, Input, Output, Error}; use sr_primitives::traits::{ CheckedAdd, CheckedSub, MaybeSerializeDebug, Member, One, Saturating, SimpleArithmetic, Zero, Bounded @@ -284,10 +284,12 @@ impl Encode for PermissionVersions { } } +impl codec::EncodeLike for PermissionVersions {} + impl Decode for PermissionVersions { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> core::result::Result { let version = PermissionVersionNumber::decode(input)?; - Some( + Ok( match version { PermissionVersionNumber::V1 => PermissionVersions::V1(Decode::decode(input)?) } @@ -484,7 +486,7 @@ decl_storage! { config.endowed_accounts.iter().for_each(|account_id| { storage.insert( >::key_for(asset_id, account_id), - ::encode(&config.initial_balance) + ::encode(&config.initial_balance) ); }); }); diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml index 478cddd153..2466b8e012 100644 --- a/srml/grandpa/Cargo.toml +++ b/srml/grandpa/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } substrate-finality-grandpa-primitives = { path = "../../core/finality-grandpa/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -23,7 +23,7 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "primitives/std", "substrate-finality-grandpa-primitives/std", "rstd/std", diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index 6f1c897e53..3f4b26c17d 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -31,7 +31,7 @@ pub use substrate_finality_grandpa_primitives as fg_primitives; use rstd::prelude::*; -use parity_codec::{self as codec, Encode, Decode}; +use codec::{self as codec, Encode, Decode, Error}; use srml_support::{ decl_event, decl_storage, decl_module, dispatch::Result, storage::StorageValue }; @@ -78,11 +78,11 @@ pub struct StoredPendingChange { } impl Decode for StoredPendingChange { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> core::result::Result { let old = OldStoredPendingChange::decode(value)?; let forced = >::decode(value).unwrap_or(None); - Some(StoredPendingChange { + Ok(StoredPendingChange { scheduled_at: old.scheduled_at, delay: old.delay, next_authorities: old.next_authorities, diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 637ae7c25f..4e5d133b9e 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -22,7 +22,7 @@ use sr_primitives::{Perbill, DigestItem, traits::IdentityLookup, testing::{Heade use runtime_io; use srml_support::{impl_outer_origin, impl_outer_event, parameter_types}; use primitives::{H256, Blake2Hasher}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::{AuthorityId, GenesisConfig, Trait, Module, ConsensusLog}; use substrate_finality_grandpa_primitives::GRANDPA_ENGINE_ID; diff --git a/srml/im-online/Cargo.toml b/srml/im-online/Cargo.toml index c015e5e4c5..60be1a89c2 100644 --- a/srml/im-online/Cargo.toml +++ b/srml/im-online/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../../core/sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -18,7 +18,7 @@ system = { package = "srml-system", path = "../system", default-features = false [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "sr-primitives/std", "rstd/std", "serde", diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 8254cb6078..19875d9a37 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -74,7 +74,7 @@ use primitives::{ offchain::StorageKind, sr25519, ed25519, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::{ ApplyError, traits::{Member, IsMember, Extrinsic as ExtrinsicT}, transaction_validity::{TransactionValidity, TransactionLongevity, ValidTransaction}, @@ -216,7 +216,7 @@ decl_module! { // we run only when a local authority key is configured if let Ok(key) = sr_io::pubkey(CryptoKey::AuthorityKey) { let authority_id = ::AuthorityId::decode(&mut &key[..]) - .ok_or(OffchainErr::DecodeAuthorityId)?; + .map_err(|_| OffchainErr::DecodeAuthorityId)?; let network_state = sr_io::network_state().map_err(|_| OffchainErr::NetworkState)?; let heartbeat_data = Heartbeat { @@ -282,7 +282,7 @@ decl_module! { match last_gossip { Some(last) => { let worker_status: WorkerStatus = Decode::decode(&mut &last[..]) - .ok_or(OffchainErr::DecodeWorkerStatus)?; + .map_err(|_| OffchainErr::DecodeWorkerStatus)?; let was_aborted = !worker_status.done && worker_status.gossipping_at < now; diff --git a/srml/indices/Cargo.toml b/srml/indices/Cargo.toml index c500cf5f87..3cbf1d88de 100644 --- a/srml/indices/Cargo.toml +++ b/srml/indices/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -25,7 +25,7 @@ std = [ "serde", "safe-mix/std", "substrate-keyring", - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", "runtime-io/std", diff --git a/srml/indices/src/address.rs b/srml/indices/src/address.rs index c76585d216..caef4728fb 100644 --- a/srml/indices/src/address.rs +++ b/srml/indices/src/address.rs @@ -19,7 +19,8 @@ #[cfg(feature = "std")] use std::fmt; use rstd::convert::TryInto; -use crate::{Member, Decode, Encode, Input, Output}; +use crate::Member; +use codec::{Encode, Decode, Input, Output, Error}; /// An indices-aware address, which can be either a direct `AccountId` or /// an index. @@ -54,16 +55,16 @@ impl From for Address(a: T, b: T) -> Option { - if a < b { Some(b) } else { None } +fn need_more_than(a: T, b: T) -> Result { + if a < b { Ok(b) } else { Err("Invalid range".into()) } } impl Decode for Address where AccountId: Member + Decode, AccountIndex: Member + Decode + PartialOrd + Ord + From + Copy, { - fn decode(input: &mut I) -> Option { - Some(match input.read_byte()? { + fn decode(input: &mut I) -> Result { + Ok(match input.read_byte()? { x @ 0x00..=0xef => Address::Index(AccountIndex::from(x as u32)), 0xfc => Address::Index(AccountIndex::from( need_more_than(0xef, u16::decode(input)?)? as u32 @@ -75,7 +76,7 @@ impl Decode for Address where need_more_than(0xffffffffu32.into(), Decode::decode(input)?)? ), 0xff => Address::Id(Decode::decode(input)?), - _ => return None, + _ => return Err("Invalid address variant".into()), }) } } @@ -114,6 +115,11 @@ impl Encode for Address where } } +impl codec::EncodeLike for Address where + AccountId: Member + Encode, + AccountIndex: Member + Encode + PartialOrd + Ord + Copy + From + TryInto, +{} + impl Default for Address where AccountId: Member + Default, AccountIndex: Member, @@ -125,7 +131,7 @@ impl Default for Address where #[cfg(test)] mod tests { - use crate::{Encode, Decode}; + use codec::{Encode, Decode}; type Address = super::Address<[u8; 8], u32>; fn index(i: u32) -> Address { super::Address::Index(i) } @@ -135,7 +141,7 @@ mod tests { if let Some(ref a) = a { assert_eq!(d, &a.encode()[..]); } - assert_eq!(Address::decode(&mut &d[..]), a); + assert_eq!(Address::decode(&mut &d[..]).ok(), a); } #[test] diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index 0bfd6d6054..5bf838f321 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -20,7 +20,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::{prelude::*, result, marker::PhantomData, convert::TryInto}; -use parity_codec::{Encode, Decode, Codec, Input, Output}; +use codec::{Encode, Codec}; use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; use sr_primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; use system::{IsDeadAccount, OnNewAccount}; diff --git a/srml/metadata/Cargo.toml b/srml/metadata/Cargo.toml index cdb7a41ff8..9fc9c6e46d 100644 --- a/srml/metadata/Cargo.toml +++ b/srml/metadata/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } @@ -13,7 +13,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives", [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "rstd/std", "primitives/std", "serde", diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index f518de5057..329b543d1a 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -25,8 +25,8 @@ #[cfg(feature = "std")] use serde::Serialize; #[cfg(feature = "std")] -use parity_codec::{Decode, Input}; -use parity_codec::{Encode, Output}; +use codec::{Decode, Input, Error}; +use codec::{Encode, Output}; use rstd::vec::Vec; #[cfg(feature = "std")] @@ -59,11 +59,13 @@ impl Encode for DecodeDifferent where B: Encode + 'static, O: Encode } } +impl codec::EncodeLike for DecodeDifferent where B: Encode + 'static, O: Encode + 'static {} + #[cfg(feature = "std")] impl Decode for DecodeDifferent where B: 'static, O: Decode + 'static { - fn decode(input: &mut I) -> Option { - ::decode(input).and_then(|val| { - Some(DecodeDifferent::Decoded(val)) + fn decode(input: &mut I) -> Result { + ::decode(input).map(|val| { + DecodeDifferent::Decoded(val) }) } } @@ -144,6 +146,8 @@ impl Encode for FnEncode { } } +impl codec::EncodeLike for FnEncode {} + impl PartialEq for FnEncode { fn eq(&self, other: &Self) -> bool { self.0().eq(&other.0()) @@ -223,6 +227,8 @@ impl Encode for DefaultByteGetter { } } +impl codec::EncodeLike for DefaultByteGetter {} + impl PartialEq for DefaultByteGetter { fn eq(&self, other: &DefaultByteGetter) -> bool { let left = self.0.default_byte(); @@ -333,10 +339,12 @@ impl Encode for RuntimeMetadataDeprecated { fn encode_to(&self, _dest: &mut W) {} } +impl codec::EncodeLike for RuntimeMetadataDeprecated {} + #[cfg(feature = "std")] impl Decode for RuntimeMetadataDeprecated { - fn decode(_input: &mut I) -> Option { - unimplemented!() + fn decode(_input: &mut I) -> Result { + Err("Decoding is not supported".into()) } } diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml index a5dfb713d1..66d47f4c35 100644 --- a/srml/session/Cargo.toml +++ b/srml/session/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } @@ -26,7 +26,7 @@ historical = ["substrate-trie"] std = [ "serde", "safe-mix/std", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", "sr-primitives/std", diff --git a/srml/session/src/historical.rs b/srml/session/src/historical.rs index 1e8e7faaaf..e35df3011c 100644 --- a/srml/session/src/historical.rs +++ b/srml/session/src/historical.rs @@ -26,7 +26,7 @@ //! Afterwards, the proofs can be fed to a consensus module when reporting misbehavior. use rstd::prelude::*; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::KeyTypeId; use sr_primitives::traits::{Convert, OpaqueKeys, Hash as HashT}; use srml_support::{ @@ -235,13 +235,13 @@ impl ProvingTrie { let val_idx = (key_id, key_data).using_encoded(|s| { trie.get_with(s, &mut recorder) .ok()? - .and_then(|raw| u32::decode(&mut &*raw)) + .and_then(|raw| u32::decode(&mut &*raw).ok()) })?; val_idx.using_encoded(|s| { trie.get_with(s, &mut recorder) .ok()? - .and_then(|raw| >::decode(&mut &*raw)) + .and_then(|raw| >::decode(&mut &*raw).ok()) })?; Some(recorder.drain().into_iter().map(|r| r.data).collect()) @@ -258,11 +258,11 @@ impl ProvingTrie { let trie = TrieDB::new(&self.db, &self.root).ok()?; let val_idx = (key_id, key_data).using_encoded(|s| trie.get(s)) .ok()? - .and_then(|raw| u32::decode(&mut &*raw))?; + .and_then(|raw| u32::decode(&mut &*raw).ok())?; val_idx.using_encoded(|s| trie.get(s)) .ok()? - .and_then(|raw| >::decode(&mut &*raw)) + .and_then(|raw| >::decode(&mut &*raw).ok()) } } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index a189a91da2..8b9e8b1566 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -120,7 +120,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::{prelude::*, marker::PhantomData, ops::{Sub, Rem}}; -use parity_codec::Decode; +use codec::Decode; use sr_primitives::KeyTypeId; use sr_primitives::weights::SimpleDispatchInfo; use sr_primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey}; diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index 5feab0f516..5428d663f3 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -31,7 +31,7 @@ std = [ "serde", "safe-mix/std", "substrate-keyring", - "parity-codec/std", + "codec/std", "rstd/std", "runtime_io/std", "srml-support/std", diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index dd540e78b1..11aa4f3c7d 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -284,7 +284,7 @@ mod benches; #[cfg(feature = "std")] use runtime_io::with_storage; use rstd::{prelude::*, result, collections::btree_map::BTreeMap}; -use parity_codec::{HasCompact, Encode, Decode}; +use codec::{HasCompact, Encode, Decode}; use srml_support::{ StorageValue, StorageMap, EnumerableStorageMap, decl_module, decl_event, decl_storage, ensure, traits::{ diff --git a/srml/sudo/Cargo.toml b/srml/sudo/Cargo.toml index 6f7d290396..d0e2d5dbc5 100644 --- a/srml/sudo/Cargo.toml +++ b/srml/sudo/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-std = { path = "../../core/sr-std", default-features = false } sr-io = { path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -22,7 +22,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "sr-std/std", "sr-io/std", "sr-primitives/std", diff --git a/srml/support/Cargo.toml b/srml/support/Cargo.toml index 99fa2dbb38..2befc11b19 100644 --- a/srml/support/Cargo.toml +++ b/srml/support/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -codec = { package = "parity-codec", version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } srml-metadata = { path = "../metadata", default-features = false } sr-std = { path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index 4d367fb2a8..19c4440c85 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -208,7 +208,7 @@ pub trait StorageValue { let new_val = ::append( storage.get_raw(Self::key()).unwrap_or_default(), items, - ).ok_or_else(|| "Could not append given item")?; + ).map_err(|_| "Could not append given item")?; storage.put_raw(Self::key(), &new_val); Ok(()) } @@ -286,7 +286,7 @@ pub trait AppendableStorageMap: StorageMap::append( storage.get_raw(&k[..]).unwrap_or_default(), items, - ).ok_or_else(|| "Could not append given item")?; + ).map_err(|_| "Could not append given item")?; storage.put_raw(&k[..], &new_val); Ok(()) } diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs index 26cb4b73e5..a5385af8fb 100644 --- a/srml/support/src/storage/unhashed/generator.rs +++ b/srml/support/src/storage/unhashed/generator.rs @@ -234,7 +234,7 @@ pub trait StorageDoubleMap::append( storage.get_raw(&key).unwrap_or_default(), items, - ).ok_or_else(|| "Could not append given item")?; + ).map_err(|_| "Could not append given item")?; storage.put_raw(&key, &new_val); Ok(()) } diff --git a/srml/support/test/Cargo.toml b/srml/support/test/Cargo.toml index a4152dae2f..fa3a04d3bc 100644 --- a/srml/support/test/Cargo.toml +++ b/srml/support/test/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", default-features = false, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } runtime_io = { package = "sr-io", path = "../../../core/sr-io", default-features = false } srml-support = { version = "2", path = "../", default-features = false } inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false } @@ -18,7 +18,7 @@ pretty_assertions = "0.6.1" default = ["std"] std = [ "serde/std", - "parity-codec/std", + "codec/std", "runtime_io/std", "srml-support/std", "inherents/std", diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs index 54c08d5e5f..0b16db3de7 100644 --- a/srml/support/test/tests/final_keys.rs +++ b/srml/support/test/tests/final_keys.rs @@ -17,7 +17,7 @@ use runtime_io::{with_externalities, Blake2Hasher}; use srml_support::{StorageValue, StorageMap, StorageDoubleMap}; use srml_support::storage::unhashed; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; pub trait Trait { type Origin; diff --git a/srml/support/test/tests/genesisconfig.rs b/srml/support/test/tests/genesisconfig.rs index 717c7105b5..b190fa8b74 100644 --- a/srml/support/test/tests/genesisconfig.rs +++ b/srml/support/test/tests/genesisconfig.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . pub trait Trait { - type BlockNumber: parity_codec::Codec + Default; + type BlockNumber: codec::Codec + Default; type Origin; } @@ -41,4 +41,4 @@ fn init_genesis_config() { GenesisConfig:: { t: Default::default(), }; -} \ No newline at end of file +} diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 863532ff09..f77b4a284a 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -45,7 +45,7 @@ mod module1 { type Event: From> + Into<::Event>; type Origin: From>; type SomeParameter: Get; - type GenericType: Default + Clone + parity_codec::Codec; + type GenericType: Default + Clone + codec::Codec; } srml_support::decl_module! { diff --git a/srml/system/Cargo.toml b/srml/system/Cargo.toml index 35ddfabd6e..9816555621 100644 --- a/srml/system/Cargo.toml +++ b/srml/system/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -22,7 +22,7 @@ default = ["std"] std = [ "serde", "safe-mix/std", - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", "runtime_io/std", diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index ac8357f5ca..d3a87cd38b 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -95,7 +95,7 @@ use srml_support::{ Parameter, for_each_tuple, traits::{Contains, Get} }; use safe_mix::TripletMix; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(any(feature = "std", test))] use runtime_io::{twox_128, TestExternalities, Blake2Hasher}; @@ -140,8 +140,8 @@ impl IsDeadAccount for () { } /// Compute the trie root of a list of extrinsics. -pub fn extrinsics_root(extrinsics: &[E]) -> H::Output { - extrinsics_data_root::(extrinsics.iter().map(parity_codec::Encode::encode).collect()) +pub fn extrinsics_root(extrinsics: &[E]) -> H::Output { + extrinsics_data_root::(extrinsics.iter().map(codec::Encode::encode).collect()) } /// Compute the trie root of a list of extrinsics. @@ -412,7 +412,7 @@ decl_storage! { _: &mut sr_primitives::ChildrenStorageOverlay, config: &GenesisConfig| { - use parity_codec::Encode; + use codec::Encode; storage.insert(well_known_keys::CODE.to_vec(), config.code.clone()); storage.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode()); diff --git a/srml/timestamp/Cargo.toml b/srml/timestamp/Cargo.toml index 765573ce46..9b066a1505 100644 --- a/srml/timestamp/Cargo.toml +++ b/srml/timestamp/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } @@ -21,7 +21,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" default = ["std"] std = [ "inherents/std", - "parity-codec/std", + "codec/std", "rstd/std", "sr-primitives/std", "srml-support/std", diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index cc439da8ee..bc9533e6e6 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -91,9 +91,9 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::{result, ops::{Mul, Div}, cmp}; -use parity_codec::Encode; +use codec::Encode; #[cfg(feature = "std")] -use parity_codec::Decode; +use codec::Decode; #[cfg(feature = "std")] use inherents::ProvideInherentData; use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple}; @@ -133,7 +133,7 @@ impl InherentError { #[cfg(feature = "std")] pub fn try_from(id: &InherentIdentifier, data: &[u8]) -> Option { if id == &INHERENT_IDENTIFIER { - ::decode(&mut &data[..]) + ::decode(&mut &data[..]).ok() } else { None } diff --git a/srml/treasury/Cargo.toml b/srml/treasury/Cargo.toml index 4314d959b3..ae2681e11b 100644 --- a/srml/treasury/Cargo.toml +++ b/srml/treasury/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } @@ -21,7 +21,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "rstd/std", "sr-primitives/std", "srml-support/std", diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 702fe3048e..1cf3277199 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -80,7 +80,7 @@ use sr_primitives::traits::{ Zero, EnsureOrigin, StaticLookup, CheckedSub, CheckedMul, AccountIdConversion }; use sr_primitives::weights::SimpleDispatchInfo; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use system::ensure_signed; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 3e0079cedf..da97ace38e 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -17,7 +17,7 @@ substrate-bip39 = "0.2.2" schnorrkel = "0.1.1" hex = "0.3" hex-literal = "0.2" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } system = { package = "srml-system", path = "../srml/system" } balances = { package = "srml-balances", path = "../srml/balances" } diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 4a63138bf6..c123e88ec2 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -26,7 +26,7 @@ use primitives::{ ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, blake2_256, crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat} }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sr_primitives::generic::Era; use node_primitives::{Balance, Index, Hash}; use node_runtime::{Call, UncheckedExtrinsic, BalancesCall, Runtime}; @@ -165,7 +165,7 @@ fn execute(matches: clap::ArgMatches) where let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), - h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])) + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..]).ok()) .expect("Invalid genesis hash or unrecognised chain identifier"), }; @@ -203,12 +203,12 @@ fn execute(matches: clap::ArgMatches) where let call = matches.value_of("call") .expect("call is required; thus it can't be None; qed"); let function: Call = hex::decode(&call).ok() - .and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + .and_then(|x| Decode::decode(&mut &x[..]).ok()).unwrap(); let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), - h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])) + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..]).ok()) .expect("Invalid genesis hash or unrecognised chain identifier"), }; @@ -289,7 +289,7 @@ mod tests { fn should_work() { let s = "0123456789012345678901234567890123456789012345678901234567890123"; - let d1: Hash = hex::decode(s).ok().and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + let d1: Hash = hex::decode(s).ok().and_then(|x| Decode::decode(&mut &x[..]).ok()).unwrap(); let d2: Hash = { let mut gh: [u8; 32] = Default::default(); diff --git a/test-utils/transaction-factory/Cargo.toml b/test-utils/transaction-factory/Cargo.toml index 1c4cf5a5d5..f3c392c3d6 100644 --- a/test-utils/transaction-factory/Cargo.toml +++ b/test-utils/transaction-factory/Cargo.toml @@ -9,7 +9,7 @@ cli = { package = "substrate-cli", path = "../../core/cli" } client = { package = "substrate-client", path = "../../core/client" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } log = "0.4" -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } substrate-service = { path = "../../core/service" } @@ -17,6 +17,6 @@ substrate-service = { path = "../../core/service" } [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "sr-primitives/std", ] diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index 11b080f14f..ab7dfb8cea 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -33,7 +33,7 @@ use consensus_common::{ SelectChain }; use consensus_common::block_import::BlockImport; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, ProvideRuntimeApi, SimpleArithmetic, -- GitLab From e560b2ad1bf842e038120f4b12ecb332f9733d09 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 7 Aug 2019 11:52:06 +0200 Subject: [PATCH 091/151] Fix decl_storage map and linked_map for insert_ref (#3316) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test * fix * bumpd version * Update srml/support/procedural/src/storage/impls.rs Co-Authored-By: Bastian Köcher --- srml/support/procedural/src/storage/impls.rs | 21 +++++++++++++ srml/support/src/storage/hashed/generator.rs | 2 +- srml/support/test/tests/instance.rs | 32 ++++++++++++-------- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 45d7fada9f..4424aa918a 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -615,6 +615,27 @@ impl<'a, I: Iterator> Impls<'a, I> { storage.put(key_for, &(val, linkage)) } + /// Store a value under this key into the provided storage instance; this can take any reference + /// type that derefs to `T` (and has `Encode` implemented). + /// Store a value under this key into the provided storage instance. + fn insert_ref(key: &#kty, val: &Arg, storage: &mut S) + where + #typ: AsRef, + Arg: ?Sized + #scrate::codec::Encode, + S: #scrate::HashedStorage<#scrate::#hasher> + { + use self::#inner_module::Utils; + + let key_for = &*#as_map::key_for(key); + let linkage = match Self::read_with_linkage(storage, key_for) { + // overwrite but reuse existing linkage + Some((_data, linkage)) => linkage, + // create new linkage + None => Self::new_head_linkage(storage, key), + }; + storage.put(key_for, &(val, linkage)) + } + /// Mutate the value under a key fn mutate(key: &#kty, f: F, storage: &mut S) -> R where diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index 19c4440c85..bc6cd145ce 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -246,7 +246,7 @@ pub trait StorageMap { /// Store a value under this key into the provided storage instance; this can take any reference /// type that derefs to `T` (and has `Encode` implemented). /// Store a value under this key into the provided storage instance. - fn insert_ref>( + fn insert_ref>( key: &K, val: &Arg, storage: &mut S diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index f77b4a284a..55bbc73807 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -27,7 +27,7 @@ use srml_support::{ use inherents::{ ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError }; -use srml_support::{StorageValue, StorageMap, StorageDoubleMap}; +use srml_support::{StorageValue, StorageMap, StorageDoubleMap, EnumerableStorageMap}; use primitives::{H256, sr25519}; mod system; @@ -140,7 +140,7 @@ mod module2 { trait Store for Module, I: Instance=DefaultInstance> as Module2 { pub Value config(value): T::Amount; pub Map config(map): map u64 => u64; - pub LinkedMap config(linked_map): linked_map u64 => u64; + pub LinkedMap config(linked_map): linked_map u64 => Vec; pub DoubleMap config(double_map): double_map u64, blake2_256(u64) => u64; } } @@ -288,13 +288,13 @@ fn new_test_ext() -> runtime_io::TestExternalities { module2: Some(module2::GenesisConfig { value: 4, map: vec![(0, 0)], - linked_map: vec![(0, 0)], + linked_map: vec![(0, vec![0])], double_map: vec![(0, 0, 0)], }), module2_Instance1: Some(module2::GenesisConfig { value: 4, map: vec![(0, 0)], - linked_map: vec![(0, 0)], + linked_map: vec![(0, vec![0])], double_map: vec![(0, 0, 0)], }), module2_Instance2: None, @@ -388,15 +388,23 @@ fn storage_with_instance_basic_operation() { assert_eq!(LinkedMap::exists(0), true); assert_eq!(LinkedMap::exists(key), false); - LinkedMap::insert(key, 1); - assert_eq!(LinkedMap::get(key), 1); - assert_eq!(LinkedMap::take(key), 1); - assert_eq!(LinkedMap::get(key), 0); - LinkedMap::mutate(key, |a| *a=2); - assert_eq!(LinkedMap::get(key), 2); + LinkedMap::insert(key, vec![1]); + assert_eq!(LinkedMap::enumerate().count(), 2); + assert_eq!(LinkedMap::get(key), vec![1]); + assert_eq!(LinkedMap::take(key), vec![1]); + assert_eq!(LinkedMap::enumerate().count(), 1); + assert_eq!(LinkedMap::get(key), vec![]); + LinkedMap::mutate(key, |a| *a=vec![2]); + assert_eq!(LinkedMap::enumerate().count(), 2); + assert_eq!(LinkedMap::get(key), vec![2]); LinkedMap::remove(key); + assert_eq!(LinkedMap::enumerate().count(), 1); assert_eq!(LinkedMap::exists(key), false); - assert_eq!(LinkedMap::get(key), 0); + assert_eq!(LinkedMap::get(key), vec![]); + assert_eq!(LinkedMap::exists(key), false); + assert_eq!(LinkedMap::enumerate().count(), 1); + LinkedMap::insert_ref(key, &vec![1]); + assert_eq!(LinkedMap::enumerate().count(), 2); let key1 = 1; let key2 = 1; @@ -454,7 +462,7 @@ const EXPECTED_METADATA: StorageMetadata = StorageMetadata { ty: StorageEntryType::Map { hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u64"), - value: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("Vec"), is_linked: true, }, default: DecodeDifferent::Encode( -- GitLab From 25f68b355c4ad319ce9fa2416f248a8f12429609 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 7 Aug 2019 12:40:49 +0200 Subject: [PATCH 092/151] Rename on_demand to light_dispatch and various minor changes (#3315) * Rename on_demand to light_server * Small docs improvement * Rename on_block_announce to update_best_number * More minor documentation * Light server -> light dispatch * is_light_rq_response -> is_light_response --- core/network/src/on_demand_layer.rs | 2 +- core/network/src/protocol.rs | 42 +-- .../{on_demand.rs => light_dispatch.rs} | 324 ++++++++++-------- core/network/src/service.rs | 16 +- 4 files changed, 206 insertions(+), 178 deletions(-) rename core/network/src/protocol/{on_demand.rs => light_dispatch.rs} (70%) diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs index 1cbb5387d6..818230eea5 100644 --- a/core/network/src/on_demand_layer.rs +++ b/core/network/src/on_demand_layer.rs @@ -16,7 +16,7 @@ //! On-demand requests service. -use crate::protocol::on_demand::RequestData; +use crate::protocol::light_dispatch::RequestData; use std::sync::Arc; use futures::{prelude::*, sync::mpsc, sync::oneshot}; use futures03::compat::{Compat01As03, Future01CompatExt as _}; diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index e23ec1e099..9d4a537ed2 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -34,7 +34,7 @@ use message::{BlockAttributes, Direction, FromBlock, Message, RequestId}; use message::generic::{Message as GenericMessage, ConsensusMessage}; use event::Event; use consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; +use light_dispatch::{LightDispatch, LightDispatchNetwork, RequestData}; use specialization::NetworkSpecialization; use sync::{ChainSync, SyncState}; use crate::service::{TransactionPool, ExHashT}; @@ -53,7 +53,7 @@ mod util; pub mod consensus_gossip; pub mod message; pub mod event; -pub mod on_demand; +pub mod light_dispatch; pub mod specialization; pub mod sync; @@ -96,8 +96,8 @@ pub struct Protocol, H: ExHashT> { /// Interval at which we call `propagate_extrinsics`. propagate_timeout: Box + Send>, config: ProtocolConfig, - /// Handler for on-demand requests. - on_demand_core: OnDemandCore, + /// Handler for light client requests. + light_dispatch: LightDispatch, genesis_hash: B::Hash, sync: ChainSync, specialization: S, @@ -149,12 +149,12 @@ pub struct PeerInfo { pub best_number: ::Number, } -struct OnDemandIn<'a, B: BlockT> { +struct LightDispatchIn<'a, B: BlockT> { behaviour: &'a mut CustomProto>, peerset: peerset::PeersetHandle, } -impl<'a, B: BlockT> OnDemandNetwork for OnDemandIn<'a, B> { +impl<'a, B: BlockT> LightDispatchNetwork for LightDispatchIn<'a, B> { fn report_peer(&mut self, who: &PeerId, reputation: i32) { self.peerset.report_peer(who.clone(), reputation) } @@ -373,7 +373,7 @@ impl, H: ExHashT> Protocol { peers: HashMap::new(), chain, }, - on_demand_core: OnDemandCore::new(checker), + light_dispatch: LightDispatch::new(checker), genesis_hash: info.chain.genesis_hash, sync, specialization: specialization, @@ -445,15 +445,15 @@ impl, H: ExHashT> Protocol { /// Starts a new data demand request. /// /// The parameter contains a `Sender` where the result, once received, must be sent. - pub(crate) fn add_on_demand_request(&mut self, rq: RequestData) { - self.on_demand_core.add_request(OnDemandIn { + pub(crate) fn add_light_client_request(&mut self, rq: RequestData) { + self.light_dispatch.add_request(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, rq); } - fn is_on_demand_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { - self.on_demand_core.is_on_demand_response(&who, response_id) + fn is_light_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { + self.light_dispatch.is_light_response(&who, response_id) } fn handle_response( @@ -506,7 +506,7 @@ impl, H: ExHashT> Protocol { GenericMessage::BlockRequest(r) => self.on_block_request(who, r), GenericMessage::BlockResponse(r) => { // Note, this is safe because only `ordinary bodies` and `remote bodies` are received in this matter. - if self.is_on_demand_response(&who, r.id) { + if self.is_light_response(&who, r.id) { self.on_remote_body_response(who, r); } else { if let Some(request) = self.handle_response(who.clone(), &r) { @@ -629,7 +629,7 @@ impl, H: ExHashT> Protocol { } self.sync.peer_disconnected(peer.clone()); self.specialization.on_disconnect(&mut context, peer.clone()); - self.on_demand_core.on_disconnect(OnDemandIn { + self.light_dispatch.on_disconnect(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, peer); @@ -793,7 +793,7 @@ impl, H: ExHashT> Protocol { &mut ProtocolContext::new(&mut self.context_data, &mut self.behaviour, &self.peerset_handle) ); self.maintain_peers(); - self.on_demand_core.maintain_peers(OnDemandIn { + self.light_dispatch.maintain_peers(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }); @@ -914,7 +914,7 @@ impl, H: ExHashT> Protocol { }; let info = self.context_data.peers.get(&who).expect("We just inserted above; QED").info.clone(); - self.on_demand_core.on_connect(OnDemandIn { + self.light_dispatch.on_connect(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who.clone(), status.roles, status.best_number); @@ -1053,7 +1053,7 @@ impl, H: ExHashT> Protocol { peer.known_blocks.insert(hash.clone()); } } - self.on_demand_core.on_block_announce(OnDemandIn { + self.light_dispatch.update_best_number(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who.clone(), *header.number()); @@ -1253,7 +1253,7 @@ impl, H: ExHashT> Protocol { response: message::RemoteCallResponse ) { trace!(target: "sync", "Remote call response {} from {}", response.id, who); - self.on_demand_core.on_remote_call_response(OnDemandIn { + self.light_dispatch.on_remote_call_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1294,7 +1294,7 @@ impl, H: ExHashT> Protocol { response: message::RemoteReadResponse ) { trace!(target: "sync", "Remote read response {} from {}", response.id, who); - self.on_demand_core.on_remote_read_response(OnDemandIn { + self.light_dispatch.on_remote_read_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1335,7 +1335,7 @@ impl, H: ExHashT> Protocol { response: message::RemoteHeaderResponse, ) { trace!(target: "sync", "Remote header proof response {} from {}", response.id, who); - self.on_demand_core.on_remote_header_response(OnDemandIn { + self.light_dispatch.on_remote_header_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1401,7 +1401,7 @@ impl, H: ExHashT> Protocol { who, response.max ); - self.on_demand_core.on_remote_changes_response(OnDemandIn { + self.light_dispatch.on_remote_changes_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1462,7 +1462,7 @@ impl, H: ExHashT> Protocol { peer: PeerId, response: message::BlockResponse ) { - self.on_demand_core.on_remote_body_response(OnDemandIn { + self.light_dispatch.on_remote_body_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, peer, response); diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/light_dispatch.rs similarity index 70% rename from core/network/src/protocol/on_demand.rs rename to core/network/src/protocol/light_dispatch.rs index 9d35535e21..a7b327686a 100644 --- a/core/network/src/protocol/on_demand.rs +++ b/core/network/src/protocol/light_dispatch.rs @@ -14,7 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! On-demand requests service. +//! Light client requests service. +//! +//! Handles requests for data coming from our local light client and that must be answered by +//! nodes on the network. use std::collections::{HashMap, VecDeque}; use std::sync::Arc; @@ -38,8 +41,8 @@ const RETRY_COUNT: usize = 1; /// Reputation change for a peer when a request timed out. const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 8); -/// Trait used by the `OnDemandCore` service to communicate messages back to the network. -pub trait OnDemandNetwork { +/// Trait used by the `LightDispatch` service to communicate messages back to the network. +pub trait LightDispatchNetwork { /// Adjusts the reputation of the given peer. fn report_peer(&mut self, who: &PeerId, reputation_change: i32); @@ -97,19 +100,30 @@ pub trait OnDemandNetwork { ); } -/// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemandCore { +/// Light client requests service. Dispatches requests to appropriate peers. +pub struct LightDispatch { + /// Verifies that responses are correct. Passed at initialization. checker: Arc>, + /// Numeric ID to assign to the next outgoing request. Used to assign responses to their + /// corresponding request. next_request_id: u64, + /// Requests that we have yet to send out on the network. pending_requests: VecDeque>, + /// List of nodes to which we have sent a request and that are yet to answer. active_peers: LinkedHashMap>, + /// List of nodes that we know of that aren't doing anything and that are available for new + /// requests. idle_peers: VecDeque, + /// Best known block for each node in `active_peers` and `idle_peers`. best_blocks: HashMap>, } struct Request { id: u64, + /// When the request got created or sent out to the network. timestamp: Instant, + /// Number of remaining attempts to fulfill this request. If it reaches 0, we interrupt the + /// attempt. retry_count: usize, data: RequestData, } @@ -196,12 +210,12 @@ impl FetchChecker for AlwaysBadChecker { } } -impl OnDemandCore where +impl LightDispatch where B::Header: HeaderT, { - /// Creates new on-demand requests processer. + /// Creates new light client requests processer. pub fn new(checker: Arc>) -> Self { - OnDemandCore { + LightDispatch { checker, next_request_id: 0, pending_requests: VecDeque::new(), @@ -212,7 +226,7 @@ impl OnDemandCore where } /// Inserts a new request in the list of requests to execute. - pub(crate) fn add_request(&mut self, network: impl OnDemandNetwork, data: RequestData) { + pub(crate) fn add_request(&mut self, network: impl LightDispatchNetwork, data: RequestData) { self.insert(RETRY_COUNT, data); self.dispatch(network); } @@ -234,7 +248,7 @@ impl OnDemandCore where fn accept_response( &mut self, rtype: &str, - mut network: impl OnDemandNetwork, + mut network: impl LightDispatchNetwork, peer: PeerId, request_id: u64, try_accept: impl FnOnce(Request, &Arc>) -> Accept @@ -284,9 +298,10 @@ impl OnDemandCore where self.dispatch(network); } + /// Call this when we connect to a node on the network. pub fn on_connect( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, role: Roles, best_number: NumberFor @@ -301,17 +316,20 @@ impl OnDemandCore where self.dispatch(network); } - pub fn on_block_announce(&mut self, network: impl OnDemandNetwork, peer: PeerId, best_number: NumberFor) { + /// Sets the best seen block for the given node. + pub fn update_best_number(&mut self, network: impl LightDispatchNetwork, peer: PeerId, best_number: NumberFor) { self.best_blocks.insert(peer, best_number); self.dispatch(network); } - pub fn on_disconnect(&mut self, network: impl OnDemandNetwork, peer: PeerId) { + /// Call this when we disconnect from a node. + pub fn on_disconnect(&mut self, network: impl LightDispatchNetwork, peer: PeerId) { self.remove_peer(peer); self.dispatch(network); } - pub fn maintain_peers(&mut self, mut network: impl OnDemandNetwork) { + /// Must be called periodically in order to perform maintenance. + pub fn maintain_peers(&mut self, mut network: impl LightDispatchNetwork) { let now = Instant::now(); loop { @@ -329,9 +347,10 @@ impl OnDemandCore where self.dispatch(network); } + /// Handles a remote header response message from on the network. pub fn on_remote_header_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteHeaderResponse ) { @@ -352,9 +371,10 @@ impl OnDemandCore where }) } + /// Handles a remote read response message from on the network. pub fn on_remote_read_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteReadResponse ) { @@ -387,9 +407,10 @@ impl OnDemandCore where }) } + /// Handles a remote call response message from on the network. pub fn on_remote_call_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteCallResponse ) { @@ -406,9 +427,10 @@ impl OnDemandCore where }) } + /// Handles a remote changes response message from on the network. pub fn on_remote_changes_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteChangesResponse, B::Hash> ) { @@ -431,9 +453,10 @@ impl OnDemandCore where }) } + /// Handles a remote body response message from on the network. pub fn on_remote_body_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::BlockResponse ) { @@ -466,7 +489,7 @@ impl OnDemandCore where }) } - pub fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { + pub fn is_light_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { self.active_peers.get(&peer).map_or(false, |r| r.id == request_id) } @@ -483,7 +506,10 @@ impl OnDemandCore where } } - pub fn remove_peer(&mut self, peer: PeerId) { + /// Removes a peer from the list of known peers. + /// + /// Puts back the active request that this node was performing into `pending_requests`. + fn remove_peer(&mut self, peer: PeerId) { self.best_blocks.remove(&peer); if let Some(request) = self.active_peers.remove(&peer) { @@ -497,7 +523,7 @@ impl OnDemandCore where } /// Dispatches pending requests. - fn dispatch(&mut self, mut network: impl OnDemandNetwork) { + fn dispatch(&mut self, mut network: impl LightDispatchNetwork) { let mut last_peer = self.idle_peers.back().cloned(); let mut unhandled_requests = VecDeque::new(); @@ -551,6 +577,8 @@ impl OnDemandCore where } impl Request { + /// Returns the block that the remote needs to have in order to be able to fulfill + /// this request. fn required_block(&self) -> NumberFor { match self.data { RequestData::RemoteHeader(ref data, _) => data.block, @@ -562,7 +590,7 @@ impl Request { } } - fn send_to(&self, out: &mut impl OnDemandNetwork, peer: &PeerId) { + fn send_to(&self, out: &mut impl LightDispatchNetwork, peer: &PeerId) { match self.data { RequestData::RemoteHeader(ref data, _) => out.send_header_request( @@ -645,7 +673,7 @@ pub mod tests { use crate::config::Roles; use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use libp2p::PeerId; - use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; + use super::{REQUEST_TIMEOUT, LightDispatch, LightDispatchNetwork, RequestData}; use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; struct DummyFetchChecker { ok: bool } @@ -711,21 +739,21 @@ pub mod tests { } } - fn dummy(ok: bool) -> OnDemandCore { - OnDemandCore::new(Arc::new(DummyFetchChecker { ok })) + fn dummy(ok: bool) -> LightDispatch { + LightDispatch::new(Arc::new(DummyFetchChecker { ok })) } - fn total_peers(on_demand: &OnDemandCore) -> usize { - on_demand.idle_peers.len() + on_demand.active_peers.len() + fn total_peers(light_dispatch: &LightDispatch) -> usize { + light_dispatch.idle_peers.len() + light_dispatch.active_peers.len() } fn receive_call_response( - network_interface: impl OnDemandNetwork, - on_demand: &mut OnDemandCore, + network_interface: impl LightDispatchNetwork, + light_dispatch: &mut LightDispatch, peer: PeerId, id: message::RequestId ) { - on_demand.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { + light_dispatch.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { id: id, proof: vec![vec![2]], }); @@ -746,7 +774,7 @@ pub mod tests { disconnected_peers: HashSet, } - impl<'a, B: BlockT> OnDemandNetwork for &'a mut DummyNetwork { + impl<'a, B: BlockT> LightDispatchNetwork for &'a mut DummyNetwork { fn report_peer(&mut self, _: &PeerId, _: i32) {} fn disconnect_peer(&mut self, who: &PeerId) { self.disconnected_peers.insert(who.clone()); @@ -769,16 +797,16 @@ pub mod tests { #[test] fn knows_about_peers_roles() { let mut network_interface = DummyNetwork::default(); - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let peer0 = PeerId::random(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); - on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.best_blocks.get(&peer1), Some(&2000)); - assert_eq!(on_demand.best_blocks.get(&peer2), Some(&3000)); + light_dispatch.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); + light_dispatch.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); + assert_eq!(vec![peer1.clone(), peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.best_blocks.get(&peer1), Some(&2000)); + assert_eq!(light_dispatch.best_blocks.get(&peer2), Some(&3000)); } #[test] @@ -786,69 +814,69 @@ pub mod tests { let peer0 = PeerId::random(); let mut network_interface = DummyNetwork::default(); - let mut on_demand = dummy(true); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); - assert_eq!(1, total_peers(&on_demand)); - assert!(!on_demand.best_blocks.is_empty()); - - on_demand.on_disconnect(&mut network_interface, peer0); - assert_eq!(0, total_peers(&on_demand)); - assert!(on_demand.best_blocks.is_empty()); + let mut light_dispatch = dummy(true); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); + assert_eq!(1, total_peers(&light_dispatch)); + assert!(!light_dispatch.best_blocks.is_empty()); + + light_dispatch.on_disconnect(&mut network_interface, peer0); + assert_eq!(0, total_peers(&light_dispatch)); + assert!(light_dispatch.best_blocks.is_empty()); } #[test] fn disconnects_from_timeouted_peer() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); let peer1 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); - assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert!(on_demand.active_peers.is_empty()); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); + assert_eq!(vec![peer0.clone(), peer1.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert!(light_dispatch.active_peers.is_empty()); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, }, oneshot::channel().0)); - assert_eq!(vec![peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(vec![peer0.clone()], on_demand.active_peers.keys().cloned().collect::>()); + assert_eq!(vec![peer1.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(vec![peer0.clone()], light_dispatch.active_peers.keys().cloned().collect::>()); - on_demand.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; - on_demand.maintain_peers(&mut network_interface); - assert!(on_demand.idle_peers.is_empty()); - assert_eq!(vec![peer1.clone()], on_demand.active_peers.keys().cloned().collect::>()); + light_dispatch.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; + light_dispatch.maintain_peers(&mut network_interface); + assert!(light_dispatch.idle_peers.is_empty()); + assert_eq!(vec![peer1.clone()], light_dispatch.active_peers.keys().cloned().collect::>()); assert_disconnected_peer(&network_interface); } #[test] fn disconnects_from_peer_on_response_with_wrong_id() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let peer0 = PeerId::random(); let mut network_interface = DummyNetwork::default(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, }, oneshot::channel().0)); - receive_call_response(&mut network_interface, &mut on_demand, peer0, 1); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0, 1); assert_disconnected_peer(&network_interface); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn disconnects_from_peer_on_incorrect_response() { - let mut on_demand = dummy(false); + let mut light_dispatch = dummy(false); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), @@ -856,31 +884,31 @@ pub mod tests { retry_count: Some(1), }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0.clone(), 0); assert_disconnected_peer(&network_interface); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn disconnects_from_peer_on_unexpected_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - receive_call_response(&mut network_interface, &mut on_demand, peer0, 0); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0, 0); assert_disconnected_peer(&network_interface); } #[test] fn disconnects_from_peer_on_wrong_response_type() { - let mut on_demand = dummy(false); + let mut light_dispatch = dummy(false); let peer0 = PeerId::random(); let mut network_interface = DummyNetwork::default(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), @@ -888,26 +916,26 @@ pub mod tests { retry_count: Some(1), }, oneshot::channel().0)); - on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + light_dispatch.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); assert_disconnected_peer(&network_interface); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn receives_remote_failure_after_retry_count_failures() { let retry_count = 2; let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); - let mut on_demand = dummy(false); + let mut light_dispatch = dummy(false); let mut network_interface = DummyNetwork::default(); for i in 0..retry_count+1 { - on_demand.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); } let (tx, mut response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), @@ -917,7 +945,7 @@ pub mod tests { for i in 0..retry_count { assert!(response.try_recv().unwrap().is_none()); - receive_call_response(&mut network_interface, &mut on_demand, peer_ids[i].clone(), i as u64); + receive_call_response(&mut network_interface, &mut light_dispatch, peer_ids[i].clone(), i as u64); } assert!(response.try_recv().unwrap().unwrap().is_err()); @@ -925,13 +953,13 @@ pub mod tests { #[test] fn receives_remote_call_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), @@ -939,26 +967,26 @@ pub mod tests { retry_count: None, }, tx)); - receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0.clone(), 0); assert_eq!(response.wait().unwrap().unwrap(), vec![42]); } #[test] fn receives_remote_read_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { header: dummy_header(), block: Default::default(), key: b":key".to_vec(), retry_count: None, }, tx)); - on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + light_dispatch.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); @@ -967,13 +995,13 @@ pub mod tests { #[test] fn receives_remote_read_child_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { header: dummy_header(), block: Default::default(), storage_key: b":child_storage:sub".to_vec(), @@ -981,7 +1009,7 @@ pub mod tests { retry_count: None, }, tx)); - on_demand.on_remote_read_response(&mut network_interface, + light_dispatch.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], @@ -991,19 +1019,19 @@ pub mod tests { #[test] fn receives_remote_header_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 1, retry_count: None, }, tx)); - on_demand.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { + light_dispatch.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { id: 0, header: Some(Header { parent_hash: Default::default(), @@ -1022,13 +1050,13 @@ pub mod tests { #[test] fn receives_remote_changes_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { changes_trie_config: changes_trie_config(), first_block: (1, Default::default()), last_block: (100, Default::default()), @@ -1038,7 +1066,7 @@ pub mod tests { retry_count: None, }, tx)); - on_demand.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { + light_dispatch.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { id: 0, max: 1000, proof: vec![vec![2]], @@ -1050,52 +1078,52 @@ pub mod tests { #[test] fn does_not_sends_request_to_peer_who_has_no_required_block() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 200, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); + light_dispatch.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.pending_requests.len(), 3); + assert_eq!(vec![peer1.clone(), peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.pending_requests.len(), 3); - on_demand.on_block_announce(&mut network_interface, peer1.clone(), 250); + light_dispatch.update_best_number(&mut network_interface, peer1.clone(), 250); - assert_eq!(vec![peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.pending_requests.len(), 2); + assert_eq!(vec![peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.pending_requests.len(), 2); - on_demand.on_block_announce(&mut network_interface, peer2.clone(), 250); + light_dispatch.update_best_number(&mut network_interface, peer2.clone(), 250); - assert!(!on_demand.idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.pending_requests.len(), 1); + assert!(!light_dispatch.idle_peers.iter().any(|_| true)); + assert_eq!(light_dispatch.pending_requests.len(), 1); - on_demand.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { + light_dispatch.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { id: 0, header: Some(dummy_header()), proof: vec![], }); - assert!(!on_demand.idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.pending_requests.len(), 0); + assert!(!light_dispatch.idle_peers.iter().any(|_| true)); + assert_eq!(light_dispatch.pending_requests.len(), 0); } #[test] @@ -1103,70 +1131,70 @@ pub mod tests { // this test is a regression for a bug where the dispatch function would // loop forever after dispatching a request to the last peer, since the // last peer was not updated - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); let peer3 = PeerId::random(); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); - on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); - on_demand.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); + light_dispatch.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); + light_dispatch.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(vec![peer1.clone(), peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn tries_to_send_all_pending_requests() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 300, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - assert!(on_demand.idle_peers.iter().cloned().collect::>().is_empty()); - assert_eq!(on_demand.pending_requests.len(), 1); + assert!(light_dispatch.idle_peers.iter().cloned().collect::>().is_empty()); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn remote_body_with_one_block_body_should_succeed() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let header = dummy_header(); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { header: header.clone(), retry_count: None, }, oneshot::channel().0)); - assert!(on_demand.pending_requests.is_empty()); - assert_eq!(on_demand.active_peers.len(), 1); + assert!(light_dispatch.pending_requests.is_empty()); + assert_eq!(light_dispatch.active_peers.len(), 1); let block = message::BlockData:: { hash: primitives::H256::random(), @@ -1182,28 +1210,28 @@ pub mod tests { blocks: vec![block], }; - on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + light_dispatch.on_remote_body_response(&mut network_interface, peer1.clone(), response); - assert!(on_demand.active_peers.is_empty()); - assert_eq!(on_demand.idle_peers.len(), 1); + assert!(light_dispatch.active_peers.is_empty()); + assert_eq!(light_dispatch.idle_peers.len(), 1); } #[test] fn remote_body_with_three_bodies_should_fail() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let header = dummy_header(); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { header: header.clone(), retry_count: None, }, oneshot::channel().0)); - assert!(on_demand.pending_requests.is_empty()); - assert_eq!(on_demand.active_peers.len(), 1); + assert!(light_dispatch.pending_requests.is_empty()); + assert_eq!(light_dispatch.active_peers.len(), 1); let response = { let blocks: Vec<_> = (0..3).map(|_| message::BlockData:: { @@ -1221,8 +1249,8 @@ pub mod tests { } }; - on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); - assert!(on_demand.active_peers.is_empty()); - assert!(on_demand.idle_peers.is_empty(), "peer should be disconnected after bad response"); + light_dispatch.on_remote_body_response(&mut network_interface, peer1.clone(), response); + assert!(light_dispatch.active_peers.is_empty()); + assert!(light_dispatch.idle_peers.is_empty(), "peer should be disconnected after bad response"); } } diff --git a/core/network/src/service.rs b/core/network/src/service.rs index acd3bbeab7..ff5db5f702 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -47,7 +47,7 @@ use crate::config::{Params, TransportConfig}; use crate::error::Error; use crate::protocol::{self, Protocol, Context, CustomMessageOutcome, PeerInfo}; use crate::protocol::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::protocol::{event::Event, on_demand::{AlwaysBadChecker, RequestData}}; +use crate::protocol::{event::Event, light_dispatch::{AlwaysBadChecker, RequestData}}; use crate::protocol::specialization::NetworkSpecialization; use crate::protocol::sync::SyncState; @@ -241,7 +241,7 @@ impl, H: ExHashT> NetworkWorker service, import_queue: params.import_queue, from_worker, - on_demand_in: params.on_demand.and_then(|od| od.extract_receiver()), + light_client_rqs: params.on_demand.and_then(|od| od.extract_receiver()), }) } @@ -585,8 +585,8 @@ pub struct NetworkWorker, H: Ex import_queue: Box>, /// Messages from the `NetworkService` and that must be processed. from_worker: mpsc::UnboundedReceiver>, - /// Receiver for queries from the on-demand that must be processed. - on_demand_in: Option>>, + /// Receiver for queries from the light client that must be processed. + light_client_rqs: Option>>, } impl, H: ExHashT> Future for NetworkWorker { @@ -602,10 +602,10 @@ impl, H: ExHashT> Future for Ne std::task::Poll::Pending::> }).compat().poll(); - // Check for new incoming on-demand requests. - if let Some(on_demand_in) = self.on_demand_in.as_mut() { - while let Ok(Async::Ready(Some(rq))) = on_demand_in.poll() { - self.network_service.user_protocol_mut().add_on_demand_request(rq); + // Check for new incoming light client requests. + if let Some(light_client_rqs) = self.light_client_rqs.as_mut() { + while let Ok(Async::Ready(Some(rq))) = light_client_rqs.poll() { + self.network_service.user_protocol_mut().add_light_client_request(rq); } } -- GitLab From e2d9619d4905822bad8e253b80ea5d7a0f1d9b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 7 Aug 2019 12:59:54 +0200 Subject: [PATCH 093/151] Update to schnorrkel `0.8.0` (#3267) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update to schnorrkel `0.8.0` * Increase `spec_version` * Bump schnorrkel to 0.8.3 (#3283) * Schnorrkel 0.8.1 (builds on bkchr upgrade branch) * Add tests for known hard/soft derivation values * Bump all schnorrkel versions * Flatten for easier inspection * 0.8.2 * 0.8.3 * Update subkey/Cargo.toml Co-Authored-By: Bastian Köcher * Update `Cargo.lock` * 0.8.4 * Fix cargo lock file. * Adding an error message for `NotMarkedSchnorrkel` as that was missing. Also fixing a typo, strage -> stage. --- Cargo.lock | 25 +++---- core/consensus/babe/Cargo.toml | 2 +- core/consensus/babe/primitives/Cargo.toml | 2 +- core/consensus/babe/primitives/src/digest.rs | 13 ++-- core/consensus/babe/src/lib.rs | 2 +- core/primitives/Cargo.toml | 4 +- core/primitives/src/sr25519.rs | 77 ++++++++++++++------ node/runtime/src/lib.rs | 2 +- subkey/Cargo.toml | 3 +- 9 files changed, 79 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3b101fb31b..24e830af71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3310,19 +3310,17 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.1.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4198,11 +4196,10 @@ dependencies = [ "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "srml-balances 2.0.0", "srml-system 2.0.0", - "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4236,12 +4233,12 @@ dependencies = [ [[package]] name = "substrate-bip39" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4394,7 +4391,7 @@ dependencies = [ "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -4419,8 +4416,8 @@ dependencies = [ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4723,11 +4720,11 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-serializer 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6324,7 +6321,7 @@ dependencies = [ "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" -"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" +"checksum schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "77e8d6a92f49a53f21b71c090a5559bf45c469071ebe556aebaf2dca3abc5cb5" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" @@ -6364,7 +6361,7 @@ dependencies = [ "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" "checksum strum 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1c33039533f051704951680f1adfd468fd37ac46816ded0d9ee068e60f05f" "checksum strum_macros 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "47cd23f5c7dee395a00fa20135e2ec0fffcdfa151c56182966d7a3261343432e" -"checksum substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d69ace596e9ca97837cc41f8edcfc4e0a997f227d5fc153d1010b60a0fe9acda" +"checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" "checksum substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f52ecbff6cc3d6e5c6401828e15937b680f459d6803ce238f01fe615bc40d071" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 855daab1e0..8bcade8023 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -28,7 +28,7 @@ futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" parking_lot = "0.8.0" log = "0.4.6" -schnorrkel = "0.1.1" +schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"] } rand = "0.6.5" merlin = "1.0.3" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index cf52d270c7..3948c9727c 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -11,8 +11,8 @@ rstd = { package = "sr-std", path = "../../../sr-std", default-features = false sr-primitives = { path = "../../../sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } +schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"], optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } -schnorrkel = { version = "0.1.1", optional = true } [features] default = ["std"] diff --git a/core/consensus/babe/primitives/src/digest.rs b/core/consensus/babe/primitives/src/digest.rs index 52e7e26e52..81effef5d6 100644 --- a/core/consensus/babe/primitives/src/digest.rs +++ b/core/consensus/babe/primitives/src/digest.rs @@ -153,6 +153,7 @@ fn convert_error(e: SignatureError) -> codec::Error { EquationFalse => "Signature error: `EquationFalse`".into(), PointDecompressionError => "Signature error: `PointDecompressionError`".into(), ScalarFormatError => "Signature error: `ScalarFormatError`".into(), + NotMarkedSchnorrkel => "Signature error: `NotMarkedSchnorrkel`".into(), BytesLengthError { .. } => "Signature error: `BytesLengthError`".into(), MuSigAbsent { musig_stage: Commitment } => "Signature error: `MuSigAbsent` at stage `Commitment`".into(), @@ -161,16 +162,16 @@ fn convert_error(e: SignatureError) -> codec::Error { MuSigAbsent { musig_stage: Cosignature } => "Signature error: `MuSigAbsent` at stage `Commitment`".into(), MuSigInconsistent { musig_stage: Commitment, duplicate: true } => - "Signature error: `MuSigInconsistent` at strage `Commitment` on duplicate".into(), + "Signature error: `MuSigInconsistent` at stage `Commitment` on duplicate".into(), MuSigInconsistent { musig_stage: Commitment, duplicate: false } => - "Signature error: `MuSigInconsistent` at strage `Commitment` on not duplicate".into(), + "Signature error: `MuSigInconsistent` at stage `Commitment` on not duplicate".into(), MuSigInconsistent { musig_stage: Reveal, duplicate: true } => - "Signature error: `MuSigInconsistent` at strage `Reveal` on duplicate".into(), + "Signature error: `MuSigInconsistent` at stage `Reveal` on duplicate".into(), MuSigInconsistent { musig_stage: Reveal, duplicate: false } => - "Signature error: `MuSigInconsistent` at strage `Reveal` on not duplicate".into(), + "Signature error: `MuSigInconsistent` at stage `Reveal` on not duplicate".into(), MuSigInconsistent { musig_stage: Cosignature, duplicate: true } => - "Signature error: `MuSigInconsistent` at strage `Cosignature` on duplicate".into(), + "Signature error: `MuSigInconsistent` at stage `Cosignature` on duplicate".into(), MuSigInconsistent { musig_stage: Cosignature, duplicate: false } => - "Signature error: `MuSigInconsistent` at strage `Cosignature` on not duplicate".into(), + "Signature error: `MuSigInconsistent` at stage `Cosignature` on not duplicate".into(), } } diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index e61fb04062..722c63bb95 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -837,7 +837,7 @@ fn claim_slot( let threshold = calculate_threshold(c, authorities, authority_index); get_keypair(key) - .vrf_sign_n_check(transcript, |inout| check(inout, threshold)) + .vrf_sign_after_check(transcript, |inout| check(inout, threshold)) .map(|s|(s, authority_index)) } diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index c927ddfeb6..49d5a0de30 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -19,10 +19,10 @@ hash256-std-hasher = { version = "0.15.0", default-features = false } ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } -schnorrkel = { version = "0.1.1", optional = true } +schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"], optional = true } rand = { version = "0.6", optional = true } sha2 = { version = "0.8", optional = true } -substrate-bip39 = { version = "0.2.2", optional = true } +substrate-bip39 = { version = "0.3.1", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } regex = { version = "1.1", optional = true } diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index f87a0078ef..b0c217c64f 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -22,7 +22,7 @@ // end::description[] #[cfg(feature = "std")] -use schnorrkel::{signing_context, Keypair, SecretKey, MiniSecretKey, PublicKey, +use schnorrkel::{signing_context, ExpansionMode, Keypair, SecretKey, MiniSecretKey, PublicKey, derive::{Derivation, ChainCode, CHAIN_CODE_LENGTH} }; #[cfg(feature = "std")] @@ -341,7 +341,7 @@ impl AsRef for Pair { #[cfg(feature = "std")] impl From for Pair { fn from(sec: MiniSecretKey) -> Pair { - Pair(sec.expand_to_keypair()) + Pair(sec.expand_to_keypair(ExpansionMode::Ed25519)) } } @@ -376,7 +376,7 @@ impl AsRef for Pair { /// Derive a single hard junction. #[cfg(feature = "std")] fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> SecretKey { - secret.hard_derive_mini_secret_key(Some(ChainCode(cc.clone())), b"").0.expand() + secret.hard_derive_mini_secret_key(Some(ChainCode(cc.clone())), b"").0.expand(ExpansionMode::Ed25519) } /// The raw secret seed, which can be used to recreate the `Pair`. @@ -417,7 +417,7 @@ impl TraitPair for Pair { Ok(Pair( MiniSecretKey::from_bytes(seed) .map_err(|_| SecretStringError::InvalidSeed)? - .expand_to_keypair() + .expand_to_keypair(ExpansionMode::Ed25519) )) } SECRET_KEY_LENGTH => { @@ -476,28 +476,23 @@ impl TraitPair for Pair { /// Verify a signature on a message. Returns true if the signature is good. fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(&sig.as_ref()) { - Ok(some_signature) => some_signature, - Err(_) => return false - }; + // Match both schnorrkel 0.1.1 and 0.8.0+ signatures, supporting both wallets + // that have not been upgraded and those that have. To swap to 0.8.0 only, + // create `schnorrkel::Signature` and pass that into `verify_simple` match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { - Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature - ), + Ok(pk) => pk.verify_simple_preaudit_deprecated( + SIGNING_CTX, message.as_ref(), &sig.as_ref(), + ).is_ok(), Err(_) => false, } } /// Verify a signature on a message. Returns true if the signature is good. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { - let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(sig) { - Ok(some_signature) => some_signature, - Err(_) => return false - }; match PublicKey::from_bytes(pubkey.as_ref()) { - Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature - ), + Ok(pk) => pk.verify_simple_preaudit_deprecated( + SIGNING_CTX, message.as_ref(), &sig, + ).is_ok(), Err(_) => false, } } @@ -518,7 +513,7 @@ impl Pair { let mini_key: MiniSecretKey = mini_secret_from_entropy(entropy, password.unwrap_or("")) .expect("32 bytes can always build a key; qed"); - let kp = mini_key.expand_to_keypair(); + let kp = mini_key.expand_to_keypair(ExpansionMode::Ed25519); (Pair(kp), mini_key.to_bytes()) } } @@ -536,6 +531,43 @@ impl TypedKey for Pair { const KEY_TYPE: KeyTypeId = key_types::SR25519; } +#[cfg(test)] +mod compatibility_test { + use super::*; + use crate::crypto::{DEV_PHRASE}; + use hex_literal::hex; + + // NOTE: tests to ensure addresses that are created with the `0.1.x` version (pre-audit) are + // still functional. + + #[test] + fn derive_soft_known_pair_should_work() { + let pair = Pair::from_string(&format!("{}/Alice", DEV_PHRASE), None).unwrap(); + // known address of DEV_PHRASE with 1.1 + let known = hex!("d6c71059dbbe9ad2b0ed3f289738b800836eb425544ce694825285b958ca755e"); + assert_eq!(pair.public().to_raw_vec(), known); + } + + #[test] + fn derive_hard_known_pair_should_work() { + let pair = Pair::from_string(&format!("{}//Alice", DEV_PHRASE), None).unwrap(); + // known address of DEV_PHRASE with 1.1 + let known = hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); + assert_eq!(pair.public().to_raw_vec(), known); + } + + #[test] + fn verify_known_message_should_work() { + let public = Public::from_raw(hex!("b4bfa1f7a5166695eb75299fd1c4c03ea212871c342f2c5dfea0902b2c246918")); + // signature generated by the 1.1 version with the same ^^ public key. + let signature = Signature::from_raw(hex!( + "5a9755f069939f45d96aaf125cf5ce7ba1db998686f87f2fb3cbdea922078741a73891ba265f70c31436e18a9acd14d189d73c12317ab6c313285cd938453202" + )); + let message = b"Verifying that I am the owner of 5G9hQLdsKQswNPgB499DeA5PkFBbgkLPJWkkS6FAM6xGQ8xD. Hash: 221455a3\n"; + assert!(Pair::verify(&signature, &message[..], &public)); + } +} + #[cfg(test)] mod test { use super::*; @@ -646,7 +678,6 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!( @@ -679,9 +710,9 @@ mod test { &hex!("0000000000000000000000000000000000000000000000000000000000000000") ); let public = pk.public(); - let js_signature = Signature::from_raw( - hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00") - ); + let js_signature = Signature::from_raw(hex!( + "28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00" + )); assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); } } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index f89e1f4a86..c2c5252969 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 129, + spec_version: 130, impl_version: 130, apis: RUNTIME_API_VERSIONS, }; diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index da97ace38e..9e7112a029 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -13,8 +13,7 @@ rand = "0.6" clap = { version = "~2.32", features = ["yaml"] } tiny-bip39 = "0.6.0" rustc-hex = "2.0" -substrate-bip39 = "0.2.2" -schnorrkel = "0.1.1" +substrate-bip39 = "0.3.1" hex = "0.3" hex-literal = "0.2" codec = { package = "parity-scale-codec", version = "1.0.0" } -- GitLab From e348b5b32896dd473e74f54fe0bf5d7fce8f8cfd Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Wed, 7 Aug 2019 13:18:03 +0200 Subject: [PATCH 094/151] Propagate cache when calling into runtime (#3319) --- core/client/src/call_executor.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index bd00b33e4a..f25f77c484 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -241,7 +241,7 @@ where let mut state = self.backend.state_at(*at)?; - match recorder { + let result = match recorder { Some(recorder) => { let trie_state = state.as_trie_backend() .ok_or_else(|| @@ -286,15 +286,18 @@ where native_call, ) .map(|(result, _, _)| result) - .map_err(Into::into) - } + }?; + self.backend.destroy_state(state)?; + Ok(result) } fn runtime_version(&self, id: &BlockId) -> error::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage(), NeverOffchainExt::new()); - self.executor.runtime_version(&mut ext).ok_or(error::Error::VersionInvalid.into()) + let version = self.executor.runtime_version(&mut ext); + self.backend.destroy_state(state)?; + version.ok_or(error::Error::VersionInvalid.into()) } fn call_at_state< -- GitLab From dcde9c075c96e6454c2aab46f1466d4b73979488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 7 Aug 2019 18:43:05 +0200 Subject: [PATCH 095/151] Fix `linked_map` in `decl_storage!` for option values (#3323) --- Cargo.lock | 2 +- srml/support/procedural/src/storage/impls.rs | 45 +++++++++++++------- srml/support/src/lib.rs | 31 +++++++++++++- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24e830af71..0acda1e81e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4416,8 +4416,8 @@ dependencies = [ name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ - "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 4424aa918a..dd93663673 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -200,10 +200,13 @@ impl<'a, I: Iterator> Impls<'a, I> { } = instance_opts; let final_prefix = if let Some(instance) = instance { - let const_name = syn::Ident::new(&format!("{}{}", PREFIX_FOR, name.to_string()), proc_macro2::Span::call_site()); - quote!{ #instance::#const_name.as_bytes() } + let const_name = syn::Ident::new( + &format!("{}{}", PREFIX_FOR, name.to_string()), + proc_macro2::Span::call_site(), + ); + quote! { #instance::#const_name.as_bytes() } } else { - quote!{ #prefix.as_bytes() } + quote! { #prefix.as_bytes() } }; let trait_required = ext::type_contains_ident(value_type, traitinstance) @@ -352,6 +355,12 @@ impl<'a, I: Iterator> Impls<'a, I> { } }; + let mutate_map = if type_infos.is_option { + quote! { .map(|(data, linkage)| (Some(data), Some(linkage))) } + } else { + quote! { .map(|(data, linkage)| (data, Some(linkage))) } + }; + let trait_required = ext::type_contains_ident(value_type, traitinstance) || ext::type_contains_ident(kty, traitinstance); @@ -442,7 +451,7 @@ impl<'a, I: Iterator> Impls<'a, I> { fn remove_linkage>(linkage: Linkage<#kty>, storage: &mut S); /// Read the contained data and it's linkage. - fn read_with_linkage(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)> + fn read_with_linkage(storage: &S, key: &[u8]) -> Option<(#typ, Linkage<#kty>)> where S: #scrate::HashedStorage<#scrate::#hasher>; @@ -504,7 +513,7 @@ impl<'a, I: Iterator> Impls<'a, I> { fn read_with_linkage>( storage: &S, key: &[u8], - ) -> Option<(#value_type, self::#inner_module::Linkage<#kty>)> { + ) -> Option<(#typ, self::#inner_module::Linkage<#kty>)> { storage.get(key) } @@ -586,14 +595,12 @@ impl<'a, I: Iterator> Impls<'a, I> { fn take>(key: &#kty, storage: &mut S) -> Self::Query { use self::#inner_module::Utils; - let res: Option<(#value_type, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key)); - match res { - Some((data, linkage)) => { - Self::remove_linkage(linkage, storage); - data - }, - None => #fielddefault, - } + let res: Option<(#typ, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key)); + + res.map(|(d, l)| { + Self::remove_linkage(l, storage); + d + }).#option_simple_1(|| #fielddefault) } /// Remove the value under a key. @@ -602,7 +609,11 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Store a value to be associated with the given key from the map. - fn insert>(key: &#kty, val: &#typ, storage: &mut S) { + fn insert>( + key: &#kty, + val: &#typ, + storage: &mut S, + ) { use self::#inner_module::Utils; let key_for = &*#as_map::key_for(key); @@ -612,6 +623,7 @@ impl<'a, I: Iterator> Impls<'a, I> { // create new linkage None => Self::new_head_linkage(storage, key), }; + storage.put(key_for, &(val, linkage)) } @@ -633,6 +645,7 @@ impl<'a, I: Iterator> Impls<'a, I> { // create new linkage None => Self::new_head_linkage(storage, key), }; + storage.put(key_for, &(val, linkage)) } @@ -646,11 +659,11 @@ impl<'a, I: Iterator> Impls<'a, I> { let key_for = &*#as_map::key_for(key); let (mut val, linkage) = Self::read_with_linkage(storage, key_for) - .map(|(data, linkage)| (data, Some(linkage))) + #mutate_map .unwrap_or_else(|| (#fielddefault, None)); let ret = f(&mut val); - #mutate_impl ; + #mutate_impl; ret } } diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 677fd6b82e..abc9d7d215 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -308,6 +308,7 @@ mod tests { decl_storage! { trait Store for Module as Example { pub Data get(data) build(|_| vec![(15u32, 42u64)]): linked_map hasher(twox_64_concat) u32 => u64; + pub OptionLinkedMap: linked_map u32 => Option; pub GenericData get(generic_data): linked_map hasher(twox_128) T::BlockNumber => T::BlockNumber; pub GenericData2 get(generic_data2): linked_map T::BlockNumber => Option; @@ -331,6 +332,16 @@ mod tests { type Map = Data; + #[test] + fn linked_map_issue_3318() { + with_externalities(&mut new_test_ext(), || { + OptionLinkedMap::insert(1, 1); + assert_eq!(OptionLinkedMap::get(1), Some(1)); + OptionLinkedMap::insert(1, 2); + assert_eq!(OptionLinkedMap::get(1), Some(2)); + }); + } + #[test] fn linked_map_basic_insert_remove_should_work() { with_externalities(&mut new_test_ext(), || { @@ -472,13 +483,29 @@ mod tests { modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map{ hasher: StorageHasher::Twox64Concat, - key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("u64"), + is_linked: true, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructData(PhantomData::)) ), documentation: DecodeDifferent::Encode(&[]), }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("OptionLinkedMap"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("u32"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructOptionLinkedMap(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, StorageEntryMetadata { name: DecodeDifferent::Encode("GenericData"), modifier: StorageEntryModifier::Default, @@ -574,6 +601,6 @@ mod tests { #[test] fn store_metadata() { let metadata = Module::::storage_metadata(); - assert_eq!(EXPECTED_METADATA, metadata); + pretty_assertions::assert_eq!(EXPECTED_METADATA, metadata); } } -- GitLab From ed61b1fd98010b85d508bdd17867bf6bfb5cfee7 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 7 Aug 2019 20:47:48 +0200 Subject: [PATCH 096/151] Refactor key management (#3296) * Add Call type to extensible transactions. Cleanup some naming * Merge Resource and BlockExhausted into just Exhausted * Fix * Another fix * Call * Some fixes * Fix srml tests. * Fix all tests. * Refactor crypto so each application of it has its own type. * Introduce new AuthorityProvider API into Aura This will eventually allow for dynamic determination of authority keys and avoid having to set them directly on CLI. * Introduce authority determinator for Babe. Experiment with modular consensus API. * Work in progress to introduce KeyTypeId and avoid polluting API with validator IDs * Finish up drafting imonline * Rework offchain workers API. * Rework API implementation. * Make it compile for wasm, simplify app_crypto. * Fix compilation of im-online. * Fix compilation of im-online. * Fix more compilation errors. * Make it compile. * Fixing tests. * Rewrite `keystore` * Fix session tests * Bring back `TryFrom`'s' * Fix `srml-grandpa` * Fix `srml-aura` * Fix consensus babe * More fixes * Make service generate keys from dev_seed * Build fixes * Remove offchain tests * More fixes and cleanups * Fixes finality grandpa * Fix `consensus-aura` * Fix cli * Fix `node-cli` * Fix chain_spec builder * Fix doc tests * Add authority getter for grandpa. * Test fix * Fixes * Make keystore accessible from the runtime * Move app crypto to its own crate * Update `Cargo.lock` * Make the crypto stuff usable from the runtime * Adds some runtime crypto tests * Use last finalized block for grandpa authority * Fix warning * Adds `SessionKeys` runtime api * Remove `FinalityPair` and `ConsensusPair` * Minor governance tweaks to get it inline with docs. * Make the governance be up to date with the docs. * Build fixes. * Generate the inital session keys * Failing keystore is a hard error * Make babe work again * Fix grandpa * Fix tests * Disable `keystore` in consensus critical stuff * Build fix. * ImOnline supports multiple authorities at once. * Update core/application-crypto/src/ed25519.rs * Merge branch 'master' into gav-in-progress * Remove unneeded code for now. * Some `session` testing * Support querying the public keys * Cleanup offchain * Remove warnings * More cleanup * Apply suggestions from code review Co-Authored-By: Benjamin Kampmann * More cleanups * JSONRPC API for setting keys. Also, rename traits::KeyStore* -> traits::BareCryptoStore* * Bad merge * Fix integration tests * Fix test build * Test fix * Fixes * Warnings * Another warning * Bump version. --- Cargo.lock | 136 ++++-- Cargo.toml | 3 + core/application-crypto/Cargo.toml | 21 + core/application-crypto/src/ed25519.rs | 75 +++ core/application-crypto/src/lib.rs | 320 +++++++++++++ core/application-crypto/src/sr25519.rs | 75 +++ core/application-crypto/src/traits.rs | 120 +++++ core/cli/src/lib.rs | 39 +- core/cli/src/params.rs | 47 +- core/client/Cargo.toml | 2 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/lib.rs | 3 +- core/client/src/call_executor.rs | 31 +- core/client/src/client.rs | 113 +++-- core/client/src/genesis.rs | 12 +- core/client/src/lib.rs | 5 +- core/client/src/light/call_executor.rs | 26 +- core/client/src/light/fetcher.rs | 1 - core/client/src/light/mod.rs | 2 +- core/consensus/aura/Cargo.toml | 4 +- core/consensus/aura/primitives/Cargo.toml | 4 +- core/consensus/aura/primitives/src/lib.rs | 34 ++ core/consensus/aura/src/lib.rs | 35 +- core/consensus/babe/Cargo.toml | 13 +- core/consensus/babe/primitives/Cargo.toml | 3 +- core/consensus/babe/primitives/src/digest.rs | 10 +- core/consensus/babe/primitives/src/lib.rs | 13 +- core/consensus/babe/src/lib.rs | 67 +-- core/consensus/babe/src/tests.rs | 49 +- core/consensus/common/Cargo.toml | 2 +- core/consensus/rhd/Cargo.toml | 2 +- core/consensus/rhd/src/misbehaviour_check.rs | 2 +- core/consensus/slots/Cargo.toml | 2 +- core/executor/Cargo.toml | 2 +- core/executor/runtime-test/src/lib.rs | 5 +- core/executor/src/wasm_executor.rs | 321 +++++++------ core/executor/src/wasm_utils.rs | 25 +- core/finality-grandpa/Cargo.toml | 5 +- core/finality-grandpa/primitives/Cargo.toml | 4 +- core/finality-grandpa/primitives/src/lib.rs | 11 +- core/finality-grandpa/src/authorities.rs | 15 +- .../src/communication/gossip.rs | 13 +- .../finality-grandpa/src/communication/mod.rs | 27 +- .../src/communication/tests.rs | 8 +- core/finality-grandpa/src/environment.rs | 42 +- core/finality-grandpa/src/finality_proof.rs | 33 +- core/finality-grandpa/src/lib.rs | 71 ++- core/finality-grandpa/src/light_import.rs | 18 +- core/finality-grandpa/src/observer.rs | 2 +- core/finality-grandpa/src/tests.rs | 94 ++-- core/inherents/Cargo.toml | 2 +- core/keyring/src/ed25519.rs | 45 +- core/keyring/src/sr25519.rs | 56 ++- core/keystore/Cargo.toml | 4 +- core/keystore/src/lib.rs | 329 ++++++++++--- core/network/Cargo.toml | 3 +- core/network/src/config.rs | 5 + core/network/src/test/mod.rs | 2 +- core/offchain/Cargo.toml | 3 +- core/offchain/src/api.rs | 313 +----------- core/offchain/src/lib.rs | 103 +--- core/offchain/src/testing.rs | 43 -- core/primitives/Cargo.toml | 2 +- core/primitives/src/crypto.rs | 236 ++++++++-- core/primitives/src/ed25519.rs | 101 ++-- core/primitives/src/lib.rs | 21 +- core/primitives/src/offchain.rs | 164 +------ core/primitives/src/sr25519.rs | 107 +++-- core/primitives/src/testing.rs | 115 +++++ core/primitives/src/traits.rs | 72 +++ core/rpc/Cargo.toml | 5 +- core/rpc/src/author/error.rs | 12 + core/rpc/src/author/mod.rs | 88 +++- core/rpc/src/author/tests.rs | 54 ++- core/service/Cargo.toml | 8 +- core/service/src/chain_spec.rs | 6 +- core/service/src/components.rs | 88 ++-- core/service/src/config.rs | 18 +- core/service/src/lib.rs | 190 ++------ core/service/test/src/lib.rs | 10 +- core/session/Cargo.toml | 15 + core/session/src/lib.rs | 64 +++ core/sr-api-macros/tests/runtime_calls.rs | 1 + core/sr-io/src/lib.rs | 89 ++-- core/sr-io/with_std.rs | 138 +++--- core/sr-io/without_std.rs | 346 ++++++-------- core/sr-primitives/Cargo.toml | 4 + .../src/generic/checked_extrinsic.rs | 11 +- .../src/generic/unchecked_extrinsic.rs | 1 + core/sr-primitives/src/lib.rs | 17 +- core/sr-primitives/src/testing.rs | 83 +++- core/sr-primitives/src/traits.rs | 82 ++-- core/state-db/Cargo.toml | 2 +- core/state-machine/Cargo.toml | 2 +- core/state-machine/src/basic.rs | 7 +- core/state-machine/src/ext.rs | 35 +- core/state-machine/src/lib.rs | 173 ++++--- core/state-machine/src/overlayed_changes.rs | 1 + core/state-machine/src/testing.rs | 11 +- core/telemetry/Cargo.toml | 2 +- core/test-client/src/lib.rs | 22 +- core/test-runtime/Cargo.toml | 2 + core/test-runtime/client/src/lib.rs | 20 +- core/test-runtime/src/lib.rs | 90 +++- core/test-runtime/src/system.rs | 3 +- core/transaction-pool/Cargo.toml | 2 +- core/transaction-pool/graph/Cargo.toml | 2 +- node-template/Cargo.toml | 4 +- node-template/runtime/Cargo.toml | 2 + node-template/runtime/src/lib.rs | 30 +- node-template/runtime/src/template.rs | 1 + node-template/src/chain_spec.rs | 5 +- node-template/src/service.rs | 10 +- node/cli/Cargo.toml | 5 +- node/cli/src/chain_spec.rs | 117 ++--- node/cli/src/service.rs | 119 ++--- node/executor/src/lib.rs | 22 +- node/runtime/Cargo.toml | 4 + node/runtime/src/lib.rs | 74 ++- srml/assets/src/lib.rs | 1 + srml/aura/Cargo.toml | 4 +- srml/aura/src/lib.rs | 6 +- srml/aura/src/mock.rs | 8 +- srml/authorship/src/lib.rs | 1 + srml/babe/Cargo.toml | 4 +- srml/balances/src/lib.rs | 3 + srml/balances/src/mock.rs | 4 + srml/balances/src/tests.rs | 11 +- srml/collective/src/lib.rs | 57 +-- srml/contracts/src/exec.rs | 2 +- srml/contracts/src/lib.rs | 6 +- srml/contracts/src/tests.rs | 1 + srml/council/src/lib.rs | 1 + srml/democracy/src/lib.rs | 171 +++---- srml/elections/src/lib.rs | 7 +- srml/example/src/lib.rs | 1 + srml/executive/src/lib.rs | 6 +- srml/finality-tracker/src/lib.rs | 1 + srml/generic-asset/src/lib.rs | 1 + srml/generic-asset/src/mock.rs | 1 + srml/grandpa/src/mock.rs | 5 +- srml/im-online/Cargo.toml | 2 + srml/im-online/src/lib.rs | 444 ++++++++---------- srml/indices/src/mock.rs | 1 + srml/membership/Cargo.toml | 29 ++ srml/membership/src/lib.rs | 347 ++++++++++++++ srml/session/Cargo.toml | 1 + srml/session/src/historical.rs | 31 +- srml/session/src/lib.rs | 79 ++-- srml/session/src/mock.rs | 27 +- srml/staking/src/mock.rs | 1 + srml/support/src/storage/hashed/generator.rs | 17 + srml/support/src/storage/mod.rs | 7 + srml/support/src/traits.rs | 61 ++- srml/system/benches/bench.rs | 1 + srml/system/src/lib.rs | 50 +- srml/timestamp/src/lib.rs | 1 + srml/treasury/src/lib.rs | 1 + subkey/src/main.rs | 2 +- test-utils/chain-spec-builder/src/main.rs | 6 +- 160 files changed, 4450 insertions(+), 2752 deletions(-) create mode 100644 core/application-crypto/Cargo.toml create mode 100644 core/application-crypto/src/ed25519.rs create mode 100644 core/application-crypto/src/lib.rs create mode 100644 core/application-crypto/src/sr25519.rs create mode 100644 core/application-crypto/src/traits.rs create mode 100644 core/primitives/src/testing.rs create mode 100644 core/primitives/src/traits.rs create mode 100644 core/session/Cargo.toml create mode 100644 core/session/src/lib.rs create mode 100644 srml/membership/Cargo.toml create mode 100644 srml/membership/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 0acda1e81e..62969a0efa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -695,6 +695,19 @@ dependencies = [ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "derive_more" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "difference" version = "2.0.0" @@ -2264,7 +2277,9 @@ dependencies = [ "srml-balances 2.0.0", "srml-contracts 2.0.0", "srml-finality-tracker 2.0.0", + "srml-im-online 0.1.0", "srml-indices 2.0.0", + "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2285,6 +2300,7 @@ dependencies = [ "substrate-service-test 2.0.0", "substrate-telemetry 2.0.0", "substrate-transaction-pool 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "transaction-factory 0.0.1", ] @@ -2369,6 +2385,7 @@ dependencies = [ "srml-grandpa 2.0.0", "srml-im-online 0.1.0", "srml-indices 2.0.0", + "srml-membership 2.0.0", "srml-session 2.0.0", "srml-staking 2.0.0", "srml-sudo 2.0.0", @@ -2382,6 +2399,7 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-wasm-builder-runner 1.0.2", ] @@ -2396,13 +2414,15 @@ dependencies = [ "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "substrate-basic-authorship 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-executor 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", @@ -2436,6 +2456,7 @@ dependencies = [ "substrate-consensus-aura-primitives 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3631,10 +3652,12 @@ dependencies = [ "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", ] @@ -3689,7 +3712,7 @@ version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3699,6 +3722,7 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", @@ -3724,7 +3748,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3918,6 +3942,7 @@ dependencies = [ "srml-session 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", ] @@ -3938,6 +3963,20 @@ dependencies = [ "substrate-primitives 2.0.0", ] +[[package]] +name = "srml-membership" +version = "2.0.0" +dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "srml-metadata" version = "2.0.0" @@ -3962,6 +4001,7 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", ] @@ -4214,6 +4254,19 @@ dependencies = [ "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-application-crypto" +version = "2.0.0" +dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-runtime-client 2.0.0", +] + [[package]] name = "substrate-basic-authorship" version = "2.0.0" @@ -4291,7 +4344,7 @@ dependencies = [ "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4319,7 +4372,7 @@ dependencies = [ "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -4342,12 +4395,13 @@ dependencies = [ "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", "srml-support 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-common 2.0.0", @@ -4355,6 +4409,7 @@ dependencies = [ "substrate-executor 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", @@ -4370,8 +4425,8 @@ dependencies = [ "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", - "substrate-primitives 2.0.0", ] [[package]] @@ -4389,7 +4444,7 @@ dependencies = [ "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4397,6 +4452,7 @@ dependencies = [ "sr-version 2.0.0", "srml-babe 2.0.0", "srml-support 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", @@ -4404,11 +4460,13 @@ dependencies = [ "substrate-executor 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4420,9 +4478,9 @@ dependencies = [ "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-slots 2.0.0", - "substrate-primitives 2.0.0", ] [[package]] @@ -4435,7 +4493,7 @@ dependencies = [ "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -4463,7 +4521,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4486,7 +4544,7 @@ dependencies = [ "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -4508,7 +4566,7 @@ dependencies = [ "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-client 2.0.0", @@ -4535,21 +4593,24 @@ dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "srml-finality-tracker 2.0.0", "substrate-client 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-finality-grandpa-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4563,8 +4624,8 @@ dependencies = [ "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", - "substrate-primitives 2.0.0", ] [[package]] @@ -4572,7 +4633,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -4592,10 +4653,12 @@ dependencies = [ name = "substrate-keystore" version = "2.0.0" dependencies = [ - "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4622,7 +4685,7 @@ dependencies = [ "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4633,6 +4696,7 @@ dependencies = [ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-keyring 2.0.0", "substrate-peerset 2.0.0", @@ -4656,10 +4720,11 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -4714,7 +4779,7 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4746,7 +4811,7 @@ dependencies = [ "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4755,6 +4820,7 @@ dependencies = [ "sr-version 2.0.0", "substrate-client 2.0.0", "substrate-executor 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", @@ -4810,22 +4876,26 @@ dependencies = [ "node-runtime 2.0.0", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-executor 2.0.0", "substrate-finality-grandpa 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-offchain 2.0.0", "substrate-primitives 2.0.0", "substrate-rpc-servers 2.0.0", + "substrate-session 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", @@ -4853,6 +4923,16 @@ dependencies = [ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-session" +version = "2.0.0" +dependencies = [ + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "substrate-state-db" version = "2.0.0" @@ -4860,7 +4940,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4873,7 +4953,7 @@ dependencies = [ "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -4891,7 +4971,7 @@ dependencies = [ "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4937,6 +5017,7 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-babe-primitives 2.0.0", @@ -4972,7 +5053,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -4987,7 +5068,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-keyring 2.0.0", @@ -6075,6 +6156,7 @@ dependencies = [ "checksum curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d4b820e8711c211745880150f5fac78ab07d6e3851d8ce9f5a02cedc199174c" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" "checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" +"checksum derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" diff --git a/Cargo.toml b/Cargo.toml index a6a7b8d17b..298882e9a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ vergen = "3" [workspace] members = [ + "core/application-crypto", "core/cli", "core/client", "core/client/db", @@ -42,6 +43,7 @@ members = [ "core/serializer", "core/service", "core/service/test", + "core/session", "core/sr-api-macros", "core/sr-io", "core/sr-primitives", @@ -79,6 +81,7 @@ members = [ "srml/grandpa", "srml/im-online", "srml/indices", + "srml/membership", "srml/metadata", "srml/session", "srml/staking", diff --git a/core/application-crypto/Cargo.toml b/core/application-crypto/Cargo.toml new file mode 100644 index 0000000000..6d39b12653 --- /dev/null +++ b/core/application-crypto/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "substrate-application-crypto" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Provides facilities for generating application specific crypto wrapper types." + +[dependencies] +primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } +rstd = { package = "sr-std", path = "../sr-std", default-features = false } +rio = { package = "sr-io", path = "../sr-io", default-features = false } + +[dev-dependencies] +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } +sr-primitives = { path = "../sr-primitives" } + +[features] +default = [ "std" ] +std = [ "primitives/std", "codec/std", "serde", "rstd/std", "rio/std" ] diff --git a/core/application-crypto/src/ed25519.rs b/core/application-crypto/src/ed25519.rs new file mode 100644 index 0000000000..6c5458492b --- /dev/null +++ b/core/application-crypto/src/ed25519.rs @@ -0,0 +1,75 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Ed25519 crypto types. + +use crate::{RuntimePublic, KeyTypeId}; + +pub use primitives::ed25519::*; + +mod app { + use crate::key_types::ED25519; + crate::app_crypto!(super, ED25519); +} + +pub use app::Public as AppPublic; +pub use app::Signature as AppSignature; +#[cfg(feature="std")] +pub use app::Pair as AppPair; + +impl RuntimePublic for Public { + type Signature = Signature; + + fn all(key_type: KeyTypeId) -> crate::Vec { + rio::ed25519_public_keys(key_type) + } + + fn generate_pair(key_type: KeyTypeId, seed: Option<&str>) -> Self { + rio::ed25519_generate(key_type, seed) + } + + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option { + rio::ed25519_sign(key_type, self, msg) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + rio::ed25519_verify(&signature, msg.as_ref(), self) + } +} + +#[cfg(test)] +mod tests { + use sr_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; + use primitives::{testing::KeyStore, crypto::Pair, traits::BareCryptoStore as _}; + use test_client::{ + TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, + runtime::{TestAPI, app_crypto::ed25519::{AppPair, AppPublic}}, + }; + + #[test] + fn ed25519_works_in_runtime() { + let keystore = KeyStore::new(); + let test_client = TestClientBuilder::new().set_keystore(keystore.clone()).build(); + let (signature, public) = test_client.runtime_api() + .test_ed25519_crypto(&BlockId::Number(0)) + .expect("Tests `ed25519` crypto."); + + let key_pair = keystore.read().ed25519_key_pair(crate::key_types::ED25519, &public.as_ref()) + .expect("There should be at a `ed25519` key in the keystore for the given public key."); + + assert!(AppPair::verify(&signature, "ed25519", &AppPublic::from(key_pair.public()))); + } +} diff --git a/core/application-crypto/src/lib.rs b/core/application-crypto/src/lib.rs new file mode 100644 index 0000000000..d9bff822ee --- /dev/null +++ b/core/application-crypto/src/lib.rs @@ -0,0 +1,320 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Traits and macros for constructing application specific strongly typed crypto wrappers. + +#![warn(missing_docs)] + +#![cfg_attr(not(feature = "std"), no_std)] + +#[doc(hidden)] +pub use primitives::{self, crypto::{CryptoType, Public, Derive, IsWrappedBy, Wraps}}; +#[doc(hidden)] +#[cfg(feature = "std")] +pub use primitives::crypto::{SecretStringError, DeriveJunction, Ss58Codec, Pair}; +pub use primitives::{crypto::{KeyTypeId, key_types}}; + +#[doc(hidden)] +pub use codec; +#[doc(hidden)] +#[cfg(feature = "std")] +pub use serde; +#[doc(hidden)] +pub use rstd::{ops::Deref, vec::Vec}; + +pub mod ed25519; +pub mod sr25519; +mod traits; + +pub use traits::*; + +/// Declares Public, Pair, Signature types which are functionally equivalent to `$pair`, but are new +/// Application-specific types whose identifier is `$key_type`. +/// +/// ```rust +///# use substrate_application_crypto::{app_crypto, wrap, ed25519, KeyTypeId}; +/// // Declare a new set of crypto types using Ed25519 logic that identifies as `KeyTypeId` +/// // of value `b"fuba"`. +/// app_crypto!(ed25519, KeyTypeId(*b"_uba")); +/// ``` +#[macro_export] +macro_rules! app_crypto { + ($module:ident, $key_type:expr) => { + #[cfg(feature="std")] + $crate::app_crypto!($module::Pair, $module::Public, $module::Signature, $key_type); + #[cfg(not(feature="std"))] + $crate::app_crypto!($module::Public, $module::Signature, $key_type); + }; + ($pair:ty, $public:ty, $sig:ty, $key_type:expr) => { + $crate::app_crypto!($public, $sig, $key_type); + + $crate::wrap!{ + /// A generic `AppPublic` wrapper type over $pair crypto; this has no specific App. + #[derive(Clone)] + pub struct Pair($pair); + } + + impl $crate::CryptoType for Pair { + type Pair = Pair; + } + + #[cfg(feature = "std")] + impl $crate::Pair for Pair { + type Public = Public; + type Seed = <$pair as $crate::Pair>::Seed; + type Signature = Signature; + type DeriveError = <$pair as $crate::Pair>::DeriveError; + fn generate_with_phrase(password: Option<&str>) -> (Self, String, Self::Seed) { + let r = <$pair>::generate_with_phrase(password); + (Self(r.0), r.1, r.2) + } + fn from_phrase(phrase: &str, password: Option<&str>) + -> Result<(Self, Self::Seed), $crate::SecretStringError> + { + <$pair>::from_phrase(phrase, password).map(|r| (Self(r.0), r.1)) + } + fn derive< + Iter: Iterator + >(&self, path: Iter) -> Result { + self.0.derive(path).map(Self) + } + fn from_seed(seed: &Self::Seed) -> Self { Self(<$pair>::from_seed(seed)) } + fn from_seed_slice(seed: &[u8]) -> Result { + <$pair>::from_seed_slice(seed).map(Self) + } + fn from_standard_components< + I: Iterator + >( + seed: &str, + password: Option<&str>, + path: I, + ) -> Result { + <$pair>::from_standard_components::(seed, password, path).map(Self) + } + fn sign(&self, msg: &[u8]) -> Self::Signature { + Signature(self.0.sign(msg)) + } + fn verify>( + sig: &Self::Signature, + message: M, + pubkey: &Self::Public, + ) -> bool { + <$pair>::verify(&sig.0, message, pubkey.as_ref()) + } + fn verify_weak, M: AsRef<[u8]>>( + sig: &[u8], + message: M, + pubkey: P, + ) -> bool { + <$pair>::verify_weak(sig, message, pubkey) + } + fn public(&self) -> Self::Public { Public(self.0.public()) } + fn to_raw_vec(&self) -> Vec { self.0.to_raw_vec() } + } + impl $crate::AppKey for Pair { + type UntypedGeneric = $pair; + type Public = Public; + type Pair = Pair; + type Signature = Signature; + const ID: $crate::KeyTypeId = $key_type; + } + impl $crate::AppPair for Pair { + type Generic = $pair; + } + }; + ($public:ty, $sig:ty, $key_type:expr) => { + $crate::wrap!{ + /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. + #[derive( + Clone, Default, Eq, PartialEq, Ord, PartialOrd, $crate::codec::Encode, + $crate::codec::Decode, + )] + #[cfg_attr(feature = "std", derive(Debug, Hash))] + pub struct Public($public); + } + + impl $crate::Derive for Public { + #[cfg(feature = "std")] + fn derive>(&self, + path: Iter + ) -> Option { + self.0.derive(path).map(Self) + } + } + + #[cfg(feature = "std")] + impl std::fmt::Display for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + use $crate::Ss58Codec; + write!(f, "{}", self.0.to_ss58check()) + } + } + #[cfg(feature = "std")] + impl $crate::serde::Serialize for Public { + fn serialize(&self, serializer: S) -> std::result::Result where + S: $crate::serde::Serializer + { + use $crate::Ss58Codec; + serializer.serialize_str(&self.to_ss58check()) + } + } + #[cfg(feature = "std")] + impl<'de> $crate::serde::Deserialize<'de> for Public { + fn deserialize(deserializer: D) -> std::result::Result where + D: $crate::serde::Deserializer<'de> + { + use $crate::Ss58Codec; + Public::from_ss58check(&String::deserialize(deserializer)?) + .map_err(|e| $crate::serde::de::Error::custom(format!("{:?}", e))) + } + } + + impl AsRef<[u8]> for Public { + fn as_ref(&self) -> &[u8] { self.0.as_ref() } + } + + impl AsMut<[u8]> for Public { + fn as_mut(&mut self) -> &mut [u8] { self.0.as_mut() } + } + + impl $crate::CryptoType for Public { + #[cfg(feature="std")] + type Pair = Pair; + } + + impl $crate::Public for Public { + fn from_slice(x: &[u8]) -> Self { Self(<$public>::from_slice(x)) } + } + + impl $crate::AppKey for Public { + type UntypedGeneric = $public; + type Public = Public; + #[cfg(feature="std")] + type Pair = Pair; + type Signature = Signature; + const ID: $crate::KeyTypeId = $key_type; + } + + impl $crate::AppPublic for Public { + type Generic = $public; + } + + impl $crate::RuntimeAppPublic for Public where $public: $crate::RuntimePublic { + type Signature = Signature; + + fn all() -> $crate::Vec { + <$public as $crate::RuntimePublic>::all($key_type).into_iter().map(Self).collect() + } + + fn generate_pair(seed: Option<&str>) -> Self { + Self(<$public as $crate::RuntimePublic>::generate_pair($key_type, seed)) + } + + fn sign>(&self, msg: &M) -> Option { + <$public as $crate::RuntimePublic>::sign( + self.as_ref(), + $key_type, + msg, + ).map(Signature) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + <$public as $crate::RuntimePublic>::verify(self.as_ref(), msg, &signature.as_ref()) + } + } + + $crate::wrap! { + /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. + #[derive(Clone, Default, Eq, PartialEq, $crate::codec::Encode, $crate::codec::Decode)] + #[cfg_attr(feature = "std", derive(Debug, Hash))] + pub struct Signature($sig); + } + + impl $crate::Deref for Signature { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { self.0.as_ref() } + } + + impl AsRef<[u8]> for Signature { + fn as_ref(&self) -> &[u8] { self.0.as_ref() } + } + + impl $crate::CryptoType for Signature { + #[cfg(feature="std")] + type Pair = Pair; + } + + impl $crate::AppKey for Signature { + type UntypedGeneric = $sig; + type Public = Public; + #[cfg(feature="std")] + type Pair = Pair; + type Signature = Signature; + const ID: $crate::KeyTypeId = $key_type; + } + + impl $crate::AppSignature for Signature { + type Generic = $sig; + } + } +} + +/// Implement bidirectional `From` and on-way `AsRef`/`AsMut` for two types, `$inner` and `$outer`. +/// +/// ```rust +/// substrate_application_crypto::wrap! { +/// pub struct Wrapper(u32); +/// } +/// ``` +#[macro_export] +macro_rules! wrap { + ($( #[ $attr:meta ] )* struct $outer:ident($inner:ty);) => { + $( #[ $attr ] )* + struct $outer( $inner ); + $crate::wrap!($inner, $outer); + }; + ($( #[ $attr:meta ] )* pub struct $outer:ident($inner:ty);) => { + $( #[ $attr ] )* + pub struct $outer( $inner ); + $crate::wrap!($inner, $outer); + }; + ($inner:ty, $outer:ty) => { + impl $crate::Wraps for $outer { + type Inner = $inner; + } + impl From<$inner> for $outer { + fn from(inner: $inner) -> Self { + Self(inner) + } + } + impl From<$outer> for $inner { + fn from(outer: $outer) -> Self { + outer.0 + } + } + impl AsRef<$inner> for $outer { + fn as_ref(&self) -> &$inner { + &self.0 + } + } + impl AsMut<$inner> for $outer { + fn as_mut(&mut self) -> &mut $inner { + &mut self.0 + } + } + } +} diff --git a/core/application-crypto/src/sr25519.rs b/core/application-crypto/src/sr25519.rs new file mode 100644 index 0000000000..af112dc70e --- /dev/null +++ b/core/application-crypto/src/sr25519.rs @@ -0,0 +1,75 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Sr25519 crypto types. + +use crate::{RuntimePublic, KeyTypeId}; + +pub use primitives::sr25519::*; + +mod app { + use crate::key_types::SR25519; + crate::app_crypto!(super, SR25519); +} + +pub use app::Public as AppPublic; +pub use app::Signature as AppSignature; +#[cfg(feature="std")] +pub use app::Pair as AppPair; + +impl RuntimePublic for Public { + type Signature = Signature; + + fn all(key_type: KeyTypeId) -> crate::Vec { + rio::sr25519_public_keys(key_type) + } + + fn generate_pair(key_type: KeyTypeId, seed: Option<&str>) -> Self { + rio::sr25519_generate(key_type, seed) + } + + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option { + rio::sr25519_sign(key_type, self, msg) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + rio::sr25519_verify(&signature, msg.as_ref(), self) + } +} + +#[cfg(test)] +mod tests { + use sr_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; + use primitives::{testing::KeyStore, crypto::Pair, traits::BareCryptoStore as _}; + use test_client::{ + TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, + runtime::{TestAPI, app_crypto::sr25519::{AppPair, AppPublic}}, + }; + + #[test] + fn sr25519_works_in_runtime() { + let keystore = KeyStore::new(); + let test_client = TestClientBuilder::new().set_keystore(keystore.clone()).build(); + let (signature, public) = test_client.runtime_api() + .test_sr25519_crypto(&BlockId::Number(0)) + .expect("Tests `sr25519` crypto."); + + let key_pair = keystore.read().sr25519_key_pair(crate::key_types::SR25519, public.as_ref()) + .expect("There should be at a `sr25519` key in the keystore for the given public key."); + + assert!(AppPair::verify(&signature, "sr25519", &AppPublic::from(key_pair.public()))); + } +} diff --git a/core/application-crypto/src/traits.rs b/core/application-crypto/src/traits.rs new file mode 100644 index 0000000000..d7f1eafe35 --- /dev/null +++ b/core/application-crypto/src/traits.rs @@ -0,0 +1,120 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use primitives::crypto::{KeyTypeId, CryptoType, IsWrappedBy, Public}; +#[cfg(feature = "std")] +use primitives::crypto::Pair; + +/// An application-specific key. +pub trait AppKey: 'static + Send + Sync + Sized + CryptoType + Clone { + /// The corresponding type as a generic crypto type. + type UntypedGeneric: IsWrappedBy; + + /// The corresponding public key type in this application scheme. + type Public: AppPublic; + + /// The corresponding key pair type in this application scheme. + #[cfg(feature="std")] + type Pair: AppPair; + + /// The corresponding signature type in this application scheme. + type Signature: AppSignature; + + /// An identifier for this application-specific key type. + const ID: KeyTypeId; +} + +/// Type which implements Debug and Hash in std, not when no-std (std variant). +#[cfg(feature = "std")] +pub trait MaybeDebugHash: std::fmt::Debug + std::hash::Hash {} +#[cfg(feature = "std")] +impl MaybeDebugHash for T {} + +/// Type which implements Debug and Hash in std, not when no-std (no-std variant). +#[cfg(not(feature = "std"))] +pub trait MaybeDebugHash {} +#[cfg(not(feature = "std"))] +impl MaybeDebugHash for T {} + +/// A application's public key. +pub trait AppPublic: AppKey + Public + Ord + PartialOrd + Eq + PartialEq + MaybeDebugHash + codec::Codec { + /// The wrapped type which is just a plain instance of `Public`. + type Generic: + IsWrappedBy + Public + Ord + PartialOrd + Eq + PartialEq + MaybeDebugHash + codec::Codec; +} + +/// A application's key pair. +#[cfg(feature = "std")] +pub trait AppPair: AppKey + Pair::Public> { + /// The wrapped type which is just a plain instance of `Pair`. + type Generic: IsWrappedBy + Pair::Public as AppPublic>::Generic>; +} + +/// A application's signature. +pub trait AppSignature: AppKey + Eq + PartialEq + MaybeDebugHash { + /// The wrapped type which is just a plain instance of `Signature`. + type Generic: IsWrappedBy + Eq + PartialEq + MaybeDebugHash; +} + +/// A runtime interface for a public key. +pub trait RuntimePublic: Sized { + /// The signature that will be generated when signing with the corresponding private key. + type Signature; + + /// Returns all public keys for the given key type in the keystore. + fn all(key_type: KeyTypeId) -> crate::Vec; + + /// Generate a public/private pair for the given key type and store it in the keystore. + /// + /// Returns the generated public key. + fn generate_pair(key_type: KeyTypeId, seed: Option<&str>) -> Self; + + /// Sign the given message with the corresponding private key of this public key. + /// + /// The private key will be requested from the keystore using the given key type. + /// + /// Returns the signature or `None` if the private key could not be found or some other error + /// occurred. + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option; + + /// Verify that the given signature matches the given message using this public key. + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool; +} + +/// A runtime interface for an application's public key. +pub trait RuntimeAppPublic: Sized { + /// The signature that will be generated when signing with the corresponding private key. + type Signature; + + /// Returns all public keys for this application in the keystore. + fn all() -> crate::Vec; + + /// Generate a public/private pair and store it in the keystore. + /// + /// Returns the generated public key. + fn generate_pair(seed: Option<&str>) -> Self; + + /// Sign the given message with the corresponding private key of this public key. + /// + /// The private key will be requested from the keystore. + /// + /// Returns the signature or `None` if the private key could not be found or some other error + /// occurred. + fn sign>(&self, msg: &M) -> Option; + + /// Verify that the given signature matches the given message using this public key. + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool; +} diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index eb0e443a57..0f6769a699 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -366,6 +366,24 @@ fn input_keystore_password() -> Result { .map_err(|e| format!("{:?}", e)) } +/// Fill the password field of the given config instance. +fn fill_config_keystore_password( + config: &mut service::Configuration, + cli: &RunCmd, +) -> Result<(), String> { + config.keystore_password = if cli.password_interactive { + Some(input_keystore_password()?.into()) + } else if let Some(ref file) = cli.password_filename { + Some(fs::read_to_string(file).map_err(|e| format!("{}", e))?.into()) + } else if let Some(ref password) = cli.password { + Some(password.clone().into()) + } else { + None + }; + + Ok(()) +} + fn create_run_node_config( cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo ) -> error::Result> @@ -375,9 +393,8 @@ where { let spec = load_spec(&cli.shared_params, spec_factory)?; let mut config = service::Configuration::default_with_spec(spec.clone()); - if cli.interactive_password { - config.password = input_keystore_password()?.into() - } + + fill_config_keystore_password(&mut config, &cli)?; config.impl_name = impl_name; config.impl_commit = version.commit; @@ -401,7 +418,9 @@ where let base_path = base_path(&cli.shared_params, version); - config.keystore_path = cli.keystore_path.or_else(|| Some(keystore_path(&base_path, config.chain_spec.id()))); + config.keystore_path = cli.keystore_path.unwrap_or_else( + || keystore_path(&base_path, config.chain_spec.id()) + ); config.database_path = db_path(&base_path, config.chain_spec.id()); config.database_cache_size = cli.database_cache_size; @@ -462,17 +481,13 @@ where cli.pool_config, )?; - if let Some(key) = cli.key { - config.keys.push(key); - } - if cli.shared_params.dev && cli.keyring.account.is_none() { - config.keys.push("//Alice".into()); + if cli.shared_params.dev { + config.dev_key_seed = cli.keyring.account + .map(|a| format!("//{}", a)) + .or_else(|| Some("//Alice".into())); } - if let Some(account) = cli.keyring.account { - config.keys.push(format!("//{}", account)); - } let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; let ws_interface: &str = if cli.ws_external { "0.0.0.0" } else { "127.0.0.1" }; diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index e1018eb93a..6f92e8c9b4 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -36,9 +36,13 @@ arg_enum! { #[allow(missing_docs)] #[derive(Debug, Clone, Copy)] pub enum ExecutionStrategy { + // Execute with native build (if available, WebAssembly otherwise). Native, + // Only execute with the WebAssembly build. Wasm, + // Execute with both native (where available) and WebAssembly builds. Both, + // Execute with the native build if possible; if it fails, then execute with WebAssembly. NativeElseWasm, } } @@ -55,7 +59,8 @@ impl Into for ExecutionStrategy { } arg_enum! { - /// How to execute blocks + /// Whether off-chain workers are enabled. + #[allow(missing_docs)] #[derive(Debug, Clone)] pub enum OffchainWorkerEnabled { Always, @@ -306,14 +311,6 @@ pub struct ExecutionStrategies { /// The `run` command used to run a node. #[derive(Debug, StructOpt, Clone)] pub struct RunCmd { - /// Specify custom keystore path - #[structopt(long = "keystore-path", value_name = "PATH", parse(from_os_str))] - pub keystore_path: Option, - - /// Specify additional key seed - #[structopt(long = "key", value_name = "STRING")] - pub key: Option, - /// Enable validator mode #[structopt(long = "validator")] pub validator: bool, @@ -422,9 +419,32 @@ pub struct RunCmd { #[structopt(long = "force-authoring")] pub force_authoring: bool, - /// Interactive password for validator key. - #[structopt(short = "i")] - pub interactive_password: bool, + /// Specify custom keystore path. + #[structopt(long = "keystore-path", value_name = "PATH", parse(from_os_str))] + pub keystore_path: Option, + + /// Use interactive shell for entering the password used by the keystore. + #[structopt( + long = "password-interactive", + raw(conflicts_with_all = "&[ \"password\", \"password_filename\" ]") + )] + pub password_interactive: bool, + + /// Password used by the keystore. + #[structopt( + long = "password", + raw(conflicts_with_all = "&[ \"password_interactive\", \"password_filename\" ]") + )] + pub password: Option, + + /// File that contains the password used by the keystore. + #[structopt( + long = "password-filename", + value_name = "PATH", + parse(from_os_str), + raw(conflicts_with_all = "&[ \"password_interactive\", \"password\" ]") + )] + pub password_filename: Option } /// Stores all required Cli values for a keyring test account. @@ -443,7 +463,7 @@ lazy_static::lazy_static! { let conflicts_with = keyring::Sr25519Keyring::iter() .filter(|b| a != *b) .map(|b| b.to_string().to_lowercase()) - .chain(["name", "key"].iter().map(ToString::to_string)) + .chain(std::iter::once("name".to_string())) .collect::>(); let name = a.to_string().to_lowercase(); @@ -485,6 +505,7 @@ impl AugmentClap for Keyring { .long(&a.name) .help(&a.help) .conflicts_with_all(&conflicts_with_strs) + .requires("dev") .takes_value(false) ) }) diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 5848c67349..793db37613 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" derive_more = { version = "0.14.0", optional = true } fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } -parking_lot = { version = "0.8.0", optional = true } +parking_lot = { version = "0.9.0", optional = true } hex = { package = "hex-literal", version = "0.2", optional = true } futures-preview = { version = "0.3.0-alpha.17", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 5df825fe12..b7bc835ef0 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.8" +parking_lot = "0.9.0" log = "0.4" kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index a25ded0db3..250af8ea60 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -195,6 +195,7 @@ pub fn new_client( executor: E, genesis_storage: S, execution_strategies: ExecutionStrategies, + keystore: Option, ) -> Result< client::Client, client::LocalCallExecutor, E>, Block, RA>, client::error::Error @@ -205,7 +206,7 @@ pub fn new_client( S: BuildStorage, { let backend = Arc::new(Backend::new(settings, CANONICALIZATION_DELAY)?); - let executor = client::LocalCallExecutor::new(backend.clone(), executor); + let executor = client::LocalCallExecutor::new(backend.clone(), executor, keystore); Ok(client::Client::new(backend, executor, genesis_storage, execution_strategies)?) } diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index f25f77c484..e82bd9a22c 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -83,6 +83,7 @@ where native_call: Option, side_effects_handler: Option<&mut O>, proof_recorder: &Option>>>, + enable_keystore: bool, ) -> error::Result> where ExecutionManager: Clone; /// Extract RuntimeVersion of given block @@ -150,14 +151,20 @@ where pub struct LocalCallExecutor { backend: Arc, executor: E, + keystore: Option, } impl LocalCallExecutor { /// Creates new instance of local call executor. - pub fn new(backend: Arc, executor: E) -> Self { + pub fn new( + backend: Arc, + executor: E, + keystore: Option, + ) -> Self { LocalCallExecutor { backend, executor, + keystore, } } } @@ -167,6 +174,7 @@ impl Clone for LocalCallExecutor where E: Clone { LocalCallExecutor { backend: self.backend.clone(), executor: self.executor.clone(), + keystore: self.keystore.clone(), } } } @@ -197,6 +205,7 @@ where &self.executor, method, call_data, + self.keystore.clone(), ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( strategy.get_manager(), false, @@ -229,6 +238,7 @@ where native_call: Option, side_effects_handler: Option<&mut O>, recorder: &Option>>>, + enable_keystore: bool, ) -> Result, error::Error> where ExecutionManager: Clone { match initialize_block { InitializeBlock::Do(ref init_block) @@ -239,6 +249,12 @@ where _ => {}, } + let keystore = if enable_keystore { + self.keystore.clone() + } else { + None + }; + let mut state = self.backend.state_at(*at)?; let result = match recorder { @@ -262,6 +278,7 @@ where &self.executor, method, call_data, + keystore, ) .execute_using_consensus_failure_handler( execution_manager, @@ -279,6 +296,7 @@ where &self.executor, method, call_data, + keystore, ) .execute_using_consensus_failure_handler( execution_manager, @@ -294,7 +312,14 @@ where fn runtime_version(&self, id: &BlockId) -> error::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; - let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage(), NeverOffchainExt::new()); + + let mut ext = Ext::new( + &mut overlay, + &state, + self.backend.changes_trie_storage(), + NeverOffchainExt::new(), + None, + ); let version = self.executor.runtime_version(&mut ext); self.backend.destroy_state(state)?; version.ok_or(error::Error::VersionInvalid.into()) @@ -330,6 +355,7 @@ where &self.executor, method, call_data, + self.keystore.clone(), ).execute_using_consensus_failure_handler( manager, true, @@ -356,6 +382,7 @@ where &self.executor, method, call_data, + self.keystore.clone(), ) .map_err(Into::into) } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index cd6c2d63b7..7213db0c9f 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -20,66 +20,59 @@ use std::{ marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, panic::UnwindSafe, result, cell::RefCell, rc::Rc, }; -use crate::error::Error; +use log::{info, trace, warn}; use futures::channel::mpsc; use parking_lot::{Mutex, RwLock}; -use primitives::NativeOrEncoded; -use sr_primitives::{ - Justification, - generic::{BlockId, SignedBlock}, -}; -use consensus::{ - Error as ConsensusError, BlockImportParams, - ImportResult, BlockOrigin, ForkChoiceStrategy, - well_known_cache_keys::Id as CacheKeyId, - SelectChain, self, -}; -use sr_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, NumberFor, - ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, -}; -use sr_primitives::generic::DigestItem; -use sr_primitives::BuildStorage; -use crate::runtime_api::{ - CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, - InitializeBlock, -}; +use codec::{Encode, Decode}; +use hash_db::{Hasher, Prefix}; use primitives::{ Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, - NeverNativeValue, ExecutionContext + NeverNativeValue, ExecutionContext, + storage::{StorageKey, StorageData, well_known_keys}, NativeOrEncoded +}; +use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; +use sr_primitives::{ + Justification, BuildStorage, + generic::{BlockId, SignedBlock, DigestItem}, + traits::{ + Block as BlockT, Header as HeaderT, Zero, NumberFor, + ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, + }, }; -use primitives::storage::{StorageKey, StorageData}; -use primitives::storage::well_known_keys; -use codec::{Encode, Decode}; use state_machine::{ DBValue, Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, ExecutionStrategy, ExecutionManager, prove_read, prove_child_read, ChangesTrieRootsStorage, ChangesTrieStorage, key_changes, key_changes_proof, OverlayedChanges, NeverOffchainExt, }; -use hash_db::{Hasher, Prefix}; - -use crate::backend::{ - self, BlockImportOperation, PrunableStateChangesTrieStorage, - StorageCollection, ChildStorageCollection -}; -use crate::blockchain::{ - self, Info as ChainInfo, Backend as ChainBackend, - HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, -}; -use crate::call_executor::{CallExecutor, LocalCallExecutor}; use executor::{RuntimeVersion, RuntimeInfo}; -use crate::notifications::{StorageNotifications, StorageEventStream}; -use crate::light::{call_executor::prove_execution, fetcher::ChangesProof}; -use crate::cht; -use crate::error; -use crate::in_mem; -use crate::block_builder::{self, api::BlockBuilder as BlockBuilderAPI}; -use crate::genesis; -use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; - -use log::{info, trace, warn}; +use consensus::{ + Error as ConsensusError, BlockImportParams, + ImportResult, BlockOrigin, ForkChoiceStrategy, + well_known_cache_keys::Id as CacheKeyId, + SelectChain, self, +}; +use crate::{ + runtime_api::{ + CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, + InitializeBlock, + }, + backend::{ + self, BlockImportOperation, PrunableStateChangesTrieStorage, + StorageCollection, ChildStorageCollection + }, + blockchain::{ + self, Info as ChainInfo, Backend as ChainBackend, + HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, + }, + call_executor::{CallExecutor, LocalCallExecutor}, + notifications::{StorageNotifications, StorageEventStream}, + light::{call_executor::prove_execution, fetcher::ChangesProof}, + block_builder::{self, api::BlockBuilder as BlockBuilderAPI}, + error::Error, + cht, error, in_mem, genesis +}; /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; @@ -260,6 +253,7 @@ impl PrePostHeader { pub fn new_in_mem( executor: E, genesis_storage: S, + keystore: Option, ) -> error::Result, LocalCallExecutor, E>, @@ -270,7 +264,7 @@ pub fn new_in_mem( S: BuildStorage, Block: BlockT, { - new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage) + new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage, keystore) } /// Create a client with the explicitly provided backend. @@ -279,6 +273,7 @@ pub fn new_with_backend( backend: Arc, executor: E, build_genesis_storage: S, + keystore: Option, ) -> error::Result, Block, RA>> where E: CodeExecutor + RuntimeInfo, @@ -286,10 +281,24 @@ pub fn new_with_backend( Block: BlockT, B: backend::LocalBackend { - let call_executor = LocalCallExecutor::new(backend.clone(), executor); + let call_executor = LocalCallExecutor::new(backend.clone(), executor, keystore); Client::new(backend, call_executor, build_genesis_storage, Default::default()) } +/// Figure out the block type for a given type (for now, just a `Client`). +pub trait BlockOf { + /// The type of the block. + type Type: BlockT; +} + +impl BlockOf for Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, +{ + type Type = Block; +} + impl Client where B: backend::Backend, E: CallExecutor, @@ -362,7 +371,8 @@ impl Client where pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result> { Ok(self.state_at(id)? .storage(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? - .map(StorageData)) + .map(StorageData) + ) } /// Given a `BlockId` and a key, return the value under the hash in that block. @@ -1414,6 +1424,8 @@ impl CallRuntimeAt for Client where context: ExecutionContext, recorder: &Option>>>, ) -> error::Result> { + let enable_keystore = context.enable_keystore(); + let manager = match context { ExecutionContext::BlockConstruction => self.execution_strategies.block_construction.get_manager(), @@ -1443,6 +1455,7 @@ impl CallRuntimeAt for Client where native_call, offchain_extensions.as_mut(), recorder, + enable_keystore, ) } diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index bc401c8cd9..a7700b7d9f 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -96,6 +96,7 @@ mod tests { &executor(), "Core_initialize_block", &header.encode(), + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -109,6 +110,7 @@ mod tests { &executor(), "BlockBuilder_apply_extrinsic", &tx.encode(), + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -122,6 +124,7 @@ mod tests { &executor(), "BlockBuilder_finalize_block", &[], + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -148,7 +151,7 @@ mod tests { #[test] fn construct_genesis_should_work_with_native() { let mut storage = GenesisConfig::new(false, - vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], + vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000, None, @@ -170,6 +173,7 @@ mod tests { &executor(), "Core_execute_block", &b1data, + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -178,7 +182,7 @@ mod tests { #[test] fn construct_genesis_should_work_with_wasm() { let mut storage = GenesisConfig::new(false, - vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], + vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000, None, @@ -200,6 +204,7 @@ mod tests { &executor(), "Core_execute_block", &b1data, + None, ).execute( ExecutionStrategy::AlwaysWasm, ).unwrap(); @@ -208,7 +213,7 @@ mod tests { #[test] fn construct_genesis_with_bad_transaction_should_panic() { let mut storage = GenesisConfig::new(false, - vec![Sr25519Keyring::One.into(), Sr25519Keyring::Two.into()], + vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 68, None, @@ -230,6 +235,7 @@ mod tests { &executor(), "Core_execute_block", &b1data, + None, ).execute( ExecutionStrategy::NativeElseWasm, ); diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index aa16e20cd8..ba5f316d0c 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -62,7 +62,8 @@ //! backend.clone(), //! LocalCallExecutor::new( //! backend.clone(), -//! NativeExecutor::::new(None) +//! NativeExecutor::::new(None), +//! None, //! ), //! // This parameter provides the storage for the chain genesis. //! <(StorageOverlay, ChildrenStorageOverlay)>::default(), @@ -114,7 +115,7 @@ pub use crate::client::{ new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, FinalityNotification, - LongestChain, + LongestChain, BlockOf, utils, }; #[cfg(feature = "std")] diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 9d8df1c541..2367aaf806 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -94,8 +94,8 @@ where call_data: &[u8], _strategy: ExecutionStrategy, _side_effects_handler: Option<&mut O>, - ) - -> ClientResult> { + ) -> ClientResult> + { let block_hash = self.blockchain.expect_block_hash_from_id(id)?; let block_header = self.blockchain.expect_header(id.clone())?; @@ -130,6 +130,7 @@ where _native_call: Option, side_effects_handler: Option<&mut O>, _recorder: &Option>>>, + _enable_keystore: bool, ) -> ClientResult> where ExecutionManager: Clone { let block_initialized = match initialize_block { InitializeBlock::Do(ref init_block) => { @@ -143,11 +144,23 @@ where return Err(ClientError::NotAvailableOnLightClient.into()); } - self.call(at, method, call_data, (&execution_manager).into(), side_effects_handler).map(NativeOrEncoded::Encoded) + self.call( + at, + method, + call_data, + (&execution_manager).into(), + side_effects_handler, + ).map(NativeOrEncoded::Encoded) } fn runtime_version(&self, id: &BlockId) -> ClientResult { - let call_result = self.call(id, "Core_version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; + let call_result = self.call( + id, + "Core_version", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new() + )?; RuntimeVersion::decode(&mut call_result.as_slice()) .map_err(|_| ClientError::VersionInvalid.into()) } @@ -270,6 +283,7 @@ impl CallExecutor for native_call: Option, side_effects_handler: Option<&mut O>, recorder: &Option>>>, + enable_keystore: bool, ) -> ClientResult> where ExecutionManager: Clone { // there's no actual way/need to specify native/wasm execution strategy on light node // => we can safely ignore passed values @@ -296,6 +310,7 @@ impl CallExecutor for native_call, side_effects_handler, recorder, + enable_keystore, ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), false => CallExecutor::contextual_call::< _, @@ -318,6 +333,7 @@ impl CallExecutor for native_call, side_effects_handler, recorder, + enable_keystore, ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), } } @@ -463,6 +479,7 @@ pub fn check_execution_proof( executor, "Core_initialize_block", &next_block.encode(), + None, )?; // execute method @@ -472,6 +489,7 @@ pub fn check_execution_proof( executor, &request.method, &request.call_data, + None, )?; Ok(local_result) diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index e80541a096..22d3e8fdb7 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -424,7 +424,6 @@ impl FetchChecker for LightDataChecker, body: Vec ) -> ClientResult> { - // TODO: #2621 let extrinsics_root = HashFor::::ordered_trie_root(body.iter().map(Encode::encode)); if *request.header.extrinsics_root() == extrinsics_root { diff --git a/core/client/src/light/mod.rs b/core/client/src/light/mod.rs index 69ba4d9f73..89d3c60ddc 100644 --- a/core/client/src/light/mod.rs +++ b/core/client/src/light/mod.rs @@ -73,7 +73,7 @@ pub fn new_light( E: CodeExecutor + RuntimeInfo, { let remote_executor = RemoteCallExecutor::new(backend.blockchain().clone(), fetcher); - let local_executor = LocalCallExecutor::new(backend.clone(), code_executor); + let local_executor = LocalCallExecutor::new(backend.clone(), code_executor, None); let executor = RemoteOrLocalCallExecutor::new(backend.clone(), remote_executor, local_executor); Client::new(backend, executor, genesis_storage, Default::default()) } diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 98f233b8f4..c27aa5df6d 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } primitives = { package = "substrate-primitives", path = "../../primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../../application-crypto" } runtime_support = { package = "srml-support", path = "../../../srml/support" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } @@ -17,12 +18,13 @@ inherents = { package = "substrate-inherents", path = "../../inherents" } srml-aura = { path = "../../../srml/aura" } client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } +substrate-keystore = { path = "../../keystore" } consensus_common = { package = "substrate-consensus-common", path = "../common" } sr-primitives = { path = "../../sr-primitives" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" [dev-dependencies] diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index ea8ffb4200..ac2c2c791b 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } substrate-client = { path = "../../../client", default-features = false } -primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../../application-crypto", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } sr-primitives = { path = "../../../sr-primitives", default-features = false } @@ -19,5 +19,5 @@ std = [ "codec/std", "sr-primitives/std", "substrate-client/std", - "primitives/std", + "app-crypto/std", ] diff --git a/core/consensus/aura/primitives/src/lib.rs b/core/consensus/aura/primitives/src/lib.rs index 1a0aa5583f..070eb6c6a9 100644 --- a/core/consensus/aura/primitives/src/lib.rs +++ b/core/consensus/aura/primitives/src/lib.rs @@ -23,6 +23,40 @@ use substrate_client::decl_runtime_apis; use rstd::vec::Vec; use sr_primitives::ConsensusEngineId; +mod app_sr25519 { + use app_crypto::{app_crypto, key_types::AURA, sr25519}; + app_crypto!(sr25519, AURA); +} + +pub mod sr25519 { + /// An Aura authority keypair using S/R 25519 as its crypto. + #[cfg(feature = "std")] + pub type AuthorityPair = super::app_sr25519::Pair; + + /// An Aura authority signature using S/R 25519 as its crypto. + pub type AuthoritySignature = super::app_sr25519::Signature; + + /// An Aura authority identifier using S/R 25519 as its crypto. + pub type AuthorityId = super::app_sr25519::Public; +} + +mod app_ed25519 { + use app_crypto::{app_crypto, key_types::AURA, ed25519}; + app_crypto!(ed25519, AURA); +} + +pub mod ed25519 { + /// An Aura authority keypair using Ed25519 as its crypto. + #[cfg(feature = "std")] + pub type AuthorityPair = super::app_ed25519::Pair; + + /// An Aura authority signature using Ed25519 as its crypto. + pub type AuthoritySignature = super::app_ed25519::Signature; + + /// An Aura authority identifier using Ed25519 as its crypto. + pub type AuthorityId = super::app_ed25519::Public; +} + /// The `ConsensusEngineId` of AuRa. pub const AURA_ENGINE_ID: ConsensusEngineId = [b'a', b'u', b'r', b'a']; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 15966c611d..ffce6dad32 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -44,12 +44,13 @@ use client::{ runtime_api::ApiExt, error::Result as CResult, backend::AuxStore, + BlockOf }; use sr_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; use sr_primitives::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; -use primitives::Pair; +use primitives::crypto::Pair; use inherents::{InherentDataProviders, InherentData}; use futures::{prelude::*, future}; @@ -141,7 +142,7 @@ pub fn start_aura( force_authoring: bool, ) -> Result, consensus_common::Error> where B: BlockT, - C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, + C: ProvideRuntimeApi + BlockOf + ProvideCache + AuxStore + Send + Sync, C::Api: AuraApi>, SC: SelectChain, E::Proposer: Proposer, @@ -188,7 +189,7 @@ struct AuraWorker { impl SlotWorker for AuraWorker where B: BlockT, - C: ProvideRuntimeApi + ProvideCache + Sync, + C: ProvideRuntimeApi + BlockOf + ProvideCache + Sync, C::Api: AuraApi>, E: Environment, E::Proposer: Proposer, @@ -397,7 +398,7 @@ fn check_header( DigestItemFor: CompatibleDigestItem

, P::Signature: Decode, C: client::backend::AuxStore, - P::Public: AsRef + Encode + Decode + PartialEq + Clone, + P::Public: Encode + Decode + PartialEq + Clone, { let seal = match header.digest_mut().pop() { Some(x) => x, @@ -507,11 +508,11 @@ impl AuraVerifier #[forbid(deprecated)] impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache, + C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache + BlockOf, C::Api: BlockBuilderApi + AuraApi>, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, - P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + AsRef + 'static, + P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + 'static, P::Signature: Encode + Decode, { fn verify( @@ -610,7 +611,7 @@ impl Verifier for AuraVerifier where fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where A: Codec, B: BlockT, - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + BlockOf + ProvideCache, C::Api: AuraApi, { // no cache => no initialization @@ -644,7 +645,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusErro fn authorities(client: &C, at: &BlockId) -> Result, ConsensusError> where A: Codec, B: BlockT, - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + BlockOf + ProvideCache, C::Api: AuraApi, { client @@ -685,11 +686,11 @@ pub fn import_queue( inherent_data_providers: InherentDataProviders, ) -> Result, consensus_common::Error> where B: BlockT, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, + C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore, C::Api: BlockBuilderApi + AuraApi>, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, - P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, + P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, P::Signature: Encode + Decode, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; @@ -721,9 +722,9 @@ mod tests { use parking_lot::Mutex; use tokio::runtime::current_thread; use keyring::sr25519::Keyring; - use primitives::sr25519; use client::{LongestChain, BlockchainEvents}; use test_client; + use aura_primitives::sr25519::AuthorityPair; type Error = client::error::Error; @@ -771,7 +772,7 @@ mod tests { impl TestNetFactory for AuraTestNet { type Specialization = DummySpecialization; - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -855,9 +856,9 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _>( + let aura = start_aura::<_, _, _, _, _, AuthorityPair, _, _, _>( slot_duration, - Arc::new(key.clone().into()), + Arc::new(key.clone().pair().into()), client.clone(), select_chain, client, @@ -885,9 +886,9 @@ mod tests { assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ - Keyring::Alice.into(), - Keyring::Bob.into(), - Keyring::Charlie.into() + Keyring::Alice.public().into(), + Keyring::Bob.public().into(), + Keyring::Charlie.public().into() ]); } } diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 8bcade8023..9e1fb6bd4b 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -9,24 +9,26 @@ edition = "2018" codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } babe_primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } primitives = { package = "substrate-primitives", path = "../../primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../../application-crypto" } num-bigint = "0.2" num-rational = "0.2" num-traits = "0.2" -runtime_support = { package = "srml-support", path = "../../../srml/support" } -runtime_version = { package = "sr-version", path = "../../sr-version" } -runtime_io = { package = "sr-io", path = "../../sr-io" } +runtime-support = { package = "srml-support", path = "../../../srml/support" } +runtime-version = { package = "sr-version", path = "../../sr-version" } +runtime-io = { package = "sr-io", path = "../../sr-io" } inherents = { package = "substrate-inherents", path = "../../inherents" } substrate-telemetry = { path = "../../telemetry" } +keystore = { package = "substrate-keystore", path = "../../keystore" } srml-babe = { path = "../../../srml/babe" } client = { package = "substrate-client", path = "../../client" } -consensus_common = { package = "substrate-consensus-common", path = "../common" } +consensus-common = { package = "substrate-consensus-common", path = "../common" } slots = { package = "substrate-consensus-slots", path = "../slots" } sr-primitives = { path = "../../sr-primitives" } fork-tree = { path = "../../utils/fork-tree" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4.6" schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"] } rand = "0.6.5" @@ -40,6 +42,7 @@ service = { package = "substrate-service", path = "../../service" } test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.18" env_logger = "0.6.1" +tempfile = "3.1" [features] test-helpers = [] diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 3948c9727c..5f7fbe4fd8 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" substrate-client = { path = "../../../client", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } sr-primitives = { path = "../../../sr-primitives", default-features = false } -primitives = { package = "substrate-primitives", path = "../../../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../../application-crypto", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"], optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } @@ -23,4 +23,5 @@ std = [ "codec/std", "schnorrkel", "slots", + "app-crypto/std", ] diff --git a/core/consensus/babe/primitives/src/digest.rs b/core/consensus/babe/primitives/src/digest.rs index 81effef5d6..3b6e3221bd 100644 --- a/core/consensus/babe/primitives/src/digest.rs +++ b/core/consensus/babe/primitives/src/digest.rs @@ -17,7 +17,7 @@ //! Private implementation details of BABE digests. #[cfg(feature = "std")] -use primitives::sr25519::Signature; +use super::AuthoritySignature; #[cfg(feature = "std")] use super::{BABE_ENGINE_ID, Epoch}; #[cfg(not(feature = "std"))] @@ -111,10 +111,10 @@ pub trait CompatibleDigestItem: Sized { fn as_babe_pre_digest(&self) -> Option; /// Construct a digest item which contains a BABE seal. - fn babe_seal(signature: Signature) -> Self; + fn babe_seal(signature: AuthoritySignature) -> Self; /// If this item is a BABE signature, return the signature. - fn as_babe_seal(&self) -> Option; + fn as_babe_seal(&self) -> Option; /// If this item is a BABE epoch, return it. fn as_babe_epoch(&self) -> Option; @@ -132,11 +132,11 @@ impl CompatibleDigestItem for DigestItem where self.try_to(OpaqueDigestItemId::PreRuntime(&BABE_ENGINE_ID)) } - fn babe_seal(signature: Signature) -> Self { + fn babe_seal(signature: AuthoritySignature) -> Self { DigestItem::Seal(BABE_ENGINE_ID, signature.encode()) } - fn as_babe_seal(&self) -> Option { + fn as_babe_seal(&self) -> Option { self.try_to(OpaqueDigestItemId::Seal(&BABE_ENGINE_ID)) } diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index f076c3ae2a..f4da908080 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -24,21 +24,28 @@ mod digest; use codec::{Encode, Decode}; use rstd::vec::Vec; use sr_primitives::ConsensusEngineId; -use primitives::sr25519; use substrate_client::decl_runtime_apis; #[cfg(feature = "std")] pub use digest::{BabePreDigest, CompatibleDigestItem}; pub use digest::{BABE_VRF_PREFIX, RawBabePreDigest}; +mod app { + use app_crypto::{app_crypto, key_types::BABE, sr25519}; + app_crypto!(sr25519, BABE); +} + /// A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in /// the main Babe module. If that ever changes, then this must, too. #[cfg(feature = "std")] -pub type AuthorityPair = sr25519::Pair; +pub type AuthorityPair = app::Pair; + +/// A Babe authority signature. +pub type AuthoritySignature = app::Signature; /// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in /// the main Babe module. If that ever changes, then this must, too. -pub type AuthorityId = sr25519::Public; +pub type AuthorityId = app::Public; /// The `ConsensusEngineId` of BABE. pub const BABE_ENGINE_ID: ConsensusEngineId = *b"BABE"; diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 722c63bb95..c8b9f25559 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -18,9 +18,11 @@ //! //! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. -#![forbid(unsafe_code, missing_docs, unused_must_use, unused_imports, unused_variables)] +#![forbid(unsafe_code, missing_docs)] pub use babe_primitives::*; pub use consensus_common::SyncOracle; +use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, pin::Pin, time::{Instant, Duration}}; +use babe_primitives; use consensus_common::ImportResult; use consensus_common::import_queue::{ BoxJustificationImport, BoxFinalityProofImport, @@ -31,11 +33,11 @@ use sr_primitives::traits::{ Block as BlockT, Header, DigestItemFor, NumberFor, ProvideRuntimeApi, SimpleBitOps, Zero, }; -use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, pin::Pin, time::{Instant, Duration}}; +use keystore::KeyStorePtr; use runtime_support::serde::{Serialize, Deserialize}; use codec::{Decode, Encode}; use parking_lot::{Mutex, MutexGuard}; -use primitives::{Blake2Hasher, H256, Pair, Public, sr25519}; +use primitives::{Blake2Hasher, H256, Pair, Public}; use merlin::Transcript; use inherents::{InherentDataProviders, InherentData}; use substrate_telemetry::{ @@ -63,12 +65,8 @@ use consensus_common::{SelectChain, well_known_cache_keys}; use consensus_common::import_queue::{Verifier, BasicQueue}; use client::{ block_builder::api::BlockBuilder as BlockBuilderApi, - blockchain::{self, HeaderBackend, ProvideCache}, - BlockchainEvents, - CallExecutor, Client, - runtime_api::ApiExt, - error::Result as ClientResult, - backend::{AuxStore, Backend}, + blockchain::{self, HeaderBackend, ProvideCache}, BlockchainEvents, CallExecutor, Client, + runtime_api::ApiExt, error::Result as ClientResult, backend::{AuxStore, Backend}, utils::is_descendent_of, }; use fork_tree::ForkTree; @@ -135,13 +133,12 @@ impl SlotCompatible for BabeLink { /// Parameters for BABE. pub struct BabeParams { - /// The configuration for BABE. Includes the slot duration, threshold, and /// other parameters. pub config: Config, - /// The key of the node we are running on. - pub local_key: Arc, + /// The keystore that manages the keys of the node. + pub keystore: KeyStorePtr, /// The client to use pub client: Arc, @@ -171,8 +168,8 @@ pub struct BabeParams { /// Start the babe worker. The returned future should be run in a tokio runtime. pub fn start_babe(BabeParams { config, - local_key, client, + keystore, select_chain, block_import, env, @@ -200,10 +197,10 @@ pub fn start_babe(BabeParams { client: client.clone(), block_import: Arc::new(Mutex::new(block_import)), env, - local_key, sync_oracle: sync_oracle.clone(), force_authoring, c: config.c(), + keystore, }; register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; Ok(slots::start_slot_worker( @@ -220,10 +217,10 @@ struct BabeWorker { client: Arc, block_import: Arc>, env: E, - local_key: Arc, sync_oracle: SO, force_authoring: bool, c: (u64, u64), + keystore: KeyStorePtr, } impl SlotWorker for BabeWorker where @@ -248,7 +245,6 @@ impl SlotWorker for BabeWorker w chain_head: B::Header, slot_info: SlotInfo, ) -> Self::OnSlot { - let pair = self.local_key.clone(); let ref client = self.client; let block_import = self.block_import.clone(); @@ -288,10 +284,10 @@ impl SlotWorker for BabeWorker w let proposal_work = if let Some(claim) = claim_slot( slot_info.number, epoch, - &pair, self.c, + &self.keystore, ) { - let ((inout, vrf_proof, _batchable_proof), authority_index) = claim; + let ((inout, vrf_proof, _batchable_proof), authority_index, key) = claim; debug!( target: "babe", "Starting authorship at slot {}; timestamp = {}", @@ -340,7 +336,7 @@ impl SlotWorker for BabeWorker w Delay::new(remaining_duration) .map_err(|err| consensus_common::Error::FaultyTimer(err).into()) ).map(|v| match v { - futures::future::Either::Left((v, _)) => v, + futures::future::Either::Left((v, _)) => v.map(|v| (v, key)), futures::future::Either::Right((Ok(_), _)) => Err(consensus_common::Error::ClientImport("Timeout in the BaBe proposer".into())), futures::future::Either::Right((Err(err), _)) => Err(err), @@ -349,7 +345,7 @@ impl SlotWorker for BabeWorker w return Box::pin(future::ready(Ok(()))); }; - Box::pin(proposal_work.map_ok(move |b| { + Box::pin(proposal_work.map_ok(move |(b, key)| { // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); @@ -372,7 +368,7 @@ impl SlotWorker for BabeWorker w // sign the pre-sealed hash of the block and then // add it to a digest item. let header_hash = header.hash(); - let signature = pair.sign(header_hash.as_ref()); + let signature = key.sign(header_hash.as_ref()); let signature_digest_item = DigestItemFor::::babe_seal(signature); let import_block = BlockImportParams:: { @@ -496,7 +492,7 @@ fn check_header( } else { let (pre_hash, author) = (header.hash(), &authorities[authority_index as usize].0); - if sr25519::Pair::verify(&sig, pre_hash, author.clone()) { + if AuthorityPair::verify(&sig, pre_hash, &author) { let (inout, _batchable_proof) = { let transcript = make_transcript( &randomness, @@ -769,8 +765,9 @@ fn register_babe_inherent_data_provider( } } -fn get_keypair(q: &sr25519::Pair) -> &Keypair { - q.as_ref() +fn get_keypair(q: &AuthorityPair) -> &Keypair { + use primitives::crypto::IsWrappedBy; + primitives::sr25519::Pair::from_ref(q).as_ref() } #[allow(deprecated)] @@ -823,11 +820,15 @@ fn calculate_threshold( fn claim_slot( slot_number: u64, Epoch { ref authorities, ref randomness, epoch_index, .. }: Epoch, - key: &sr25519::Pair, c: (u64, u64), -) -> Option<((VRFInOut, VRFProof, VRFProofBatchable), usize)> { - let public = &key.public(); - let authority_index = authorities.iter().position(|s| &s.0 == public)?; + keystore: &KeyStorePtr, +) -> Option<((VRFInOut, VRFProof, VRFProofBatchable), usize, AuthorityPair)> { + let keystore = keystore.read(); + let (key_pair, authority_index) = authorities.iter() + .enumerate() + .find_map(|(i, a)| { + keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) + })?; let transcript = make_transcript(randomness, slot_number, epoch_index); // Compute the threshold we will use. @@ -836,9 +837,9 @@ fn claim_slot( // be empty. Therefore, this division in `calculate_threshold` is safe. let threshold = calculate_threshold(c, authorities, authority_index); - get_keypair(key) + get_keypair(&key_pair) .vrf_sign_after_check(transcript, |inout| check(inout, threshold)) - .map(|s|(s, authority_index)) + .map(|s|(s, authority_index, key_pair)) } fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where @@ -1201,8 +1202,8 @@ pub mod test_helpers { client: &C, at: &BlockId, slot_number: u64, - key: &sr25519::Pair, c: (u64, u64), + keystore: &KeyStorePtr, ) -> Option where B: BlockT, C: ProvideRuntimeApi + ProvideCache, @@ -1213,9 +1214,9 @@ pub mod test_helpers { super::claim_slot( slot_number, epoch, - key, c, - ).map(|((inout, vrf_proof, _), authority_index)| { + keystore, + ).map(|((inout, vrf_proof, _), authority_index, _)| { BabePreDigest { vrf_proof, vrf_output: inout.to_output(), diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index a0e59e3e80..f1983a9962 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -20,7 +20,9 @@ // https://github.com/paritytech/substrate/issues/2532 #![allow(deprecated)] use super::*; +use super::generic::DigestItem; +use babe_primitives::AuthorityPair; use client::{LongestChain, block_builder::BlockBuilder}; use consensus_common::NoNetwork as DummyOracle; use network::test::*; @@ -29,7 +31,6 @@ use sr_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use tokio::runtime::current_thread; use keyring::sr25519::Keyring; -use super::generic::DigestItem; use client::BlockchainEvents; use test_client; use log::debug; @@ -183,15 +184,21 @@ fn run_one_test() { let net = BabeTestNet::new(3); let peers = &[ - (0, Keyring::Alice), - (1, Keyring::Bob), - (2, Keyring::Charlie), + (0, "//Alice"), + (1, "//Bob"), + (2, "//Charlie"), ]; let net = Arc::new(Mutex::new(net)); let mut import_notifications = Vec::new(); let mut runtime = current_thread::Runtime::new().unwrap(); - for (peer_id, key) in peers { + let mut keystore_paths = Vec::new(); + for (peer_id, seed) in peers { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + keystore.write().insert_ephemeral_from_seed::(seed).expect("Generates authority key"); + keystore_paths.push(keystore_path); + let client = net.lock().peer(*peer_id).client().as_full().unwrap(); let environ = DummyFactory(client.clone()); import_notifications.push( @@ -200,21 +207,18 @@ fn run_one_test() { .for_each(move |_| future::ready(())) ); - let config = Config::get_or_compute(&*client) - .expect("slot duration available"); + let config = Config::get_or_compute(&*client).expect("slot duration available"); let inherent_data_providers = InherentDataProviders::new(); register_babe_inherent_data_provider( &inherent_data_providers, config.get() ).expect("Registers babe inherent data provider"); - #[allow(deprecated)] let select_chain = LongestChain::new(client.backend().clone()); runtime.spawn(start_babe(BabeParams { config, - local_key: Arc::new(key.clone().into()), block_import: client.clone(), select_chain, client, @@ -223,6 +227,7 @@ fn run_one_test() { inherent_data_providers, force_authoring: false, time_source: Default::default(), + keystore, }).expect("Starts babe")); } @@ -230,7 +235,7 @@ fn run_one_test() { net.lock().poll(); Ok::<_, ()>(futures01::Async::NotReady::<()>) })); - + runtime.block_on(future::join_all(import_notifications) .map(|_| Ok::<(), ()>(())).compat()).unwrap(); } @@ -280,8 +285,8 @@ fn rejects_missing_consensus_digests() { #[test] fn wrong_consensus_engine_id_rejected() { let _ = env_logger::try_init(); - let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal([0; 4], sig.0.to_vec()); + let sig = AuthorityPair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal([0; 4], sig.to_vec()); assert!(bad_seal.as_babe_pre_digest().is_none()); assert!(bad_seal.as_babe_seal().is_none()) } @@ -296,8 +301,8 @@ fn malformed_pre_digest_rejected() { #[test] fn sig_is_not_pre_digest() { let _ = env_logger::try_init(); - let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.0.to_vec()); + let sig = AuthorityPair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.to_vec()); assert!(bad_seal.as_babe_pre_digest().is_none()); assert!(bad_seal.as_babe_seal().is_some()) } @@ -305,7 +310,11 @@ fn sig_is_not_pre_digest() { #[test] fn can_author_block() { let _ = env_logger::try_init(); - let (pair, _) = sr25519::Pair::generate(); + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + let pair = keystore.write().insert_ephemeral_from_seed::("//Alice") + .expect("Generates authority pair"); + let mut i = 0; let epoch = Epoch { start_slot: 0, @@ -315,10 +324,10 @@ fn can_author_block() { duration: 100, }; loop { - match claim_slot(i, epoch.clone(), &pair, (3, 10)) { + match claim_slot(i, epoch.clone(), (3, 10), &keystore) { None => i += 1, Some(s) => { - debug!(target: "babe", "Authored block {:?}", s); + debug!(target: "babe", "Authored block {:?}", s.0); break } } @@ -332,8 +341,8 @@ fn authorities_call_works() { assert_eq!(client.info().chain.best_number, 0); assert_eq!(epoch(&client, &BlockId::Number(0)).unwrap().authorities, vec![ - (Keyring::Alice.into(), 1), - (Keyring::Bob.into(), 1), - (Keyring::Charlie.into(), 1), + (Keyring::Alice.public().into(), 1), + (Keyring::Bob.public().into(), 1), + (Keyring::Charlie.public().into(), 1), ]); } diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index b327e9456a..29f30e363d 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -17,7 +17,7 @@ rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } sr-primitives = { path = "../../sr-primitives" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } -parking_lot = "0.8.0" +parking_lot = "0.9.0" [dev-dependencies] test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 3f6fef71a3..801605c3f6 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -19,7 +19,7 @@ sr-primitives = { path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" rhododendron = { version = "0.7.0", features = ["codec"] } exit-future = "0.1" diff --git a/core/consensus/rhd/src/misbehaviour_check.rs b/core/consensus/rhd/src/misbehaviour_check.rs index e40311c14f..bde3976c19 100644 --- a/core/consensus/rhd/src/misbehaviour_check.rs +++ b/core/consensus/rhd/src/misbehaviour_check.rs @@ -26,7 +26,7 @@ use runtime_io; fn check_message_sig( message: Message, signature: &Signature, - from: &AuthorityId + from: &AuthorityId, ) -> bool { let msg: Vec = message.encode(); runtime_io::ed25519_verify(&signature.0, &msg, from) diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 30e3eb654c..857d1e3a6b 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -14,7 +14,7 @@ consensus_common = { package = "substrate-consensus-common", path = "../common" inherents = { package = "substrate-inherents", path = "../../inherents" } futures-preview = "0.3.0-alpha.17" futures-timer = "0.2.1" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" [dev-dependencies] diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index c5b296b866..a4707fb89e 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -18,7 +18,7 @@ wasmi = "0.5.0" parity-wasm = "0.31" byteorder = "1.3" lazy_static = "1.3" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" libsecp256k1 = "0.2.1" tiny-keccak = "1.4.2" diff --git a/core/executor/runtime-test/src/lib.rs b/core/executor/runtime-test/src/lib.rs index 4c68d449f2..49612c271e 100644 --- a/core/executor/runtime-test/src/lib.rs +++ b/core/executor/runtime-test/src/lib.rs @@ -11,6 +11,7 @@ use runtime_io::{ set_storage, storage, clear_prefix, print, blake2_128, blake2_256, twox_128, twox_256, ed25519_verify, sr25519_verify, enumerated_trie_root }; +use primitives::{ed25519, sr25519}; macro_rules! impl_stubs { ( $( $new_name:ident => $invoke:expr, )* ) => { @@ -80,7 +81,7 @@ impl_stubs!( sig.copy_from_slice(&input[32..96]); let msg = b"all ok!"; - [ed25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() + [ed25519_verify(&ed25519::Signature(sig), &msg[..], &ed25519::Public(pubkey)) as u8].to_vec() }, test_sr25519_verify => |input: &[u8]| { let mut pubkey = [0; 32]; @@ -90,7 +91,7 @@ impl_stubs!( sig.copy_from_slice(&input[32..96]); let msg = b"all ok!"; - [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() + [sr25519_verify(&sr25519::Signature(sig), &msg[..], &sr25519::Public(pubkey)) as u8].to_vec() }, test_enumerated_trie_root => |_| { enumerated_trie_root::( diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 637390b2c7..2c69c8ba05 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -27,11 +27,10 @@ use wasmi::{ use state_machine::{Externalities, ChildStorageKey}; use crate::error::{Error, Result}; use codec::Encode; -use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; -use primitives::offchain; -use primitives::hexdisplay::HexDisplay; -use primitives::sandbox as sandbox_primitives; -use primitives::{H256, Blake2Hasher}; +use primitives::{ + blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair, crypto::KeyTypeId, + offchain, hexdisplay::HexDisplay, sandbox as sandbox_primitives, H256, Blake2Hasher, +}; use trie::{TrieConfiguration, trie_types::Layout}; use crate::sandbox; use crate::allocator; @@ -641,7 +640,30 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_keccak_256")?; Ok(()) }, - ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { + ext_ed25519_public_keys(id_data: *const u8, result_len: *mut u32) -> *mut u8 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_ed25519_public_keys")?; + let key_type = KeyTypeId(id); + + let keys = runtime_io::ed25519_public_keys(key_type).encode(); + + let len = keys.len() as u32; + let offset = this.heap.allocate(len)? as u32; + + this.memory.set(offset, keys.as_ref()) + .map_err(|_| "Invalid attempt to set memory in ext_ed25519_public_keys")?; + this.memory.write_primitive(result_len, len) + .map_err(|_| "Invalid attempt to write result_len in ext_ed25519_public_keys")?; + + Ok(offset) + }, + ext_ed25519_verify( + msg_data: *const u8, + msg_len: u32, + sig_data: *const u8, + pubkey_data: *const u8, + ) -> u32 => { let mut sig = [0u8; 64]; this.memory.get_into(sig_data, &mut sig[..]) .map_err(|_| "Invalid attempt to get signature in ext_ed25519_verify")?; @@ -657,7 +679,87 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 5 }) }, - ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { + ext_ed25519_generate(id_data: *const u8, seed: *const u8, seed_len: u32, out: *mut u8) => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_ed25519_generate")?; + let key_type = KeyTypeId(id); + + let seed = if seed_len == 0 { + None + } else { + Some( + this.memory.get(seed, seed_len as usize) + .map_err(|_| "Invalid attempt to get seed in ext_ed25519_generate")? + ) + }; + + let seed = seed.as_ref() + .map(|seed| + std::str::from_utf8(&seed) + .map_err(|_| "Seed not a valid utf8 string in ext_sr25119_generate") + ).transpose()?; + + let pubkey = runtime_io::ed25519_generate(key_type, seed); + + this.memory.set(out, pubkey.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_ed25519_generate".into()) + }, + ext_ed25519_sign( + id_data: *const u8, + pubkey_data: *const u8, + msg_data: *const u8, + msg_len: u32, + out: *mut u8, + ) -> u32 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_ed25519_sign")?; + let key_type = KeyTypeId(id); + + let mut pubkey = [0u8; 32]; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| "Invalid attempt to get pubkey in ext_ed25519_sign")?; + + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| "Invalid attempt to get message in ext_ed25519_sign")?; + + let signature = runtime_io::ed25519_sign(key_type, &ed25519::Public(pubkey), &msg); + + match signature { + Some(signature) => { + this.memory + .set(out, signature.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_ed25519_sign")?; + Ok(0) + }, + None => Ok(1), + } + }, + ext_sr25519_public_keys(id_data: *const u8, result_len: *mut u32) -> *mut u8 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_sr25519_public_keys")?; + let key_type = KeyTypeId(id); + + let keys = runtime_io::sr25519_public_keys(key_type).encode(); + + let len = keys.len() as u32; + let offset = this.heap.allocate(len)? as u32; + + this.memory.set(offset, keys.as_ref()) + .map_err(|_| "Invalid attempt to set memory in ext_sr25519_public_keys")?; + this.memory.write_primitive(result_len, len) + .map_err(|_| "Invalid attempt to write result_len in ext_sr25519_public_keys")?; + + Ok(offset) + }, + ext_sr25519_verify( + msg_data: *const u8, + msg_len: u32, + sig_data: *const u8, + pubkey_data: *const u8, + ) -> u32 => { let mut sig = [0u8; 64]; this.memory.get_into(sig_data, &mut sig[..]) .map_err(|_| "Invalid attempt to get signature in ext_sr25519_verify")?; @@ -673,6 +775,62 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 5 }) }, + ext_sr25519_generate(id_data: *const u8, seed: *const u8, seed_len: u32, out: *mut u8) => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_sr25519_generate")?; + let key_type = KeyTypeId(id); + let seed = if seed_len == 0 { + None + } else { + Some( + this.memory.get(seed, seed_len as usize) + .map_err(|_| "Invalid attempt to get seed in ext_sr25519_generate")? + ) + }; + + let seed = seed.as_ref() + .map(|seed| + std::str::from_utf8(&seed) + .map_err(|_| "Seed not a valid utf8 string in ext_sr25119_generate") + ) + .transpose()?; + + let pubkey = runtime_io::sr25519_generate(key_type, seed); + + this.memory.set(out, pubkey.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_sr25519_generate".into()) + }, + ext_sr25519_sign( + id_data: *const u8, + pubkey_data: *const u8, + msg_data: *const u8, + msg_len: u32, + out: *mut u8, + ) -> u32 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_sr25519_sign")?; + let key_type = KeyTypeId(id); + + let mut pubkey = [0u8; 32]; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| "Invalid attempt to get pubkey in ext_sr25519_sign")?; + + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| "Invalid attempt to get message in ext_sr25519_sign")?; + + let signature = runtime_io::sr25519_sign(key_type, &sr25519::Public(pubkey), &msg); + + match signature { + Some(signature) => { + this.memory.set(out, signature.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_sr25519_sign")?; + Ok(0) + }, + None => Ok(1), + } + }, ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32 => { let mut sig = [0u8; 65]; this.memory.get_into(sig_data, &mut sig[..]) @@ -711,50 +869,6 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(if res.is_ok() { 0 } else { 1 }) }, - ext_new_crypto_key(crypto: u32) -> u64 => { - let kind = offchain::CryptoKind::try_from(crypto) - .map_err(|_| "crypto kind OOB while ext_new_crypto_key: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.new_crypto_key(kind)) - .ok_or_else(|| "Calling unavailable API ext_new_crypto_key: wasm")?; - - match res { - Ok(key) => Ok(key.into()), - Err(()) => Ok(u64::max_value()), - } - }, - ext_encrypt( - key: u64, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8 => { - let key = offchain::CryptoKey::try_from(key) - .map_err(|_| "Key OOB while ext_encrypt: wasm")?; - let message = this.memory.get(data, data_len as usize) - .map_err(|_| "OOB while ext_encrypt: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.encrypt(key, &*message)) - .ok_or_else(|| "Calling unavailable API ext_encrypt: wasm")?; - - let (offset,len) = match res { - Ok(encrypted) => { - let len = encrypted.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &encrypted) - .map_err(|_| "Invalid attempt to set memory in ext_encrypt")?; - (offset, len) - }, - Err(()) => (0, u32::max_value()), - }; - - this.memory.write_primitive(msg_len, len) - .map_err(|_| "Invalid attempt to write msg_len in ext_encrypt")?; - - Ok(offset) - }, ext_network_state(written_out: *mut u32) -> *mut u8 => { let res = this.ext.offchain() .map(|api| api.network_state()) @@ -771,111 +885,6 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(offset) }, - ext_pubkey( - key: u64, - written_out: *mut u32 - ) -> *mut u8 => { - let key = offchain::CryptoKey::try_from(key) - .map_err(|_| "Key OOB while ext_decrypt: wasm")?; - let res = this.ext.offchain() - .map(|api| api.pubkey(key)) - .ok_or_else(|| "Calling unavailable API ext_authority_pubkey: wasm")?; - - let encoded = res.encode(); - let len = encoded.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &encoded) - .map_err(|_| "Invalid attempt to set memory in ext_authority_pubkey")?; - this.memory.write_primitive(written_out, len) - .map_err(|_| "Invalid attempt to write written_out in ext_authority_pubkey")?; - Ok(offset) - }, - ext_decrypt( - key: u64, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8 => { - let key = offchain::CryptoKey::try_from(key) - .map_err(|_| "Key OOB while ext_decrypt: wasm")?; - let message = this.memory.get(data, data_len as usize) - .map_err(|_| "OOB while ext_decrypt: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.decrypt(key, &*message)) - .ok_or_else(|| "Calling unavailable API ext_decrypt: wasm")?; - - let (offset,len) = match res { - Ok(decrypted) => { - let len = decrypted.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &decrypted) - .map_err(|_| "Invalid attempt to set memory in ext_decrypt")?; - (offset, len) - }, - Err(()) => (0, u32::max_value()), - }; - - this.memory.write_primitive(msg_len, len) - .map_err(|_| "Invalid attempt to write msg_len in ext_decrypt")?; - - Ok(offset) - }, - ext_sign( - key: u64, - data: *const u8, - data_len: u32, - sig_data_len: *mut u32 - ) -> *mut u8 => { - let key = offchain::CryptoKey::try_from(key) - .map_err(|_| "Key OOB while ext_sign: wasm")?; - let message = this.memory.get(data, data_len as usize) - .map_err(|_| "OOB while ext_sign: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.sign(key, &*message)) - .ok_or_else(|| "Calling unavailable API ext_sign: wasm")?; - - let (offset,len) = match res { - Ok(signature) => { - let len = signature.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &signature) - .map_err(|_| "Invalid attempt to set memory in ext_sign")?; - (offset, len) - }, - Err(()) => (0, u32::max_value()), - }; - - this.memory.write_primitive(sig_data_len, len) - .map_err(|_| "Invalid attempt to write sig_data_len in ext_sign")?; - - Ok(offset) - }, - ext_verify( - key: u64, - msg: *const u8, - msg_len: u32, - signature: *const u8, - signature_len: u32 - ) -> u32 => { - let key = offchain::CryptoKey::try_from(key) - .map_err(|_| "Key OOB while ext_verify: wasm")?; - let message = this.memory.get(msg, msg_len as usize) - .map_err(|_| "OOB while ext_verify: wasm")?; - let signature = this.memory.get(signature, signature_len as usize) - .map_err(|_| "OOB while ext_verify: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.verify(key, &*message, &*signature)) - .ok_or_else(|| "Calling unavailable API ext_verify: wasm")?; - - match res { - Ok(true) => Ok(0), - Ok(false) => Ok(1), - Err(()) => Ok(u32::max_value()), - } - }, ext_timestamp() -> u64 => { let timestamp = this.ext.offchain() .map(|api| api.timestamp()) diff --git a/core/executor/src/wasm_utils.rs b/core/executor/src/wasm_utils.rs index 47867f7b48..80ef376df5 100644 --- a/core/executor/src/wasm_utils.rs +++ b/core/executor/src/wasm_utils.rs @@ -217,9 +217,15 @@ macro_rules! dispatch_fn { /// Implements `wasmi::Externals` trait and `Resolver` for given struct. #[macro_export] macro_rules! impl_function_executor { - ( $objectname:ident : $structname:ty, - $( $name:ident ( $( $names:ident : $params:ty ),* ) $( -> $returns:ty )* => $body:tt , )* - => $($pre:tt)+ ) => ( + ( + $objectname:ident : $structname:ty, + $( + $name:ident + ( $( $names:ident : $params:ty ),* $(,)? ) + $( -> $returns:ty )? => { $( $body:tt )* }, + )* + => $( $pre:tt )+ + ) => ( impl $( $pre ) + $structname { #[allow(unused)] fn resolver() -> &'static dyn $crate::wasmi::ModuleImportResolver { @@ -230,7 +236,11 @@ macro_rules! impl_function_executor { name: &str, signature: &$crate::wasmi::Signature ) -> std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> { - resolve_fn!(signature, name, $( $name( $( $params ),* ) $( -> $returns )* => )*); + resolve_fn!( + signature, + name, + $( $name( $( $params ),* ) $( -> $returns )? => )* + ); Err($crate::wasmi::Error::Instantiation( format!("Export {} not found", name), @@ -249,7 +259,12 @@ macro_rules! impl_function_executor { ) -> std::result::Result, $crate::wasmi::Trap> { let $objectname = self; let mut args = args.as_ref().iter(); - dispatch_fn!(index, $objectname, args, $( $name( $( $names : $params ),* ) $( -> $returns )* => $body ),*); + dispatch_fn! { + index, + $objectname, + args, + $( $name( $( $names : $params ),* ) $( -> $returns )? => { $( $body )* } ),* + }; } } ); diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 04f9e7162c..71a0775cd7 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -9,7 +9,7 @@ fork-tree = { path = "../../core/utils/fork-tree" } futures = "0.1" futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" tokio-executor = "0.1.7" tokio-timer = "0.2.11" rand = "0.6" @@ -18,6 +18,7 @@ sr-primitives = { path = "../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } primitives = { package = "substrate-primitives", path = "../primitives" } substrate-telemetry = { path = "../telemetry" } +keystore = { package = "substrate-keystore", path = "../keystore" } serde_json = "1.0" client = { package = "substrate-client", path = "../client" } inherents = { package = "substrate-inherents", path = "../../core/inherents" } @@ -32,8 +33,10 @@ grandpa = { package = "finality-grandpa", version = "0.9.0", features = ["derive network = { package = "substrate-network", path = "../network", features = ["test-helpers"] } keyring = { package = "substrate-keyring", path = "../keyring" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client"} +babe_primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives" } env_logger = "0.6" tokio = "0.1.17" +tempfile = "3.1" [features] default = ["service-integration"] diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index 1c17639a2a..ecbaf2e1ec 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../client", default-features = false } -primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../application-crypto", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../sr-std", default-features = false } @@ -15,10 +15,10 @@ serde = { version = "1.0", optional = true, features = ["derive"] } [features] default = ["std"] std = [ - "primitives/std", "client/std", "codec/std", "sr-primitives/std", "rstd/std", "serde", + "app-crypto/std", ] diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 25f8b802ce..b92444e262 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -28,15 +28,20 @@ use sr_primitives::{ConsensusEngineId, traits::{DigestFor, NumberFor}}; use client::decl_runtime_apis; use rstd::vec::Vec; +mod app { + use app_crypto::{app_crypto, key_types::GRANDPA, ed25519}; + app_crypto!(ed25519, GRANDPA); +} + /// The grandpa crypto scheme defined via the keypair type. #[cfg(feature = "std")] -pub type AuthorityPair = primitives::ed25519::Pair; +pub type AuthorityPair = app::Pair; /// Identity of a Grandpa authority. -pub type AuthorityId = primitives::ed25519::Public; +pub type AuthorityId = app::Public; /// Signature for a Grandpa authority. -pub type AuthoritySignature = primitives::ed25519::Signature; +pub type AuthoritySignature = app::Signature; /// The `ConsensusEngineId` of GRANDPA. pub const GRANDPA_ENGINE_ID: ConsensusEngineId = *b"FRNK"; diff --git a/core/finality-grandpa/src/authorities.rs b/core/finality-grandpa/src/authorities.rs index 27b9c57073..9b83c9feb6 100644 --- a/core/finality-grandpa/src/authorities.rs +++ b/core/finality-grandpa/src/authorities.rs @@ -431,6 +431,7 @@ impl + Clone> PendingChange { #[cfg(test)] mod tests { use super::*; + use primitives::crypto::Public; fn static_is_descendent_of(value: bool) -> impl Fn(&A, &A) -> Result @@ -520,8 +521,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; - let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_slice(&[2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -585,8 +586,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; - let set_c = vec![(AuthorityId::from_raw([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; + let set_c = vec![(AuthorityId::from_slice(&[2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -651,7 +652,7 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), @@ -717,8 +718,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; - let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_slice(&[2; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index e51e23254c..5eb912c957 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -86,7 +86,7 @@ use sr_primitives::traits::{NumberFor, Block as BlockT, Zero}; use network::consensus_gossip::{self as network_gossip, MessageIntent, ValidatorContext}; use network::{config::Roles, PeerId}; use codec::{Encode, Decode}; -use crate::ed25519::Public as AuthorityId; +use fg_primitives::AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG}; use log::{trace, debug, warn}; @@ -1233,13 +1233,14 @@ mod tests { use super::environment::SharedVoterSetState; use network_gossip::Validator as GossipValidatorT; use network::test::Block; + use primitives::crypto::Public; // some random config (not really needed) fn config() -> crate::Config { crate::Config { gossip_duration: Duration::from_millis(10), justification_period: 256, - local_key: None, + keystore: None, name: None, } } @@ -1452,7 +1453,7 @@ mod tests { voter_set_state(), ); let set_id = 1; - let auth = AuthorityId::from_raw([1u8; 32]); + let auth = AuthorityId::from_slice(&[1u8; 32]); let peer = PeerId::random(); val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); @@ -1468,7 +1469,7 @@ mod tests { target_number: 10, }), signature: Default::default(), - id: AuthorityId::from_raw([2u8; 32]), + id: AuthorityId::from_slice(&[2u8; 32]), } }); @@ -1497,7 +1498,7 @@ mod tests { ); let set_id = 1; - let auth = AuthorityId::from_raw([1u8; 32]); + let auth = AuthorityId::from_slice(&[1u8; 32]); let peer = PeerId::random(); val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); @@ -1562,7 +1563,7 @@ mod tests { ); let set_id = 1; - let auth = AuthorityId::from_raw([1u8; 32]); + let auth = AuthorityId::from_slice(&[1u8; 32]); let peer = PeerId::random(); val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 607dba486d..2aa2618535 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -29,18 +29,18 @@ use std::sync::Arc; -use grandpa::{voter, voter_set::VoterSet}; -use grandpa::Message::{Prevote, Precommit, PrimaryPropose}; use futures::prelude::*; use futures::sync::{oneshot, mpsc}; +use grandpa::Message::{Prevote, Precommit, PrimaryPropose}; +use grandpa::{voter, voter_set::VoterSet}; use log::{debug, trace}; -use tokio_executor::Executor; -use codec::{Encode, Decode}; -use primitives::{ed25519, Pair}; -use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; -use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; +use codec::{Encode, Decode}; +use primitives::Pair; +use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; +use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; +use tokio_executor::Executor; use crate::{ CatchUp, Commit, CommunicationIn, CommunicationOut, CompactCommit, Error, @@ -50,7 +50,7 @@ use crate::environment::HasVoted; use gossip::{ GossipMessage, FullCatchUpMessage, FullCommitMessage, VoteOrPrecommitMessage, GossipValidator }; -use primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use fg_primitives::{AuthorityPair, AuthorityId, AuthoritySignature}; pub mod gossip; mod periodic; @@ -341,7 +341,7 @@ impl> NetworkBridge { round: Round, set_id: SetId, voters: Arc>, - local_key: Option>, + local_key: Option, has_voted: HasVoted, ) -> ( impl Stream,Error=Error>, @@ -354,8 +354,7 @@ impl> NetworkBridge { ); let locals = local_key.and_then(|pair| { - let public = pair.public(); - let id = AuthorityId(public.0); + let id = pair.public(); if voters.contains_key(&id) { Some((pair, id)) } else { @@ -633,9 +632,9 @@ pub(crate) fn check_message_sig( round: u64, set_id: u64, ) -> Result<(), ()> { - let as_public = AuthorityId::from_raw(id.0); + let as_public = id.clone(); let encoded_raw = localized_payload(round, set_id, message); - if ed25519::Pair::verify(signature, &encoded_raw, as_public) { + if AuthorityPair::verify(signature, &encoded_raw, &as_public) { Ok(()) } else { debug!(target: "afg", "Bad signature on message from {:?}", id); @@ -653,7 +652,7 @@ pub(crate) fn check_message_sig( struct OutgoingMessages> { round: u64, set_id: u64, - locals: Option<(Arc, AuthorityId)>, + locals: Option<(AuthorityPair, AuthorityId)>, sender: mpsc::UnboundedSender>, network: N, has_voted: HasVoted, diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index f1473e9863..70e9413cd9 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -133,7 +133,7 @@ fn config() -> crate::Config { crate::Config { gossip_duration: std::time::Duration::from_millis(10), justification_period: 256, - local_key: None, + keystore: None, name: None, } } @@ -204,7 +204,7 @@ fn make_test_network() -> ( fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(AuthorityId, u64)> { keys.iter() - .map(|key| AuthorityId(key.to_raw_public())) + .map(|key| key.clone().public().into()) .map(|id| (id, 1)) .collect() } @@ -242,7 +242,7 @@ fn good_commit_leads_to_relay() { for (i, key) in private.iter().enumerate() { precommits.push(precommit.clone()); - let signature = key.sign(&payload[..]); + let signature = fg_primitives::AuthoritySignature::from(key.sign(&payload[..])); auth_data.push((signature, public[i].0.clone())) } @@ -357,7 +357,7 @@ fn bad_commit_leads_to_report() { for (i, key) in private.iter().enumerate() { precommits.push(precommit.clone()); - let signature = key.sign(&payload[..]); + let signature = fg_primitives::AuthoritySignature::from(key.sign(&payload[..])); auth_data.push((signature, public[i].0.clone())) } diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 1949fd25a1..93b176a430 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -33,11 +33,11 @@ use grandpa::{ BlockNumberOps, Equivocation, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet, }; +use primitives::{Blake2Hasher, H256, Pair}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, One, Zero, }; -use primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use crate::{ @@ -478,7 +478,7 @@ where { type Timer = Box + Send>; type Id = AuthorityId; - type Signature = ed25519::Signature; + type Signature = AuthoritySignature; // regular round message streams type In = Box { + if local_key.as_ref().map(|k| k.public() == id).unwrap_or(false) { + HasVoted::Yes(id, vote) + } else { + HasVoted::No + } + }, + HasVoted::No => HasVoted::No, + }; let (incoming, outgoing) = self.network.round_communication( crate::communication::Round(round), crate::communication::SetId(self.set_id), self.voters.clone(), - local_key.cloned(), - self.voter_set_state.has_voted(), + local_key.clone(), + has_voted, ); // schedule incoming messages from the network to be held until @@ -523,7 +533,7 @@ where let outgoing = Box::new(outgoing.sink_map_err(Into::into)); voter::RoundData { - voter_id: self.config.local_key.as_ref().map(|pair| pair.public().clone()), + voter_id: local_key.map(|pair| pair.public()), prevote_timer: Box::new(prevote_timer.map_err(|e| Error::Timer(e).into())), precommit_timer: Box::new(precommit_timer.map_err(|e| Error::Timer(e).into())), incoming, @@ -532,12 +542,10 @@ where } fn proposed(&self, _round: u64, propose: PrimaryPropose) -> Result<(), Self::Error> { - let local_id = self.config.local_key.as_ref() - .map(|pair| pair.public().into()) - .filter(|id| self.voters.contains_key(&id)); + let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { - Some(id) => id, + Some(id) => id.public(), None => return Ok(()), }; @@ -571,12 +579,10 @@ where } fn prevoted(&self, _round: u64, prevote: Prevote) -> Result<(), Self::Error> { - let local_id = self.config.local_key.as_ref() - .map(|pair| pair.public().into()) - .filter(|id| self.voters.contains_key(&id)); + let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { - Some(id) => id, + Some(id) => id.public(), None => return Ok(()), }; @@ -613,12 +619,10 @@ where } fn precommitted(&self, _round: u64, precommit: Precommit) -> Result<(), Self::Error> { - let local_id = self.config.local_key.as_ref() - .map(|pair| pair.public().into()) - .filter(|id| self.voters.contains_key(&id)); + let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { - Some(id) => id, + Some(id) => id.public(), None => return Ok(()), }; diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index 830383ffca..6262ad74a7 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -582,6 +582,7 @@ pub(crate) mod tests { use test_client::client::{backend::NewBlockState}; use test_client::client::in_mem::Blockchain as InMemoryBlockchain; use super::*; + use primitives::crypto::Public; type FinalityProof = super::FinalityProof

; @@ -740,7 +741,7 @@ pub(crate) mod tests { let proof_of_4 = prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("authorities didn't change => ProveAuthorities won't be called"), ), 0, @@ -763,7 +764,7 @@ pub(crate) mod tests { let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("should return before calling ProveAuthorities"), ), 0, @@ -789,7 +790,7 @@ pub(crate) mod tests { let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("should return before calling ProveAuthorities"), ), 0, @@ -821,10 +822,12 @@ pub(crate) mod tests { &blockchain, &( |block_id| match block_id { - BlockId::Hash(h) if h == header(3).hash() => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), - BlockId::Number(3) => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), - BlockId::Number(4) => Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)]), - BlockId::Number(6) => Ok(vec![(AuthorityId::from_raw([6u8; 32]), 1u64)]), + BlockId::Hash(h) if h == header(3).hash() => Ok( + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)] + ), + BlockId::Number(3) => Ok(vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)]), + BlockId::Number(4) => Ok(vec![(AuthorityId::from_slice(&[4u8; 32]), 1u64)]), + BlockId::Number(6) => Ok(vec![(AuthorityId::from_slice(&[6u8; 32]), 1u64)]), _ => unreachable!("no other authorities should be fetched: {:?}", block_id), }, |block_id| match block_id { @@ -865,7 +868,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), vec![42], ).unwrap_err(); @@ -879,7 +882,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), Vec::::new().encode(), ).unwrap_err(); @@ -893,7 +896,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), vec![FinalityProofFragment { block: header(4).hash(), @@ -917,7 +920,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), vec![FinalityProofFragment { block: header(4).hash(), @@ -940,8 +943,8 @@ pub(crate) mod tests { let effects = do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], - &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)])), + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_slice(&[4u8; 32]), 1u64)])), vec![FinalityProofFragment { block: header(2).hash(), justification: TestJustification(true, vec![7]).encode(), @@ -959,7 +962,7 @@ pub(crate) mod tests { block: header(4).hash(), justification: TestJustification(true, vec![8]).encode(), new_set_id: 2, - new_authorities: vec![(AuthorityId::from_raw([4u8; 32]), 1u64)], + new_authorities: vec![(AuthorityId::from_slice(&[4u8; 32]), 1u64)], }); } @@ -976,7 +979,7 @@ pub(crate) mod tests { let proof_of_4 = prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("should return before calling ProveAuthorities"), ), 0, diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 0d04e964e2..a0df661f0c 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -55,17 +55,20 @@ use futures::prelude::*; use log::{debug, info, warn}; use futures::sync::mpsc; -use client::{BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError}; +use client::{ + BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError, +}; use client::blockchain::HeaderBackend; use codec::Encode; +use sr_primitives::generic::BlockId; use sr_primitives::traits::{ - NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, + NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi }; -use fg_primitives::GrandpaApi; +use fg_primitives::{GrandpaApi, AuthorityPair}; +use keystore::KeyStorePtr; use inherents::InherentDataProviders; -use sr_primitives::generic::BlockId; use consensus_common::SelectChain; -use primitives::{ed25519, H256, Pair, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; use serde_json; @@ -198,10 +201,10 @@ pub struct Config { /// at least every justification_period blocks. There are some other events which might cause /// justification generation. pub justification_period: u32, - /// The local signing key. - pub local_key: Option>, /// Some local identifier of the voter. pub name: Option, + /// The keystore that manages the keys of this node. + pub keystore: Option, } impl Config { @@ -396,11 +399,11 @@ where } fn global_communication, B, E, N, RA>( - local_key: Option<&Arc>, set_id: u64, voters: &Arc>, client: &Arc>, network: &NetworkBridge, + keystore: &Option, ) -> ( impl Stream< Item = CommunicationInH, @@ -417,10 +420,7 @@ fn global_communication, B, E, N, RA>( RA: Send + Sync, NumberFor: BlockNumberOps, { - - let is_voter = local_key - .map(|pair| voters.contains_key(&pair.public().into())) - .unwrap_or(false); + let is_voter = is_voter(voters, keystore).is_some(); // verification stream let (global_in, global_out) = network.global_communication( @@ -491,7 +491,7 @@ pub struct GrandpaParams, N, RA, SC, X> { /// block import worker that has already been instantiated with `block_import`. pub fn run_grandpa_voter, N, RA, SC, X>( grandpa_params: GrandpaParams, -) -> ::client::error::Result + Send + 'static> where +) -> client::error::Result + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, @@ -568,31 +568,6 @@ pub fn run_grandpa_voter, N, RA, SC, X>( voter_set_state: set_state.clone(), }); - initial_environment.update_voter_set_state(|voter_set_state| { - match voter_set_state { - VoterSetState::Live { current_round: HasVoted::Yes(id, _), completed_rounds } => { - let local_id = config.local_key.clone().map(|pair| pair.public()); - let has_voted = match local_id { - Some(local_id) => if *id == local_id { - // keep the previous votes - return Ok(None); - } else { - HasVoted::No - }, - _ => HasVoted::No, - }; - - // NOTE: only updated on disk when the voter first - // proposes/prevotes/precommits or completes a round. - Ok(Some(VoterSetState::Live { - current_round: has_voted, - completed_rounds: completed_rounds.clone(), - })) - }, - _ => Ok(None), - } - }).expect("operation inside closure cannot fail; qed"); - let initial_state = (initial_environment, voter_commands_rx.into_future()); let voter_work = future::loop_fn(initial_state, move |params| { let (env, voter_commands_rx) = params; @@ -611,20 +586,18 @@ pub fn run_grandpa_voter, N, RA, SC, X>( ); let global_comms = global_communication( - config.local_key.as_ref(), env.set_id, &env.voters, &client, &network, + &config.keystore, ); - let voters = (*env.voters).clone(); - let last_completed_round = completed_rounds.last(); Some(voter::Voter::new( env.clone(), - voters, + (*env.voters).clone(), global_comms, last_completed_round.number, last_completed_round.state.clone(), @@ -777,3 +750,17 @@ pub fn run_grandpa, N, RA, SC, X>( { run_grandpa_voter(grandpa_params) } + +/// Checks if this node is a voter in the given voter set. +/// +/// Returns the key pair of the node that is being used in the current voter set or `None`. +fn is_voter( + voters: &Arc>, + keystore: &Option, +) -> Option { + match keystore { + Some(keystore) => voters.voters().iter() + .find_map(|(p, _)| keystore.read().key_pair::(&p).ok()), + None => None, + } +} \ No newline at end of file diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 3fec523dcb..4dc934303c 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -538,7 +538,7 @@ fn on_post_finalization_error(error: ClientError, value_type: &str) -> Consensus pub mod tests { use super::*; use consensus_common::ForkChoiceStrategy; - use primitives::H256; + use primitives::{H256, crypto::Public}; use test_client::client::in_mem::Blockchain as InMemoryAuxStore; use test_client::runtime::{Block, Header}; use crate::tests::TestApi; @@ -637,7 +637,7 @@ pub mod tests { let client = test_client::new_light(); let mut import_data = LightImportData { last_finalized: Default::default(), - authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([1; 32]), 1)]), + authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_slice(&[1; 32]), 1)]), consensus_changes: ConsensusChanges::empty(), }; let block = BlockImportParams { @@ -688,7 +688,7 @@ pub mod tests { #[test] fn finality_proof_required_when_consensus_data_changes_and_no_justification_provided() { let mut cache = HashMap::new(); - cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_slice(&[2; 32])].encode()); assert_eq!(import_block(cache, None), ImportResult::Imported(ImportedAux { clear_justification_requests: false, needs_justification: false, @@ -701,7 +701,7 @@ pub mod tests { fn finality_proof_required_when_consensus_data_changes_and_incorrect_justification_provided() { let justification = TestJustification(false, Vec::new()).encode(); let mut cache = HashMap::new(); - cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_slice(&[2; 32])].encode()); assert_eq!( import_block(cache, Some(justification)), ImportResult::Imported(ImportedAux { @@ -717,7 +717,7 @@ pub mod tests { #[test] fn aux_data_updated_on_start() { let aux_store = InMemoryAuxStore::::new(); - let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_slice(&[1; 32]), 1)])); // when aux store is empty initially assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_none()); @@ -732,7 +732,7 @@ pub mod tests { #[test] fn aux_data_loaded_on_restart() { let aux_store = InMemoryAuxStore::::new(); - let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_slice(&[1; 32]), 1)])); // when aux store is non-empty initially let mut consensus_changes = ConsensusChanges::::empty(); @@ -741,7 +741,9 @@ pub mod tests { &[ ( LIGHT_AUTHORITY_SET_KEY, - LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([42; 32]), 2)]).encode().as_slice(), + LightAuthoritySet::genesis( + vec![(AuthorityId::from_slice(&[42; 32]), 2)] + ).encode().as_slice(), ), ( LIGHT_CONSENSUS_CHANGES_KEY, @@ -753,7 +755,7 @@ pub mod tests { // importer uses it on start let data = load_aux_import_data(Default::default(), &aux_store, api).unwrap(); - assert_eq!(data.authority_set.authorities(), vec![(AuthorityId::from_raw([42; 32]), 2)]); + assert_eq!(data.authority_set.authorities(), vec![(AuthorityId::from_slice(&[42; 32]), 2)]); assert_eq!(data.consensus_changes.pending_changes(), &[(42, Default::default())]); } } diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 1301a6656b..f347b678b6 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -185,11 +185,11 @@ pub fn run_grandpa_observer, N, RA, SC>( // start global communication stream for the current set let (global_in, _) = global_communication( - None, set_id, &voters, &client, &network, + &config.keystore, ); let last_finalized_number = client.info().chain.finalized_number; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 38a5dd5441..8b0cc3bc0c 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -37,7 +37,7 @@ use std::result; use codec::Decode; use sr_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; use sr_primitives::generic::BlockId; -use primitives::{NativeOrEncoded, ExecutionContext}; +use primitives::{NativeOrEncoded, ExecutionContext, crypto::Public}; use fg_primitives::AuthorityId; use authorities::AuthoritySet; @@ -273,7 +273,7 @@ impl GrandpaApi for RuntimeApi { _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { + ) -> Result>> { Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } @@ -342,11 +342,17 @@ impl AuthoritySetForFinalityChecker for TestApi { const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); -fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(primitives::ed25519::Public, u64)> { - keys.iter() - .map(|key| AuthorityId::from_raw(key.to_raw_public())) - .map(|id| (id, 1)) - .collect() +fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(AuthorityId, u64)> { + keys.iter().map(|key| key.clone().public().into()).map(|id| (id, 1)).collect() +} + +fn create_keystore(authority: Ed25519Keyring) -> (KeyStorePtr, tempfile::TempDir) { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + keystore.write().insert_ephemeral_from_seed::(&authority.to_seed()) + .expect("Creates authority key"); + + (keystore, keystore_path) } // run the voters to completion. provide a closure to be invoked after @@ -370,7 +376,11 @@ fn run_to_completion_with( wait_for.push(f); }; + let mut keystore_paths = Vec::new(); for (peer_id, key) in peers.iter().enumerate() { + let (keystore, keystore_path) = create_keystore(*key); + keystore_paths.push(keystore_path); + let highest_finalized = highest_finalized.clone(); let (client, net_service, link) = { let net = net.lock(); @@ -405,7 +415,7 @@ fn run_to_completion_with( config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: Some(Arc::new(key.clone().into())), + keystore: Some(keystore), name: Some(format!("peer#{}", peer_id)), }, link: link, @@ -462,8 +472,10 @@ fn finalize_3_voters_no_observers() { run_to_completion(&mut runtime, 20, net.clone(), peers); // normally there's no justification for finalized blocks - assert!(net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), - "Extra justification for block#1"); + assert!( + net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), + "Extra justification for block#1", + ); } #[test] @@ -482,8 +494,10 @@ fn finalize_3_voters_1_full_observer() { let all_peers = peers.iter() .cloned() - .map(|key| Some(Arc::new(key.into()))) - .chain(::std::iter::once(None)); + .map(Some) + .chain(std::iter::once(None)); + + let mut keystore_paths = Vec::new(); for (peer_id, local_key) in all_peers.enumerate() { let (client, net_service, link) = { @@ -502,11 +516,19 @@ fn finalize_3_voters_1_full_observer() { .for_each(move |_| Ok(())) ); + let keystore = if let Some(local_key) = local_key { + let (keystore, keystore_path) = create_keystore(local_key); + keystore_paths.push(keystore_path); + Some(keystore) + } else { + None + }; + let grandpa_params = GrandpaParams { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key, + keystore, name: Some(format!("peer#{}", peer_id)), }, link: link, @@ -521,7 +543,7 @@ fn finalize_3_voters_1_full_observer() { } // wait for all finalized on each. - let wait_for = ::futures::future::join_all(finality_notifications) + let wait_for = futures::future::join_all(finality_notifications) .map(|_| ()) .map_err(|_| ()); @@ -640,10 +662,13 @@ fn transition_3_voters_twice_1_full_observer() { .cloned() .collect::>() // deduplicate .into_iter() - .map(|key| Some(Arc::new(key.into()))) .enumerate(); + let mut keystore_paths = Vec::new(); for (peer_id, local_key) in all_peers { + let (keystore, keystore_path) = create_keystore(local_key); + keystore_paths.push(keystore_path); + let (client, net_service, link) = { let net = net.lock(); let link = net.peers[peer_id].data.lock().take().expect("link initialized at startup; qed"); @@ -674,7 +699,7 @@ fn transition_3_voters_twice_1_full_observer() { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key, + keystore: Some(keystore), name: Some(format!("peer#{}", peer_id)), }, link: link, @@ -704,7 +729,7 @@ fn justification_is_emitted_when_consensus_data_changes() { let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change - let new_authorities = vec![primitives::sr25519::Public::from_raw([42; 32])]; + let new_authorities = vec![babe_primitives::AuthorityId::from_slice(&[42; 32])]; net.peer(0).push_authorities_change_block(new_authorities); net.block_until_sync(&mut runtime); let net = Arc::new(Mutex::new(net)); @@ -1080,6 +1105,8 @@ fn voter_persists_its_votes() { let (voter_tx, voter_rx) = mpsc::unbounded::<()>(); + let mut keystore_paths = Vec::new(); + // startup a grandpa voter for alice but also listen for messages on a // channel. whenever a message is received the voter is restarted. when the // sender is dropped the voter is stopped. @@ -1087,6 +1114,9 @@ fn voter_persists_its_votes() { let net = net.clone(); let client = client.clone(); + let (keystore, keystore_path) = create_keystore(peers[0]); + keystore_paths.push(keystore_path); + let voter = future::loop_fn(voter_rx, move |rx| { let (_block_import, _, _, _, link) = net.lock().make_block_import(client.clone()); let link = link.lock().take().unwrap(); @@ -1095,10 +1125,10 @@ fn voter_persists_its_votes() { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: Some(Arc::new(peers[0].clone().into())), + keystore: Some(keystore.clone()), name: Some(format!("peer#{}", 0)), }, - link: link, + link, network: net.lock().peers[0].network_service().clone(), inherent_data_providers: InherentDataProviders::new(), on_exit: Exit, @@ -1144,10 +1174,13 @@ fn voter_persists_its_votes() { // voter. instead we'll listen for the prevote that alice casts // and cast our own manually { + let (keystore, keystore_path) = create_keystore(peers[1]); + keystore_paths.push(keystore_path); + let config = Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: Some(Arc::new(peers[1].clone().into())), + keystore: Some(keystore), name: Some(format!("peer#{}", 1)), }; @@ -1170,7 +1203,7 @@ fn voter_persists_its_votes() { communication::Round(1), communication::SetId(0), Arc::new(VoterSet::from_iter(voters)), - Some(config.local_key.unwrap()), + Some(peers[1].pair().into()), HasVoted::No, ); @@ -1296,7 +1329,7 @@ fn finalize_3_voters_1_light_observer() { Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: None, + keystore: None, name: Some("observer".to_string()), }, link, @@ -1320,7 +1353,7 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { // import block#1 WITH consensus data change. Light client ignores justification // && instead fetches finality proof for block #1 - net.peer(0).push_authorities_change_block(vec![primitives::sr25519::Public::from_raw([42; 32])]); + net.peer(0).push_authorities_change_block(vec![babe_primitives::AuthorityId::from_slice(&[42; 32])]); let net = Arc::new(Mutex::new(net)); run_to_completion(&mut runtime, 1, net.clone(), peers); net.lock().block_until_sync(&mut runtime); @@ -1383,7 +1416,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // normally it will reach light client, but because of the forced change, it will not net.lock().peer(0).push_blocks(8, false); // best is #9 net.lock().peer(0).push_authorities_change_block( - vec![primitives::sr25519::Public::from_raw([42; 32])] + vec![babe_primitives::AuthorityId::from_slice(&[42; 32])] ); // #10 net.lock().peer(0).push_blocks(1, false); // best is #11 net.lock().block_until_sync(&mut runtime); @@ -1417,15 +1450,15 @@ fn voter_catches_up_to_latest_round_when_behind() { let net = Arc::new(Mutex::new(net)); let mut finality_notifications = Vec::new(); - let voter = |local_key, peer_id, link, net: Arc>| -> Box + Send> { + let voter = |keystore, peer_id, link, net: Arc>| -> Box + Send> { let grandpa_params = GrandpaParams { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key, + keystore, name: Some(format!("peer#{}", peer_id)), }, - link: link, + link, network: net.lock().peer(peer_id).network_service().clone(), inherent_data_providers: InherentDataProviders::new(), on_exit: Exit, @@ -1435,6 +1468,8 @@ fn voter_catches_up_to_latest_round_when_behind() { Box::new(run_grandpa_voter(grandpa_params).expect("all in order with client and network")) }; + let mut keystore_paths = Vec::new(); + // spawn authorities for (peer_id, key) in peers.iter().enumerate() { let (client, link) = { @@ -1453,7 +1488,10 @@ fn voter_catches_up_to_latest_round_when_behind() { .for_each(move |_| Ok(())) ); - let voter = voter(Some(Arc::new((*key).into())), peer_id, link, net.clone()); + let (keystore, keystore_path) = create_keystore(*key); + keystore_paths.push(keystore_path); + + let voter = voter(Some(keystore), peer_id, link, net.clone()); runtime.spawn(voter); } diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index f89288578a..45e0b9e828 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = { version = "0.8.0", optional = true } +parking_lot = { version = "0.9.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../sr-primitives", default-features = false } diff --git a/core/keyring/src/ed25519.rs b/core/keyring/src/ed25519.rs index a66cc73b56..56bdb1ce8c 100644 --- a/core/keyring/src/ed25519.rs +++ b/core/keyring/src/ed25519.rs @@ -36,18 +36,7 @@ pub enum Keyring { impl Keyring { pub fn from_public(who: &Public) -> Option { - [ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, - Keyring::One, - Keyring::Two, - ].iter() - .map(|i| *i) - .find(|&k| &Public::from(k) == who) + Self::iter().find(|&k| &Public::from(k) == who) } pub fn from_raw_public(who: [u8; 32]) -> Option { @@ -83,6 +72,14 @@ impl Keyring { pub fn iter() -> impl Iterator { ::iter() } + + pub fn public(self) -> Public { + self.pair().public() + } + + pub fn to_seed(self) -> String { + format!("//{}", self) + } } impl From for &'static str { @@ -172,8 +169,26 @@ mod tests { #[test] fn should_work() { - assert!(Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Bob!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Bob)); + assert!( + Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Bob!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Bob.public(), + ) + ); } } diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index aefdc05fa7..bb3aaa6b51 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -37,18 +37,7 @@ pub enum Keyring { impl Keyring { pub fn from_public(who: &Public) -> Option { - [ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, - Keyring::One, - Keyring::Two, - ].iter() - .map(|i| *i) - .find(|&k| &Public::from(k) == who) + Self::iter().find(|&k| &Public::from(k) == who) } pub fn from_raw_public(who: [u8; 32]) -> Option { @@ -84,6 +73,14 @@ impl Keyring { pub fn iter() -> impl Iterator { ::iter() } + + pub fn public(self) -> Public { + self.pair().public() + } + + pub fn to_seed(self) -> String { + format!("//{}", self) + } } impl From for &'static str { @@ -109,16 +106,7 @@ impl From for sr_primitives::MultiSigner { lazy_static! { static ref PRIVATE_KEYS: HashMap = { - [ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, - Keyring::One, - Keyring::Two, - ].iter().map(|&i| (i, i.pair())).collect() + Keyring::iter().map(|i| (i, i.pair())).collect() }; static ref PUBLIC_KEYS: HashMap = { @@ -182,8 +170,26 @@ mod tests { #[test] fn should_work() { - assert!(Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Bob!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Bob)); + assert!( + Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Bob!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Bob.public(), + ) + ); } } diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 00a653c114..c56b9ba67d 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -5,12 +5,14 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -derive_more = "0.14.0" +derive_more = "0.15.0" primitives = { package = "substrate-primitives", path = "../primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto" } hex = "0.3" rand = "0.6" serde_json = "1.0" subtle = "2.0" +parking_lot = "0.9.0" [dev-dependencies] tempdir = "0.3" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 89cfca559c..5a6df04b77 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -18,12 +18,18 @@ #![warn(missing_docs)] -use std::collections::HashMap; -use std::path::PathBuf; -use std::fs::{self, File}; -use std::io::{self, Write}; +use std::{collections::HashMap, path::PathBuf, fs::{self, File}, io::{self, Write}, sync::Arc}; -use primitives::crypto::{KeyTypeId, Pair, Public}; +use primitives::{ + crypto::{KeyTypeId, Pair as PairT, Public, IsWrappedBy, Protected}, traits::BareCryptoStore, +}; + +use app_crypto::{AppKey, AppPublic, AppPair, ed25519, sr25519}; + +use parking_lot::RwLock; + +/// Keystore pointer +pub type KeyStorePtr = Arc>; /// Keystore error. #[derive(Debug, derive_more::Display, derive_more::From)] @@ -41,6 +47,9 @@ pub enum Error { /// Invalid seed #[display(fmt="Invalid seed")] InvalidSeed, + /// Keystore unavailable + #[display(fmt="Keystore unavailable")] + Unavailable, } /// Keystore Result @@ -57,80 +66,159 @@ impl std::error::Error for Error { } /// Key store. +/// +/// Stores key pairs in a file system store + short lived key pairs in memory. +/// +/// Every pair that is being generated by a `seed`, will be placed in memory. pub struct Store { path: PathBuf, additional: HashMap<(KeyTypeId, Vec), Vec>, + password: Option>, } impl Store { - /// Create a new store at the given path. - pub fn open(path: PathBuf) -> Result { + /// Open the store at the given path. + /// + /// Optionally takes a password that will be used to encrypt/decrypt the keys. + pub fn open>(path: T, password: Option>) -> Result { + let path = path.into(); fs::create_dir_all(&path)?; - Ok(Store { path, additional: HashMap::new() }) + + let instance = Self { path, additional: HashMap::new(), password }; + Ok(Arc::new(RwLock::new(instance))) } - fn get_pair(&self, public: &TPair::Public) -> Result> { - let key = (TPair::KEY_TYPE, public.to_raw_vec()); - if let Some(bytes) = self.additional.get(&key) { - let pair = TPair::from_seed_slice(bytes) - .map_err(|_| Error::InvalidSeed)?; - return Ok(Some(pair)); - } - Ok(None) + /// Get the public/private key pair for the given public key and key type. + fn get_additional_pair( + &self, + public: &Pair::Public, + key_type: KeyTypeId, + ) -> Result> { + let key = (key_type, public.to_raw_vec()); + self.additional + .get(&key) + .map(|bytes| Pair::from_seed_slice(bytes).map_err(|_| Error::InvalidSeed)) + .transpose() } - fn insert_pair(&mut self, pair: &TPair) { - let key = (TPair::KEY_TYPE, pair.public().to_raw_vec()); + /// Insert the given public/private key pair with the given key type. + /// + /// Does not place it into the file system store. + fn insert_ephemeral_pair(&mut self, pair: &Pair, key_type: KeyTypeId) { + let key = (key_type, pair.public().to_raw_vec()); self.additional.insert(key, pair.to_raw_vec()); } - /// Generate a new key, placing it into the store. - pub fn generate(&self, password: &str) -> Result { - let (pair, phrase, _) = TPair::generate_with_phrase(Some(password)); - let mut file = File::create(self.key_file_path::(&pair.public()))?; - ::serde_json::to_writer(&file, &phrase)?; + /// Insert a new key with anonymous crypto. + /// + /// Places it into the file system store. + fn insert_unknown(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<()> { + let mut file = File::create(self.key_file_path(public, key_type)).map_err(Error::Io)?; + serde_json::to_writer(&file, &suri).map_err(Error::Json)?; + file.flush().map_err(Error::Io)?; + Ok(()) + } + + /// Insert a new key. + /// + /// Places it into the file system store. + pub fn insert_by_type(&self, key_type: KeyTypeId, suri: &str) -> Result { + let pair = Pair::from_string( + suri, + self.password.as_ref().map(|p| &***p) + ).map_err(|_| Error::InvalidSeed)?; + self.insert_unknown(key_type, suri, pair.public().as_slice()) + .map_err(|_| Error::Unavailable)?; + Ok(pair) + } + + /// Insert a new key. + /// + /// Places it into the file system store. + pub fn insert(&self, suri: &str) -> Result { + self.insert_by_type::(Pair::ID, suri).map(Into::into) + } + + /// Generate a new key. + /// + /// Places it into the file system store. + pub fn generate_by_type(&self, key_type: KeyTypeId) -> Result { + let (pair, phrase, _) = Pair::generate_with_phrase(self.password.as_ref().map(|p| &***p)); + let mut file = File::create(self.key_file_path(pair.public().as_slice(), key_type))?; + serde_json::to_writer(&file, &phrase)?; file.flush()?; Ok(pair) } - /// Create a new key from seed. Do not place it into the store. - pub fn generate_from_seed(&mut self, seed: &str) -> Result { - let pair = TPair::from_string(seed, None) - .ok().ok_or(Error::InvalidSeed)?; - self.insert_pair(&pair); + /// Generate a new key. + /// + /// Places it into the file system store. + pub fn generate(&self) -> Result { + self.generate_by_type::(Pair::ID).map(Into::into) + } + + /// Create a new key from seed. + /// + /// Does not place it into the file system store. + pub fn insert_ephemeral_from_seed_by_type( + &mut self, + seed: &str, + key_type: KeyTypeId, + ) -> Result { + let pair = Pair::from_string(seed, None).map_err(|_| Error::InvalidSeed)?; + self.insert_ephemeral_pair(&pair, key_type); Ok(pair) } - /// Load a key file with given public key. - pub fn load(&self, public: &TPair::Public, password: &str) -> Result { - if let Some(pair) = self.get_pair(public)? { + /// Create a new key from seed. + /// + /// Does not place it into the file system store. + pub fn insert_ephemeral_from_seed(&mut self, seed: &str) -> Result { + self.insert_ephemeral_from_seed_by_type::(seed, Pair::ID).map(Into::into) + } + + /// Get a key pair for the given public key and key type. + pub fn key_pair_by_type(&self, + public: &Pair::Public, + key_type: KeyTypeId, + ) -> Result { + if let Some(pair) = self.get_additional_pair(public, key_type)? { return Ok(pair) } - let path = self.key_file_path::(public); + let path = self.key_file_path(public.as_slice(), key_type); let file = File::open(path)?; - let phrase: String = ::serde_json::from_reader(&file)?; - let (pair, _) = TPair::from_phrase(&phrase, Some(password)) - .ok().ok_or(Error::InvalidPhrase)?; - if &pair.public() != public { - return Err(Error::InvalidPassword); + let phrase: String = serde_json::from_reader(&file)?; + let pair = Pair::from_phrase( + &phrase, + self.password.as_ref().map(|p| &***p), + ).map_err(|_| Error::InvalidPhrase)?.0; + + if &pair.public() == public { + Ok(pair) + } else { + Err(Error::InvalidPassword) } - Ok(pair) } - /// Get public keys of all stored keys. - pub fn contents(&self) -> Result> { + /// Get a key pair for the given public key. + pub fn key_pair(&self, public: &::Public) -> Result { + self.key_pair_by_type::(IsWrappedBy::from_ref(public), Pair::ID).map(Into::into) + } + + /// Get public keys of all stored keys that match the given key type. + pub fn public_keys_by_type(&self, key_type: KeyTypeId) -> Result> { let mut public_keys: Vec = self.additional.keys() .filter_map(|(ty, public)| { - if *ty != TPublic::KEY_TYPE { - return None + if *ty == key_type { + Some(TPublic::from_slice(public)) + } else { + None } - Some(TPublic::from_slice(public)) }) .collect(); - let key_type: [u8; 4] = TPublic::KEY_TYPE.to_le_bytes(); for entry in fs::read_dir(&self.path)? { let entry = entry?; let path = entry.path(); @@ -139,7 +227,7 @@ impl Store { if let Some(name) = path.file_name().and_then(|n| n.to_str()) { match hex::decode(name) { Ok(ref hex) => { - if hex[0..4] != key_type { continue } + if &hex[0..4] != &key_type.0 { continue } let public = TPublic::from_slice(&hex[4..]); public_keys.push(public); } @@ -151,48 +239,165 @@ impl Store { Ok(public_keys) } - fn key_file_path(&self, public: &TPair::Public) -> PathBuf { + /// Get public keys of all stored keys that match the key type. + /// + /// This will just use the type of the public key (a list of which to be returned) in order + /// to determine the key type. Unless you use a specialised application-type public key, then + /// this only give you keys registered under generic cryptography, and will not return keys + /// registered under the application type. + pub fn public_keys(&self) -> Result> { + self.public_keys_by_type::(Public::ID) + .map(|v| v.into_iter().map(Into::into).collect()) + } + + /// Returns the file path for the given public key and key type. + fn key_file_path(&self, public: &[u8], key_type: KeyTypeId) -> PathBuf { let mut buf = self.path.clone(); - let bytes: [u8; 4] = TPair::KEY_TYPE.to_le_bytes(); - let key_type = hex::encode(bytes); - let key = hex::encode(public.as_slice()); + let key_type = hex::encode(key_type.0); + let key = hex::encode(public); buf.push(key_type + key.as_str()); buf } } +impl BareCryptoStore for Store { + fn sr25519_public_keys(&self, key_type: KeyTypeId) -> Vec { + self.public_keys_by_type::(key_type).unwrap_or_default() + } + + fn sr25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> std::result::Result { + let pair = match seed { + Some(seed) => self.insert_ephemeral_from_seed_by_type::(seed, id), + None => self.generate_by_type::(id), + }.map_err(|e| e.to_string())?; + + Ok(pair.public()) + } + + fn sr25519_key_pair(&self, id: KeyTypeId, pub_key: &sr25519::Public) -> Option { + self.key_pair_by_type::(pub_key, id).ok() + } + + fn ed25519_public_keys(&self, key_type: KeyTypeId) -> Vec { + self.public_keys_by_type::(key_type).unwrap_or_default() + } + + fn ed25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> std::result::Result { + let pair = match seed { + Some(seed) => self.insert_ephemeral_from_seed_by_type::(seed, id), + None => self.generate_by_type::(id), + }.map_err(|e| e.to_string())?; + + Ok(pair.public()) + } + + fn ed25519_key_pair(&self, id: KeyTypeId, pub_key: &ed25519::Public) -> Option { + self.key_pair_by_type::(pub_key, id).ok() + } + + fn insert_unknown(&mut self, key_type: KeyTypeId, suri: &str, public: &[u8]) + -> std::result::Result<(), ()> + { + Store::insert_unknown(self, key_type, suri, public).map_err(|_| ()) + } + + fn password(&self) -> Option<&str> { + self.password.as_ref().map(|x| x.as_str()) + } +} + #[cfg(test)] mod tests { use super::*; use tempdir::TempDir; - use primitives::ed25519; use primitives::crypto::Ss58Codec; #[test] fn basic_store() { let temp_dir = TempDir::new("keystore").unwrap(); - let store = Store::open(temp_dir.path().to_owned()).unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); - assert!(store.contents::().unwrap().is_empty()); + assert!(store.read().public_keys::().unwrap().is_empty()); - let key: ed25519::Pair = store.generate("thepassword").unwrap(); - let key2: ed25519::Pair = store.load(&key.public(), "thepassword").unwrap(); - - assert!(store.load::(&key.public(), "notthepassword").is_err()); + let key: ed25519::AppPair = store.write().generate().unwrap(); + let key2: ed25519::AppPair = store.read().key_pair(&key.public()).unwrap(); assert_eq!(key.public(), key2.public()); - assert_eq!(store.contents::().unwrap()[0], key.public()); + assert_eq!(store.read().public_keys::().unwrap()[0], key.public()); } #[test] - fn test_generate_from_seed() { + fn test_insert_ephemeral_from_seed() { let temp_dir = TempDir::new("keystore").unwrap(); - let mut store = Store::open(temp_dir.path().to_owned()).unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); - let pair: ed25519::Pair = store - .generate_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc") + let pair: ed25519::AppPair = store + .write() + .insert_ephemeral_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc") .unwrap(); - assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HJCA", pair.public().to_ss58check()); + assert_eq!( + "5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HJCA", + pair.public().to_ss58check() + ); + + drop(store); + let store = Store::open(temp_dir.path(), None).unwrap(); + // Keys generated from seed should not be persisted! + assert!(store.read().key_pair::(&pair.public()).is_err()); + } + + #[test] + fn password_being_used() { + let password = String::from("password"); + let temp_dir = TempDir::new("keystore").unwrap(); + let store = Store::open(temp_dir.path(), Some(password.clone().into())).unwrap(); + + let pair: ed25519::AppPair = store.write().generate().unwrap(); + assert_eq!( + pair.public(), + store.read().key_pair::(&pair.public()).unwrap().public(), + ); + + // Without the password the key should not be retrievable + let store = Store::open(temp_dir.path(), None).unwrap(); + assert!(store.read().key_pair::(&pair.public()).is_err()); + + let store = Store::open(temp_dir.path(), Some(password.into())).unwrap(); + assert_eq!( + pair.public(), + store.read().key_pair::(&pair.public()).unwrap().public(), + ); + } + + #[test] + fn public_keys_are_returned() { + let temp_dir = TempDir::new("keystore").unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); + + let mut public_keys = Vec::new(); + for i in 0..10 { + public_keys.push(store.write().generate::().unwrap().public()); + public_keys.push(store.write().insert_ephemeral_from_seed::( + &format!("0x3d97c819d68f9bafa7d6e79cb991eebcd7{}d966c5334c0b94d9e1fa7ad0869dc", i), + ).unwrap().public()); + } + + // Generate a key of a different type + store.write().generate::().unwrap(); + + public_keys.sort(); + let mut store_pubs = store.read().public_keys::().unwrap(); + store_pubs.sort(); + + assert_eq!(public_keys, store_pubs); } } diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 383fc29fc6..0600a60999 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -11,7 +11,7 @@ bytes = "0.4" derive_more = "0.14.0" either = "1.5.2" log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" bitflags = "1.0" fnv = "1.0" futures = "0.1.17" @@ -44,6 +44,7 @@ test-client = { package = "substrate-test-runtime-client", path = "../../core/te erased-serde = "0.3.9" void = "1.0" zeroize = "0.9.0" +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives" } [dev-dependencies] env_logger = { version = "0.6" } diff --git a/core/network/src/config.rs b/core/network/src/config.rs index c05c127d83..6cabb1217b 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -102,6 +102,11 @@ impl Roles { self.intersects(Roles::FULL | Roles::AUTHORITY) } + /// Does this role represents a client that does not participates in the consensus? + pub fn is_authority(&self) -> bool { + *self == Roles::AUTHORITY + } + /// Does this role represents a client that does not hold full chain data locally? pub fn is_light(&self) -> bool { !self.is_full() diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index c416d347d6..110201057c 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -57,7 +57,7 @@ use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; pub use test_client::TestClient; -type AuthorityId = primitives::sr25519::Public; +type AuthorityId = babe_primitives::AuthorityId; #[cfg(any(test, feature = "test-helpers"))] /// A Verifier that accepts all blocks and passes them on with the configured diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 97a6fd3d2d..ed201c9316 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -12,11 +12,12 @@ futures = "0.1.25" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } -parking_lot = "0.8.0" +parking_lot = "0.9.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } sr-primitives = { path = "../../core/sr-primitives" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } network = { package = "substrate-network", path = "../../core/network" } +keystore = { package = "substrate-keystore", path = "../keystore" } [dev-dependencies] env_logger = "0.6" diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 8733f3699a..c13b79131b 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -21,174 +21,32 @@ use std::{ time::{SystemTime, Duration}, thread::sleep, }; + use client::backend::OffchainStorage; -use crate::AuthorityKeyProvider; use futures::{Stream, Future, sync::mpsc}; use log::{info, debug, warn, error}; +use network::{PeerId, Multiaddr, NetworkStateInfo}; use codec::{Encode, Decode}; use primitives::offchain::{ - Timestamp, - HttpRequestId, HttpRequestStatus, HttpError, - Externalities as OffchainExt, - CryptoKind, CryptoKey, - StorageKind, - OpaqueNetworkState, OpaquePeerId, OpaqueMultiaddr, -}; -use primitives::crypto::{Pair, Public, Protected}; -use primitives::{ed25519, sr25519}; -use sr_primitives::{ - generic::BlockId, - traits::{self, Extrinsic}, + Externalities as OffchainExt, HttpRequestId, Timestamp, HttpRequestStatus, HttpError, + OpaqueNetworkState, OpaquePeerId, OpaqueMultiaddr, StorageKind, }; +use sr_primitives::{generic::BlockId, traits::{self, Extrinsic}}; use transaction_pool::txpool::{Pool, ChainApi}; -use network::NetworkStateInfo; -use network::{PeerId, Multiaddr}; /// A message between the offchain extension and the processing thread. enum ExtMessage { SubmitExtrinsic(Vec), } -/// A persisted key seed. -#[derive(Encode, Decode)] -struct StoredKey { - kind: CryptoKind, - phrase: String, -} - -impl StoredKey { - fn generate_with_phrase(kind: CryptoKind, password: Option<&str>) -> Self { - match kind { - CryptoKind::Ed25519 => { - let phrase = ed25519::Pair::generate_with_phrase(password).1; - Self { kind, phrase } - } - CryptoKind::Sr25519 => { - let phrase = sr25519::Pair::generate_with_phrase(password).1; - Self { kind, phrase } - } - } - } - - fn to_local_key(&self, password: Option<&str>) -> Result { - match self.kind { - CryptoKind::Ed25519 => { - ed25519::Pair::from_phrase(&self.phrase, password) - .map(|x| LocalKey::Ed25519(x.0)) - } - CryptoKind::Sr25519 => { - sr25519::Pair::from_phrase(&self.phrase, password) - .map(|x| LocalKey::Sr25519(x.0)) - } - } - .map_err(|e| { - warn!("Error recovering Offchain Worker key. Password invalid? {:?}", e); - () - }) - } -} - -enum LocalKey { - Ed25519(ed25519::Pair), - Sr25519(sr25519::Pair), -} - -impl LocalKey { - fn public(&self) -> Result, ()> { - match self { - LocalKey::Ed25519(pair) => Ok(pair.public().to_raw_vec()), - LocalKey::Sr25519(pair) => Ok(pair.public().to_raw_vec()), - } - } - - fn sign(&self, data: &[u8]) -> Result, ()> { - match self { - LocalKey::Ed25519(pair) => { - let sig = pair.sign(data); - let bytes: &[u8] = sig.as_ref(); - Ok(bytes.to_vec()) - } - LocalKey::Sr25519(pair) => { - let sig = pair.sign(data); - let bytes: &[u8] = sig.as_ref(); - Ok(bytes.to_vec()) - } - } - } - - fn verify(&self, msg: &[u8], signature: &[u8]) -> Result { - match self { - LocalKey::Ed25519(pair) => { - Ok(ed25519::Pair::verify_weak(signature, msg, pair.public())) - } - LocalKey::Sr25519(pair) => { - Ok(sr25519::Pair::verify_weak(signature, msg, pair.public())) - } - } - } -} - -/// A key. -enum Key { - LocalKey(LocalKey), - AuthorityKey(ConsensusPair), - FgAuthorityKey(FinalityPair), -} - -impl Key { - fn public(&self) -> Result, ()> { - match self { - Key::LocalKey(local) => { - local.public() - } - Key::AuthorityKey(pair) => { - Ok(pair.public().to_raw_vec()) - } - Key::FgAuthorityKey(pair) => { - Ok(pair.public().to_raw_vec()) - } - } - } - - fn sign(&self, data: &[u8]) -> Result, ()> { - match self { - Key::LocalKey(local) => { - local.sign(data) - } - Key::AuthorityKey(pair) => { - Ok(pair.sign(data).as_ref().to_vec()) - } - Key::FgAuthorityKey(pair) => { - Ok(pair.sign(data).as_ref().to_vec()) - } - } - } - - fn verify(&self, msg: &[u8], signature: &[u8]) -> Result { - match self { - Key::LocalKey(local) => { - local.verify(msg, signature) - } - Key::AuthorityKey(pair) => { - Ok(ConsensusPair::verify_weak(signature, msg, pair.public())) - } - Key::FgAuthorityKey(pair) => { - Ok(FinalityPair::verify_weak(signature, msg, pair.public())) - } - } - } -} - /// Asynchronous offchain API. /// /// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). -pub(crate) struct Api { +pub(crate) struct Api { sender: mpsc::UnboundedSender, db: Storage, - keys_password: Protected, - key_provider: KeyProvider, network_state: Arc, - at: BlockId, + _at: BlockId, } fn unavailable_yet(name: &str) -> R { @@ -199,59 +57,10 @@ fn unavailable_yet(name: &str) -> R { const LOCAL_DB: &str = "LOCAL (fork-aware) DB"; const STORAGE_PREFIX: &[u8] = b"storage"; -const KEYS_PREFIX: &[u8] = b"keys"; - -const NEXT_ID: &[u8] = b"crypto_key_id"; - -impl Api where - Storage: OffchainStorage, - KeyProvider: AuthorityKeyProvider, - Block: traits::Block, -{ - fn password(&self) -> Option<&str> { - Some(self.keys_password.as_ref().as_str()) - } - - fn read_key( - &self, - key: CryptoKey, - ) -> Result, ()> { - match key { - CryptoKey::LocalKey { id, kind } => { - let key = self.db.get(KEYS_PREFIX, &id.encode()) - .and_then(|key| StoredKey::decode(&mut &*key).ok()) - .ok_or(())?; - if key.kind != kind { - warn!( - "Invalid crypto kind (got: {:?}, expected: {:?}), when requesting key {:?}", - key.kind, - kind, - id - ); - return Err(()) - } - Ok(Key::LocalKey(key.to_local_key(self.password())?)) - } - CryptoKey::AuthorityKey => { - let key = self.key_provider - .authority_key(&self.at) - .ok_or(())?; - Ok(Key::AuthorityKey(key)) - } - CryptoKey::FgAuthorityKey => { - let key = self.key_provider - .fg_authority_key(&self.at) - .ok_or(())?; - Ok(Key::FgAuthorityKey(key)) - } - } - } -} -impl OffchainExt for Api +impl OffchainExt for Api where Storage: OffchainStorage, - KeyProvider: AuthorityKeyProvider, Block: traits::Block, { fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { @@ -261,30 +70,6 @@ where .map_err(|_| ()) } - fn new_crypto_key(&mut self, kind: CryptoKind) -> Result { - let key = StoredKey::generate_with_phrase(kind, self.password()); - let (id, id_encoded) = loop { - let encoded = self.db.get(KEYS_PREFIX, NEXT_ID); - let encoded_slice = encoded.as_ref().map(|x| x.as_slice()); - let new_id = encoded_slice.and_then(|mut x| u16::decode(&mut x).ok()).unwrap_or_default() - .checked_add(1) - .ok_or(())?; - let new_id_encoded = new_id.encode(); - - if self.db.compare_and_set(KEYS_PREFIX, NEXT_ID, encoded_slice, &new_id_encoded) { - break (new_id, new_id_encoded); - } - }; - - self.db.set(KEYS_PREFIX, &id_encoded, &key.encode()); - - Ok(CryptoKey::LocalKey { id, kind }) - } - - fn pubkey(&self, key: CryptoKey) -> Result, ()> { - self.read_key(key)?.public() - } - fn network_state(&self) -> Result { let external_addresses = self.network_state.external_addresses(); @@ -295,25 +80,6 @@ where Ok(OpaqueNetworkState::from(state)) } - fn encrypt(&mut self, _key: CryptoKey, _data: &[u8]) -> Result, ()> { - unavailable_yet::<()>("encrypt"); - Err(()) - } - - fn decrypt(&mut self, _key: CryptoKey, _data: &[u8]) -> Result, ()> { - unavailable_yet::<()>("decrypt"); - Err(()) - - } - - fn sign(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { - self.read_key(key)?.sign(data) - } - - fn verify(&mut self, key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result { - self.read_key(key)?.verify(msg, signature) - } - fn timestamp(&mut self) -> Timestamp { let now = SystemTime::now(); let epoch_duration = now.duration_since(SystemTime::UNIX_EPOCH); @@ -506,23 +272,19 @@ pub(crate) struct AsyncApi { impl AsyncApi { /// Creates new Offchain extensions API implementation an the asynchronous processing part. - pub fn new>( + pub fn new( transaction_pool: Arc>, db: S, - keys_password: Protected, - key_provider: P, at: BlockId, network_state: Arc, - ) -> (Api, AsyncApi) { + ) -> (Api, AsyncApi) { let (sender, rx) = mpsc::unbounded(); let api = Api { sender, db, - keys_password, - key_provider, network_state, - at, + _at: at, }; let async_api = AsyncApi { @@ -571,7 +333,6 @@ mod tests { use std::convert::TryFrom; use sr_primitives::traits::Zero; use client_db::offchain::LocalStorage; - use crate::tests::TestProvider; use network::PeerId; use test_client::runtime::Block; @@ -587,7 +348,7 @@ mod tests { } } - fn offchain_api() -> (Api, Block>, AsyncApi) { + fn offchain_api() -> (Api, AsyncApi) { let _ = env_logger::try_init(); let db = LocalStorage::new_test(); let client = Arc::new(test_client::new()); @@ -596,7 +357,12 @@ mod tests { ); let mock = Arc::new(MockNetworkStateInfo()); - AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(Zero::zero()), mock) + AsyncApi::new( + pool, + db, + BlockId::Number(Zero::zero()), + mock, + ) } #[test] @@ -680,49 +446,6 @@ mod tests { assert_eq!(api.local_storage_get(kind, key), Some(b"value".to_vec())); } - #[test] - fn should_create_a_new_key_and_sign_and_verify_stuff() { - let test = |kind: CryptoKind| { - // given - let mut api = offchain_api().0; - let msg = b"Hello world!"; - - // when - let key = api.new_crypto_key(kind).unwrap(); - let signature = api.sign(key, msg).unwrap(); - - // then - let res = api.verify(key, msg, &signature).unwrap(); - assert_eq!(res, true); - let res = api.verify(key, msg, &[]).unwrap(); - assert_eq!(res, false); - let res = api.verify(key, b"Different msg", &signature).unwrap(); - assert_eq!(res, false); - }; - - test(CryptoKind::Ed25519); - test(CryptoKind::Sr25519); - } - - #[test] - fn should_sign_and_verify_with_authority_key() { - // given - let mut api = offchain_api().0; - api.key_provider.ed_key = Some(ed25519::Pair::generate().0); - let msg = b"Hello world!"; - - // when - let signature = api.sign(CryptoKey::AuthorityKey, msg).unwrap(); - - // then - let res = api.verify(CryptoKey::AuthorityKey, msg, &signature).unwrap(); - assert_eq!(res, true); - let res = api.verify(CryptoKey::AuthorityKey, msg, &[]).unwrap(); - assert_eq!(res, false); - let res = api.verify(CryptoKey::AuthorityKey, b"Different msg", &signature).unwrap(); - assert_eq!(res, false); - } - #[test] fn should_convert_network_states() { // given diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index feacb535aa..5525546f25 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -40,18 +40,12 @@ use std::{ }; use client::runtime_api::ApiExt; -use log::{debug, warn}; -use primitives::{ - ExecutionContext, - crypto, -}; -use sr_primitives::{ - generic::BlockId, - traits::{self, ProvideRuntimeApi}, -}; use futures::future::Future; -use transaction_pool::txpool::{Pool, ChainApi}; +use log::{debug, warn}; use network::NetworkStateInfo; +use primitives::ExecutionContext; +use sr_primitives::{generic::BlockId, traits::{self, ProvideRuntimeApi}}; +use transaction_pool::txpool::{Pool, ChainApi}; mod api; @@ -59,61 +53,27 @@ pub mod testing; pub use offchain_primitives::OffchainWorkerApi; -/// Provides currently configured authority key. -pub trait AuthorityKeyProvider: Clone + 'static { - /// The crypto used by the block authoring algorithm. - type ConsensusPair: crypto::Pair; - /// The crypto used by the finality gadget. - type FinalityPair: crypto::Pair; - - /// Returns currently configured authority key. - fn authority_key(&self, block_id: &BlockId) -> Option; - - /// Returns currently configured finality gadget authority key. - fn fg_authority_key(&self, block_id: &BlockId) -> Option; -} - /// An offchain workers manager. -pub struct OffchainWorkers< - Client, - Storage, - KeyProvider, - Block: traits::Block, -> { +pub struct OffchainWorkers { client: Arc, db: Storage, - authority_key: KeyProvider, - keys_password: crypto::Protected, _block: PhantomData, } -impl OffchainWorkers< - Client, - Storage, - KeyProvider, - Block, -> { +impl OffchainWorkers { /// Creates new `OffchainWorkers`. - pub fn new( - client: Arc, - db: Storage, - authority_key: KeyProvider, - keys_password: crypto::Protected, - ) -> Self { + pub fn new(client: Arc, db: Storage) -> Self { Self { client, db, - authority_key, - keys_password, _block: PhantomData, } } } -impl fmt::Debug for OffchainWorkers< +impl fmt::Debug for OffchainWorkers< Client, Storage, - KeyProvider, Block, > { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -121,16 +81,14 @@ impl fmt::Debug for Offchain } } -impl OffchainWorkers< +impl OffchainWorkers< Client, Storage, - KeyProvider, Block, > where Block: traits::Block, Client: ProvideRuntimeApi + Send + Sync + 'static, Client::Api: OffchainWorkerApi, - KeyProvider: AuthorityKeyProvider + Send, Storage: client::backend::OffchainStorage + 'static, { /// Start the offchain workers after given block. @@ -152,8 +110,6 @@ impl OffchainWorkers< let (api, runner) = api::AsyncApi::new( pool.clone(), self.db.clone(), - self.keys_password.clone(), - self.authority_key.clone(), at.clone(), network_state.clone(), ); @@ -167,7 +123,7 @@ impl OffchainWorkers< let run = runtime.offchain_worker_with_context( &at, ExecutionContext::OffchainWorker(api), - number + number, ); if let Err(e) = run { log::error!("Error running offchain workers at {:?}: {:?}", at, e); @@ -197,7 +153,6 @@ fn spawn_worker(f: impl FnOnce() -> () + Send + 'static) { mod tests { use super::*; use futures::Future; - use primitives::{ed25519, sr25519}; use network::{Multiaddr, PeerId}; struct MockNetworkStateInfo(); @@ -212,49 +167,19 @@ mod tests { } } - #[derive(Clone)] - pub(crate) struct TestProvider { - _marker: PhantomData, - pub(crate) sr_key: Option, - pub(crate) ed_key: Option, - } - - impl Default for TestProvider { - fn default() -> Self { - Self { - _marker: PhantomData, - sr_key: None, - ed_key: None, - } - } - } - - impl AuthorityKeyProvider for TestProvider { - type ConsensusPair = ed25519::Pair; - type FinalityPair = sr25519::Pair; - - fn authority_key(&self, _: &BlockId) -> Option { - self.ed_key.clone() - } - - fn fg_authority_key(&self, _: &BlockId) -> Option { - self.sr_key.clone() - } - } - #[test] fn should_call_into_runtime_and_produce_extrinsic() { // given let _ = env_logger::try_init(); let runtime = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); - let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); + let pool = Arc::new(Pool::new(Default::default(), transaction_pool::ChainApi::new(client.clone()))); let db = client_db::offchain::LocalStorage::new_test(); - let mock = Arc::new(MockNetworkStateInfo()); + let network_state = Arc::new(MockNetworkStateInfo()); // when - let offchain = OffchainWorkers::new(client, db, TestProvider::default(), "".to_owned().into()); - runtime.executor().spawn(offchain.on_block_imported(&0u64, &pool, mock.clone())); + let offchain = OffchainWorkers::new(client, db); + runtime.executor().spawn(offchain.on_block_imported(&0u64, &pool, network_state.clone())); // then runtime.shutdown_on_idle().wait().unwrap(); diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs index f1c38007ea..e01e4f5f59 100644 --- a/core/offchain/src/testing.rs +++ b/core/offchain/src/testing.rs @@ -28,8 +28,6 @@ use primitives::offchain::{ HttpRequestId as RequestId, HttpRequestStatus as RequestStatus, Timestamp, - CryptoKind, - CryptoKey, StorageKind, OpaqueNetworkState, }; @@ -144,47 +142,6 @@ impl offchain::Externalities for TestOffchainExt { unimplemented!("not needed in tests so far") } - fn pubkey(&self, _key: CryptoKey) -> Result, ()> { - unimplemented!("not needed in tests so far") - } - - fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { - unimplemented!("not needed in tests so far") - } - - fn encrypt( - &mut self, - _key: CryptoKey, - _data: &[u8], - ) -> Result, ()> { - unimplemented!("not needed in tests so far") - } - - fn decrypt( - &mut self, - _key: CryptoKey, - _data: &[u8], - ) -> Result, ()> { - unimplemented!("not needed in tests so far") - } - - fn sign( - &mut self, - _key: CryptoKey, - _data: &[u8], - ) -> Result, ()> { - unimplemented!("not needed in tests so far") - } - - fn verify( - &mut self, - _key: CryptoKey, - _msg: &[u8], - _signature: &[u8], - ) -> Result { - unimplemented!("not needed in tests so far") - } - fn timestamp(&mut self) -> Timestamp { unimplemented!("not needed in tests so far") } diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 49d5a0de30..085b7f52c1 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -29,7 +29,7 @@ regex = { version = "1.1", optional = true } num-traits = { version = "0.2", default-features = false } zeroize = { version = "0.9.2", default-features = false } lazy_static = { version = "1.3", optional = true } -parking_lot = { version = "0.8", optional = true } +parking_lot = { version = "0.9.0", optional = true } [dev-dependencies] substrate-serializer = { path = "../serializer" } diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index b3469e09b8..56a8528369 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -18,13 +18,11 @@ //! Cryptographic utilities. // end::description[] -#[cfg(feature = "std")] -use std::convert::{TryFrom, TryInto}; +use rstd::convert::{TryFrom, TryInto}; #[cfg(feature = "std")] use parking_lot::Mutex; #[cfg(feature = "std")] use rand::{RngCore, rngs::OsRng}; -#[cfg(feature = "std")] use codec::{Encode, Decode}; #[cfg(feature = "std")] use regex::Regex; @@ -33,6 +31,8 @@ use base58::{FromBase58, ToBase58}; #[cfg(feature = "std")] use std::hash::Hash; use zeroize::Zeroize; +#[doc(hidden)] +pub use rstd::ops::Deref; /// The root phrase for our publicly known keys. pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; @@ -83,6 +83,14 @@ impl AsRef for Protected { } } +impl rstd::ops::Deref for Protected { + type Target = T; + + fn deref(&self) -> &T { + &self.0 + } +} + #[cfg(feature = "std")] impl std::fmt::Debug for Protected { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -279,12 +287,12 @@ pub trait Ss58Codec: Sized { } } -#[cfg(feature = "std")] /// Derivable key trait. pub trait Derive: Sized { /// Derive a child key from a series of given junctions. /// /// Will be `None` for public keys if there are any hard junctions in there. + #[cfg(feature = "std")] fn derive>(&self, _path: Iter) -> Option { None } @@ -457,8 +465,8 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { } /// Trait suitable for typical cryptographic PKI key public type. -pub trait Public: AsRef<[u8]> + TypedKey + PartialEq + Eq + Clone + Send + Sync { - /// A new instance from the given slice that should be 32 bytes long. +pub trait Public: AsRef<[u8]> + AsMut<[u8]> + Default + Derive + CryptoType + PartialEq + Eq + Clone + Send + Sync { + /// A new instance from the given slice. /// /// NOTE: No checking goes on to ensure this is a real public key. Only use it if /// you are certain that the array actually is a pubkey. GIGO! @@ -466,17 +474,85 @@ pub trait Public: AsRef<[u8]> + TypedKey + PartialEq + Eq + Clone + Send + Sync /// Return a `Vec` filled with raw data. #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec; + fn to_raw_vec(&self) -> Vec { self.as_slice().to_owned() } /// Return a slice filled with raw data. - fn as_slice(&self) -> &[u8]; + fn as_slice(&self) -> &[u8] { self.as_ref() } +} + +#[cfg(feature = "std")] +pub use self::dummy::*; + +#[cfg(feature = "std")] +mod dummy { + use super::*; + + /// Dummy cryptography. Doesn't do anything. + #[derive(Clone, Hash, Default, Eq, PartialEq)] + pub struct Dummy; + + impl AsRef<[u8]> for Dummy { + fn as_ref(&self) -> &[u8] { &b""[..] } + } + + impl AsMut<[u8]> for Dummy { + fn as_mut(&mut self) -> &mut[u8] { + unsafe { + #[allow(mutable_transmutes)] + rstd::mem::transmute::<_, &'static mut [u8]>(&b""[..]) + } + } + } + + impl CryptoType for Dummy { + type Pair = Dummy; + } + + impl Derive for Dummy {} + + impl Public for Dummy { + fn from_slice(_: &[u8]) -> Self { Self } + #[cfg(feature = "std")] + fn to_raw_vec(&self) -> Vec { vec![] } + fn as_slice(&self) -> &[u8] { b"" } + } + + impl Pair for Dummy { + type Public = Dummy; + type Seed = Dummy; + type Signature = Dummy; + type DeriveError = (); + fn generate_with_phrase(_: Option<&str>) -> (Self, String, Self::Seed) { Default::default() } + fn from_phrase(_: &str, _: Option<&str>) + -> Result<(Self, Self::Seed), SecretStringError> + { + Ok(Default::default()) + } + fn derive< + Iter: Iterator + >(&self, _: Iter) -> Result { Ok(Self) } + fn from_seed(_: &Self::Seed) -> Self { Self } + fn from_seed_slice(_: &[u8]) -> Result { Ok(Self) } + fn from_standard_components< + I: Iterator + >( + _: &str, + _: Option<&str>, + _: I + ) -> Result { Ok(Self) } + fn sign(&self, _: &[u8]) -> Self::Signature { Self } + fn verify>(_: &Self::Signature, _: M, _: &Self::Public) -> bool { true } + fn verify_weak, M: AsRef<[u8]>>(_: &[u8], _: M, _: P) -> bool { true } + fn public(&self) -> Self::Public { Self } + fn to_raw_vec(&self) -> Vec { vec![] } + } } /// Trait suitable for typical cryptographic PKI key pair type. /// /// For now it just specifies how to create a key from a phrase and derivation path. #[cfg(feature = "std")] -pub trait Pair: TypedKey + Sized + Clone + Send + Sync + 'static { +pub trait Pair: CryptoType + Sized + Clone + Send + Sync + 'static { /// The type which is used to encode a public key. type Public: Public + Hash; @@ -538,7 +614,7 @@ pub trait Pair: TypedKey + Sized + Clone + Send + Sync + 'static { fn sign(&self, message: &[u8]) -> Self::Signature; /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool; + fn verify>(sig: &Self::Signature, message: M, pubkey: &Self::Public) -> bool; /// Verify a signature on a message. Returns true if the signature is good. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool; @@ -603,26 +679,109 @@ pub trait Pair: TypedKey + Sized + Clone + Send + Sync + 'static { fn to_raw_vec(&self) -> Vec; } +/// One type is wrapped by another. +pub trait IsWrappedBy: From + Into { + /// Get a reference to the inner from the outer. + fn from_ref(outer: &Outer) -> &Self; + /// Get a mutable reference to the inner from the outer. + fn from_mut(outer: &mut Outer) -> &mut Self; +} + +/// Opposite of `IsWrappedBy` - denotes a type which is a simple wrapper around another type. +pub trait Wraps: Sized { + /// The inner type it is wrapping. + type Inner: IsWrappedBy; +} + +impl IsWrappedBy for T where + Outer: AsRef + AsMut + From, + T: From, +{ + /// Get a reference to the inner from the outer. + fn from_ref(outer: &Outer) -> &Self { outer.as_ref() } + + /// Get a mutable reference to the inner from the outer. + fn from_mut(outer: &mut Outer) -> &mut Self { outer.as_mut() } +} + +impl UncheckedFrom for Outer where + Outer: Wraps, + Inner: IsWrappedBy + UncheckedFrom, +{ + fn unchecked_from(t: T) -> Self { + let inner: Inner = t.unchecked_into(); + inner.into() + } +} + +/// Type which has a particular kind of crypto associated with it. +pub trait CryptoType { + /// The pair key type of this crypto. + #[cfg(feature="std")] + type Pair: Pair; +} + /// An identifier for a type of cryptographic key. /// -/// 0-1024 are reserved. -pub type KeyTypeId = u32; +/// To avoid clashes with other modules when distributing your module publically, register your +/// `KeyTypeId` on the list here by making a PR. +/// +/// Values whose first character is `_` are reserved for private use and won't conflict with any +/// public modules. +#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct KeyTypeId(pub [u8; 4]); -/// Constant key types. -pub mod key_types { - use super::KeyTypeId; +impl From for KeyTypeId { + fn from(x: u32) -> Self { + Self(x.to_le_bytes()) + } +} - /// ED25519 public key. - pub const ED25519: KeyTypeId = 10; +impl From for u32 { + fn from(x: KeyTypeId) -> Self { + u32::from_le_bytes(x.0) + } +} - /// SR25519 public key. - pub const SR25519: KeyTypeId = 20; +impl<'a> TryFrom<&'a str> for KeyTypeId { + type Error = (); + fn try_from(x: &'a str) -> Result { + let b = x.as_bytes(); + if b.len() != 4 { + return Err(()); + } + let mut res = KeyTypeId::default(); + res.0.copy_from_slice(&b[0..4]); + Ok(res) + } } -/// A trait for something that has a key type ID. -pub trait TypedKey { - /// The type ID of this key. - const KEY_TYPE: KeyTypeId; +/// Known key types; this also functions as a global registry of key types for projects wishing to +/// avoid collisions with each other. +/// +/// It's not universal in the sense that *all* key types need to be mentioned here, it's just a +/// handy place to put common key types. +pub mod key_types { + use super::KeyTypeId; + + /// Key type for generic S/R 25519 key. + pub const SR25519: KeyTypeId = KeyTypeId(*b"sr25"); + /// Key type for generic Ed25519 key. + pub const ED25519: KeyTypeId = KeyTypeId(*b"ed25"); + /// Key type for Babe module, build-in. + pub const BABE: KeyTypeId = KeyTypeId(*b"babe"); + /// Key type for Grandpa module, build-in. + pub const GRANDPA: KeyTypeId = KeyTypeId(*b"gran"); + /// Key type for controlling an account in a Substrate runtime, built-in. + pub const ACCOUNT: KeyTypeId = KeyTypeId(*b"acco"); + /// Key type for Aura module, built-in. + pub const AURA: KeyTypeId = KeyTypeId(*b"aura"); + /// Key type for ImOnline module, built-in. + pub const IM_ONLINE: KeyTypeId = KeyTypeId(*b"imon"); + /// A key type ID useful for tests. + #[cfg(feature = "std")] + pub const DUMMY: KeyTypeId = KeyTypeId(*b"dumy"); } #[cfg(test)] @@ -639,14 +798,31 @@ mod tests { Standard{phrase: String, password: Option, path: Vec}, Seed(Vec), } + impl Default for TestPair { + fn default() -> Self { + TestPair::Generated + } + } + impl CryptoType for TestPair { + type Pair = Self; + } - #[derive(Clone, PartialEq, Eq, Hash)] + #[derive(Clone, PartialEq, Eq, Hash, Default)] struct TestPublic; impl AsRef<[u8]> for TestPublic { fn as_ref(&self) -> &[u8] { &[] } } + impl AsMut<[u8]> for TestPublic { + fn as_mut(&mut self) -> &mut [u8] { + &mut [] + } + } + impl CryptoType for TestPublic { + type Pair = TestPair; + } + impl Derive for TestPublic {} impl Public for TestPublic { fn from_slice(_bytes: &[u8]) -> Self { Self @@ -658,9 +834,6 @@ mod tests { vec![] } } - impl TypedKey for TestPublic { - const KEY_TYPE: u32 = 4242; - } impl Pair for TestPair { type Public = TestPublic; type Seed = [u8; 0]; @@ -686,11 +859,7 @@ mod tests { } fn from_seed(_seed: &::Seed) -> Self { TestPair::Seed(vec![]) } fn sign(&self, _message: &[u8]) -> Self::Signature { [] } - fn verify, M: AsRef<[u8]>>( - _sig: &Self::Signature, - _message: M, - _pubkey: P - ) -> bool { true } + fn verify>(_: &Self::Signature, _: M, _: &Self::Public) -> bool { true } fn verify_weak, M: AsRef<[u8]>>( _sig: &[u8], _message: M, @@ -717,9 +886,6 @@ mod tests { vec![] } } - impl TypedKey for TestPair { - const KEY_TYPE: u32 = 4242; - } #[test] fn interpret_std_seed_should_work() { diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 0ff0042911..810e86767d 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -29,10 +29,10 @@ use substrate_bip39::seed_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive, Ss58Codec}; +use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Ss58Codec}; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; -use crate::crypto::{key_types, KeyTypeId, Public as TraitPublic, TypedKey, UncheckedFrom}; +use crate::{crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive}}; /// A secret seed. It's not called a "secret key" because ring doesn't expose the secret keys /// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we @@ -77,6 +77,20 @@ impl AsMut<[u8]> for Public { } } +impl rstd::convert::TryFrom<&[u8]> for Public { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 32 { + let mut inner = [0u8; 32]; + inner.copy_from_slice(data); + Ok(Public(inner)) + } else { + Err(()) + } + } +} + impl From for [u8; 32] { fn from(x: Public) -> Self { x.0 @@ -90,12 +104,6 @@ impl From for Public { } } -impl AsRef for Public { - fn as_ref(&self) -> &Public { - &self - } -} - impl From for H256 { fn from(x: Public) -> Self { x.0.into() @@ -115,15 +123,15 @@ impl UncheckedFrom for Public { } #[cfg(feature = "std")] -impl ::std::fmt::Display for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Display for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", self.to_ss58check()) } } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) } @@ -145,8 +153,8 @@ impl<'de> Deserialize<'de> for Public { } #[cfg(feature = "std")] -impl ::std::hash::Hash for Public { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Public { + fn hash(&self, state: &mut H) { self.0.hash(state); } } @@ -155,6 +163,20 @@ impl ::std::hash::Hash for Public { #[derive(Encode, Decode)] pub struct Signature(pub [u8; 64]); +impl rstd::convert::TryFrom<&[u8]> for Signature { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 64 { + let mut inner = [0u8; 64]; + inner.copy_from_slice(data); + Ok(Signature(inner)) + } else { + Err(()) + } + } +} + impl Clone for Signature { fn clone(&self) -> Self { let mut r = [0u8; 64]; @@ -171,7 +193,7 @@ impl Default for Signature { impl PartialEq for Signature { fn eq(&self, b: &Self) -> bool { - &self.0[..] == &b.0[..] + self.0[..] == b.0[..] } } @@ -208,16 +230,16 @@ impl AsMut<[u8]> for Signature { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Signature { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for Signature { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] -impl ::std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - ::std::hash::Hash::hash(&self.0[..], state); +impl std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + std::hash::Hash::hash(&self.0[..], state); } } @@ -306,31 +328,10 @@ impl TraitPublic for Public { r.copy_from_slice(data); Public(r) } - - /// Return a `Vec` filled with raw data. - #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec { - let r: &[u8; 32] = self.as_ref(); - r.to_vec() - } - - /// Return a slice filled with raw data. - fn as_slice(&self) -> &[u8] { - let r: &[u8; 32] = self.as_ref(); - &r[..] - } } -#[cfg(feature = "std")] impl Derive for Public {} -#[cfg(feature = "std")] -impl AsRef for Pair { - fn as_ref(&self) -> &Pair { - &self - } -} - /// Derive a single hard junction. #[cfg(feature = "std")] fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { @@ -438,8 +439,8 @@ impl TraitPair for Pair { } /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - Self::verify_weak(&sig.0[..], message.as_ref(), &pubkey.as_ref().0[..]) + fn verify>(sig: &Self::Signature, message: M, pubkey: &Self::Public) -> bool { + Self::verify_weak(&sig.0[..], message.as_ref(), pubkey) } /// Verify a signature on a message. Returns true if the signature is good. @@ -488,17 +489,19 @@ impl Pair { } } -impl TypedKey for Public { - const KEY_TYPE: KeyTypeId = key_types::ED25519; +impl CryptoType for Public { + #[cfg(feature="std")] + type Pair = Pair; } -impl TypedKey for Signature { - const KEY_TYPE: KeyTypeId = key_types::ED25519; +impl CryptoType for Signature { + #[cfg(feature="std")] + type Pair = Pair; } #[cfg(feature = "std")] -impl TypedKey for Pair { - const KEY_TYPE: KeyTypeId = key_types::ED25519; +impl CryptoType for Pair { + type Pair = Pair; } #[cfg(test)] diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index bf1911dad9..21e7c87808 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -33,11 +33,13 @@ macro_rules! map { use rstd::prelude::*; use rstd::ops::Deref; -use codec::{Encode, Decode}; #[cfg(feature = "std")] use std::borrow::Cow; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; +#[cfg(feature = "std")] +pub use serde;// << for macro +pub use codec::{Encode, Decode};// << for macro #[cfg(feature = "std")] pub use impl_serde::serialize as bytes; @@ -61,6 +63,8 @@ pub mod sandbox; pub mod storage; pub mod uint; mod changes_trie; +pub mod traits; +pub mod testing; #[cfg(test)] mod tests; @@ -77,7 +81,6 @@ pub use hash_db::Hasher; pub use self::hasher::blake2::Blake2Hasher; /// Context for executing a call into the runtime. -#[repr(u8)] pub enum ExecutionContext { /// Context for general importing (including own blocks). Importing, @@ -91,6 +94,17 @@ pub enum ExecutionContext { Other, } +impl ExecutionContext { + /// Returns if the keystore should be enabled for the current context. + pub fn enable_keystore(&self) -> bool { + use ExecutionContext::*; + match self { + Importing | Syncing | BlockConstruction => false, + OffchainWorker(_) | Other => true, + } + } +} + /// Hex-serialized shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] @@ -147,7 +161,7 @@ impl ::std::fmt::Debug for NativeOrEncoded { #[cfg(feature = "std")] impl NativeOrEncoded { /// Return the value as the encoded format. - pub fn as_encoded<'a>(&'a self) -> Cow<'a, [u8]> { + pub fn as_encoded(&self) -> Cow<'_, [u8]> { match self { NativeOrEncoded::Encoded(e) => Cow::Borrowed(e.as_slice()), NativeOrEncoded::Native(n) => Cow::Owned(n.encode()), @@ -199,3 +213,4 @@ impl codec::Decode for NeverNativeValue { Err("`NeverNativeValue` should never be decoded".into()) } } + diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index a0ee1c34d1..8ce5863e01 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -16,11 +16,12 @@ //! Offchain workers types -use crate::crypto; use codec::{Encode, Decode}; use rstd::prelude::{Vec, Box}; use rstd::convert::TryFrom; +pub use crate::crypto::KeyTypeId; + /// A type of supported crypto. #[derive(Clone, Copy, PartialEq, Eq, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] @@ -58,81 +59,6 @@ impl From for u32 { } } -/// A type of supported crypto. -#[derive(Clone, Copy, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -#[repr(C)] -pub enum CryptoKind { - /// SR25519 crypto (Schnorrkel) - Sr25519 = crypto::key_types::SR25519 as isize, - /// ED25519 crypto (Edwards) - Ed25519 = crypto::key_types::ED25519 as isize, -} - -impl TryFrom for CryptoKind { - type Error = (); - - fn try_from(kind: u32) -> Result { - match kind { - e if e == CryptoKind::Sr25519 as isize as u32 => Ok(CryptoKind::Sr25519), - e if e == CryptoKind::Ed25519 as isize as u32 => Ok(CryptoKind::Ed25519), - _ => Err(()), - } - } -} - -impl From for u32 { - fn from(c: CryptoKind) -> Self { - c as isize as u32 - } -} - -/// Key to use in the offchain worker crypto api. -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum CryptoKey { - /// Use a key from the offchain workers local storage. - LocalKey { - /// The id of the key. - id: u16, - /// The kind of the key. - kind: CryptoKind, - }, - /// Use the key the block authoring algorithm uses. - AuthorityKey, - /// Use the key the finality gadget uses. - FgAuthorityKey, -} - -impl TryFrom for CryptoKey { - type Error = (); - - fn try_from(key: u64) -> Result { - match key & 0xFF { - 0 => { - let id = (key >> 8 & 0xFFFF) as u16; - let kind = CryptoKind::try_from((key >> 32) as u32)?; - Ok(CryptoKey::LocalKey { id, kind }) - } - 1 => Ok(CryptoKey::AuthorityKey), - 2 => Ok(CryptoKey::FgAuthorityKey), - _ => Err(()), - } - } -} - -impl From for u64 { - fn from(key: CryptoKey) -> u64 { - match key { - CryptoKey::LocalKey { id, kind } => { - ((kind as u64) << 32) | ((id as u64) << 8) - } - CryptoKey::AuthorityKey => 1, - CryptoKey::FgAuthorityKey => 2, - } - } -} - /// Opaque type for offchain http requests. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "std", derive(Debug))] @@ -314,45 +240,6 @@ pub trait Externalities { /// Returns information about the local node's network state. fn network_state(&self) -> Result; - /// Create new key(pair) for signing/encryption/decryption. - /// - /// Returns an error if given crypto kind is not supported. - fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; - - /// Returns the locally configured authority public key, if available. - fn pubkey(&self, key: CryptoKey) -> Result, ()>; - - /// Encrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key of `CryptoKind`. - /// - /// Returns an error if `key` is not available or does not exist, - /// or the expected `CryptoKind` does not match. - fn encrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()>; - - /// Decrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key of `CryptoKind`. - /// - /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist, - /// or the expected `CryptoKind` does not match. - fn decrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()>; - - /// Sign a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key of `CryptoKind`. - /// - /// Returns an error if `key` is not available or does not exist, - /// or the expected `CryptoKind` does not match. - fn sign(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()>; - - /// Verifies that `signature` for `msg` matches given `key`. - /// - /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. - /// Returns an error in case the key is not available or does not exist or the parameters - /// lengths are incorrect or `CryptoKind` does not match. - fn verify(&mut self, key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result; - /// Returns current UNIX timestamp (in millis) fn timestamp(&mut self) -> Timestamp; @@ -466,34 +353,10 @@ impl Externalities for Box { (&mut **self).submit_transaction(ex) } - fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { - (&mut **self).new_crypto_key(crypto) - } - - fn encrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { - (&mut **self).encrypt(key, data) - } - fn network_state(&self) -> Result { (& **self).network_state() } - fn pubkey(&self, key: CryptoKey) -> Result, ()> { - (&**self).pubkey(key) - } - - fn decrypt(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { - (&mut **self).decrypt(key, data) - } - - fn sign(&mut self, key: CryptoKey, data: &[u8]) -> Result, ()> { - (&mut **self).sign(key, data) - } - - fn verify(&mut self, key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result { - (&mut **self).verify(key, msg, signature) - } - fn timestamp(&mut self) -> Timestamp { (&mut **self).timestamp() } @@ -571,27 +434,4 @@ mod tests { assert_eq!(t.sub(Duration::from_millis(10)), Timestamp(0)); assert_eq!(t.diff(&Timestamp(3)), Duration(2)); } - - #[test] - fn crypto_key_to_from_u64() { - let key = CryptoKey::AuthorityKey; - let uint: u64 = key.clone().into(); - let key2 = CryptoKey::try_from(uint).unwrap(); - assert_eq!(key, key2); - - let key = CryptoKey::FgAuthorityKey; - let uint: u64 = key.clone().into(); - let key2 = CryptoKey::try_from(uint).unwrap(); - assert_eq!(key, key2); - - let key = CryptoKey::LocalKey { id: 0, kind: CryptoKind::Ed25519 }; - let uint: u64 = key.clone().into(); - let key2 = CryptoKey::try_from(uint).unwrap(); - assert_eq!(key, key2); - - let key = CryptoKey::LocalKey { id: 10, kind: CryptoKind::Sr25519 }; - let uint: u64 = key.clone().into(); - let key2 = CryptoKey::try_from(uint).unwrap(); - assert_eq!(key, key2); - } } diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index b0c217c64f..0e573f49ce 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -30,8 +30,10 @@ use substrate_bip39::mini_secret_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use crate::crypto::{Pair as TraitPair, DeriveJunction, Infallible, SecretStringError, Derive, Ss58Codec}; -use crate::crypto::{key_types, KeyTypeId, Public as TraitPublic, TypedKey, UncheckedFrom}; +use crate::crypto::{ + Pair as TraitPair, DeriveJunction, Infallible, SecretStringError, Ss58Codec +}; +use crate::{crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive}}; use crate::hash::{H256, H512}; use codec::{Encode, Decode}; @@ -56,19 +58,13 @@ pub struct Pair(Keypair); impl Clone for Pair { fn clone(&self) -> Self { Pair(schnorrkel::Keypair { - public: self.0.public.clone(), + public: self.0.public, secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..]) .expect("key is always the correct size; qed") }) } } -impl AsRef for Public { - fn as_ref(&self) -> &Public { - &self - } -} - impl AsRef<[u8; 32]> for Public { fn as_ref(&self) -> &[u8; 32] { &self.0 @@ -99,6 +95,20 @@ impl From for H256 { } } +impl rstd::convert::TryFrom<&[u8]> for Public { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 32 { + let mut inner = [0u8; 32]; + inner.copy_from_slice(data); + Ok(Public(inner)) + } else { + Err(()) + } + } +} + impl UncheckedFrom<[u8; 32]> for Public { fn unchecked_from(x: [u8; 32]) -> Self { Public::from_raw(x) @@ -112,15 +122,15 @@ impl UncheckedFrom for Public { } #[cfg(feature = "std")] -impl ::std::fmt::Display for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Display for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", self.to_ss58check()) } } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> ::std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) } @@ -142,8 +152,8 @@ impl<'de> Deserialize<'de> for Public { } #[cfg(feature = "std")] -impl ::std::hash::Hash for Public { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Public { + fn hash(&self, state: &mut H) { self.0.hash(state); } } @@ -154,6 +164,20 @@ impl ::std::hash::Hash for Public { #[derive(Encode, Decode)] pub struct Signature(pub [u8; 64]); +impl rstd::convert::TryFrom<&[u8]> for Signature { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 64 { + let mut inner = [0u8; 64]; + inner.copy_from_slice(data); + Ok(Signature(inner)) + } else { + Err(()) + } + } +} + impl Clone for Signature { fn clone(&self) -> Self { let mut r = [0u8; 64]; @@ -170,7 +194,7 @@ impl Default for Signature { impl PartialEq for Signature { fn eq(&self, b: &Self) -> bool { - &self.0[..] == &b.0[..] + self.0[..] == b.0[..] } } @@ -268,11 +292,11 @@ impl Signature { } } -#[cfg(feature = "std")] impl Derive for Public { /// Derive a child key from a series of given junctions. /// /// `None` if there are any hard junctions in there. + #[cfg(feature = "std")] fn derive>(&self, path: Iter) -> Option { let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?; for j in path { @@ -318,24 +342,6 @@ impl TraitPublic for Public { r.copy_from_slice(data); Public(r) } - - /// Return a `Vec` filled with raw data. - #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec { - self.0.to_vec() - } - - /// Return a slice filled with raw data. - fn as_slice(&self) -> &[u8] { - &self.0 - } -} - -#[cfg(feature = "std")] -impl AsRef for Pair { - fn as_ref(&self) -> &Pair { - &self - } } #[cfg(feature = "std")] @@ -475,20 +481,15 @@ impl TraitPair for Pair { } /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - // Match both schnorrkel 0.1.1 and 0.8.0+ signatures, supporting both wallets - // that have not been upgraded and those that have. To swap to 0.8.0 only, - // create `schnorrkel::Signature` and pass that into `verify_simple` - match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { - Ok(pk) => pk.verify_simple_preaudit_deprecated( - SIGNING_CTX, message.as_ref(), &sig.as_ref(), - ).is_ok(), - Err(_) => false, - } + fn verify>(sig: &Self::Signature, message: M, pubkey: &Self::Public) -> bool { + Self::verify_weak(&sig.0[..], message, pubkey) } /// Verify a signature on a message. Returns true if the signature is good. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { + // Match both schnorrkel 0.1.1 and 0.8.0+ signatures, supporting both wallets + // that have not been upgraded and those that have. To swap to 0.8.0 only, + // create `schnorrkel::Signature` and pass that into `verify_simple` match PublicKey::from_bytes(pubkey.as_ref()) { Ok(pk) => pk.verify_simple_preaudit_deprecated( SIGNING_CTX, message.as_ref(), &sig, @@ -518,17 +519,19 @@ impl Pair { } } -impl TypedKey for Public { - const KEY_TYPE: KeyTypeId = key_types::SR25519; +impl CryptoType for Public { + #[cfg(feature="std")] + type Pair = Pair; } -impl TypedKey for Signature { - const KEY_TYPE: KeyTypeId = key_types::SR25519; +impl CryptoType for Signature { + #[cfg(feature="std")] + type Pair = Pair; } #[cfg(feature = "std")] -impl TypedKey for Pair { - const KEY_TYPE: KeyTypeId = key_types::SR25519; +impl CryptoType for Pair { + type Pair = Pair; } #[cfg(test)] @@ -713,6 +716,6 @@ mod test { let js_signature = Signature::from_raw(hex!( "28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00" )); - assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); + assert!(Pair::verify(&js_signature, b"SUBSTRATE", &public)); } } diff --git a/core/primitives/src/testing.rs b/core/primitives/src/testing.rs new file mode 100644 index 0000000000..6d91c83ccb --- /dev/null +++ b/core/primitives/src/testing.rs @@ -0,0 +1,115 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Types that should only be used for testing! + +#[cfg(feature = "std")] +use crate::{ed25519, sr25519, crypto::{Public, Pair, KeyTypeId}}; + +/// A keystore implementation usable in tests. +#[cfg(feature = "std")] +#[derive(Default)] +pub struct KeyStore { + /// `KeyTypeId` maps to public keys and public keys map to private keys. + keys: std::collections::HashMap, Vec>>, +} + +#[cfg(feature = "std")] +impl KeyStore { + /// Creates a new instance of `Self`. + pub fn new() -> std::sync::Arc> { + std::sync::Arc::new(parking_lot::RwLock::new(Self::default())) + } +} + +#[cfg(feature = "std")] +impl crate::traits::BareCryptoStore for KeyStore { + fn sr25519_public_keys(&self, id: KeyTypeId) -> Vec { + self.keys.get(&id) + .map(|keys| + keys.values() + .map(|s| sr25519::Pair::from_seed_slice(s).expect("`sr25519` seed slice is valid")) + .map(|p| p.public()) + .collect() + ) + .unwrap_or_default() + } + + fn sr25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result { + match seed { + Some(seed) => { + let pair = sr25519::Pair::from_string(seed, None).expect("Generates an `sr25519` pair."); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + Ok(pair.public()) + }, + None => { + let (pair, _) = sr25519::Pair::generate(); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + Ok(pair.public()) + } + } + } + + fn sr25519_key_pair(&self, id: KeyTypeId, pub_key: &sr25519::Public) -> Option { + self.keys.get(&id) + .and_then(|inner| + inner.get(pub_key.as_slice()) + .map(|s| sr25519::Pair::from_seed_slice(s).expect("`sr25519` seed slice is valid")) + ) + } + + fn ed25519_public_keys(&self, id: KeyTypeId) -> Vec { + self.keys.get(&id) + .map(|keys| + keys.values() + .map(|s| ed25519::Pair::from_seed_slice(s).expect("`ed25519` seed slice is valid")) + .map(|p| p.public()) + .collect() + ) + .unwrap_or_default() + } + + fn ed25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result { + match seed { + Some(seed) => { + let pair = ed25519::Pair::from_string(seed, None).expect("Generates an `ed25519` pair."); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + Ok(pair.public()) + }, + None => { + let (pair, _) = ed25519::Pair::generate(); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + Ok(pair.public()) + } + } + } + + fn ed25519_key_pair(&self, id: KeyTypeId, pub_key: &ed25519::Public) -> Option { + self.keys.get(&id) + .and_then(|inner| + inner.get(pub_key.as_slice()) + .map(|s| ed25519::Pair::from_seed_slice(s).expect("`ed25519` seed slice is valid")) + ) + } +} diff --git a/core/primitives/src/traits.rs b/core/primitives/src/traits.rs new file mode 100644 index 0000000000..6fa84088db --- /dev/null +++ b/core/primitives/src/traits.rs @@ -0,0 +1,72 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Shareable Substrate traits. + +#[cfg(feature = "std")] +use crate::{crypto::KeyTypeId, ed25519, sr25519}; + +/// Something that generates, stores and provides access to keys. +#[cfg(feature = "std")] +pub trait BareCryptoStore: Send + Sync { + /// Returns all sr25519 public keys for the given key type. + fn sr25519_public_keys(&self, id: KeyTypeId) -> Vec; + /// Generate a new sr25519 key pair for the given key type and an optional seed. + /// + /// If the given seed is `Some(_)`, the key pair will only be stored in memory. + /// + /// Returns the public key of the generated key pair. + fn sr25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result; + /// Returns the sr25519 key pair for the given key type and public key combination. + fn sr25519_key_pair(&self, id: KeyTypeId, pub_key: &sr25519::Public) -> Option; + + /// Returns all ed25519 public keys for the given key type. + fn ed25519_public_keys(&self, id: KeyTypeId) -> Vec; + /// Generate a new ed25519 key pair for the given key type and an optional seed. + /// + /// If the given seed is `Some(_)`, the key pair will only be stored in memory. + /// + /// Returns the public key of the generated key pair. + fn ed25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result; + + /// Returns the ed25519 key pair for the given key type and public key combination. + fn ed25519_key_pair(&self, id: KeyTypeId, pub_key: &ed25519::Public) -> Option; + + /// Insert a new key. This doesn't require any known of the crypto; but a public key must be + /// manually provided. + /// + /// Places it into the file system store. + /// + /// `Err` if there's some sort of weird filesystem error, but should generally be `Ok`. + fn insert_unknown(&mut self, _key_type: KeyTypeId, _suri: &str, _public: &[u8]) -> Result<(), ()> { + Err(()) + } + + /// Get the password for this store. + fn password(&self) -> Option<&str> { None } +} + +/// A pointer to the key store. +#[cfg(feature = "std")] +pub type BareCryptoStorePtr = std::sync::Arc>; diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index cf129a03e6..3072ba4783 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -13,7 +13,7 @@ jsonrpc-core-client = "12.0.0" jsonrpc-pubsub = "12.0.0" jsonrpc-derive = "12.0.0" log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" codec = { package = "parity-scale-codec", version = "1.0.0" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -23,8 +23,9 @@ network = { package = "substrate-network", path = "../network" } primitives = { package = "substrate-primitives", path = "../primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } transaction_pool = { package = "substrate-transaction-pool", path = "../transaction-pool" } -sr-primitives = { path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } runtime_version = { package = "sr-version", path = "../sr-version" } +substrate-keystore = { path = "../keystore" } [dev-dependencies] assert_matches = "1.1" diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 769f111105..2fcc8c780d 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -37,6 +37,18 @@ pub enum Error { /// Incorrect extrinsic format. #[display(fmt="Invalid extrinsic format: {}", _0)] BadFormat(codec::Error), + /// Incorrect seed phrase. + #[display(fmt="Invalid seed phrase/SURI")] + BadSeedPhrase, + /// Key type ID has an unknown format. + #[display(fmt="Invalid key type ID format (should be of length four)")] + BadKeyType, + /// Key type ID has some unsupported crypto. + #[display(fmt="The crypto of key type ID is unknown")] + UnsupportedKeyType, + /// Some random issue with the key store. Shouldn't happen. + #[display(fmt="The key store is unavailable")] + KeyStoreUnavailable, } impl std::error::Error for Error { diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index aa238aeb70..226fd2b105 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -22,7 +22,7 @@ pub mod hash; #[cfg(test)] mod tests; -use std::sync::Arc; +use std::{sync::Arc, convert::TryInto}; use client::{self, Client}; use crate::rpc::futures::{Sink, Stream, Future}; @@ -31,9 +31,12 @@ use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use log::warn; use codec::{Encode, Decode}; -use primitives::{Bytes, Blake2Hasher, H256}; +use primitives::{ + Bytes, Blake2Hasher, H256, ed25519, sr25519, crypto::{Pair, Public, key_types}, + traits::BareCryptoStorePtr +}; use sr_primitives::{generic, traits}; -use self::error::Result; +use self::error::{Error, Result}; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, @@ -57,21 +60,46 @@ pub trait AuthorApi { #[rpc(name = "author_submitExtrinsic")] fn submit_extrinsic(&self, extrinsic: Bytes) -> Result; + /// Insert a key into the keystore. + #[rpc(name = "author_insertKey")] + fn insert_key(&self, + key_type: String, + suri: String, + maybe_public: Option + ) -> Result; + /// Returns all pending extrinsics, potentially grouped by sender. #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; /// Remove given extrinsic from the pool and temporarily ban it to prevent reimporting. #[rpc(name = "author_removeExtrinsic")] - fn remove_extrinsic(&self, bytes_or_hash: Vec>) -> Result>; + fn remove_extrinsic(&self, + bytes_or_hash: Vec> + ) -> Result>; /// Submit an extrinsic to watch. - #[pubsub(subscription = "author_extrinsicUpdate", subscribe, name = "author_submitAndWatchExtrinsic")] - fn watch_extrinsic(&self, metadata: Self::Metadata, subscriber: Subscriber>, bytes: Bytes); + #[pubsub( + subscription = "author_extrinsicUpdate", + subscribe, + name = "author_submitAndWatchExtrinsic" + )] + fn watch_extrinsic(&self, + metadata: Self::Metadata, + subscriber: Subscriber>, + bytes: Bytes + ); /// Unsubscribe from extrinsic watching. - #[pubsub(subscription = "author_extrinsicUpdate", unsubscribe, name = "author_unwatchExtrinsic")] - fn unwatch_extrinsic(&self, metadata: Option, id: SubscriptionId) -> Result; + #[pubsub( + subscription = "author_extrinsicUpdate", + unsubscribe, + name = "author_unwatchExtrinsic" + )] + fn unwatch_extrinsic(&self, + metadata: Option, + id: SubscriptionId + ) -> Result; } /// Authoring API @@ -82,6 +110,8 @@ pub struct Author where P: PoolChainApi + Sync + Send + 'static { pool: Arc>, /// Subscriptions manager subscriptions: Subscriptions, + /// The key store. + keystore: BareCryptoStorePtr, } impl Author where P: PoolChainApi + Sync + Send + 'static { @@ -90,11 +120,13 @@ impl Author where P: PoolChainApi + Sync + Send + 'sta client: Arc::Block, RA>>, pool: Arc>, subscriptions: Subscriptions, + keystore: BareCryptoStorePtr, ) -> Self { Author { client, pool, subscriptions, + keystore, } } } @@ -105,10 +137,38 @@ impl AuthorApi, BlockHash

> for Author whe P: PoolChainApi + Sync + Send + 'static, P::Block: traits::Block, P::Error: 'static, - RA: Send + Sync + 'static + RA: Send + Sync + 'static, { type Metadata = crate::metadata::Metadata; + fn insert_key(&self, + key_type: String, + suri: String, + maybe_public: Option, + ) -> Result { + let key_type = key_type.as_str().try_into().map_err(|_| Error::BadKeyType)?; + let mut keystore = self.keystore.write(); + let maybe_password = keystore.password(); + let public = match maybe_public { + Some(public) => public.0, + None => { + let maybe_public = match key_type { + key_types::BABE | key_types::IM_ONLINE | key_types::SR25519 => + sr25519::Pair::from_string(&suri, maybe_password) + .map(|pair| pair.public().to_raw_vec()), + key_types::GRANDPA | key_types::ED25519 => + ed25519::Pair::from_string(&suri, maybe_password) + .map(|pair| pair.public().to_raw_vec()), + _ => Err(Error::UnsupportedKeyType)?, + }; + maybe_public.map_err(|_| Error::BadSeedPhrase)? + } + }; + keystore.insert_unknown(key_type, &suri, &public[..]) + .map_err(|_| Error::KeyStoreUnavailable)?; + Ok(public.into()) + } + fn submit_extrinsic(&self, ext: Bytes) -> Result> { let xt = Decode::decode(&mut &ext[..])?; let best_block_hash = self.client.info().chain.best_hash; @@ -124,7 +184,9 @@ impl AuthorApi, BlockHash

> for Author whe Ok(self.pool.ready().map(|tx| tx.data.encode().into()).collect()) } - fn remove_extrinsic(&self, bytes_or_hash: Vec>>) -> Result>> { + fn remove_extrinsic(&self, + bytes_or_hash: Vec>> + ) -> Result>> { let hashes = bytes_or_hash.into_iter() .map(|x| match x { hash::ExtrinsicOrHash::Hash(h) => Ok(h), @@ -143,7 +205,11 @@ impl AuthorApi, BlockHash

> for Author whe ) } - fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: Subscriber, BlockHash

>>, xt: Bytes) { + fn watch_extrinsic(&self, + _metadata: Self::Metadata, + subscriber: Subscriber, BlockHash

>>, + xt: Bytes + ) { let submit = || -> Result<_> { let best_block_hash = self.client.info().chain.best_hash; let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..])?; diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 6295220820..93c39a4bc5 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -23,9 +23,12 @@ use transaction_pool::{ txpool::Pool, ChainApi, }; -use primitives::{H256, blake2_256, hexdisplay::HexDisplay}; +use primitives::{H256, blake2_256, hexdisplay::HexDisplay, traits::BareCryptoStore}; use test_client::{self, AccountKeyring, runtime::{Extrinsic, Transfer}}; use tokio::runtime; +use std::collections::HashMap; +use sr_primitives::KeyTypeId; +use parking_lot::RwLock; fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { let tx = Transfer { @@ -37,14 +40,55 @@ fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { tx.into_signed_tx() } +#[derive(Default)] +struct TestKeyStore { + keys: HashMap, String>>, +} + +impl BareCryptoStore for TestKeyStore { + fn sr25519_public_keys(&self, _id: KeyTypeId) -> Vec { vec![] } + fn sr25519_generate_new(&mut self, _id: KeyTypeId, _seed: Option<&str>) + -> std::result::Result + { + Err("unimplemented".into()) + } + fn sr25519_key_pair(&self, _id: KeyTypeId, _pub_key: &sr25519::Public) -> Option { + None + } + fn ed25519_public_keys(&self, _id: KeyTypeId) -> Vec { vec![] } + fn ed25519_generate_new(&mut self, _id: KeyTypeId, _seed: Option<&str>) + -> std::result::Result + { + Err("unimplemented".into()) + } + fn ed25519_key_pair(&self, _id: KeyTypeId, _pub_key: &ed25519::Public) -> Option { + None + } + + fn insert_unknown(&mut self, key_type: KeyTypeId, suri: &str, public: &[u8]) + -> std::result::Result<(), ()> + { + self.keys + .entry(key_type) + .or_default() + .insert(public.to_owned(), suri.to_owned()); + Ok(()) + } + + fn password(&self) -> Option<&str> { None } +} + #[test] fn submit_transaction_should_not_cause_error() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); + let keystore = TestKeyStore::default(); + let keystore = Arc::new(RwLock::new(keystore)); let p = Author { client: client.clone(), pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let xt = uxt(AccountKeyring::Alice, 1).encode(); let h: H256 = blake2_256(&xt).into(); @@ -62,10 +106,12 @@ fn submit_transaction_should_not_cause_error() { fn submit_rich_transaction_should_not_cause_error() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); + let keystore = Arc::new(RwLock::new(TestKeyStore::default())); let p = Author { client: client.clone(), pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let xt = uxt(AccountKeyring::Alice, 0).encode(); let h: H256 = blake2_256(&xt).into(); @@ -85,10 +131,12 @@ fn should_watch_extrinsic() { let mut runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let keystore = Arc::new(RwLock::new(TestKeyStore::default())); let p = Author { client, pool: pool.clone(), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let (subscriber, id_rx, data) = ::jsonrpc_pubsub::typed::Subscriber::new_test("test"); @@ -125,10 +173,12 @@ fn should_return_pending_extrinsics() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let keystore = Arc::new(RwLock::new(TestKeyStore::default())); let p = Author { client, pool: pool.clone(), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let ex = uxt(AccountKeyring::Alice, 0); AuthorApi::submit_extrinsic(&p, ex.encode().into()).unwrap(); @@ -143,10 +193,12 @@ fn should_remove_extrinsics() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let keystore = Arc::new(RwLock::new(TestKeyStore::default())); let p = Author { client, pool: pool.clone(), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let ex1 = uxt(AccountKeyring::Alice, 0); p.submit_extrinsic(ex1.encode().into()).unwrap(); diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index dcb47bbbfb..2bcb180570 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" derive_more = "0.14.0" futures = "0.1.17" futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } -parking_lot = "0.8.0" +parking_lot = "0.9.0" lazy_static = "1.0" log = "0.4" slog = {version = "^2", features = ["nested-values"]} @@ -22,7 +22,9 @@ target_info = "0.1" keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } sr-primitives = { path = "../../core/sr-primitives" } -primitives = { package = "substrate-primitives", path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto" } +substrate-session = { path = "../session" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } @@ -40,4 +42,6 @@ substrate-test-runtime-client = { path = "../test-runtime/client" } node-executor = { path = "../../node/executor" } node-primitives = { path = "../../node/primitives" } node-runtime = { path = "../../node/runtime" } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives" } grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } +grandpa-primitives = { package = "substrate-finality-grandpa-primitives", path = "../../core/finality-grandpa/primitives" } diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index ca92a4814c..ecd77af082 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -34,7 +34,7 @@ enum GenesisSource { Factory(fn() -> G), } -impl Clone for GenesisSource { +impl Clone for GenesisSource { fn clone(&self) -> Self { match *self { GenesisSource::File(ref path) => GenesisSource::File(path.clone()), @@ -104,12 +104,12 @@ struct ChainSpecFile { pub type Properties = json::map::Map; /// A configuration of a chain. Can be used to build a genesis block. -pub struct ChainSpec { +pub struct ChainSpec { spec: ChainSpecFile, genesis: GenesisSource, } -impl Clone for ChainSpec { +impl Clone for ChainSpec { fn clone(&self) -> Self { ChainSpec { spec: self.spec.clone(), diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 570e894c39..47781aa79d 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -19,18 +19,21 @@ use std::{sync::Arc, ops::Deref, ops::DerefMut}; use serde::{Serialize, de::DeserializeOwned}; use crate::chain_spec::ChainSpec; +use keystore::KeyStorePtr; use client_db; use client::{self, Client, runtime_api}; -use crate::{error, Service, AuthorityKeyProvider}; +use crate::{error, Service}; use consensus_common::{import_queue::ImportQueue, SelectChain}; -use network::{self, OnDemand, FinalityProofProvider, NetworkStateInfo, config::BoxFinalityProofRequestBuilder}; +use network::{ + self, OnDemand, FinalityProofProvider, NetworkStateInfo, config::BoxFinalityProofRequestBuilder +}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; use sr_primitives::{ BuildStorage, traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi}, generic::BlockId }; use crate::config::Configuration; -use primitives::{Blake2Hasher, H256, Pair}; +use primitives::{Blake2Hasher, H256, traits::BareCryptoStorePtr}; use rpc::{self, apis::system::SystemInfo}; use futures::{prelude::*, future::Executor}; use futures03::channel::mpsc; @@ -129,16 +132,6 @@ pub type ComponentOffchainStorage = < /// Block type for `Components` pub type ComponentBlock = <::Factory as ServiceFactory>::Block; -/// ConsensusPair type for `Components` -pub type ComponentConsensusPair = <::Factory as ServiceFactory>::ConsensusPair; - -/// FinalityPair type for `Components` -pub type ComponentFinalityPair = <::Factory as ServiceFactory>::FinalityPair; - -/// AuthorityKeyProvider type for `Components` -pub type ComponentAuthorityKeyProvider = - AuthorityKeyProvider, ComponentConsensusPair, ComponentFinalityPair>; - /// Extrinsic hash type for `Components` pub type ComponentExHash = <::TransactionPoolApi as txpool::ChainApi>::Hash; @@ -152,6 +145,27 @@ pub type PoolApi = ::TransactionPoolApi; pub trait RuntimeGenesis: Serialize + DeserializeOwned + BuildStorage {} impl RuntimeGenesis for T {} +/// Something that can create initial session keys from given seeds. +pub trait InitialSessionKeys { + /// Generate the initial session keys for the given seeds. + fn generate_intial_session_keys( + client: Arc>, + seeds: Vec, + ) -> error::Result<()>; +} + +impl InitialSessionKeys for C where + ComponentClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: substrate_session::SessionKeys>, +{ + fn generate_intial_session_keys( + client: Arc>, + seeds: Vec, + ) -> error::Result<()> { + substrate_session::generate_initial_session_keys(client, seeds).map_err(Into::into) + } +} + /// Something that can start the RPC service. pub trait StartRPC { fn start_rpc( @@ -160,6 +174,7 @@ pub trait StartRPC { system_info: SystemInfo, task_executor: TaskExecutor, transaction_pool: Arc>, + keystore: KeyStorePtr, ) -> rpc::RpcHandler; } @@ -173,11 +188,12 @@ impl StartRPC for C where rpc_system_info: SystemInfo, task_executor: TaskExecutor, transaction_pool: Arc>, + keystore: KeyStorePtr, ) -> rpc::RpcHandler { let subscriptions = rpc::apis::Subscriptions::new(task_executor.clone()); let chain = rpc::apis::chain::Chain::new(client.clone(), subscriptions.clone()); let state = rpc::apis::state::State::new(client.clone(), subscriptions.clone()); - let author = rpc::apis::author::Author::new(client, transaction_pool, subscriptions); + let author = rpc::apis::author::Author::new(client, transaction_pool, subscriptions, keystore); let system = rpc::apis::system::System::new(rpc_system_info, system_send_back); rpc::rpc_handler::, ComponentExHash, _, _, _, _>( state, @@ -242,7 +258,6 @@ pub trait OffchainWorker { offchain: &offchain::OffchainWorkers< ComponentClient, ComponentOffchainStorage, - ComponentAuthorityKeyProvider, ComponentBlock >, pool: &Arc>, @@ -259,7 +274,6 @@ impl OffchainWorker for C where offchain: &offchain::OffchainWorkers< ComponentClient, ComponentOffchainStorage, - ComponentAuthorityKeyProvider, ComponentBlock >, pool: &Arc>, @@ -277,6 +291,7 @@ pub trait ServiceTrait: + StartRPC + MaintainTransactionPool + OffchainWorker + + InitialSessionKeys {} impl ServiceTrait for T where T: Deref> @@ -285,6 +300,7 @@ impl ServiceTrait for T where + StartRPC + MaintainTransactionPool + OffchainWorker + + InitialSessionKeys {} /// Alias for a an implementation of `futures::future::Executor`. @@ -294,10 +310,6 @@ pub type TaskExecutor = Arc + pub trait ServiceFactory: 'static + Sized { /// Block type. type Block: BlockT; - /// Consensus crypto type. - type ConsensusPair: Pair; - /// Finality crypto type. - type FinalityPair: Pair; /// The type that implements the runtime API. type RuntimeApi: Send + Sync; /// Network protocol extensions. @@ -412,6 +424,7 @@ pub trait Components: Sized + 'static { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, + keystore: Option, ) -> Result< ( Arc>, @@ -498,11 +511,11 @@ impl Components for FullComponents { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, - ) - -> Result<( - Arc>, - Option>>> - ), error::Error> + keystore: Option, + ) -> Result< + (Arc>, Option>>>), + error::Error, + > { let db_settings = client_db::DatabaseSettings { cache_size: config.database_cache_size.map(|u| u as usize), @@ -512,12 +525,19 @@ impl Components for FullComponents { path: config.database_path.clone(), pruning: config.pruning.clone(), }; - Ok((Arc::new(client_db::new_client( - db_settings, - executor, - &config.chain_spec, - config.execution_strategies.clone(), - )?), None)) + + Ok(( + Arc::new( + client_db::new_client( + db_settings, + executor, + &config.chain_spec, + config.execution_strategies.clone(), + keystore, + )? + ), + None, + )) } fn build_transaction_pool( @@ -600,6 +620,7 @@ impl Components for LightComponents { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, + _: Option, ) -> Result< ( @@ -615,9 +636,12 @@ impl Components for LightComponents { path: config.database_path.clone(), pruning: config.pruning.clone(), }; + let db_storage = client_db::light::LightStorage::new(db_settings)?; let light_blockchain = client::light::new_light_blockchain(db_storage); - let fetch_checker = Arc::new(client::light::new_fetch_checker(light_blockchain.clone(), executor.clone())); + let fetch_checker = Arc::new( + client::light::new_fetch_checker(light_blockchain.clone(), executor.clone()) + ); let fetcher = Arc::new(network::OnDemand::new(fetch_checker)); let client_backend = client::light::new_light_backend(light_blockchain, fetcher.clone()); let client = client::light::new_light(client_backend, fetcher.clone(), &config.chain_spec, executor)?; diff --git a/core/service/src/config.rs b/core/service/src/config.rs index cd2364b37d..b5019c8263 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -31,7 +31,7 @@ use tel::TelemetryEndpoints; /// Service configuration. #[derive(Clone)] -pub struct Configuration { +pub struct Configuration { /// Implementation name pub impl_name: &'static str, /// Implementation version @@ -45,7 +45,7 @@ pub struct Configuration { /// Network configuration. pub network: NetworkConfiguration, /// Path to key files. - pub keystore_path: Option, + pub keystore_path: PathBuf, /// Path to the database. pub database_path: PathBuf, /// Cache Size for internal database in MiB @@ -56,8 +56,6 @@ pub struct Configuration { pub state_cache_child_ratio: Option, /// Pruning settings. pub pruning: PruningMode, - /// Additional key seeds. - pub keys: Vec, /// Chain configuration. pub chain_spec: ChainSpec, /// Custom configuration. @@ -91,7 +89,13 @@ pub struct Configuration { /// running a sentry node in front of a validator, thus needing to forward GRANDPA gossip messages. pub grandpa_voter: bool, /// Node keystore's password - pub password: Protected, + pub keystore_password: Option>, + /// Development key seed. + /// + /// When running in development mode, the seed will be used to generate authority keys by the keystore. + /// + /// Should only be set when `node` is running development mode. + pub dev_key_seed: Option, } impl Configuration { @@ -111,7 +115,6 @@ impl Configuration Configuration { NetworkStatus>, NetworkState )>>>>, transaction_pool: Arc>, - keystore: ComponentAuthorityKeyProvider, - exit: ::exit_future::Exit, + exit: exit_future::Exit, signal: Option, /// Sender for futures that must be spawned as background tasks. to_spawn_tx: mpsc::UnboundedSender + Send>>, @@ -105,21 +101,22 @@ pub struct Service { _offchain_workers: Option, ComponentOffchainStorage, - ComponentAuthorityKeyProvider, ComponentBlock> >>, + keystore: keystore::KeyStorePtr, } /// Creates bare client without any networking. -pub fn new_client(config: &FactoryFullConfiguration) - -> Result>>, error::Error> -{ +pub fn new_client( + config: &FactoryFullConfiguration, +) -> Result>>, error::Error> { let executor = NativeExecutor::new(config.default_heap_pages); - let (client, _) = components::FullComponents::::build_client( + + components::FullComponents::::build_client( config, executor, - )?; - Ok(client) + None, + ).map(|r| r.0) } /// An handle for spawning tasks in the service. @@ -172,43 +169,9 @@ impl Service { // Create client let executor = NativeExecutor::new(config.default_heap_pages); - let mut keystore = if let Some(keystore_path) = config.keystore_path.as_ref() { - match Keystore::open(keystore_path.clone()) { - Ok(ks) => Some(ks), - Err(err) => { - error!("Failed to initialize keystore: {}", err); - None - } - } - } else { - None - }; - - // Keep the public key for telemetry - let public_key: String; - - // This is meant to be for testing only - // FIXME #1063 remove this - if let Some(keystore) = keystore.as_mut() { - for seed in &config.keys { - keystore.generate_from_seed::(seed)?; - keystore.generate_from_seed::(seed)?; - } - - public_key = match keystore.contents::()?.get(0) { - Some(public_key) => public_key.to_string(), - None => { - let key: ed25519::Pair = keystore.generate(&config.password.as_ref())?; - let public_key = key.public(); - info!("Generated a new keypair: {:?}", public_key); - public_key.to_string() - } - } - } else { - public_key = format!(""); - } + let keystore = Keystore::open(config.keystore_path.clone(), config.keystore_password.clone())?; - let (client, on_demand) = Components::build_client(&config, executor)?; + let (client, on_demand) = Components::build_client(&config, executor, Some(keystore.clone()))?; let select_chain = Components::build_select_chain(&mut config, client.clone())?; let (import_queue, finality_proof_request_builder) = Components::build_import_queue( &mut config, @@ -219,9 +182,16 @@ impl Service { let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; let chain_info = client.info().chain; + Components::RuntimeServices::generate_intial_session_keys( + client.clone(), + config.dev_key_seed.clone().map(|s| vec![s]).unwrap_or_default(), + )?; + let version = config.full_version(); info!("Highest known block at #{}", chain_info.best_number); - telemetry!(SUBSTRATE_INFO; "node.start"; + telemetry!( + SUBSTRATE_INFO; + "node.start"; "height" => chain_info.best_number.saturated_into::(), "best" => ?chain_info.best_hash ); @@ -234,7 +204,7 @@ impl Service { imports_external_transactions: !config.roles.is_light(), pool: transaction_pool.clone(), client: client.clone(), - }); + }); let protocol_id = { let protocol_id_full = match config.chain_spec.protocol_id() { @@ -267,23 +237,11 @@ impl Service { let network = network_mut.service().clone(); let network_status_sinks = Arc::new(Mutex::new(Vec::new())); - let keystore_authority_key = AuthorityKeyProvider { - _marker: PhantomData, - roles: config.roles, - password: config.password.clone(), - keystore: keystore.map(Arc::new), - }; - #[allow(deprecated)] let offchain_storage = client.backend().offchain_storage(); let offchain_workers = match (config.offchain_worker, offchain_storage) { (true, Some(db)) => { - Some(Arc::new(offchain::OffchainWorkers::new( - client.clone(), - db, - keystore_authority_key.clone(), - config.password.clone(), - ))) + Some(Arc::new(offchain::OffchainWorkers::new(client.clone(), db))) }, (true, None) => { log::warn!("Offchain workers disabled, due to lack of offchain storage support in backend."); @@ -421,6 +379,7 @@ impl Service { system_info.clone(), Arc::new(SpawnTaskHandle { sender: to_spawn_tx.clone() }), transaction_pool.clone(), + keystore.clone(), ) }; let rpc_handlers = gen_handler(); @@ -465,7 +424,6 @@ impl Service { "version" => version.clone(), "config" => "", "chain" => chain_name.clone(), - "pubkey" => &public_key, "authority" => is_authority, "network_id" => network_id.clone() ); @@ -491,7 +449,6 @@ impl Service { to_spawn_tx, to_spawn_rx, to_poll: Vec::new(), - keystore: keystore_authority_key, config, exit, rpc_handlers, @@ -499,28 +456,20 @@ impl Service { _telemetry: telemetry, _offchain_workers: offchain_workers, _telemetry_on_connect_sinks: telemetry_connection_sinks.clone(), + keystore, }) } - /// give the authority key, if we are an authority and have a key - pub fn authority_key(&self) -> Option> { - use offchain::AuthorityKeyProvider; - - self.keystore.authority_key(&BlockId::Number(Zero::zero())) - } - - /// give the authority key, if we are an authority and have a key - pub fn fg_authority_key(&self) -> Option> { - use offchain::AuthorityKeyProvider; - - self.keystore.fg_authority_key(&BlockId::Number(Zero::zero())) - } - - /// return a shared instance of Telemetry (if enabled) + /// Return a shared instance of Telemetry (if enabled) pub fn telemetry(&self) -> Option { self._telemetry.as_ref().map(|t| t.clone()) } + /// Returns the keystore instance. + pub fn keystore(&self) -> keystore::KeyStorePtr { + self.keystore.clone() + } + /// Spawns a task in the background that runs the future passed as parameter. pub fn spawn_task(&self, task: impl Future + Send + 'static) { let _ = self.to_spawn_tx.unbounded_send(Box::new(task)); @@ -910,73 +859,6 @@ impl network::TransactionPool, ComponentBlock< } } -#[derive(Clone)] -/// A provider of current authority key. -pub struct AuthorityKeyProvider { - _marker: PhantomData<(Block, ConsensusPair, FinalityPair)>, - roles: Roles, - keystore: Option>, - password: crypto::Protected, -} - -impl - offchain::AuthorityKeyProvider - for AuthorityKeyProvider -where - Block: sr_primitives::traits::Block, - ConsensusPair: Pair, - FinalityPair: Pair, -{ - type ConsensusPair = ConsensusPair; - type FinalityPair = FinalityPair; - - fn authority_key(&self, _at: &BlockId) -> Option { - if self.roles != Roles::AUTHORITY { - return None - } - - let keystore = match self.keystore { - Some(ref keystore) => keystore, - None => return None - }; - - let loaded_key = keystore - .contents() - .map(|keys| keys.get(0) - .map(|k| keystore.load(k, self.password.as_ref())) - ); - - if let Ok(Some(Ok(key))) = loaded_key { - Some(key) - } else { - None - } - } - - fn fg_authority_key(&self, _at: &BlockId) -> Option { - if self.roles != Roles::AUTHORITY { - return None - } - - let keystore = match self.keystore { - Some(ref keystore) => keystore, - None => return None - }; - - let loaded_key = keystore - .contents() - .map(|keys| keys.get(0) - .map(|k| keystore.load(k, self.password.as_ref())) - ); - - if let Ok(Some(Ok(key))) = loaded_key { - Some(key) - } else { - None - } - } -} - /// Constructs a service factory with the given name that implements the `ServiceFactory` trait. /// The required parameters are required to be given in the exact order. Some parameters are followed /// by `{}` blocks. These blocks are required and used to initialize the given parameter. @@ -998,6 +880,8 @@ where /// # use node_runtime::{GenesisConfig, RuntimeApi}; /// # use std::sync::Arc; /// # use node_primitives::Block; +/// # use babe_primitives::AuthorityPair as BabePair; +/// # use grandpa_primitives::AuthorityPair as GrandpaPair; /// # use sr_primitives::Justification; /// # use sr_primitives::traits::Block as BlockT; /// # use grandpa; @@ -1025,8 +909,6 @@ where /// struct Factory { /// // Declare the block type /// Block = Block, -/// ConsensusPair = primitives::ed25519::Pair, -/// FinalityPair = primitives::ed25519::Pair, /// RuntimeApi = RuntimeApi, /// // Declare the network protocol and give an initializer. /// NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, @@ -1070,8 +952,6 @@ macro_rules! construct_service_factory { $(#[$attr:meta])* struct $name:ident { Block = $block:ty, - ConsensusPair = $consensus_pair:ty, - FinalityPair = $finality_pair:ty, RuntimeApi = $runtime_api:ty, NetworkProtocol = $protocol:ty { $( $protocol_init:tt )* }, RuntimeDispatch = $dispatch:ty, @@ -1097,8 +977,6 @@ macro_rules! construct_service_factory { #[allow(unused_variables)] impl $crate::ServiceFactory for $name { type Block = $block; - type ConsensusPair = $consensus_pair; - type FinalityPair = $finality_pair; type RuntimeApi = $runtime_api; type NetworkProtocol = $protocol; type RuntimeDispatch = $dispatch; diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 8375521a70..b9f05af2c7 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -135,10 +135,6 @@ fn node_config ( ) -> FactoryFullConfiguration { let root = root.path().join(format!("node-{}", index)); - let mut keys = Vec::new(); - if let Some(seed) = key_seed { - keys.push(seed); - } let config_path = Some(String::from(root.join("network").to_str().unwrap())); let net_config_path = config_path.clone(); @@ -173,13 +169,13 @@ fn node_config ( roles: role, transaction_pool: Default::default(), network: network_config, - keystore_path: Some(root.join("key")), + keystore_path: root.join("key"), + keystore_password: None, database_path: root.join("db"), database_cache_size: None, state_cache_size: 16777216, state_cache_child_ratio: None, pruning: Default::default(), - keys: keys, chain_spec: (*spec).clone(), custom: Default::default(), name: format!("Node {}", index), @@ -195,7 +191,7 @@ fn node_config ( force_authoring: false, disable_grandpa: false, grandpa_voter: false, - password: "".to_string().into(), + dev_key_seed: key_seed, } } diff --git a/core/session/Cargo.toml b/core/session/Cargo.toml new file mode 100644 index 0000000000..5d8cb3f000 --- /dev/null +++ b/core/session/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "substrate-session" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +client = { package = "substrate-client", path = "../client", default-features = false } +rstd = { package = "sr-std", path = "../sr-std", default-features = false } +sr-primitives = { path = "../sr-primitives", optional = true } +primitives = { package = "substrate-primitives", path = "../primitives", optional = true } + +[features] +default = [ "std" ] +std = [ "client/std", "rstd/std", "sr-primitives", "primitives" ] diff --git a/core/session/src/lib.rs b/core/session/src/lib.rs new file mode 100644 index 0000000000..a962f2bfe3 --- /dev/null +++ b/core/session/src/lib.rs @@ -0,0 +1,64 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Substrate core types around sessions. + +#![cfg_attr(not(feature = "std"), no_std)] + +use rstd::vec::Vec; + +#[cfg(feature = "std")] +use sr_primitives::traits::{ProvideRuntimeApi, Block as BlockT}; +#[cfg(feature = "std")] +use primitives::{H256, Blake2Hasher}; + +client::decl_runtime_apis! { + /// Session keys runtime api. + pub trait SessionKeys { + /// Generate a set of session keys with optionally using the given seed. + /// + /// The seed needs to be a valid `utf8` string. + /// + /// Returns the concatenated SCALE encoded public keys. + fn generate_session_keys(seed: Option>) -> Vec; + } +} + +/// Generate the initial session keys with the given seeds. +#[cfg(feature = "std")] +pub fn generate_initial_session_keys( + client: std::sync::Arc>, + seeds: Vec, +) -> Result<(), client::error::Error> +where + B: client::backend::Backend, + E: client::CallExecutor, + Block: BlockT, + client::Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: SessionKeys, +{ + let info = client.info().chain; + let runtime_api = client.runtime_api(); + + for seed in seeds { + runtime_api.generate_session_keys( + &sr_primitives::generic::BlockId::Number(info.best_number), + Some(seed.as_bytes().to_vec()), + )?; + } + + Ok(()) +} \ No newline at end of file diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index 75da2fe292..6b79e52ee2 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -190,5 +190,6 @@ fn record_proof_works() { &executor, "Core_execute_block", &block.encode(), + None, ).expect("Executes block while using the proof backend"); } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index ac4799513d..7227ef4f0d 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -33,12 +33,11 @@ use rstd::vec::Vec; pub use codec; pub use primitives::Blake2Hasher; -use primitives::offchain::{ - Timestamp, - HttpRequestId, HttpRequestStatus, HttpError, - CryptoKind, CryptoKey, - StorageKind, - OpaqueNetworkState, +use primitives::{ + crypto::KeyTypeId, ed25519, sr25519, + offchain::{ + Timestamp, HttpRequestId, HttpRequestStatus, HttpError, StorageKind, OpaqueNetworkState, + }, }; /// Error verifying ECDSA signature @@ -69,7 +68,7 @@ macro_rules! export_api { $( #[$attr:meta] )* fn $name:ident $(< $( $g_name:ident $( : $g_ty:path )? ),+ >)? - ( $( $arg:ident : $arg_ty:ty ),* ) + ( $( $arg:ident : $arg_ty:ty ),* $(,)? ) $( -> $ret:ty )? $( where $( $w_name:path : $w_ty:path ),+ )?; )* @@ -200,11 +199,45 @@ export_api! { export_api! { pub(crate) trait CryptoApi { - /// Verify a ed25519 signature. - fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + /// Returns all ed25519 public keys for the given key id from the keystore. + fn ed25519_public_keys(id: KeyTypeId) -> Vec; + /// Generate an ed22519 key for the given key type and store it in the keystore. + /// + /// Returns the raw public key. + fn ed25519_generate(id: KeyTypeId, seed: Option<&str>) -> ed25519::Public; + /// Sign the given `msg` with the ed25519 key that corresponds to the given public key and + /// key type in the keystore. + /// + /// Returns the raw signature. + fn ed25519_sign>( + id: KeyTypeId, + pubkey: &ed25519::Public, + msg: &M, + ) -> Option; + /// Verify an ed25519 signature. + /// + /// Returns `true` when the verification in successful. + fn ed25519_verify(sig: &ed25519::Signature, msg: &[u8], pubkey: &ed25519::Public) -> bool; + /// Returns all sr25519 public keys for the given key id from the keystore. + fn sr25519_public_keys(id: KeyTypeId) -> Vec; + /// Generate an sr22519 key for the given key type and store it in the keystore. + /// + /// Returns the raw public key. + fn sr25519_generate(id: KeyTypeId, seed: Option<&str>) -> sr25519::Public; + /// Sign the given `msg` with the sr25519 key that corresponds to the given public key and + /// key type in the keystore. + /// + /// Returns the raw signature. + fn sr25519_sign>( + id: KeyTypeId, + pubkey: &sr25519::Public, + msg: &M, + ) -> Option; /// Verify an sr25519 signature. - fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + /// + /// Returns `true` when the verification in successful. + fn sr25519_verify(sig: &sr25519::Signature, msg: &[u8], pubkey: &sr25519::Public) -> bool; /// Verify and recover a SECP256k1 ECDSA signature. /// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. @@ -245,42 +278,6 @@ export_api! { /// Returns information about the local node's network state. fn network_state() -> Result; - /// Returns the currently configured authority public key, if available. - fn pubkey(key: CryptoKey) -> Result, ()>; - - /// Create new key(pair) for signing/encryption/decryption. - /// - /// Returns an error if given crypto kind is not supported. - fn new_crypto_key(crypto: CryptoKind) -> Result; - - /// Encrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key. - /// - /// Returns an error if `key` is not available or does not exist. - fn encrypt(key: CryptoKey, data: &[u8]) -> Result, ()>; - - /// Decrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key. - /// - /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. - fn decrypt(key: CryptoKey, data: &[u8]) -> Result, ()>; - - /// Sign a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key. - /// - /// Returns an error if `key` is not available or does not exist. - fn sign(key: CryptoKey, data: &[u8]) -> Result, ()>; - - /// Verifies that `signature` for `msg` matches given `key`. - /// - /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. - /// Returns an error in case the key is not available or does not exist or the parameters - /// lengths are incorrect. - fn verify(key: CryptoKey, msg: &[u8], signature: &[u8]) -> Result; - /// Returns current UNIX timestamp (in millis) fn timestamp() -> Timestamp; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 9413673593..8774412c1c 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -15,24 +15,19 @@ // along with Substrate. If not, see . use primitives::{ - blake2_128, blake2_256, twox_128, twox_256, twox_64, ed25519, Blake2Hasher, - sr25519, Pair + blake2_128, blake2_256, twox_128, twox_256, twox_64, ed25519, Blake2Hasher, sr25519, Pair, }; // Switch to this after PoC-3 // pub use primitives::BlakeHasher; pub use substrate_state_machine::{ - Externalities, - BasicExternalities, - TestExternalities, - ChildStorageKey + Externalities, BasicExternalities, TestExternalities, ChildStorageKey, }; use environmental::environmental; use primitives::{offchain, hexdisplay::HexDisplay, H256}; use trie::{TrieConfiguration, trie_types::Layout}; -#[cfg(feature = "std")] -use std::collections::HashMap; +use std::{collections::HashMap, convert::TryFrom}; environmental!(ext: trait Externalities); @@ -208,12 +203,82 @@ impl OtherApi for () { } impl CryptoApi for () { - fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - ed25519::Pair::verify_weak(sig, msg, pubkey) + fn ed25519_public_keys(id: KeyTypeId) -> Vec { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .ed25519_public_keys(id) + }).expect("`ed25519_public_keys` cannot be called outside of an Externalities-provided environment.") + } + + fn ed25519_generate(id: KeyTypeId, seed: Option<&str>) -> ed25519::Public { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .ed25519_generate_new(id, seed) + .expect("`ed25519_generate` failed") + }).expect("`ed25519_generate` cannot be called outside of an Externalities-provided environment.") + } + + fn ed25519_sign>( + id: KeyTypeId, + pubkey: &ed25519::Public, + msg: &M, + ) -> Option { + let pub_key = ed25519::Public::try_from(pubkey.as_ref()).ok()?; + + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .read() + .ed25519_key_pair(id, &pub_key) + .map(|k| k.sign(msg.as_ref()).into()) + }).expect("`ed25519_sign` cannot be called outside of an Externalities-provided environment.") + } + + fn ed25519_verify(sig: &ed25519::Signature, msg: &[u8], pubkey: &ed25519::Public) -> bool { + ed25519::Pair::verify(sig, msg, pubkey) + } + + fn sr25519_public_keys(id: KeyTypeId) -> Vec { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .sr25519_public_keys(id) + }).expect("`sr25519_public_keys` cannot be called outside of an Externalities-provided environment.") + } + + fn sr25519_generate(id: KeyTypeId, seed: Option<&str>) -> sr25519::Public { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .sr25519_generate_new(id, seed) + .expect("`sr25519_generate` failed") + }).expect("`sr25519_generate` cannot be called outside of an Externalities-provided environment.") + } + + fn sr25519_sign>( + id: KeyTypeId, + pubkey: &sr25519::Public, + msg: &M, + ) -> Option { + let pub_key = sr25519::Public::try_from(pubkey.as_ref()).ok()?; + + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .read() + .sr25519_key_pair(id, &pub_key) + .map(|k| k.sign(msg.as_ref()).into()) + }).expect("`sr25519_sign` cannot be called outside of an Externalities-provided environment.") } - fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - sr25519::Pair::verify_weak(sig, msg, pubkey) + fn sr25519_verify(sig: &sr25519::Signature, msg: &[u8], pubkey: &sr25519::Public) -> bool { + sr25519::Pair::verify(sig, msg, pubkey) } fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { @@ -276,55 +341,6 @@ impl OffchainApi for () { }, "network_state can be called only in the offchain worker context") } - fn pubkey(key: offchain::CryptoKey) -> Result, ()> { - with_offchain(|ext| { - ext.pubkey(key) - }, "authority_pubkey can be called only in the offchain worker context") - } - - fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { - with_offchain(|ext| { - ext.new_crypto_key(crypto) - }, "new_crypto_key can be called only in the offchain worker context") - } - - fn encrypt( - key: offchain::CryptoKey, - data: &[u8], - ) -> Result, ()> { - with_offchain(|ext| { - ext.encrypt(key, data) - }, "encrypt can be called only in the offchain worker context") - } - - fn decrypt( - key: offchain::CryptoKey, - data: &[u8], - ) -> Result, ()> { - with_offchain(|ext| { - ext.decrypt(key, data) - }, "decrypt can be called only in the offchain worker context") - } - - fn sign( - key: offchain::CryptoKey, - data: &[u8], - ) -> Result, ()> { - with_offchain(|ext| { - ext.sign(key, data) - }, "sign can be called only in the offchain worker context") - } - - fn verify( - key: offchain::CryptoKey, - msg: &[u8], - signature: &[u8], - ) -> Result { - with_offchain(|ext| { - ext.verify(key, msg, signature) - }, "verify can be called only in the offchain worker context") - } - fn timestamp() -> offchain::Timestamp { with_offchain(|ext| { ext.timestamp() diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 4dc28f0471..09b3cc0e2e 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -19,8 +19,9 @@ pub use rstd; pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; -use rstd::{vec::Vec, cell::Cell, convert::TryInto, convert::TryFrom}; +use rstd::{vec::Vec, cell::Cell, convert::TryInto}; use primitives::{offchain, Blake2Hasher}; +use codec::Decode; #[cfg(not(feature = "no_panic_handler"))] #[panic_handler] @@ -158,7 +159,7 @@ pub mod ext { ( $( $( #[$attr:meta] )* - fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; + fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* $(,)? ) $( -> $ret:ty )?; )* ) => { $( @@ -352,25 +353,72 @@ pub mod ext { fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); /// Keccak256 hash fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); - /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. + + /// Returns all `ed25519` public keys for the given key type from the keystore. + fn ext_ed25519_public_keys(id: *const u8, result_len: *mut u32) -> *mut u8; + + /// Note: `ext_ed25519_verify` returns `0` if the signature is correct, nonzero otherwise. fn ext_ed25519_verify( msg_data: *const u8, msg_len: u32, sig_data: *const u8, - pubkey_data: *const u8 + pubkey_data: *const u8, + ) -> u32; + + /// Generate an `ed25519` key pair for the given key type id and store the public key + /// in `out`. + fn ext_ed25519_generate(id: *const u8, seed: *const u8, seed_len: u32, out: *mut u8); + + /// Sign the given `msg` with the `ed25519` key pair that corresponds to then given key + /// type id and public key. The raw signature is stored in `out`. + /// + /// # Returns + /// + /// - `0` on success + /// - nonezero if something failed, e.g. retrieving of the key. + fn ext_ed25519_sign( + id: *const u8, + pubkey: *const u8, + msg: *const u8, + msg_len: u32, + out: *mut u8, ) -> u32; - /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. + + /// Returns all `sr25519` public keys for the given key type from the keystore. + fn ext_sr25519_public_keys(id: *const u8, result_len: *mut u32) -> *mut u8; + + /// Note: `ext_sr25519_verify` returns 0 if the signature is correct, nonzero otherwise. fn ext_sr25519_verify( msg_data: *const u8, msg_len: u32, sig_data: *const u8, - pubkey_data: *const u8 + pubkey_data: *const u8, ) -> u32; + + /// Generate an `sr25519` key pair for the given key type id and store the public + /// key in `out`. + fn ext_sr25519_generate(id: *const u8, seed: *const u8, seed_len: u32, out: *mut u8); + + /// Sign the given `msg` with the `sr25519` key pair that corresponds to then given key + /// type id and public key. The raw signature is stored in `out`. + /// + /// # Returns + /// + /// - `0` on success + /// - nonezero if something failed, e.g. retrieving of the key. + fn ext_sr25519_sign( + id: *const u8, + pubkey: *const u8, + msg: *const u8, + msg_len: u32, + out: *mut u8, + ) -> u32; + /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. fn ext_secp256k1_ecdsa_recover( msg_data: *const u8, sig_data: *const u8, - pubkey_data: *mut u8 + pubkey_data: *mut u8, ) -> u32; //================================ @@ -398,94 +446,6 @@ pub mod ext { /// runtime code can always rely on it. fn ext_network_state(written_out: *mut u32) -> *mut u8; - /// Returns the locally configured authority public key, if available. - /// The `crypto` argument is `offchain::CryptoKind` converted to `u32`. - /// - /// # Returns - /// - /// The encoded `Result, ()>`. - /// `written_out` contains the length of the message. - /// - /// The ownership of the returned buffer is transferred to the runtime - /// code and the runtime is responsible for freeing it. This is always - /// a properly allocated pointer (which cannot be NULL), hence the - /// runtime code can always rely on it. - fn ext_pubkey(key: u64, written_out: *mut u32) -> *mut u8; - - /// Create new key(pair) for signing/encryption/decryption. - /// - /// # Returns - /// - /// - A crypto key id (if the value is less than u16::max_value) - /// - `u32::max_value` in case the crypto is not supported - fn ext_new_crypto_key(crypto: u32) -> u64; - - /// Encrypt a piece of data using given crypto key. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns - /// - /// - `0` in case the key is invalid, `msg_len` is set to `u32::max_value` - /// - Otherwise, pointer to the encrypted message in memory, - /// `msg_len` contains the length of the message. - fn ext_encrypt( - key: u64, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8; - - /// Decrypt a piece of data using given crypto key. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns - /// - /// - `0` in case the key is invalid or data couldn't be decrypted, - /// `msg_len` is set to `u32::max_value` - /// - Otherwise, pointer to the decrypted message in memory, - /// `msg_len` contains the length of the message. - fn ext_decrypt( - key: u64, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8; - - /// Sign a piece of data using given crypto key. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns - /// - /// - `0` in case the key is invalid, - /// `sig_data_len` is set to `u32::max_value` - /// - Otherwise, pointer to the signature in memory, - /// `sig_data_len` contains the length of the signature. - fn ext_sign( - key: u64, - data: *const u8, - data_len: u32, - sig_data_len: *mut u32 - ) -> *mut u8; - - /// Verifies that `signature` for `msg` matches given `key`. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns - /// - `0` in case the signature is correct - /// - `1` in case it doesn't match the key - /// - `u32::max_value` if the key is invalid. - fn ext_verify( - key: u64, - msg: *const u8, - msg_len: u32, - signature: *const u8, - signature_len: u32 - ) -> u32; - /// Returns current UNIX timestamp (milliseconds) fn ext_timestamp() -> u64; @@ -871,15 +831,105 @@ impl HashingApi for () { } impl CryptoApi for () { - fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + fn ed25519_public_keys(id: KeyTypeId) -> Vec { + let mut res_len = 0u32; unsafe { - ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + let res_ptr = ext_ed25519_public_keys.get()(id.0.as_ptr(), &mut res_len); + Vec::decode(&mut rstd::slice::from_raw_parts(res_ptr, res_len as usize)).unwrap_or_default() } } - fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + fn ed25519_generate(id: KeyTypeId, seed: Option<&str>) -> ed25519::Public { + let mut res = [0u8; 32]; + let seed = seed.as_ref().map(|s| s.as_bytes()).unwrap_or(&[]); unsafe { - ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + ext_ed25519_generate.get()(id.0.as_ptr(), seed.as_ptr(), seed.len() as u32, res.as_mut_ptr()) + }; + ed25519::Public(res) + } + + fn ed25519_sign>( + id: KeyTypeId, + pubkey: &ed25519::Public, + msg: &M, + ) -> Option { + let mut res = [0u8; 64]; + let success = unsafe { + ext_ed25519_sign.get()( + id.0.as_ptr(), + pubkey.0.as_ptr(), + msg.as_ref().as_ptr(), + msg.as_ref().len() as u32, + res.as_mut_ptr(), + ) == 0 + }; + + if success { + Some(ed25519::Signature(res)) + } else { + None + } + } + + fn ed25519_verify(sig: &ed25519::Signature, msg: &[u8], pubkey: &ed25519::Public) -> bool { + unsafe { + ext_ed25519_verify.get()( + msg.as_ptr(), + msg.len() as u32, + sig.0.as_ptr(), + pubkey.0.as_ptr(), + ) == 0 + } + } + + fn sr25519_public_keys(id: KeyTypeId) -> Vec { + let mut res_len = 0u32; + unsafe { + let res_ptr = ext_sr25519_public_keys.get()(id.0.as_ptr(), &mut res_len); + Vec::decode(&mut rstd::slice::from_raw_parts(res_ptr, res_len as usize)).unwrap_or_default() + } + } + + fn sr25519_generate(id: KeyTypeId, seed: Option<&str>) -> sr25519::Public { + let mut res = [0u8;32]; + let seed = seed.as_ref().map(|s| s.as_bytes()).unwrap_or(&[]); + unsafe { + ext_sr25519_generate.get()(id.0.as_ptr(), seed.as_ptr(), seed.len() as u32, res.as_mut_ptr()) + }; + sr25519::Public(res) + } + + fn sr25519_sign>( + id: KeyTypeId, + pubkey: &sr25519::Public, + msg: &M, + ) -> Option { + let mut res = [0u8; 64]; + let success = unsafe { + ext_sr25519_sign.get()( + id.0.as_ptr(), + pubkey.0.as_ptr(), + msg.as_ref().as_ptr(), + msg.as_ref().len() as u32, + res.as_mut_ptr(), + ) == 0 + }; + + if success { + Some(sr25519::Signature(res)) + } else { + None + } + } + + fn sr25519_verify(sig: &sr25519::Signature, msg: &[u8], pubkey: &sr25519::Public) -> bool { + unsafe { + ext_sr25519_verify.get()( + msg.as_ptr(), + msg.len() as u32, + sig.0.as_ptr(), + pubkey.0.as_ptr(), + ) == 0 } } @@ -925,104 +975,6 @@ impl OffchainApi for () { } } - fn pubkey(key: CryptoKey) -> Result, ()> { - let mut len = 0u32; - let raw_result = unsafe { - let ptr = ext_pubkey.get()( - key.into(), - &mut len, - ); - - from_raw_parts(ptr, len) - }; - - match raw_result { - Some(raw_result) => codec::Decode::decode(&mut &*raw_result).unwrap_or(Err(())), - None => Err(()) - } - } - - fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { - let crypto = crypto.into(); - let ret = unsafe { - ext_new_crypto_key.get()(crypto) - }; - offchain::CryptoKey::try_from(ret) - } - - fn encrypt( - key: offchain::CryptoKey, - data: &[u8], - ) -> Result, ()> { - let mut len = 0_u32; - unsafe { - let ptr = ext_encrypt.get()( - key.into(), - data.as_ptr(), - data.len() as u32, - &mut len - ); - - from_raw_parts(ptr, len).ok_or(()) - } - } - - fn decrypt( - key: offchain::CryptoKey, - data: &[u8], - ) -> Result, ()> { - let mut len = 0_u32; - unsafe { - let ptr = ext_decrypt.get()( - key.into(), - data.as_ptr(), - data.len() as u32, - &mut len - ); - - from_raw_parts(ptr, len).ok_or(()) - } - } - - fn sign( - key: offchain::CryptoKey, - data: &[u8], - ) -> Result, ()> { - let mut len = 0_u32; - unsafe { - let ptr = ext_sign.get()( - key.into(), - data.as_ptr(), - data.len() as u32, - &mut len - ); - - from_raw_parts(ptr, len).ok_or(()) - } - } - - fn verify( - key: offchain::CryptoKey, - msg: &[u8], - signature: &[u8], - ) -> Result { - let val = unsafe { - ext_verify.get()( - key.into(), - msg.as_ptr(), - msg.len() as u32, - signature.as_ptr(), - signature.len() as u32, - ) - }; - - match val { - 0 => Ok(true), - 1 => Ok(false), - _ => Err(()), - } - } - fn timestamp() -> offchain::Timestamp { offchain::Timestamp::from_unix_millis(unsafe { ext_timestamp.get()() diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index e161d5b887..d3510e6baa 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -10,10 +10,12 @@ integer-sqrt = { version = "0.1.2" } serde = { version = "1.0", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } log = { version = "0.4", optional = true } paste = { version = "0.1"} +rand = { version = "0.7.0", optional = true } [dev-dependencies] serde_json = "1.0" @@ -29,4 +31,6 @@ std = [ "runtime_io/std", "codec/std", "primitives/std", + "app-crypto/std", + "rand", ] diff --git a/core/sr-primitives/src/generic/checked_extrinsic.rs b/core/sr-primitives/src/generic/checked_extrinsic.rs index 04ccd1162c..44a0758267 100644 --- a/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -45,11 +45,10 @@ for where AccountId: Member + MaybeDisplay, Call: Member + Dispatchable, - Extra: SignedExtension, + Extra: SignedExtension, Origin: From>, { type AccountId = AccountId; - type Call = Call; fn sender(&self) -> Option<&Self::AccountId> { @@ -61,9 +60,9 @@ where len: usize, ) -> TransactionValidity { if let Some((ref id, ref extra)) = self.signed { - Extra::validate(extra, id, info, len).into() + Extra::validate(extra, id, &self.function, info, len).into() } else { - match Extra::validate_unsigned(info, len) { + match Extra::validate_unsigned(&self.function, info, len) { Ok(extra) => match U::validate_unsigned(&self.function) { TransactionValidity::Valid(v) => TransactionValidity::Valid(v.combine_with(extra)), @@ -79,10 +78,10 @@ where len: usize, ) -> Result { let maybe_who = if let Some((id, extra)) = self.signed { - Extra::pre_dispatch(extra, &id, info, len)?; + Extra::pre_dispatch(extra, &id, &self.function, info, len)?; Some(id) } else { - Extra::pre_dispatch_unsigned(info, len)?; + Extra::pre_dispatch_unsigned(&self.function, info, len)?; None }; Ok(self.function.dispatch(Origin::from(maybe_who))) diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index d87c9e045f..17157c4a19 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -234,6 +234,7 @@ mod tests { struct TestExtra; impl SignedExtension for TestExtra { type AccountId = u64; + type Call = (); type AdditionalSigned = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } } diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 1c9def98c1..3c4c69f084 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -31,10 +31,13 @@ pub use rstd; #[doc(hidden)] pub use paste; +#[doc(hidden)] +pub use app_crypto; + #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::{prelude::*, ops, convert::TryInto}; +use rstd::{prelude::*, ops, convert::{TryInto, TryFrom}}; use primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; @@ -52,7 +55,8 @@ pub mod transaction_validity; pub use generic::{DigestItem, Digest}; /// Re-export this since it's part of the API of this crate. -pub use primitives::crypto::{key_types, KeyTypeId}; +pub use primitives::crypto::{key_types, KeyTypeId, CryptoType}; +pub use app_crypto::AppKey; /// A message indicating an invalid signature in extrinsic. pub const BAD_SIGNATURE: &str = "bad signature in extrinsic"; @@ -660,8 +664,13 @@ pub struct AnySignature(H512); impl Verify for AnySignature { type Signer = sr25519::Public; fn verify>(&self, mut msg: L, signer: &sr25519::Public) -> bool { - runtime_io::sr25519_verify(self.0.as_fixed_bytes(), msg.get(), &signer.0) || - runtime_io::ed25519_verify(self.0.as_fixed_bytes(), msg.get(), &signer.0) + sr25519::Signature::try_from(self.0.as_fixed_bytes().as_ref()) + .map(|s| runtime_io::sr25519_verify(&s, msg.get(), &signer)) + .unwrap_or(false) + || ed25519::Signature::try_from(self.0.as_fixed_bytes().as_ref()) + .and_then(|s| ed25519::Public::try_from(signer.0.as_ref()).map(|p| (s, p))) + .map(|(s, p)| runtime_io::ed25519_verify(&s, msg.get(), &p)) + .unwrap_or(false) } } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 3d55e9c4b9..c91c8366c1 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -20,46 +20,84 @@ use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializ use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; use crate::traits::{ - self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, TypedKey, DispatchError, DispatchResult, + self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, DispatchError, DispatchResult, ValidateUnsigned, SignedExtension, Dispatchable, }; use crate::{generic, KeyTypeId}; use crate::weights::{GetDispatchInfo, DispatchInfo}; pub use primitives::H256; -use primitives::U256; -use primitives::ed25519::{Public as AuthorityId}; +use primitives::{crypto::{CryptoType, Dummy, key_types, Public}, U256}; use crate::transaction_validity::TransactionValidity; /// Authority Id -#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug, Hash, Serialize, Deserialize)] pub struct UintAuthorityId(pub u64); -impl Into for UintAuthorityId { - fn into(self) -> AuthorityId { + +impl UintAuthorityId { + /// Convert this authority id into a public key. + pub fn to_public_key(&self) -> T { let bytes: [u8; 32] = U256::from(self.0).into(); - AuthorityId(bytes) + T::from_slice(&bytes) } } -/// The key-type of the `UintAuthorityId` -pub const UINT_DUMMY_KEY: KeyTypeId = 0xdeadbeef; - -impl TypedKey for UintAuthorityId { - const KEY_TYPE: KeyTypeId = UINT_DUMMY_KEY; +impl CryptoType for UintAuthorityId { + type Pair = Dummy; } impl AsRef<[u8]> for UintAuthorityId { fn as_ref(&self) -> &[u8] { - let ptr = self.0 as *const _; - // It's safe to do this here since `UintAuthorityId` is `u64`. - unsafe { std::slice::from_raw_parts(ptr, 8) } + unsafe { + std::slice::from_raw_parts(&self.0 as *const u64 as *const _, std::mem::size_of::()) + } + } +} + +impl app_crypto::RuntimeAppPublic for UintAuthorityId { + type Signature = u64; + + fn all() -> Vec { + unimplemented!("`all()` not available for `UintAuthorityId`.") + } + + #[cfg(feature = "std")] + fn generate_pair(_: Option<&str>) -> Self { + use rand::RngCore; + UintAuthorityId(rand::thread_rng().next_u64()) + } + + #[cfg(not(feature = "std"))] + fn generate_pair(_: Option<&str>) -> Self { + unimplemented!("`generate_pair` not implemented for `UIntAuthorityId` on `no_std`.") + } + + fn sign>(&self, msg: &M) -> Option { + let mut signature = [0u8; 8]; + msg.as_ref().iter() + .chain(rstd::iter::repeat(&42u8)) + .take(8) + .enumerate() + .for_each(|(i, v)| { signature[i] = *v; }); + + Some(u64::from_le_bytes(signature)) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + let mut msg_signature = [0u8; 8]; + msg.as_ref().iter() + .chain(rstd::iter::repeat(&42)) + .take(8) + .enumerate() + .for_each(|(i, v)| { msg_signature[i] = *v; }); + + u64::from_le_bytes(msg_signature) == *signature } } impl OpaqueKeys for UintAuthorityId { type KeyTypeIds = std::iter::Cloned>; - fn key_ids() -> Self::KeyTypeIds { [UINT_DUMMY_KEY].iter().cloned() } + fn key_ids() -> Self::KeyTypeIds { [key_types::DUMMY].iter().cloned() } // Unsafe, i know, but it's test code and it's just there because it's really convenient to // keep `UintAuthorityId` as a u64 under the hood. fn get_raw(&self, _: KeyTypeId) -> &[u8] { @@ -155,8 +193,7 @@ impl traits::Extrinsic for ExtrinsicWrapper { } } -impl serde::Serialize for ExtrinsicWrapper -{ +impl serde::Serialize for ExtrinsicWrapper { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } @@ -249,13 +286,13 @@ impl traits::Extrinsic for TestXt impl Applyable for TestXt where Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug + Dispatchable, - Extra: SignedExtension, + Extra: SignedExtension, Origin: From> { type AccountId = u64; type Call = Call; - fn sender(&self) -> Option<&u64> { self.0.as_ref().map(|x| &x.0) } + fn sender(&self) -> Option<&Self::AccountId> { self.0.as_ref().map(|x| &x.0) } /// Checks to see if this is a valid *transaction*. It returns information on it if so. fn validate>(&self, @@ -272,10 +309,10 @@ impl Applyable for TestXt where len: usize, ) -> Result { let maybe_who = if let Some((who, extra)) = self.0 { - Extra::pre_dispatch(extra, &who, info, len)?; + Extra::pre_dispatch(extra, &who, &self.1, info, len)?; Some(who) } else { - Extra::pre_dispatch_unsigned(info, len)?; + Extra::pre_dispatch_unsigned(&self.1, info, len)?; None }; Ok(self.1.dispatch(maybe_who.into())) diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index ce67a888bc..442aa9b0ac 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -26,7 +26,6 @@ use crate::codec::{Codec, Encode, Decode, HasCompact}; use crate::transaction_validity::{ValidTransaction, TransactionValidity}; use crate::generic::{Digest, DigestItem}; use crate::weights::DispatchInfo; -pub use primitives::crypto::TypedKey; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, @@ -60,14 +59,14 @@ pub trait Verify { impl Verify for primitives::ed25519::Signature { type Signer = primitives::ed25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - runtime_io::ed25519_verify(self.as_ref(), msg.get(), signer) + runtime_io::ed25519_verify(self, msg.get(), signer) } } impl Verify for primitives::sr25519::Signature { type Signer = primitives::sr25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - runtime_io::sr25519_verify(self.as_ref(), msg.get(), signer) + runtime_io::sr25519_verify(self, msg.get(), signer) } } @@ -745,7 +744,7 @@ pub enum DispatchError { Payment, /// General error to do with the exhaustion of block resources. - Resource, + Exhausted, /// General error to do with the permissions of the sender. NoPermission, @@ -761,16 +760,13 @@ pub enum DispatchError { /// General error to do with the transaction's proofs (e.g. signature). BadProof, - -/* /// General error to do with actually executing the dispatched logic. - User(&'static str),*/ } impl From for i8 { fn from(e: DispatchError) -> i8 { match e { DispatchError::Payment => -64, - DispatchError::Resource => -65, + DispatchError::Exhausted => -65, DispatchError::NoPermission => -66, DispatchError::BadState => -67, DispatchError::Stale => -68, @@ -805,6 +801,9 @@ pub trait SignedExtension: /// The type which encodes the sender identity. type AccountId; + /// The type which encodes the call to be dispatched. + type Call; + /// Any additional data that will go into the signed payload. This may be created dynamically /// from the transaction using the `additional_signed` function. type AdditionalSigned: Encode; @@ -813,35 +812,45 @@ pub trait SignedExtension: /// also perform any pre-signature-verification checks and return an error if needed. fn additional_signed(&self) -> Result; - /// Validate a signed transaction for the transaction queue. + /// Validate a signed transaction for the transaction queue. fn validate( &self, _who: &Self::AccountId, + _call: &Self::Call, _info: DispatchInfo, _len: usize, - ) -> Result { Ok(Default::default()) } + ) -> Result { + Ok(Default::default()) + } /// Do any pre-flight stuff for a signed transaction. fn pre_dispatch( self, who: &Self::AccountId, + call: &Self::Call, info: DispatchInfo, len: usize, - ) -> Result<(), DispatchError> { self.validate(who, info, len).map(|_| ()) } + ) -> Result<(), DispatchError> { + self.validate(who, call, info, len).map(|_| ()) + } /// Validate an unsigned transaction for the transaction queue. Normally the default /// implementation is fine since `ValidateUnsigned` is a better way of recognising and /// validating unsigned transactions. fn validate_unsigned( + _call: &Self::Call, _info: DispatchInfo, _len: usize, ) -> Result { Ok(Default::default()) } /// Do any pre-flight stuff for a unsigned transaction. fn pre_dispatch_unsigned( + call: &Self::Call, info: DispatchInfo, len: usize, - ) -> Result<(), DispatchError> { Self::validate_unsigned(info, len).map(|_| ()) } + ) -> Result<(), DispatchError> { + Self::validate_unsigned(call, info, len).map(|_| ()) + } } macro_rules! tuple_impl_indexed { @@ -851,9 +860,11 @@ macro_rules! tuple_impl_indexed { ([$($direct:ident)+] ; [$($index:tt,)+]) => { impl< AccountId, - $($direct: SignedExtension),+ + Call, + $($direct: SignedExtension),+ > SignedExtension for ($($direct),+,) { type AccountId = AccountId; + type Call = Call; type AdditionalSigned = ($($direct::AdditionalSigned,)+); fn additional_signed(&self) -> Result { Ok(( $(self.$index.additional_signed()?,)+ )) @@ -861,33 +872,37 @@ macro_rules! tuple_impl_indexed { fn validate( &self, who: &Self::AccountId, + call: &Self::Call, info: DispatchInfo, len: usize, ) -> Result { - let aggregator = vec![$(<$direct as SignedExtension>::validate(&self.$index, who, info, len)?),+]; + let aggregator = vec![$(<$direct as SignedExtension>::validate(&self.$index, who, call, info, len)?),+]; Ok(aggregator.into_iter().fold(ValidTransaction::default(), |acc, a| acc.combine_with(a))) } fn pre_dispatch( self, who: &Self::AccountId, + call: &Self::Call, info: DispatchInfo, len: usize, ) -> Result<(), DispatchError> { - $(self.$index.pre_dispatch(who, info, len)?;)+ + $(self.$index.pre_dispatch(who, call, info, len)?;)+ Ok(()) } fn validate_unsigned( + call: &Self::Call, info: DispatchInfo, len: usize, ) -> Result { - let aggregator = vec![$($direct::validate_unsigned(info, len)?),+]; + let aggregator = vec![$($direct::validate_unsigned(call, info, len)?),+]; Ok(aggregator.into_iter().fold(ValidTransaction::default(), |acc, a| acc.combine_with(a))) } fn pre_dispatch_unsigned( + call: &Self::Call, info: DispatchInfo, len: usize, ) -> Result<(), DispatchError> { - $($direct::pre_dispatch_unsigned(info, len)?;)+ + $($direct::pre_dispatch_unsigned(call, info, len)?;)+ Ok(()) } } @@ -910,11 +925,12 @@ macro_rules! tuple_impl_indexed { #[allow(non_snake_case)] tuple_impl_indexed!(A, B, C, D, E, F, G, H, I, J, ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,); -/// Only for base bone testing when you don't care about signed extensions at all.\ +/// Only for bare bone testing when you don't care about signed extensions at all. #[cfg(feature = "std")] impl SignedExtension for () { type AccountId = u64; type AdditionalSigned = (); + type Call = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } } @@ -1208,14 +1224,14 @@ macro_rules! count { /// just the bytes of the key. /// /// ```rust -/// use sr_primitives::{impl_opaque_keys, key_types, KeyTypeId}; +/// use sr_primitives::{impl_opaque_keys, key_types, KeyTypeId, app_crypto::{sr25519, ed25519}}; /// /// impl_opaque_keys! { /// pub struct Keys { /// #[id(key_types::ED25519)] -/// pub ed25519: [u8; 32], +/// pub ed25519: ed25519::AppPublic, /// #[id(key_types::SR25519)] -/// pub sr25519: [u8; 32], +/// pub sr25519: sr25519::AppPublic, /// } /// } /// ``` @@ -1237,22 +1253,34 @@ macro_rules! impl_opaque_keys { )* } + impl $name { + /// Generate a set of keys with optionally using the given seed. + /// + /// The generated key pairs are stored in the keystore. + /// + /// Returns the concatenated SCALE encoded public keys. + pub fn generate(seed: Option<&str>) -> $crate::rstd::vec::Vec { + let keys = Self{ + $( + $field: <$type as $crate::app_crypto::RuntimeAppPublic>::generate_pair(seed), + )* + }; + $crate::codec::Encode::encode(&keys) + } + } + impl $crate::traits::OpaqueKeys for $name { type KeyTypeIds = $crate::rstd::iter::Cloned< $crate::rstd::slice::Iter<'static, $crate::KeyTypeId> >; fn key_ids() -> Self::KeyTypeIds { - [ - $($key_id),* - ].iter().cloned() + [ $($key_id),* ].iter().cloned() } fn get_raw(&self, i: $crate::KeyTypeId) -> &[u8] { match i { - $( - i if i == $key_id => self.$field.as_ref(), - )* + $( i if i == $key_id => self.$field.as_ref(), )* _ => &[], } } diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index 55d66ea5f8..332751c927 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" primitives = { package = "substrate-primitives", path = "../../core/primitives" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index bb00cfcbb7..bf5b96e436 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" hash-db = "0.15.0" trie-db = "0.15.0" trie-root = "0.15.0" diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 53ab731671..85f5fa28b6 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -168,7 +168,12 @@ impl Externalities for BasicExternalities where H::Out: Ord { } fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { - warn!("Call to non-existent out offchain externalities set."); + warn!("Call to non-existent offchain externalities set."); + None + } + + fn keystore(&self) -> Option { + warn!("Call to non-existent keystore."); None } } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 8c54806dd9..f7ff649925 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -22,8 +22,7 @@ use crate::backend::Backend; use crate::changes_trie::{Storage as ChangesTrieStorage, build_changes_trie}; use crate::{Externalities, OverlayedChanges, ChildStorageKey}; use hash_db::Hasher; -use primitives::offchain; -use primitives::storage::well_known_keys::is_child_storage_key; +use primitives::{offchain, storage::well_known_keys::is_child_storage_key, traits::BareCryptoStorePtr}; use trie::{MemoryDB, default_child_trie_root}; use trie::trie_types::Layout; @@ -84,6 +83,8 @@ where /// /// If None, some methods from the trait might not be supported. offchain_externalities: Option<&'a mut O>, + /// The keystore that manages the keys of the node. + keystore: Option, /// Dummy usage of N arg. _phantom: ::std::marker::PhantomData, } @@ -103,6 +104,7 @@ where backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_externalities: Option<&'a mut O>, + keystore: Option, ) -> Self { Ext { overlay, @@ -111,6 +113,7 @@ where changes_trie_storage, changes_trie_transaction: None, offchain_externalities, + keystore, _phantom: Default::default(), } } @@ -333,6 +336,10 @@ where fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { self.offchain_externalities.as_mut().map(|x| &mut **x as _) } + + fn keystore(&self) -> Option { + self.keystore.clone() + } } #[cfg(test)] @@ -375,7 +382,7 @@ mod tests { fn storage_changes_root_is_none_when_storage_is_not_provided() { let mut overlay = prepare_overlay_with_changes(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, None, None); + let mut ext = TestExt::new(&mut overlay, &backend, None, None, None); assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } @@ -385,7 +392,7 @@ mod tests { overlay.changes_trie_config = None; let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None, None); assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } @@ -394,11 +401,11 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - let root = hex!("bb0c2ef6e1d36d5490f9766cfcc7dfe2a6ca804504c3bb206053890d6dd02376").into(); - - assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), - Some(root)); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None, None); + assert_eq!( + ext.storage_changes_root(Default::default()).unwrap(), + Some(hex!("bb0c2ef6e1d36d5490f9766cfcc7dfe2a6ca804504c3bb206053890d6dd02376").into()), + ); } #[test] @@ -407,10 +414,10 @@ mod tests { overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - let root = hex!("96f5aae4690e7302737b6f9b7f8567d5bbb9eac1c315f80101235a92d9ec27f4").into(); - - assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), - Some(root)); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None, None); + assert_eq!( + ext.storage_changes_root(Default::default()).unwrap(), + Some(hex!("96f5aae4690e7302737b6f9b7f8567d5bbb9eac1c315f80101235a92d9ec27f4").into()), + ); } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index b98228e9b2..6279966cae 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -25,6 +25,7 @@ use hash_db::Hasher; use codec::{Decode, Encode}; use primitives::{ storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain, + traits::BareCryptoStorePtr, }; pub mod backend; @@ -61,6 +62,7 @@ pub use proving_backend::{ pub use trie_backend_essence::{TrieBackendStorage, Storage}; pub use trie_backend::TrieBackend; + /// A wrapper around a child storage key. /// /// This wrapper ensures that the child storage key is correct and properly used. It is @@ -224,6 +226,9 @@ pub trait Externalities { /// Returns offchain externalities extension if present. fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities>; + + /// Returns the keystore. + fn keystore(&self) -> Option; } /// An implementation of offchain extensions that should never be triggered. @@ -247,53 +252,6 @@ impl offchain::Externalities for NeverOffchainExt { unreachable!() } - fn pubkey( - &self, - _key: offchain::CryptoKey, - ) -> Result, ()> { - unreachable!() - } - - fn new_crypto_key( - &mut self, - _crypto: offchain::CryptoKind, - ) -> Result { - unreachable!() - } - - fn encrypt( - &mut self, - _key: offchain::CryptoKey, - _data: &[u8], - ) -> Result, ()> { - unreachable!() - } - - fn decrypt( - &mut self, - _key: offchain::CryptoKey, - _data: &[u8], - ) -> Result, ()> { - unreachable!() - } - - fn sign( - &mut self, - _key: offchain::CryptoKey, - _data: &[u8], - ) -> Result, ()> { - unreachable!() - } - - fn verify( - &mut self, - _key: offchain::CryptoKey, - _msg: &[u8], - _signature: &[u8], - ) -> Result { - unreachable!() - } - fn timestamp(&mut self) -> offchain::Timestamp { unreachable!() } @@ -481,6 +439,7 @@ pub fn new<'a, H, N, B, T, O, Exec>( exec: &'a Exec, method: &'a str, call_data: &'a [u8], + keystore: Option, ) -> StateMachine<'a, H, N, B, T, O, Exec> { StateMachine { backend, @@ -490,6 +449,7 @@ pub fn new<'a, H, N, B, T, O, Exec>( exec, method, call_data, + keystore, _hasher: PhantomData, } } @@ -503,6 +463,7 @@ pub struct StateMachine<'a, H, N, B, T, O, Exec> { exec: &'a Exec, method: &'a str, call_data: &'a [u8], + keystore: Option, _hasher: PhantomData<(H, N)>, } @@ -560,6 +521,7 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where self.backend, self.changes_trie_storage, self.offchain_ext.as_mut().map(|x| &mut **x), + self.keystore.clone(), ); let (result, was_native) = self.exec.call( &mut externalities, @@ -707,6 +669,7 @@ pub fn prove_execution( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result<(Vec, Vec>), Box> where B: Backend, @@ -716,7 +679,7 @@ where { let trie_backend = backend.as_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data) + prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data, keystore) } /// Prove execution using the given trie backend, overlayed changes, and call executor. @@ -734,6 +697,7 @@ pub fn prove_execution_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result<(Vec, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, @@ -750,6 +714,7 @@ where exec, method, call_data, + keystore, _hasher: PhantomData, }; let (result, _, _) = sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -769,6 +734,7 @@ pub fn execution_proof_check( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result, Box> where H: Hasher, @@ -776,7 +742,7 @@ where H::Out: Ord + 'static, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; - execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) + execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data, keystore) } /// Check execution proof on proving backend, generated by `prove_execution` call. @@ -786,6 +752,7 @@ pub fn execution_proof_check_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result, Box> where H: Hasher, @@ -800,6 +767,7 @@ where exec, method, call_data, + keystore, _hasher: PhantomData, }; sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -1050,6 +1018,7 @@ mod tests { }, "test", &[], + None, ).execute( ExecutionStrategy::NativeWhenPossible ).unwrap().0, vec![66]); @@ -1071,6 +1040,7 @@ mod tests { }, "test", &[], + None, ).execute( ExecutionStrategy::NativeElseWasm ).unwrap().0, vec![66]); @@ -1092,6 +1062,7 @@ mod tests { }, "test", &[], + None, ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( ExecutionManager::Both(|we, _ne| { consensus_failed = true; @@ -1114,13 +1085,26 @@ mod tests { // fetch execution proof from 'remote' full node let remote_backend = trie_backend::tests::test_trie(); - let remote_root = remote_backend.storage_root(::std::iter::empty()).0; - let (remote_result, remote_proof) = prove_execution(remote_backend, - &mut Default::default(), &executor, "test", &[]).unwrap(); + let remote_root = remote_backend.storage_root(std::iter::empty()).0; + let (remote_result, remote_proof) = prove_execution( + remote_backend, + &mut Default::default(), + &executor, + "test", + &[], + None, + ).unwrap(); // check proof locally - let local_result = execution_proof_check::(remote_root, remote_proof, - &mut Default::default(), &executor, "test", &[]).unwrap(); + let local_result = execution_proof_check::( + remote_root, + remote_proof, + &mut Default::default(), + &executor, + "test", + &[], + None, + ).unwrap(); // check that both results are correct assert_eq!(remote_result, vec![66]); @@ -1151,7 +1135,13 @@ mod tests { { let changes_trie_storage = InMemoryChangesTrieStorage::::new(); - let mut ext = Ext::new(&mut overlay, backend, Some(&changes_trie_storage), NeverOffchainExt::new()); + let mut ext = Ext::new( + &mut overlay, + backend, + Some(&changes_trie_storage), + NeverOffchainExt::new(), + None, + ); ext.clear_prefix(b"ab"); } overlay.commit_prospective(); @@ -1180,7 +1170,8 @@ mod tests { &mut overlay, backend, Some(&changes_trie_storage), - NeverOffchainExt::new() + NeverOffchainExt::new(), + None, ); ext.set_child_storage( @@ -1252,41 +1243,47 @@ mod tests { #[test] fn cannot_change_changes_trie_config() { - assert!(new( - &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::::new()), - NeverOffchainExt::new(), - &mut Default::default(), - &DummyCodeExecutor { - change_changes_trie_config: true, - native_available: false, - native_succeeds: true, - fallback_succeeds: true, - }, - "test", - &[], - ).execute( - ExecutionStrategy::NativeWhenPossible - ).is_err()); + assert!( + new( + &trie_backend::tests::test_trie(), + Some(&InMemoryChangesTrieStorage::::new()), + NeverOffchainExt::new(), + &mut Default::default(), + &DummyCodeExecutor { + change_changes_trie_config: true, + native_available: false, + native_succeeds: true, + fallback_succeeds: true, + }, + "test", + &[], + None, + ) + .execute(ExecutionStrategy::NativeWhenPossible) + .is_err() + ); } #[test] fn cannot_change_changes_trie_config_with_native_else_wasm() { - assert!(new( - &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::::new()), - NeverOffchainExt::new(), - &mut Default::default(), - &DummyCodeExecutor { - change_changes_trie_config: true, - native_available: false, - native_succeeds: true, - fallback_succeeds: true, - }, - "test", - &[], - ).execute( - ExecutionStrategy::NativeElseWasm - ).is_err()); + assert!( + new( + &trie_backend::tests::test_trie(), + Some(&InMemoryChangesTrieStorage::::new()), + NeverOffchainExt::new(), + &mut Default::default(), + &DummyCodeExecutor { + change_changes_trie_config: true, + native_available: false, + native_succeeds: true, + fallback_succeeds: true, + }, + "test", + &[], + None, + ) + .execute(ExecutionStrategy::NativeElseWasm) + .is_err() + ); } } diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index 8c4160760b..edc03baa39 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -371,6 +371,7 @@ mod tests { &backend, Some(&changes_trie_storage), crate::NeverOffchainExt::new(), + None, ); const ROOT: [u8; 32] = hex!("39245109cef3758c2eed2ccba8d9b370a917850af3824bc8348d505df2c298fa"); diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 89290a59e2..0722eda456 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -25,8 +25,9 @@ use crate::changes_trie::{ build_changes_trie, InMemoryStorage as ChangesTrieInMemoryStorage, BlockNumber as ChangesTrieBlockNumber, }; -use primitives::offchain; -use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; +use primitives::{ + storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}, traits::BareCryptoStorePtr, offchain +}; use codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; @@ -40,6 +41,7 @@ pub struct TestExternalities { backend: InMemory, changes_trie_storage: ChangesTrieInMemoryStorage, offchain: Option>, + keystore: Option, } impl TestExternalities { @@ -84,6 +86,7 @@ impl TestExternalities { changes_trie_storage: ChangesTrieInMemoryStorage::new(), backend: backend.into(), offchain: None, + keystore: None, } } @@ -263,6 +266,10 @@ impl Externalities for TestExternalities .as_mut() .map(|x| &mut **x as _) } + + fn keystore(&self) -> Option { + self.keystore.clone() + } } #[cfg(test)] diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index 540305435f..8647462739 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] bytes = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" futures01 = { package = "futures", version = "0.1" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } futures-timer = "0.2.1" diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 175996a432..d0d4a54b0f 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -30,7 +30,7 @@ pub use keyring::{ ed25519::Keyring as Ed25519Keyring, sr25519::Keyring as Sr25519Keyring, }; -pub use primitives::Blake2Hasher; +pub use primitives::{Blake2Hasher, traits::BareCryptoStorePtr}; pub use sr_primitives::{StorageOverlay, ChildrenStorageOverlay}; pub use state_machine::ExecutionStrategy; @@ -73,6 +73,7 @@ pub struct TestClientBuilder { child_storage_extension: HashMap, Vec<(Vec, Vec)>>, backend: Arc, _executor: std::marker::PhantomData, + keystore: Option, } impl Default for TestClientBuilder< @@ -100,11 +101,7 @@ impl TestClientBuilder< } } -impl TestClientBuilder< - Executor, - Backend, - G, -> { +impl TestClientBuilder { /// Create a new instance of the test client builder. pub fn with_backend(backend: Arc) -> Self { TestClientBuilder { @@ -113,9 +110,16 @@ impl TestClientBuilder< child_storage_extension: Default::default(), genesis_init: Default::default(), _executor: Default::default(), + keystore: None, } } + /// Set the keystore that should be used by the externalities. + pub fn set_keystore(mut self, keystore: BareCryptoStorePtr) -> Self { + self.keystore = Some(keystore); + self + } + /// Alter the genesis storage parameters. pub fn genesis_init_mut(&mut self) -> &mut G { &mut self.genesis_init @@ -184,7 +188,7 @@ impl TestClientBuilder< self.backend.clone(), executor, storage, - self.execution_strategies + self.execution_strategies, ).expect("Creates new client"); let longest_chain = client::LongestChain::new(self.backend); @@ -200,7 +204,7 @@ impl TestClientBuilder< > { /// Build the test client with the given native executor. pub fn build_with_native_executor( - self, + mut self, executor: I, ) -> ( client::Client< @@ -217,7 +221,7 @@ impl TestClientBuilder< Block: BlockT::Out>, { let executor = executor.into().unwrap_or_else(|| executor::NativeExecutor::new(None)); - let executor = LocalCallExecutor::new(self.backend.clone(), executor); + let executor = LocalCallExecutor::new(self.backend.clone(), executor, self.keystore.take()); self.build_with_executor(executor) } diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 03c95a5c27..98d110a574 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -12,6 +12,7 @@ codec = { package = "parity-scale-codec", version = "1.0.0", default-features = keyring = { package = "substrate-keyring", path = "../keyring", optional = true } substrate-client = { path = "../client", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } aura-primitives = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } @@ -67,4 +68,5 @@ std = [ "srml-babe/std", "srml-timestamp/std", "srml-system/std", + "app-crypto/std", ] diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs index 36a2fd3e86..03f7bb3ddb 100644 --- a/core/test-runtime/client/src/lib.rs +++ b/core/test-runtime/client/src/lib.rs @@ -26,6 +26,7 @@ pub use block_builder_ext::BlockBuilderExt; pub use generic_test_client::*; pub use runtime; +use primitives::sr25519; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; @@ -183,9 +184,9 @@ fn genesis_config(support_changes_trie: bool, heap_pages_override: Option) GenesisConfig::new( support_changes_trie, vec![ - Sr25519Keyring::Alice.into(), - Sr25519Keyring::Bob.into(), - Sr25519Keyring::Charlie.into(), + sr25519::Public::from(Sr25519Keyring::Alice).into(), + sr25519::Public::from(Sr25519Keyring::Bob).into(), + sr25519::Public::from(Sr25519Keyring::Charlie).into(), ], vec![ AccountKeyring::Alice.into(), AccountKeyring::Bob.into(), @@ -210,9 +211,16 @@ pub fn new_light() -> client::Client Option { if let Extrinsic::IncludeData(_) = *self { @@ -149,8 +150,8 @@ impl ExtrinsicT for Extrinsic { } } - fn new_unsigned(_call: Self::Call) -> Option { - None + fn new_unsigned(call: Self::Call) -> Option { + Some(call) } } @@ -267,6 +268,14 @@ cfg_if! { /// Returns if no block was initialized. #[skip_initialize_block] fn without_initialize_block() -> bool; + /// Test that `ed25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `ed25519` and the public key. + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic); + /// Test that `sr25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `sr25519`. + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic); } } } else { @@ -300,6 +309,14 @@ cfg_if! { /// Returns if no block was initialized. #[skip_initialize_block] fn without_initialize_block() -> bool; + /// Test that `ed25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `ed25519` and the public key. + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic); + /// Test that `sr25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `sr25519`. + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic); } } } @@ -340,6 +357,7 @@ parameter_types! { impl srml_system::Trait for Runtime { type Origin = Origin; + type Call = Extrinsic; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -545,11 +563,24 @@ cfg_if! { fn take_block_number() -> Option { system::take_block_number() } + + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic) { + test_ed25519_crypto() + } + + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { + test_sr25519_crypto() + } } impl aura_primitives::AuraApi for Runtime { fn slot_duration() -> u64 { 1000 } - fn authorities() -> Vec { system::authorities() } + fn authorities() -> Vec { + system::authorities().into_iter().map(|a| { + let authority: sr25519::Public = a.into(); + AuraId::from(authority) + }).collect() + } } impl babe_primitives::BabeApi for Runtime { @@ -736,11 +767,24 @@ cfg_if! { fn take_block_number() -> Option { system::take_block_number() } + + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic) { + test_ed25519_crypto() + } + + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { + test_sr25519_crypto() + } } impl aura_primitives::AuraApi for Runtime { fn slot_duration() -> u64 { 1000 } - fn authorities() -> Vec { system::authorities() } + fn authorities() -> Vec { + system::authorities().into_iter().map(|a| { + let authority: sr25519::Public = a.into(); + AuraId::from(authority) + }).collect() + } } impl babe_primitives::BabeApi for Runtime { @@ -776,6 +820,36 @@ cfg_if! { } } +fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic) { + let public0 = ed25519::AppPublic::generate_pair(None); + let public1 = ed25519::AppPublic::generate_pair(None); + let public2 = ed25519::AppPublic::generate_pair(None); + + let all = ed25519::AppPublic::all(); + assert!(all.contains(&public0)); + assert!(all.contains(&public1)); + assert!(all.contains(&public2)); + + let signature = public0.sign(&"ed25519").expect("Generates a valid `ed25519` signature."); + assert!(public0.verify(&"ed25519", &signature)); + (signature, public0) +} + +fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { + let public0 = sr25519::AppPublic::generate_pair(None); + let public1 = sr25519::AppPublic::generate_pair(None); + let public2 = sr25519::AppPublic::generate_pair(None); + + let all = sr25519::AppPublic::all(); + assert!(all.contains(&public0)); + assert!(all.contains(&public1)); + assert!(all.contains(&public2)); + + let signature = public0.sign(&"sr25519").expect("Generates a valid `sr25519` signature."); + assert!(public0.verify(&"sr25519", &signature)); + (signature, public0) +} + #[cfg(test)] mod tests { use substrate_test_runtime_client::{ diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index c108672c83..a1e407bd6e 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -274,8 +274,7 @@ fn execute_transfer_backend(tx: &Transfer) -> ApplyResult { } fn execute_new_authorities_backend(new_authorities: &[AuthorityId]) -> ApplyResult { - let new_authorities: Vec = new_authorities.iter().cloned().collect(); - ::put(new_authorities); + NewAuthorities::put(new_authorities.to_vec()); Ok(ApplyOutcome::Success) } diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index c18a50778d..747c39a165 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -9,7 +9,7 @@ derive_more = "0.14.0" futures = "0.1" log = "0.4" codec = { package = "parity-scale-codec", version = "1.0.0" } -parking_lot = "0.8.0" +parking_lot = "0.9.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } primitives = { package = "substrate-primitives", path = "../primitives" } diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 8010b07ac4..4dc7ce69cf 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" derive_more = "0.14.0" futures = "0.1" log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" serde = { version = "1.0", features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index ea48ff7f68..4112452b27 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -16,7 +16,7 @@ ctrlc = { version = "3.0", features = ["termination"] } log = "0.4" tokio = "0.1" exit-future = "0.1" -parking_lot = "0.8.0" +parking_lot = "0.9.0" codec = { package = "parity-scale-codec", version = "1.0.0" } trie-root = "0.15.0" sr-io = { path = "../core/sr-io" } @@ -28,6 +28,8 @@ inherents = { package = "substrate-inherents", path = "../core/inherents" } transaction-pool = { package = "substrate-transaction-pool", path = "../core/transaction-pool" } network = { package = "substrate-network", path = "../core/network" } consensus = { package = "substrate-consensus-aura", path = "../core/consensus/aura" } +aura-primitives = { package = "substrate-consensus-aura-primitives", path = "../core/consensus/aura/primitives" } +grandpa-primitives = { package = "substrate-finality-grandpa-primitives", path = "../core/finality-grandpa/primitives" } substrate-client = { path = "../core/client" } basic-authorship = { package = "substrate-basic-authorship", path = "../core/basic-authorship" } node-template-runtime = { path = "runtime" } diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 878374cf6a..437da9d973 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -13,6 +13,7 @@ runtime-io = { package = "sr-io", path = "../../core/sr-io", default_features = version = { package = "sr-version", path = "../../core/sr-version", default_features = false } support = { package = "srml-support", path = "../../srml/support", default_features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default_features = false } +substrate-session = { path = "../../core/session", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default_features = false } aura = { package = "srml-aura", path = "../../srml/aura", default_features = false } executive = { package = "srml-executive", path = "../../srml/executive", default_features = false } @@ -50,5 +51,6 @@ std = [ "safe-mix/std", "consensus-aura/std", "offchain-primitives/std", + "substrate-session/std", ] no_std = [] diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 7b2201c8ef..2b9220c6e5 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -9,8 +9,11 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); use rstd::prelude::*; -use primitives::{ed25519, sr25519, OpaqueMetadata}; -use sr_primitives::{ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str}; +use primitives::{sr25519, OpaqueMetadata, crypto::key_types}; +use sr_primitives::{ + ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, + impl_opaque_keys, +}; use sr_primitives::traits::{NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto}; use sr_primitives::weights::Weight; use client::{ @@ -30,10 +33,10 @@ pub use sr_primitives::{Permill, Perbill}; pub use support::{StorageValue, construct_runtime, parameter_types}; /// Alias to the signature scheme used for Aura authority signatures. -pub type AuraSignature = ed25519::Signature; +pub type AuraSignature = consensus_aura::sr25519::AuthoritySignature; /// The Ed25519 pub key of an session that belongs to an Aura authority of the chain. -pub type AuraId = ed25519::Public; +pub type AuraId = consensus_aura::sr25519::AuthorityId; /// Alias to pubkey that identifies an account on the chain. pub type AccountId = ::Signer; @@ -71,8 +74,13 @@ pub mod opaque { pub type Block = generic::Block; /// Opaque block identifier type. pub type BlockId = generic::BlockId; - /// Opaque session key type. - pub type SessionKey = AuraId; + + impl_opaque_keys! { + pub struct SessionKeys { + #[id(key_types::AURA)] + pub aura: AuraId, + } + } } /// This runtime version. @@ -104,6 +112,8 @@ parameter_types! { impl system::Trait for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; + /// The aggregated dispatch type that is available for extrinsics. + type Call = Call; /// The lookup mechanism to get account ID from whatever is passed in dispatchers. type Lookup = Indices; /// The index type for storing how many extrinsics an account has signed. @@ -152,6 +162,7 @@ impl indices::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = 5000; } + impl timestamp::Trait for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; @@ -299,4 +310,11 @@ impl_runtime_apis! { Executive::offchain_worker(n) } } + + impl substrate_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + let seed = seed.as_ref().map(|s| rstd::str::from_utf8(&s).expect("Seed is an utf8 string")); + opaque::SessionKeys::generate(seed) + } + } } diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index d0c5144390..baf157a4fe 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -93,6 +93,7 @@ mod tests { } impl system::Trait for Test { type Origin = Origin; + type Call = (); type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/node-template/src/chain_spec.rs b/node-template/src/chain_spec.rs index 3970522b37..65caab70db 100644 --- a/node-template/src/chain_spec.rs +++ b/node-template/src/chain_spec.rs @@ -1,8 +1,9 @@ -use primitives::{ed25519, sr25519, Pair}; +use primitives::{sr25519, Pair}; use node_template_runtime::{ AccountId, GenesisConfig, AuraConfig, BalancesConfig, SudoConfig, IndicesConfig, SystemConfig, WASM_BINARY, AuraId }; +use aura_primitives::sr25519::AuthorityPair as AuraPair; use substrate_service; // Note this is the URL for the telemetry server @@ -23,7 +24,7 @@ pub enum Alternative { } fn authority_key(s: &str) -> AuraId { - ed25519::Pair::from_string(&format!("//{}", s), None) + AuraPair::from_string(&format!("//{}", s), None) .expect("static values are valid; qed") .public() } diff --git a/node-template/src/service.rs b/node-template/src/service.rs index e5d83a1893..31323e11ad 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -15,7 +15,7 @@ use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; use futures::prelude::*; use substrate_client::{self as client, LongestChain}; -use primitives::{ed25519::Pair, Pair as PairT}; +use primitives::{Pair as PairT}; use inherents::InherentDataProviders; use network::{config::DummyFinalityProofRequestBuilder, construct_simple_protocol}; use substrate_executor::native_executor_instance; @@ -43,8 +43,6 @@ construct_simple_protocol! { construct_service_factory! { struct Factory { Block = Block, - ConsensusPair = Pair, - FinalityPair = Pair, RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = Executor, @@ -68,7 +66,7 @@ construct_service_factory! { }, AuthoritySetup = { |service: Self::FullService| { - if let Some(key) = service.authority_key() { + if let Some(key) = None:: { info!("Using authority key {}", key.public()); let proposer = ProposerFactory { client: service.client(), @@ -100,7 +98,7 @@ construct_service_factory! { Self::Block, > { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { - import_queue::<_, _, Pair>( + import_queue::<_, _, aura_primitives::sr25519::AuthorityPair>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, @@ -115,7 +113,7 @@ construct_service_factory! { > { |config: &mut FactoryFullConfiguration, client: Arc>| { let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; - import_queue::<_, _, Pair>( + import_queue::<_, _, aura_primitives::sr25519::AuthorityPair>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index f95f688ac3..184ef9382d 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -30,7 +30,6 @@ grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality- grandpa_primitives = { package = "substrate-finality-grandpa-primitives", path = "../../core/finality-grandpa/primitives" } sr-primitives = { path = "../../core/sr-primitives" } node-executor = { path = "../executor" } -substrate-keystore = { path = "../../core/keystore" } substrate-telemetry = { package = "substrate-telemetry", path = "../../core/telemetry" } structopt = "0.2" transaction-factory = { path = "../../test-utils/transaction-factory" } @@ -42,12 +41,16 @@ finality_tracker = { package = "srml-finality-tracker", path = "../../srml/final contracts = { package = "srml-contracts", path = "../../srml/contracts" } system = { package = "srml-system", path = "../../srml/system" } balances = { package = "srml-balances", path = "../../srml/balances" } +support = { package = "srml-support", path = "../../srml/support", default-features = false } +im_online = { package = "srml-im-online", path = "../../srml/im-online", default-features = false } [dev-dependencies] +keystore = { package = "substrate-keystore", path = "../../core/keystore" } babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } futures03 = { package = "futures-preview", version = "0.3.0-alpha.17" } +tempfile = "3.1" [build-dependencies] cli = { package = "substrate-cli", path = "../../core/cli" } diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 6372146a45..c14a2709c1 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,9 +16,8 @@ //! Substrate chain configurations. -use babe_primitives::AuthorityId as BabeId; -use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto}; -use node_primitives::{AccountId, Balance}; +use primitives::{Pair, Public, crypto::UncheckedInto}; +pub use node_primitives::{AccountId, Balance}; use node_runtime::{ BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig, DemocracyConfig, ElectionsConfig, GrandpaConfig, ImOnlineConfig, IndicesConfig, Perbill, @@ -30,7 +29,9 @@ pub use node_runtime::GenesisConfig; use substrate_service; use hex_literal::hex; use substrate_telemetry::TelemetryEndpoints; -use grandpa::AuthorityId as GrandpaId; +use grandpa_primitives::{AuthorityId as GrandpaId}; +use babe_primitives::{AuthorityId as BabeId}; +use im_online::AuthorityId as ImOnlineId; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -42,11 +43,8 @@ pub fn flaming_fir_config() -> Result { ChainSpec::from_json_bytes(&include_bytes!("../res/flaming-fir.json")[..]) } -fn session_keys(ed_key: ed25519::Public, sr_key: sr25519::Public) -> SessionKeys { - SessionKeys { - ed25519: ed_key, - sr25519: sr_key, - } +fn session_keys(grandpa: GrandpaId, babe: BabeId, im_online: ImOnlineId) -> SessionKeys { + SessionKeys { grandpa, babe, im_online, } } fn staging_testnet_config_genesis() -> GenesisConfig { @@ -56,7 +54,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { // and // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done - let initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId)> = vec![( + let initial_authorities: Vec<(AccountId, AccountId, GrandpaId, BabeId, ImOnlineId)> = vec![( // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq @@ -65,6 +63,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), + // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), ),( // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), @@ -74,6 +74,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), + // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), ),( // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), @@ -83,6 +85,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), + // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), ),( // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), @@ -92,6 +96,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), + // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), )]; // generated with secret: subkey inspect "$secret"/fir @@ -122,7 +128,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { }), session: Some(SessionConfig { keys: initial_authorities.iter().map(|x| { - (x.0.clone(), session_keys(x.3.clone(), x.2.clone())) + (x.0.clone(), session_keys(x.2.clone(), x.3.clone(), x.4.clone())) }).collect::>(), }), staking: Some(StakingConfig { @@ -159,15 +165,16 @@ fn staging_testnet_config_genesis() -> GenesisConfig { key: endowed_accounts[0].clone(), }), babe: Some(BabeConfig { - authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), }), im_online: Some(ImOnlineConfig { gossip_at: 0, - last_new_era_start: 0, + keys: initial_authorities.iter().map(|x| x.4.clone()).collect(), }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), + membership_Instance1: Some(Default::default()), } } @@ -186,58 +193,46 @@ pub fn staging_testnet_config() -> ChainSpec { ) } -/// Helper function to generate AccountId from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId { - sr25519::Pair::from_string(&format!("//{}", seed), None) +/// Helper function to generate a crypto pair from seed +pub fn get_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) .expect("static values are valid; qed") .public() } -/// Helper function to generate BabeId from seed -pub fn get_babe_id_from_seed(seed: &str) -> BabeId { - sr25519::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// Helper function to generate GrandpaId from seed -pub fn get_grandpa_id_from_seed(seed: &str) -> GrandpaId { - ed25519::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} /// Helper function to generate stash, controller and session key from seed -pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, BabeId, GrandpaId) { +pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, GrandpaId, BabeId, ImOnlineId) { ( - get_account_id_from_seed(&format!("{}//stash", seed)), - get_account_id_from_seed(seed), - get_babe_id_from_seed(seed), - get_grandpa_id_from_seed(seed) + get_from_seed::(&format!("{}//stash", seed)), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), ) } /// Helper function to create GenesisConfig for testing pub fn testnet_genesis( - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId)>, + initial_authorities: Vec<(AccountId, AccountId, GrandpaId, BabeId, ImOnlineId)>, root_key: AccountId, endowed_accounts: Option>, enable_println: bool, ) -> GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(|| { vec![ - get_account_id_from_seed("Alice"), - get_account_id_from_seed("Bob"), - get_account_id_from_seed("Charlie"), - get_account_id_from_seed("Dave"), - get_account_id_from_seed("Eve"), - get_account_id_from_seed("Ferdie"), - get_account_id_from_seed("Alice//stash"), - get_account_id_from_seed("Bob//stash"), - get_account_id_from_seed("Charlie//stash"), - get_account_id_from_seed("Dave//stash"), - get_account_id_from_seed("Eve//stash"), - get_account_id_from_seed("Ferdie//stash"), + get_from_seed::("Alice"), + get_from_seed::("Bob"), + get_from_seed::("Charlie"), + get_from_seed::("Dave"), + get_from_seed::("Eve"), + get_from_seed::("Ferdie"), + get_from_seed::("Alice//stash"), + get_from_seed::("Bob//stash"), + get_from_seed::("Charlie//stash"), + get_from_seed::("Dave//stash"), + get_from_seed::("Eve//stash"), + get_from_seed::("Ferdie//stash"), ] }); @@ -260,7 +255,7 @@ pub fn testnet_genesis( }), session: Some(SessionConfig { keys: initial_authorities.iter().map(|x| { - (x.0.clone(), session_keys(x.3.clone(), x.2.clone())) + (x.0.clone(), session_keys(x.2.clone(), x.3.clone(), x.4.clone())) }).collect::>(), }), staking: Some(StakingConfig { @@ -302,15 +297,16 @@ pub fn testnet_genesis( key: root_key, }), babe: Some(BabeConfig { - authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), }), im_online: Some(ImOnlineConfig{ gossip_at: 0, - last_new_era_start: 0, + keys: initial_authorities.iter().map(|x| x.4.clone()).collect(), }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), + membership_Instance1: Some(Default::default()), } } @@ -319,7 +315,7 @@ fn development_config_genesis() -> GenesisConfig { vec![ get_authority_keys_from_seed("Alice"), ], - get_account_id_from_seed("Alice"), + get_from_seed::("Alice"), None, true, ) @@ -336,7 +332,7 @@ fn local_testnet_genesis() -> GenesisConfig { get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), ], - get_account_id_from_seed("Alice"), + get_from_seed::("Alice"), None, false, ) @@ -358,7 +354,7 @@ pub(crate) mod tests { vec![ get_authority_keys_from_seed("Alice"), ], - get_account_id_from_seed("Alice"), + get_from_seed::("Alice"), None, false, ) @@ -380,7 +376,16 @@ pub(crate) mod tests { /// Local testnet config (multivalidator Alice + Bob) pub fn integration_test_config_with_two_authorities() -> ChainSpec { - ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis, vec![], None, None, None, None) + ChainSpec::from_genesis( + "Integration Test", + "test", + local_testnet_genesis, + vec![], + None, + None, + None, + None, + ) } #[test] diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 0b887bb55a..86247668f7 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -22,12 +22,9 @@ use std::sync::Arc; use std::time::Duration; use babe::{import_queue, start_babe, BabeImportQueue, Config}; -use babe_primitives::AuthorityPair as BabePair; use client::{self, LongestChain}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; -use primitives::Pair; -use grandpa_primitives::AuthorityPair as GrandpaPair; use futures::prelude::*; use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; @@ -40,7 +37,6 @@ use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use inherents::InherentDataProviders; use network::construct_simple_protocol; use substrate_service::construct_service_factory; -use log::info; use substrate_service::TelemetryOnConnect; construct_simple_protocol! { @@ -89,8 +85,6 @@ impl Default for NodeConfig where F: substrate_service::ServiceFactory { construct_service_factory! { struct Factory { Block = Block, - ConsensusPair = BabePair, - FinalityPair = GrandpaPair, RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = node_executor::Executor, @@ -119,74 +113,59 @@ construct_service_factory! { } } - if let Some(babe_key) = service.authority_key() { - info!("Using BABE key {}", babe_key.public()); - - let proposer = substrate_basic_authorship::ProposerFactory { - client: service.client(), - transaction_pool: service.transaction_pool(), - }; - - let client = service.client(); - let select_chain = service.select_chain() - .ok_or(ServiceError::SelectChainRequired)?; - - let babe_config = babe::BabeParams { - config: Config::get_or_compute(&*client)?, - local_key: Arc::new(babe_key), - client, - select_chain, - block_import, - env: proposer, - sync_oracle: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), - force_authoring: service.config.force_authoring, - time_source: babe_link, - }; + let proposer = substrate_basic_authorship::ProposerFactory { + client: service.client(), + transaction_pool: service.transaction_pool(), + }; - let babe = start_babe(babe_config)?; - let select = babe.select(service.on_exit()).then(|_| Ok(())); - service.spawn_task(Box::new(select)); - } + let client = service.client(); + let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?; - let grandpa_key = if service.config.disable_grandpa { - None - } else { - service.fg_authority_key() + let babe_config = babe::BabeParams { + config: Config::get_or_compute(&*client)?, + keystore: service.keystore(), + client, + select_chain, + block_import, + env: proposer, + sync_oracle: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + force_authoring: service.config.force_authoring, + time_source: babe_link, }; + let babe = start_babe(babe_config)?; + let select = babe.select(service.on_exit()).then(|_| Ok(())); + service.spawn_task(Box::new(select)); + let config = grandpa::Config { - local_key: grandpa_key.map(Arc::new), // FIXME #1578 make this available through chainspec gossip_duration: Duration::from_millis(333), justification_period: 4096, - name: Some(service.config.name.clone()) + name: Some(service.config.name.clone()), + keystore: Some(service.keystore()), }; - match config.local_key { - None if !service.config.grandpa_voter => { - service.spawn_task(Box::new(grandpa::run_grandpa_observer( - config, - link_half, - service.network(), - service.on_exit(), - )?)); - }, - // Either config.local_key is set, or user forced voter service via `--grandpa-voter` flag. - _ => { - let telemetry_on_connect = TelemetryOnConnect { - telemetry_connection_sinks: service.telemetry_on_connect_stream(), - }; - let grandpa_config = grandpa::GrandpaParams { - config: config, - link: link_half, - network: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), - on_exit: service.on_exit(), - telemetry_on_connect: Some(telemetry_on_connect), - }; - service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); - }, + if service.config.roles.is_authority() { + let telemetry_on_connect = TelemetryOnConnect { + telemetry_connection_sinks: service.telemetry_on_connect_stream(), + }; + let grandpa_config = grandpa::GrandpaParams { + config: config, + link: link_half, + network: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + on_exit: service.on_exit(), + telemetry_on_connect: Some(telemetry_on_connect), + }; + service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); + } else if !service.config.grandpa_voter { + service.spawn_task(Box::new(grandpa::run_grandpa_observer( + config, + link_half, + service.network(), + service.on_exit(), + )?)); } Ok(service) @@ -273,7 +252,7 @@ mod tests { use sr_primitives::{generic::{BlockId, Era, Digest}, traits::Block, OpaqueExtrinsic}; use timestamp; use finality_tracker; - use keyring::{AccountKeyring, Sr25519Keyring}; + use keyring::AccountKeyring; use substrate_service::ServiceFactory; use service_test::SyncService; use crate::service::Factory; @@ -339,9 +318,13 @@ mod tests { #[test] #[ignore] fn test_sync() { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + let alice = keystore.write().insert_ephemeral_from_seed::("//Alice") + .expect("Creates authority pair"); + let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); - let alice = Arc::new(Sr25519Keyring::Alice.pair()); let mut slot_num = 1u64; let block_factory = |service: &SyncService<::FullService>| { let service = service.get(); @@ -370,8 +353,8 @@ mod tests { &*service.client(), &parent_id, slot_num, - &alice, (278, 1000), + &keystore, ) { break babe_pre_digest; } @@ -395,7 +378,7 @@ mod tests { let to_sign = pre_hash.encode(); let signature = alice.sign(&to_sign[..]); let item = ::babe_seal( - signature, + signature.into(), ); slot_num += 1; diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 711fdcdb69..d012d35778 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -321,20 +321,20 @@ mod tests { sr25519_keyring: &Sr25519Keyring, ) -> SessionKeys { SessionKeys { - ed25519: ed25519_keyring.to_owned().into(), - sr25519: sr25519_keyring.to_owned().into(), + grandpa: ed25519_keyring.to_owned().public().into(), + babe: sr25519_keyring.to_owned().public().into(), + im_online: sr25519_keyring.to_owned().public().into(), } } fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { let mut ext = TestExternalities::new_with_code_with_children(code, GenesisConfig { - babe: Some(Default::default()), system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { digest_interval: 2, digest_levels: 2, }) } else { None }, - ..Default::default() + .. Default::default() }), indices: Some(IndicesConfig { ids: vec![alice(), bob(), charlie(), dave(), eve(), ferdie()], @@ -379,19 +379,21 @@ mod tests { offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], }), - democracy: Some(Default::default()), - collective_Instance1: Some(Default::default()), - collective_Instance2: Some(Default::default()), - elections: Some(Default::default()), contracts: Some(ContractsConfig { current_schedule: Default::default(), gas_price: 1 * MILLICENTS, }), - sudo: Some(Default::default()), - im_online: Some(Default::default()), + babe: Some(Default::default()), grandpa: Some(GrandpaConfig { authorities: vec![], }), + im_online: Some(Default::default()), + democracy: Some(Default::default()), + collective_Instance1: Some(Default::default()), + collective_Instance2: Some(Default::default()), + membership_Instance1: Some(Default::default()), + elections: Some(Default::default()), + sudo: Some(Default::default()), }.build_storage().unwrap()); ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); ext diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index da6180889e..7ffb29e078 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -29,6 +29,7 @@ executive = { package = "srml-executive", path = "../../srml/executive", default finality-tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } grandpa = { package = "srml-grandpa", path = "../../srml/grandpa", default-features = false } indices = { package = "srml-indices", path = "../../srml/indices", default-features = false } +membership = { package = "srml-membership", path = "../../srml/membership", default-features = false } session = { package = "srml-session", path = "../../srml/session", default-features = false, features = ["historical"] } staking = { package = "srml-staking", path = "../../srml/staking", default-features = false } system = { package = "srml-system", path = "../../srml/system", default-features = false } @@ -40,6 +41,7 @@ node-primitives = { path = "../primitives", default-features = false } rustc-hex = { version = "2.0", optional = true } serde = { version = "1.0", optional = true } substrate-keyring = { path = "../../core/keyring", optional = true } +substrate-session = { path = "../../core/session", default-features = false } [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.2", path = "../../core/utils/wasm-builder-runner" } @@ -68,6 +70,7 @@ std = [ "finality-tracker/std", "grandpa/std", "indices/std", + "membership/std", "session/std", "staking/std", "system/std", @@ -83,4 +86,5 @@ std = [ "substrate-keyring", "offchain-primitives/std", "im-online/std", + "substrate-session/std", ] diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c2c5252969..0ecbec7601 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -47,6 +47,7 @@ use elections::VoteIndex; use version::NativeVersion; use primitives::OpaqueMetadata; use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; +use im_online::{AuthorityId as ImOnlineId}; use finality_tracker::{DEFAULT_REPORT_LATENCY, DEFAULT_WINDOW_SIZE}; #[cfg(any(feature = "std", test))] @@ -79,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 130, - impl_version: 130, + spec_version: 131, + impl_version: 131, apis: RUNTIME_API_VERSIONS, }; @@ -111,6 +112,7 @@ parameter_types! { impl system::Trait for Runtime { type Origin = Origin; + type Call = Call; type Index = Index; type BlockNumber = BlockNumber; type Hash = Hash; @@ -191,10 +193,12 @@ type SessionHandlers = (Grandpa, Babe, ImOnline); impl_opaque_keys! { pub struct SessionKeys { - #[id(key_types::ED25519)] - pub ed25519: GrandpaId, - #[id(key_types::SR25519)] - pub sr25519: BabeId, + #[id(key_types::GRANDPA)] + pub grandpa: GrandpaId, + #[id(key_types::BABE)] + pub babe: BabeId, + #[id(key_types::IM_ONLINE)] + pub im_online: ImOnlineId, } } @@ -244,7 +248,7 @@ parameter_types! { pub const EmergencyVotingPeriod: BlockNumber = 3 * 24 * 60 * MINUTES; pub const MinimumDeposit: Balance = 100 * DOLLARS; pub const EnactmentPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; - pub const CooloffPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; + pub const CooloffPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; } impl democracy::Trait for Runtime { @@ -256,17 +260,26 @@ impl democracy::Trait for Runtime { type VotingPeriod = VotingPeriod; type EmergencyVotingPeriod = EmergencyVotingPeriod; type MinimumDeposit = MinimumDeposit; - type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilInstance>; - type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilInstance>; - type ExternalPushOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalInstance>; - type EmergencyOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilInstance>; - type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilInstance>; - type VetoOrigin = collective::EnsureMember; + /// A straight majority of the council can decide what their next motion is. + type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; + /// A super-majority can have the next scheduled referendum be a straight majority-carries vote. + type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>; + /// A unanimous council can have the next scheduled referendum be a straight default-carries + /// (NTB) vote. + type ExternalDefaultOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>; + /// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote + /// be tabled immediately and with a shorter voting/enactment period. + type FastTrackOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>; + // To cancel a proposal which has been passed, 2/3 of the council must agree to it. + type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; + // Any single technical committee member may veto a coming council proposal, however they can + // only do it once and it lasts only for the cooloff period. + type VetoOrigin = collective::EnsureMember; type CooloffPeriod = CooloffPeriod; } -type CouncilInstance = collective::Instance1; -impl collective::Trait for Runtime { +type CouncilCollective = collective::Instance1; +impl collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -302,13 +315,23 @@ impl elections::Trait for Runtime { type DecayRatio = DecayRatio; } -type TechnicalInstance = collective::Instance2; -impl collective::Trait for Runtime { +type TechnicalCollective = collective::Instance2; +impl collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; } +impl membership::Trait for Runtime { + type Event = Event; + type AddOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type RemoveOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type SwapOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type ResetOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type MembershipInitialized = TechnicalCommittee; + type MembershipChanged = TechnicalCommittee; +} + parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 1 * DOLLARS; @@ -318,8 +341,8 @@ parameter_types! { impl treasury::Trait for Runtime { type Currency = Balances; - type ApproveOrigin = collective::EnsureMembers<_4, AccountId, CouncilInstance>; - type RejectOrigin = collective::EnsureMembers<_2, AccountId, CouncilInstance>; + type ApproveOrigin = collective::EnsureMembers<_4, AccountId, CouncilCollective>; + type RejectOrigin = collective::EnsureMembers<_2, AccountId, CouncilCollective>; type Event = Event; type MintedForSpending = (); type ProposalRejection = (); @@ -369,12 +392,9 @@ impl sudo::Trait for Runtime { } impl im_online::Trait for Runtime { - type AuthorityId = BabeId; type Call = Call; type Event = Event; - type SessionsPerEra = SessionsPerEra; type UncheckedExtrinsic = UncheckedExtrinsic; - type IsValidAuthorityId = Babe; } impl grandpa::Trait for Runtime { @@ -410,12 +430,13 @@ construct_runtime!( Council: collective::::{Module, Call, Storage, Origin, Event, Config}, TechnicalCommittee: collective::::{Module, Call, Storage, Origin, Event, Config}, Elections: elections::{Module, Call, Storage, Event, Config}, + TechnicalMembership: membership::::{Module, Call, Storage, Event, Config}, FinalityTracker: finality_tracker::{Module, Call, Inherent}, Grandpa: grandpa::{Module, Call, Storage, Config, Event}, Treasury: treasury::{Module, Call, Storage, Event}, Contracts: contracts, Sudo: sudo, - ImOnline: im_online::{default, ValidateUnsigned}, + ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, } ); @@ -547,4 +568,11 @@ impl_runtime_apis! { Babe::authorities().into_iter().map(|(a, _)| a).collect() } } + + impl substrate_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + let seed = seed.as_ref().map(|s| rstd::str::from_utf8(&s).expect("Seed is an utf8 string")); + SessionKeys::generate(seed) + } + } } diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 363e1c351c..bacf722d5d 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -264,6 +264,7 @@ mod tests { impl system::Trait for Test { type Origin = Origin; type Index = u64; + type Call = (); type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index 6ce9c87c5c..955831ba29 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -11,6 +11,7 @@ inherents = { package = "substrate-inherents", path = "../../core/inherents", de rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../core/application-crypto", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } @@ -20,7 +21,7 @@ substrate-consensus-aura-primitives = { path = "../../core/consensus/aura/primit [dev-dependencies] lazy_static = "1.0" -parking_lot = "0.8.0" +parking_lot = "0.9.0" runtime_io = { package = "sr-io", path = "../../core/sr-io" } [features] @@ -37,4 +38,5 @@ std = [ "staking/std", "inherents/std", "substrate-consensus-aura-primitives/std", + "app-crypto/std", ] diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index a79b5c46a5..6d707fc8e1 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -53,9 +53,9 @@ pub use timestamp; use rstd::{result, prelude::*}; use codec::Encode; use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue, traits::Get}; +use app_crypto::AppPublic; use sr_primitives::{ - traits::{SaturatedConversion, Saturating, Zero, One, Member, IsMember, TypedKey}, - generic::DigestItem, + traits::{SaturatedConversion, Saturating, Zero, One, Member, IsMember}, generic::DigestItem, }; use timestamp::OnTimestampSet; #[cfg(feature = "std")] @@ -156,7 +156,7 @@ pub trait Trait: timestamp::Trait { type HandleReport: HandleReport; /// The identifier type for an authority. - type AuthorityId: Member + Parameter + TypedKey + Default; + type AuthorityId: Member + Parameter + AppPublic + Default; } decl_storage! { diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index f00e090b68..7c5d862a50 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -18,6 +18,8 @@ #![cfg(test)] +use crate::{Trait, Module, GenesisConfig}; +use substrate_consensus_aura_primitives::ed25519::AuthorityId; use sr_primitives::{ traits::IdentityLookup, Perbill, testing::{Header, UintAuthorityId}, @@ -25,7 +27,6 @@ use sr_primitives::{ use srml_support::{impl_outer_origin, parameter_types}; use runtime_io; use primitives::{H256, Blake2Hasher}; -use crate::{Trait, Module, GenesisConfig}; impl_outer_origin!{ pub enum Origin for Test {} @@ -47,6 +48,7 @@ impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; @@ -68,13 +70,13 @@ impl timestamp::Trait for Test { impl Trait for Test { type HandleReport = (); - type AuthorityId = UintAuthorityId; + type AuthorityId = AuthorityId; } pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; t.extend(GenesisConfig::{ - authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), + authorities: authorities.into_iter().map(|a| UintAuthorityId(a).to_public_key()).collect(), }.build_storage().unwrap().0); t.into() } diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index e46e2f232d..fb0f451930 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -349,6 +349,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index 2e2d3c84b0..76bd849a95 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -17,11 +17,11 @@ system = { package = "srml-system", path = "../system", default-features = false timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } -runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } +runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false, features = [ "wasm-nice-panic-message" ] } [dev-dependencies] lazy_static = "1.3.0" -parking_lot = "0.8.0" +parking_lot = "0.9.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index b1aefccc67..4d0306af28 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -763,6 +763,7 @@ impl, I: Instance> PartialEq for ElevatedTrait { impl, I: Instance> Eq for ElevatedTrait {} impl, I: Instance> system::Trait for ElevatedTrait { type Origin = T::Origin; + type Call = T::Call; type Index = T::Index; type BlockNumber = T::BlockNumber; type Hash = T::Hash; @@ -1213,12 +1214,14 @@ impl, I: Instance> rstd::fmt::Debug for TakeFees { impl, I: Instance + Clone + Eq> SignedExtension for TakeFees { type AccountId = T::AccountId; + type Call = T::Call; type AdditionalSigned = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } fn validate( &self, who: &Self::AccountId, + _call: &Self::Call, info: DispatchInfo, len: usize, ) -> rstd::result::Result { diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index 2c84bb9afb..ccca018ae0 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -85,6 +85,7 @@ impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; @@ -208,6 +209,9 @@ impl ExtBuilder { pub type System = system::Module; pub type Balances = Module; + +pub const CALL: &::Call = &(); + /// create a transaction info struct from weight. Handy to avoid building the whole struct. pub fn info_from_weight(w: Weight) -> DispatchInfo { DispatchInfo { weight: w, ..Default::default() } diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 5a977747fe..edbb198f34 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -19,7 +19,7 @@ #![cfg(test)] use super::*; -use mock::{Balances, ExtBuilder, Runtime, System, info_from_weight}; +use mock::{Balances, ExtBuilder, Runtime, System, info_from_weight, CALL}; use runtime_io::with_externalities; use srml_support::{ assert_noop, assert_ok, assert_err, @@ -127,6 +127,7 @@ fn lock_reasons_should_work() { assert!( as SignedExtension>::pre_dispatch( TakeFees::from(1), &1, + CALL, info_from_weight(1), 0, ).is_ok()); @@ -140,6 +141,7 @@ fn lock_reasons_should_work() { assert!( as SignedExtension>::pre_dispatch( TakeFees::from(1), &1, + CALL, info_from_weight(1), 0, ).is_ok()); @@ -150,6 +152,7 @@ fn lock_reasons_should_work() { assert!( as SignedExtension>::pre_dispatch( TakeFees::from(1), &1, + CALL, info_from_weight(1), 0, ).is_err()); @@ -757,9 +760,9 @@ fn signed_extension_take_fees_work() { .build(), || { let len = 10; - assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(5), len).is_ok()); + assert!(TakeFees::::from(0).pre_dispatch(&1, CALL, info_from_weight(5), len).is_ok()); assert_eq!(Balances::free_balance(&1), 100 - 20 - 25); - assert!(TakeFees::::from(5 /* tipped */).pre_dispatch(&1, info_from_weight(3), len).is_ok()); + assert!(TakeFees::::from(5 /* tipped */).pre_dispatch(&1, CALL, info_from_weight(3), len).is_ok()); assert_eq!(Balances::free_balance(&1), 100 - 20 - 25 - 20 - 5 - 15); } ); @@ -777,7 +780,7 @@ fn signed_extension_take_fees_is_bounded() { use sr_primitives::weights::Weight; // maximum weight possible - assert!(TakeFees::::from(0).pre_dispatch(&1, info_from_weight(Weight::max_value()), 10).is_ok()); + assert!(TakeFees::::from(0).pre_dispatch(&1, CALL, info_from_weight(Weight::max_value()), 10).is_ok()); // fee will be proportional to what is the actual maximum weight in the runtime. assert_eq!( Balances::free_balance(&1), diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index 20c11bdf9b..8c4820715b 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -16,6 +16,9 @@ //! Collective system: Members of a set of account IDs can make their collective feelings known //! through dispatched calls from one of two specialised origins. +//! +//! The membership can be provided in one of two ways: either directly, using the Root-dispatchable +//! function `set_members`, or indirectly, through implementing the `ChangeMembers` #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit="128"] @@ -119,7 +122,7 @@ decl_event!( } ); -// Note: this module is not benchmarked. The weights are obtained based on the similarity fo the +// Note: this module is not benchmarked. The weights are obtained based on the similarity of the // executed logic with other democracy function. Note that councillor operations are assigned to the // operational class. decl_module! { @@ -133,41 +136,12 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn set_members(origin, new_members: Vec) { ensure_root(origin)?; - - // stable sorting since they will generally be provided sorted. - let mut old_members = >::get(); - old_members.sort(); let mut new_members = new_members; new_members.sort(); - let mut old_iter = old_members.iter(); - let mut new_iter = new_members.iter(); - let mut incoming = vec![]; - let mut outgoing = vec![]; - let mut old_i = old_iter.next(); - let mut new_i = new_iter.next(); - loop { - match (old_i, new_i) { - (None, None) => break, - (Some(old), Some(new)) if old == new => { - old_i = old_iter.next(); - new_i = new_iter.next(); - } - (Some(old), Some(new)) if old < new => { - outgoing.push(old.clone()); - old_i = old_iter.next(); - } - (Some(old), None) => { - outgoing.push(old.clone()); - old_i = old_iter.next(); - } - (_, Some(new)) => { - incoming.push(new.clone()); - new_i = new_iter.next(); - } - } - } - - Self::change_members(&incoming, &outgoing, &new_members); + >::mutate(|m| { + >::set_members_sorted(&new_members[..], m); + *m = new_members; + }); } /// Dispatch a proposal from a member using the `Member` origin. @@ -287,18 +261,18 @@ impl, I: Instance> Module { } impl, I: Instance> ChangeMembers for Module { - fn change_members(_incoming: &[T::AccountId], outgoing: &[T::AccountId], new: &[T::AccountId]) { + fn change_members_sorted(_incoming: &[T::AccountId], outgoing: &[T::AccountId], new: &[T::AccountId]) { // remove accounts from all current voting in motions. - let mut old = outgoing.to_vec(); - old.sort_unstable(); + let mut outgoing = outgoing.to_vec(); + outgoing.sort_unstable(); for h in Self::proposals().into_iter() { >::mutate(h, |v| if let Some(mut votes) = v.take() { votes.ayes = votes.ayes.into_iter() - .filter(|i| old.binary_search(i).is_err()) + .filter(|i| outgoing.binary_search(i).is_err()) .collect(); votes.nays = votes.nays.into_iter() - .filter(|i| old.binary_search(i).is_err()) + .filter(|i| outgoing.binary_search(i).is_err()) .collect(); *v = Some(votes); } @@ -413,6 +387,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; @@ -486,7 +461,7 @@ mod tests { Collective::voting(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![] }) ); - Collective::change_members(&[4], &[1], &[2, 3, 4]); + Collective::change_members_sorted(&[4], &[1], &[2, 3, 4]); assert_eq!( Collective::voting(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![] }) @@ -500,7 +475,7 @@ mod tests { Collective::voting(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3] }) ); - Collective::change_members(&[], &[3], &[2, 4]); + Collective::change_members_sorted(&[], &[3], &[2, 4]); assert_eq!( Collective::voting(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![] }) diff --git a/srml/contracts/src/exec.rs b/srml/contracts/src/exec.rs index b27116a1ac..eda37d2452 100644 --- a/srml/contracts/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -275,7 +275,7 @@ pub enum DeferredAction { /// The account id of the contract who dispatched this call. origin: T::AccountId, /// The call to dispatch. - call: T::Call, + call: ::Call, }, RestoreTo { /// The account id of the contract which is removed during the restoration and transfers diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index d28ee362eb..ccb6709384 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -333,7 +333,7 @@ pub trait Trait: timestamp::Trait { /// /// It is recommended (though not required) for this function to return a fee that would be taken /// by the Executive module for regular dispatch. - type ComputeDispatchFee: ComputeDispatchFee>; + type ComputeDispatchFee: ComputeDispatchFee<::Call, BalanceOf>; /// trie id generator type TrieIdGenerator: TrieIdGenerator; @@ -427,8 +427,8 @@ where /// The default dispatch fee computor computes the fee in the same way that /// the implementation of `MakePayment` for the Balances module does. pub struct DefaultDispatchFeeComputor(PhantomData); -impl ComputeDispatchFee> for DefaultDispatchFeeComputor { - fn compute_dispatch_fee(call: &T::Call) -> BalanceOf { +impl ComputeDispatchFee<::Call, BalanceOf> for DefaultDispatchFeeComputor { + fn compute_dispatch_fee(call: &::Call) -> BalanceOf { let encoded_len = call.using_encoded(|encoded| encoded.len() as u32); let base_fee = T::TransactionBaseFee::get(); let byte_fee = T::TransactionByteFee::get(); diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index 80bb7af518..e12849f6fb 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -107,6 +107,7 @@ impl system::Trait for Test { type Index = u64; type BlockNumber = u64; type Hash = H256; + type Call = (); type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 6d2db9373d..712b2ca835 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -107,6 +107,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 332ad91358..c3debc1f06 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -61,6 +61,8 @@ pub enum Conviction { Locked4x, /// 5x votes, locked for 16x... Locked5x, + /// 6x votes, locked for 32x... + Locked6x, } impl Default for Conviction { @@ -78,6 +80,7 @@ impl From for u8 { Conviction::Locked3x => 3, Conviction::Locked4x => 4, Conviction::Locked5x => 5, + Conviction::Locked6x => 6, } } } @@ -92,6 +95,7 @@ impl TryFrom for Conviction { 3 => Conviction::Locked3x, 4 => Conviction::Locked4x, 5 => Conviction::Locked5x, + 6 => Conviction::Locked6x, _ => return Err(()), }) } @@ -108,6 +112,7 @@ impl Conviction { Conviction::Locked3x => 4, Conviction::Locked4x => 8, Conviction::Locked5x => 16, + Conviction::Locked6x => 32, } } @@ -134,7 +139,7 @@ impl Bounded for Conviction { } fn max_value() -> Self { - Conviction::Locked5x + Conviction::Locked6x } } @@ -208,18 +213,19 @@ pub trait Trait: system::Trait + Sized { /// a majority-carries referendum. type ExternalMajorityOrigin: EnsureOrigin; + /// Origin from which the next tabled referendum may be forced; this allows for the tabling of + /// a negative-turnout-bias (default-carries) referendum. + type ExternalDefaultOrigin: EnsureOrigin; + /// Origin from which the next referendum proposed by the external majority may be immediately /// tabled to vote asynchronously in a similar manner to the emergency origin. It remains a /// majority-carries vote. - type ExternalPushOrigin: EnsureOrigin; - - /// Origin from which emergency referenda may be scheduled. - type EmergencyOrigin: EnsureOrigin; + type FastTrackOrigin: EnsureOrigin; - /// Minimum voting period allowed for an emergency referendum. + /// Minimum voting period allowed for an fast-track/emergency referendum. type EmergencyVotingPeriod: Get; - /// Origin from which any referenda may be cancelled in an emergency. + /// Origin from which any referendum may be cancelled in an emergency. type CancellationOrigin: EnsureOrigin; /// Origin for anyone able to veto proposals. @@ -434,32 +440,6 @@ decl_module! { Self::do_vote(who, ref_index, vote) } - /// Schedule an emergency referendum. - /// - /// This will create a new referendum for the `proposal`, approved as long as counted votes - /// exceed `threshold` and, if approved, enacted after the given `delay`. - /// - /// It may be called from either the Root or the Emergency origin. - #[weight = SimpleDispatchInfo::FixedOperational(500_000)] - fn emergency_propose(origin, - proposal: Box, - threshold: VoteThreshold, - voting_period: T::BlockNumber, - delay: T::BlockNumber - ) { - T::EmergencyOrigin::try_origin(origin) - .map(|_| ()) - .or_else(|origin| ensure_root(origin))?; - let now = >::block_number(); - // We don't consider it an error if `vote_period` is too low, but we do enforce the - // minimum. This is primarily due to practicality. If it's an emergency, we don't want - // to introduce more delays than is strictly needed by requiring a potentially costly - // resubmission in the case of a mistakenly low `vote_period`; better to just let the - // referendum take place with the lowest valid value. - let period = voting_period.max(T::EmergencyVotingPeriod::get()); - Self::inject_referendum(now + period, *proposal, threshold, delay).map(|_| ())?; - } - /// Schedule an emergency cancellation of a referendum. Cannot happen twice to the same /// referendum. #[weight = SimpleDispatchInfo::FixedOperational(500_000)] @@ -489,17 +469,26 @@ decl_module! { /// Schedule a majority-carries referendum to be tabled next once it is legal to schedule /// an external referendum. + /// + /// Unlike `external_propose`, blacklisting has no effect on this and it may replace a + /// pre-scheduled `external_propose` call. #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn external_propose_majority(origin, proposal: Box) { T::ExternalMajorityOrigin::ensure_origin(origin)?; - ensure!(!>::exists(), "proposal already made"); - let proposal_hash = T::Hashing::hash_of(&proposal); - if let Some((until, _)) = >::get(proposal_hash) { - ensure!(>::block_number() >= until, "proposal still blacklisted"); - } >::put((*proposal, VoteThreshold::SimpleMajority)); } + /// Schedule a negative-turnout-bias referendum to be tabled next once it is legal to + /// schedule an external referendum. + /// + /// Unlike `external_propose`, blacklisting has no effect on this and it may replace a + /// pre-scheduled `external_propose` call. + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] + fn external_propose_default(origin, proposal: Box) { + T::ExternalDefaultOrigin::ensure_origin(origin)?; + >::put((*proposal, VoteThreshold::SuperMajorityAgainst)); + } + /// Schedule the currently externally-proposed majority-carries referendum to be tabled /// immediately. If there is no externally-proposed referendum currently, or if there is one /// but it is not a majority-carries referendum then it fails. @@ -509,14 +498,14 @@ decl_module! { /// - `delay`: The number of block after voting has ended in approval and this should be /// enacted. Increased to `EmergencyVotingPeriod` if too low. #[weight = SimpleDispatchInfo::FixedNormal(200_000)] - fn external_push(origin, + fn fast_track(origin, proposal_hash: T::Hash, voting_period: T::BlockNumber, delay: T::BlockNumber ) { - T::ExternalPushOrigin::ensure_origin(origin)?; + T::FastTrackOrigin::ensure_origin(origin)?; let (proposal, threshold) = >::get().ok_or("no proposal made")?; - ensure!(threshold == VoteThreshold::SimpleMajority, "next external proposal not simple majority"); + ensure!(threshold != VoteThreshold::SuperMajorityApprove, "next external proposal not simple majority"); ensure!(proposal_hash == T::Hashing::hash_of(&proposal), "invalid hash"); >::kill(); @@ -1028,6 +1017,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; @@ -1090,10 +1080,10 @@ mod tests { type VotingPeriod = VotingPeriod; type EmergencyVotingPeriod = EmergencyVotingPeriod; type MinimumDeposit = MinimumDeposit; - type EmergencyOrigin = EnsureSignedBy; type ExternalOrigin = EnsureSignedBy; type ExternalMajorityOrigin = EnsureSignedBy; - type ExternalPushOrigin = EnsureSignedBy; + type ExternalDefaultOrigin = EnsureSignedBy; + type FastTrackOrigin = EnsureSignedBy; type CancellationOrigin = EnsureSignedBy; type VetoOrigin = EnsureSignedBy; type CooloffPeriod = CooloffPeriod; @@ -1347,64 +1337,6 @@ mod tests { }); } - #[test] - fn emergency_referendum_works() { - with_externalities(&mut new_test_ext(), || { - System::set_block_number(0); - assert_noop!(Democracy::emergency_propose( - Origin::signed(6), // invalid - Box::new(set_balance_proposal(2)), - VoteThreshold::SuperMajorityAgainst, - 0, - 0, - ), "bad origin: expected to be a root origin"); - assert_ok!(Democracy::emergency_propose( - Origin::signed(1), - Box::new(set_balance_proposal(2)), - VoteThreshold::SuperMajorityAgainst, - 0, - 0, - )); - assert_eq!( - Democracy::referendum_info(0), - Some(ReferendumInfo { - end: 1, - proposal: set_balance_proposal(2), - threshold: VoteThreshold::SuperMajorityAgainst, - delay: 0 - }) - ); - - assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); - fast_forward_to(1); - assert_eq!(Balances::free_balance(&42), 0); - fast_forward_to(2); - assert_eq!(Balances::free_balance(&42), 2); - - assert_ok!(Democracy::emergency_propose( - Origin::signed(1), - Box::new(set_balance_proposal(4)), - VoteThreshold::SuperMajorityAgainst, - 3, - 3 - )); - assert_eq!( - Democracy::referendum_info(1), - Some(ReferendumInfo { - end: 5, - proposal: set_balance_proposal(4), - threshold: VoteThreshold::SuperMajorityAgainst, - delay: 3 - }) - ); - assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); - fast_forward_to(8); - assert_eq!(Balances::free_balance(&42), 2); - fast_forward_to(9); - assert_eq!(Balances::free_balance(&42), 4); - }); - } - #[test] fn external_referendum_works() { with_externalities(&mut new_test_ext(), || { @@ -1460,17 +1392,42 @@ mod tests { } #[test] - fn external_push_referendum_works() { + fn external_default_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose_default( + Origin::signed(3), + Box::new(set_balance_proposal(2)) + ), "Invalid origin"); + assert_ok!(Democracy::external_propose_default( + Origin::signed(1), + Box::new(set_balance_proposal(2)) + )); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 2, + }) + ); + }); + } + + #[test] + fn fast_track_referendum_works() { with_externalities(&mut new_test_ext(), || { System::set_block_number(0); let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); - assert_noop!(Democracy::external_push(Origin::signed(5), h, 3, 2), "no proposal made"); + assert_noop!(Democracy::fast_track(Origin::signed(5), h, 3, 2), "no proposal made"); assert_ok!(Democracy::external_propose_majority( Origin::signed(3), Box::new(set_balance_proposal(2)) )); - assert_noop!(Democracy::external_push(Origin::signed(1), h, 3, 2), "Invalid origin"); - assert_ok!(Democracy::external_push(Origin::signed(5), h, 0, 0)); + assert_noop!(Democracy::fast_track(Origin::signed(1), h, 3, 2), "Invalid origin"); + assert_ok!(Democracy::fast_track(Origin::signed(5), h, 0, 0)); assert_eq!( Democracy::referendum_info(0), Some(ReferendumInfo { @@ -1484,7 +1441,7 @@ mod tests { } #[test] - fn external_push_referendum_fails_when_no_simple_majority() { + fn fast_track_referendum_fails_when_no_simple_majority() { with_externalities(&mut new_test_ext(), || { System::set_block_number(0); let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); @@ -1493,7 +1450,7 @@ mod tests { Box::new(set_balance_proposal(2)) )); assert_noop!( - Democracy::external_push(Origin::signed(5), h, 3, 2), + Democracy::fast_track(Origin::signed(5), h, 3, 2), "next external proposal not simple majority" ); }); diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index e8fbb75dc3..fe00182a89 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -593,7 +593,7 @@ decl_module! { .collect(); >::put(&new_set); let new_set = new_set.into_iter().map(|x| x.0).collect::>(); - T::ChangeMembers::change_members(&[], &[who], &new_set[..]); + T::ChangeMembers::change_members(&[], &[who], new_set); } /// Set the presentation duration. If there is currently a vote being presented for, will @@ -876,7 +876,7 @@ impl Module { >::put(&new_set); let new_set = new_set.into_iter().map(|x| x.0).collect::>(); - T::ChangeMembers::change_members(&incoming, &outgoing, &new_set[..]); + T::ChangeMembers::change_members(&incoming, &outgoing, new_set); // clear all except runners-up from candidate list. let candidates = Self::candidates(); @@ -1132,6 +1132,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; @@ -1203,7 +1204,7 @@ mod tests { pub struct TestChangeMembers; impl ChangeMembers for TestChangeMembers { - fn change_members(incoming: &[u64], outgoing: &[u64], new: &[u64]) { + fn change_members_sorted(incoming: &[u64], outgoing: &[u64], new: &[u64]) { let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec()); old_plus_incoming.extend_from_slice(incoming); old_plus_incoming.sort(); diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 5925c438a8..2d4fa43fb5 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -533,6 +533,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; + type Call = (); type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 54ea3a3f14..70b4a9073d 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -108,7 +108,7 @@ mod internal { fn from(d: DispatchError) -> Self { match d { DispatchError::Payment => ApplyError::CantPay, - DispatchError::Resource => ApplyError::FullBlock, + DispatchError::Exhausted => ApplyError::FullBlock, DispatchError::NoPermission => ApplyError::CantPay, DispatchError::BadState => ApplyError::CantPay, DispatchError::Stale => ApplyError::Stale, @@ -368,8 +368,7 @@ mod tests { use hex_literal::hex; impl_outer_origin! { - pub enum Origin for Runtime { - } + pub enum Origin for Runtime { } } impl_outer_event!{ @@ -390,6 +389,7 @@ mod tests { impl system::Trait for Runtime { type Origin = Origin; type Index = u64; + type Call = Call; type BlockNumber = u64; type Hash = primitives::H256; type Hashing = BlakeTwo256; diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 4c3d975d7e..f074b27aa0 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -308,6 +308,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 57369b100e..9120188f3b 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -1050,6 +1050,7 @@ impl PartialEq for ElevatedTrait { impl Eq for ElevatedTrait {} impl system::Trait for ElevatedTrait { type Origin = T::Origin; + type Call = T::Call; type Index = T::Index; type BlockNumber = T::BlockNumber; type Hash = T::Hash; diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index 80e04a6b7e..4f8e5d886f 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -45,6 +45,7 @@ impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 4e5d133b9e..055fc4673a 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -51,6 +51,7 @@ impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; @@ -75,7 +76,9 @@ impl_outer_event!{ } pub fn to_authorities(vec: Vec<(u64, u64)>) -> Vec<(AuthorityId, u64)> { - vec.into_iter().map(|(id, weight)| (UintAuthorityId(id).into(), weight)).collect() + vec.into_iter() + .map(|(id, weight)| (UintAuthorityId(id).to_public_key::(), weight)) + .collect() } pub fn new_test_ext(authorities: Vec<(u64, u64)>) -> runtime_io::TestExternalities { diff --git a/srml/im-online/Cargo.toml b/srml/im-online/Cargo.toml index 60be1a89c2..8f0e4cc39f 100644 --- a/srml/im-online/Cargo.toml +++ b/srml/im-online/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../../core/sr-primitives", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../core/application-crypto", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } serde = { version = "1.0", optional = true } session = { package = "srml-session", path = "../session", default-features = false } @@ -26,4 +27,5 @@ std = [ "srml-support/std", "sr-io/std", "system/std", + "app-crypto/std", ] diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 19875d9a37..23345ea974 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -37,7 +37,6 @@ //! //! ### Public Functions //! -//! - `is_online_in_current_era` - True if the validator sent a heartbeat in the current era. //! - `is_online_in_current_session` - True if the validator sent a heartbeat in the current session. //! //! ## Usage @@ -51,9 +50,9 @@ //! //! decl_module! { //! pub struct Module for enum Call where origin: T::Origin { -//! pub fn is_online(origin, authority_id: T::AuthorityId) -> Result { +//! pub fn is_online(origin, authority_index: u32) -> Result { //! let _sender = ensure_signed(origin)?; -//! let _is_online = >::is_online_in_current_era(&authority_id); +//! let _is_online = >::is_online_in_current_session(authority_index); //! Ok(()) //! } //! } @@ -68,25 +67,39 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use primitives::{ - crypto::TypedKey, offchain::CryptoKey, - offchain::OpaqueNetworkState, - offchain::StorageKind, - sr25519, ed25519, -}; +use primitives::offchain::{OpaqueNetworkState, StorageKind}; use codec::{Encode, Decode}; use sr_primitives::{ - ApplyError, traits::{Member, IsMember, Extrinsic as ExtrinsicT}, + ApplyError, traits::{Extrinsic as ExtrinsicT}, transaction_validity::{TransactionValidity, TransactionLongevity, ValidTransaction}, }; use rstd::prelude::*; use session::SessionIndex; use sr_io::Printable; use srml_support::{ - Parameter, StorageValue, decl_module, decl_event, decl_storage, - traits::Get, StorageDoubleMap, print, + StorageValue, decl_module, decl_event, decl_storage, StorageDoubleMap, print, }; use system::ensure_none; +use app_crypto::RuntimeAppPublic; + +mod app { + pub use app_crypto::sr25519 as crypto; + use app_crypto::{app_crypto, key_types::IM_ONLINE, sr25519}; + + app_crypto!(sr25519, IM_ONLINE); +} + +/// A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +#[cfg(feature = "std")] +pub type AuthorityPair = app::Pair; + +/// A Babe authority signature. +pub type AuthoritySignature = app::Signature; + +/// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +pub type AuthorityId = app::Public; // The local storage database key under which the worker progress status // is tracked. @@ -106,7 +119,6 @@ struct WorkerStatus { // Error which may occur while executing the off-chain code. enum OffchainErr { - DecodeAuthorityId, DecodeWorkerStatus, ExtrinsicCreation, FailedSigning, @@ -117,7 +129,6 @@ enum OffchainErr { impl Printable for OffchainErr { fn print(self) { match self { - OffchainErr::DecodeAuthorityId => print("Offchain error: decoding AuthorityId failed!"), OffchainErr::DecodeWorkerStatus => print("Offchain error: decoding WorkerStatus failed!"), OffchainErr::ExtrinsicCreation => print("Offchain error: extrinsic creation failed!"), OffchainErr::FailedSigning => print("Offchain error: signing failed!"), @@ -127,272 +138,236 @@ impl Printable for OffchainErr { } } -/// Heartbeat which is send/received. +pub type AuthIndex = u32; + +/// Heartbeat which is sent/received. #[derive(Encode, Decode, Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Heartbeat +pub struct Heartbeat where BlockNumber: PartialEq + Eq + Decode + Encode, { block_number: BlockNumber, network_state: OpaqueNetworkState, - session_index: session::SessionIndex, - authority_id: AuthorityId, + session_index: SessionIndex, + authority_index: AuthIndex, } pub trait Trait: system::Trait + session::Trait { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From + Into<::Event>; /// The function call. type Call: From>; /// A extrinsic right from the external world. This is unchecked and so /// can contain a signature. - type UncheckedExtrinsic: ExtrinsicT + Encode + Decode; - - /// The identifier type for an authority. - type AuthorityId: Member + Parameter + Default + TypedKey + Decode + Encode + AsRef<[u8]>; - - /// Number of sessions per era. - type SessionsPerEra: Get; - - /// Determine if an `AuthorityId` is a valid authority. - type IsValidAuthorityId: IsMember; + type UncheckedExtrinsic: ExtrinsicT::Call> + Encode + Decode; } decl_event!( - pub enum Event where - ::BlockNumber, - ::AuthorityId - { - /// A new heartbeat was received at this `BlockNumber` from `AuthorityId` - HeartbeatReceived(BlockNumber, AuthorityId), + pub enum Event { + /// A new heartbeat was received from `AuthorityId` + HeartbeatReceived(AuthorityId), } ); decl_storage! { trait Store for Module as ImOnline { - // The block number when we should gossip. + /// The block number when we should gossip. GossipAt get(gossip_at) config(): T::BlockNumber; - // The session index when the last new era started. - LastNewEraStart get(last_new_era_start) config(): Option; + /// The current set of keys that may issue a heartbeat. + Keys get(keys) config(): Vec; - // For each session index we keep a mapping of `AuthorityId` to - // `offchain::OpaqueNetworkState`. - ReceivedHeartbeats get(received_heartbeats): double_map session::SessionIndex, - blake2_256(T::AuthorityId) => Vec; + /// For each session index we keep a mapping of `AuthorityId` + /// to `offchain::OpaqueNetworkState`. + ReceivedHeartbeats get(received_heartbeats): double_map SessionIndex, + blake2_256(AuthIndex) => Vec; } } + decl_module! { pub struct Module for enum Call where origin: T::Origin { - /// Number of sessions per era. - const SessionsPerEra: session::SessionIndex = T::SessionsPerEra::get(); - - fn deposit_event() = default; + fn deposit_event() = default; fn heartbeat( origin, - heartbeat: Heartbeat, - _signature: Vec + heartbeat: Heartbeat, + _signature: AuthoritySignature ) { ensure_none(origin)?; let current_session = >::current_index(); - let exists = >::exists(¤t_session, &heartbeat.authority_id); - if !exists { - let now = >::block_number(); - Self::deposit_event(RawEvent::HeartbeatReceived(now, heartbeat.authority_id.clone())); + let exists = ::exists( + ¤t_session, + &heartbeat.authority_index + ); + let keys = Keys::get(); + let public = keys.get(heartbeat.authority_index as usize); + if let (true, Some(public)) = (!exists, public) { + Self::deposit_event(Event::HeartbeatReceived(public.clone())); let network_state = heartbeat.network_state.encode(); - >::insert(¤t_session, &heartbeat.authority_id, &network_state); + ::insert( + ¤t_session, + &heartbeat.authority_index, + &network_state + ); } } // Runs after every block. fn offchain_worker(now: T::BlockNumber) { - fn gossip_at(block_number: T::BlockNumber) -> Result<(), OffchainErr> { - // we run only when a local authority key is configured - if let Ok(key) = sr_io::pubkey(CryptoKey::AuthorityKey) { - let authority_id = ::AuthorityId::decode(&mut &key[..]) - .map_err(|_| OffchainErr::DecodeAuthorityId)?; - let network_state = - sr_io::network_state().map_err(|_| OffchainErr::NetworkState)?; - let heartbeat_data = Heartbeat { - block_number, - network_state, - session_index: >::current_index(), - authority_id, - }; - - let signature = sr_io::sign(CryptoKey::AuthorityKey, &heartbeat_data.encode()) - .map_err(|_| OffchainErr::FailedSigning)?; - let call = Call::heartbeat(heartbeat_data, signature); - let ex = T::UncheckedExtrinsic::new_unsigned(call.into()) - .ok_or(OffchainErr::ExtrinsicCreation)?; - sr_io::submit_transaction(&ex) - .map_err(|_| OffchainErr::SubmitTransaction)?; - - // once finished we set the worker status without comparing - // if the existing value changed in the meantime. this is - // because at this point the heartbeat was definitely submitted. - set_worker_status::(block_number, true); - } - Ok(()) - } - - fn compare_and_set_worker_status( - gossipping_at: T::BlockNumber, - done: bool, - curr_worker_status: Option>, - ) -> bool { - let enc = WorkerStatus { - done, - gossipping_at, - }; - sr_io::local_storage_compare_and_set( - StorageKind::PERSISTENT, - DB_KEY, - curr_worker_status.as_ref().map(Vec::as_slice), - &enc.encode() - ) - } - - fn set_worker_status( - gossipping_at: T::BlockNumber, - done: bool, - ) { - let enc = WorkerStatus { - done, - gossipping_at, - }; - sr_io::local_storage_set( - StorageKind::PERSISTENT, DB_KEY, &enc.encode()); - } - - // Checks if a heartbeat gossip already occurred at this block number. - // Returns a tuple of `(current worker status, bool)`, whereby the bool - // is true if not yet gossipped. - fn check_not_yet_gossipped( - now: T::BlockNumber, - next_gossip: T::BlockNumber, - ) -> Result<(Option>, bool), OffchainErr> { - let last_gossip = sr_io::local_storage_get(StorageKind::PERSISTENT, DB_KEY); - match last_gossip { - Some(last) => { - let worker_status: WorkerStatus = Decode::decode(&mut &last[..]) - .map_err(|_| OffchainErr::DecodeWorkerStatus)?; - - let was_aborted = !worker_status.done && worker_status.gossipping_at < now; - - // another off-chain worker is currently in the process of submitting - let already_submitting = - !worker_status.done && worker_status.gossipping_at == now; - - let not_yet_gossipped = - worker_status.done && worker_status.gossipping_at < next_gossip; - - let ret = (was_aborted && !already_submitting) || not_yet_gossipped; - Ok((Some(last), ret)) - }, - None => Ok((None, true)), - } - } - - let next_gossip = >::get(); - let check = check_not_yet_gossipped::(now, next_gossip); - let (curr_worker_status, not_yet_gossipped) = match check { - Ok((s, v)) => (s, v), - Err(err) => { - print(err); - return; - }, - }; - if next_gossip < now && not_yet_gossipped { - let value_set = compare_and_set_worker_status::(now, false, curr_worker_status); - if !value_set { - // value could not be set in local storage, since the value was - // different from `curr_worker_status`. this indicates that - // another worker was running in parallel. - return; - } - - match gossip_at::(now) { - Ok(_) => {}, - Err(err) => print(err), - } - } + Self::offchain(now); } } } impl Module { - /// Returns `true` if a heartbeat has been received for `AuthorityId` - /// during the current era. Otherwise `false`. - pub fn is_online_in_current_era(authority_id: &T::AuthorityId) -> bool { - let curr = >::current_index(); - match LastNewEraStart::get() { - Some(start) => { - // iterate over every session - for index in start..curr { - if >::exists(&index, authority_id) { - return true; - } - } - false + /// Returns `true` if a heartbeat has been received for the authority at `authority_index` in + /// the authorities series, during the current session. Otherwise `false`. + pub fn is_online_in_current_session(authority_index: AuthIndex) -> bool { + let current_session = >::current_index(); + ::exists(¤t_session, &authority_index) + } + + fn offchain(now: T::BlockNumber) { + let next_gossip = >::get(); + let check = Self::check_not_yet_gossipped(now, next_gossip); + let (curr_worker_status, not_yet_gossipped) = match check { + Ok((s, v)) => (s, v), + Err(err) => { + print(err); + return; }, - None => >::exists(&curr, authority_id), + }; + if next_gossip < now && not_yet_gossipped { + let value_set = Self::compare_and_set_worker_status(now, false, curr_worker_status); + if !value_set { + // value could not be set in local storage, since the value was + // different from `curr_worker_status`. this indicates that + // another worker was running in parallel. + return; + } + + match Self::do_gossip_at(now) { + Ok(_) => {}, + Err(err) => print(err), + } } } - /// Returns `true` if a heartbeat has been received for `AuthorityId` - /// during the current session. Otherwise `false`. - pub fn is_online_in_current_session(authority_id: &T::AuthorityId) -> bool { - let current_session = >::current_index(); - >::exists(¤t_session, authority_id) - } + fn do_gossip_at(block_number: T::BlockNumber) -> Result<(), OffchainErr> { + // we run only when a local authority key is configured + let authorities = Keys::get(); + let mut local_keys = app::Public::all(); + local_keys.sort(); + + for (authority_index, key) in authorities.into_iter() + .enumerate() + .filter_map(|(index, authority)| { + local_keys.binary_search(&authority) + .ok() + .map(|location| (index as u32, &local_keys[location])) + }) + { + let network_state = sr_io::network_state().map_err(|_| OffchainErr::NetworkState)?; + let heartbeat_data = Heartbeat { + block_number, + network_state, + session_index: >::current_index(), + authority_index, + }; - /// Session has just changed. - fn new_session() { - let now = >::block_number(); - >::put(now); + let signature = key.sign(&heartbeat_data.encode()).ok_or(OffchainErr::FailedSigning)?; + let call = Call::heartbeat(heartbeat_data, signature); + let ex = T::UncheckedExtrinsic::new_unsigned(call.into()) + .ok_or(OffchainErr::ExtrinsicCreation)?; + sr_io::submit_transaction(&ex).map_err(|_| OffchainErr::SubmitTransaction)?; - let current_session = >::current_index(); + // once finished we set the worker status without comparing + // if the existing value changed in the meantime. this is + // because at this point the heartbeat was definitely submitted. + Self::set_worker_status(block_number, true); + } + Ok(()) + } - match LastNewEraStart::get() { - Some(last_new_era_start) => { - let sessions_per_era = T::SessionsPerEra::get(); + fn compare_and_set_worker_status( + gossipping_at: T::BlockNumber, + done: bool, + curr_worker_status: Option>, + ) -> bool { + let enc = WorkerStatus { + done, + gossipping_at, + }; + sr_io::local_storage_compare_and_set( + StorageKind::PERSISTENT, + DB_KEY, + curr_worker_status.as_ref().map(Vec::as_slice), + &enc.encode() + ) + } - let new_era = current_session - last_new_era_start > sessions_per_era; - if new_era { - LastNewEraStart::put(current_session); - Self::remove_heartbeats(); - } - }, - None => LastNewEraStart::put(current_session), + fn set_worker_status( + gossipping_at: T::BlockNumber, + done: bool, + ) { + let enc = WorkerStatus { + done, + gossipping_at, }; + sr_io::local_storage_set( + StorageKind::PERSISTENT, DB_KEY, &enc.encode()); } - // Remove all stored heartbeats. - fn remove_heartbeats() { - let curr = >::current_index(); - match LastNewEraStart::get() { - Some(start) => { - for index in start..curr { - >::remove_prefix(&index); - } + // Checks if a heartbeat gossip already occurred at this block number. + // Returns a tuple of `(current worker status, bool)`, whereby the bool + // is true if not yet gossipped. + fn check_not_yet_gossipped( + now: T::BlockNumber, + next_gossip: T::BlockNumber, + ) -> Result<(Option>, bool), OffchainErr> { + let last_gossip = sr_io::local_storage_get(StorageKind::PERSISTENT, DB_KEY); + match last_gossip { + Some(last) => { + let worker_status: WorkerStatus = Decode::decode(&mut &last[..]) + .map_err(|_| OffchainErr::DecodeWorkerStatus)?; + + let was_aborted = !worker_status.done && worker_status.gossipping_at < now; + + // another off-chain worker is currently in the process of submitting + let already_submitting = + !worker_status.done && worker_status.gossipping_at == now; + + let not_yet_gossipped = + worker_status.done && worker_status.gossipping_at < next_gossip; + + let ret = (was_aborted && !already_submitting) || not_yet_gossipped; + Ok((Some(last), ret)) }, - None => >::remove_prefix(&curr), + None => Ok((None, true)), } } + } impl session::OneSessionHandler for Module { - type Key = ::AuthorityId; + type Key = AuthorityId; + + fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I, next_validators: I) + where I: Iterator + { + // Reset heartbeats + ::remove_prefix(&>::current_index()); + + // Tell the offchain worker to start making the next session's heartbeats. + >::put(>::block_number()); - fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I, _next_validators: I) { - Self::new_session(); + // Remember who the authorities are for the new session. + Keys::put(next_validators.map(|x| x.1).collect::>()); } fn on_disabled(_i: usize) { @@ -405,55 +380,42 @@ impl srml_support::unsigned::ValidateUnsigned for Module { fn validate_unsigned(call: &Self::Call) -> srml_support::unsigned::TransactionValidity { if let Call::heartbeat(heartbeat, signature) = call { - // verify that the incoming (unverified) pubkey is actually an authority id - let is_authority = T::IsValidAuthorityId::is_member(&heartbeat.authority_id); - if !is_authority { - return TransactionValidity::Invalid(ApplyError::BadSignature as i8); - } - - if >::is_online_in_current_session(&heartbeat.authority_id) { + if >::is_online_in_current_session(heartbeat.authority_index) { // we already received a heartbeat for this authority - return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + return TransactionValidity::Invalid(ApplyError::Stale as i8); } - if signature.len() != 64 { - return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + // check if session index from heartbeat is recent + let current_session = >::current_index(); + if heartbeat.session_index != current_session { + return TransactionValidity::Invalid(ApplyError::Stale as i8); } - let signature = { - let mut array = [0; 64]; - array.copy_from_slice(&signature); // panics if not enough, hence the check above - array + // verify that the incoming (unverified) pubkey is actually an authority id + let keys = Keys::get(); + let authority_id = match keys.get(heartbeat.authority_index as usize) { + Some(id) => id, + None => return TransactionValidity::Invalid(ApplyError::BadSignature as i8), }; - let encoded_heartbeat = heartbeat.encode(); - - let signature_valid = match ::KEY_TYPE { - ed25519::Public::KEY_TYPE => - sr_io::ed25519_verify(&signature, &encoded_heartbeat, &heartbeat.authority_id), - sr25519::Public::KEY_TYPE => - sr_io::sr25519_verify(&signature, &encoded_heartbeat, &heartbeat.authority_id), - _ => return TransactionValidity::Invalid(ApplyError::BadSignature as i8), - }; + // check signature (this is expensive so we do it last). + let signature_valid = heartbeat.using_encoded(|encoded_heartbeat| { + authority_id.verify(&encoded_heartbeat, &signature) + }); if !signature_valid { return TransactionValidity::Invalid(ApplyError::BadSignature as i8); } - // check if session index from heartbeat is recent - let current_session = >::current_index(); - if heartbeat.session_index < current_session { - return TransactionValidity::Invalid(ApplyError::BadSignature as i8); - } - return TransactionValidity::Valid(ValidTransaction { priority: 0, requires: vec![], - provides: vec![encoded_heartbeat], + provides: vec![(current_session, authority_id).encode()], longevity: TransactionLongevity::max_value(), propagate: true, }) } + TransactionValidity::Invalid(0) } } diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index ef4b2eb649..d3ddfb0e09 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -75,6 +75,7 @@ impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; diff --git a/srml/membership/Cargo.toml b/srml/membership/Cargo.toml new file mode 100644 index 0000000000..5126f41f89 --- /dev/null +++ b/srml/membership/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "srml-membership" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +serde = { version = "1.0", optional = true } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } +sr-std = { path = "../../core/sr-std", default-features = false } +sr-io = { path = "../../core/sr-io", default-features = false } +srml-support = { path = "../support", default-features = false } +system = { package = "srml-system", path = "../system", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } + +[dev-dependencies] +primitives = { package = "substrate-primitives", path = "../../core/primitives" } + +[features] +default = ["std"] +std = [ + "serde", + "codec/std", + "sr-primitives/std", + "sr-std/std", + "sr-io/std", + "srml-support/std", + "system/std", +] diff --git a/srml/membership/src/lib.rs b/srml/membership/src/lib.rs new file mode 100644 index 0000000000..805ec368bb --- /dev/null +++ b/srml/membership/src/lib.rs @@ -0,0 +1,347 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! # Membership Module +//! +//! Allows control of membership of a set of `AccountId`s, useful for managing membership of of a +//! collective. + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +use sr_std::prelude::*; +use srml_support::{ + StorageValue, decl_module, decl_storage, decl_event, + traits::{ChangeMembers} +}; +use system::ensure_root; +use sr_primitives::{traits::EnsureOrigin, weights::SimpleDispatchInfo}; + +pub trait Trait: system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// Required origin for adding a member (though can always be Root). + type AddOrigin: EnsureOrigin; + + /// Required origin for removing a member (though can always be Root). + type RemoveOrigin: EnsureOrigin; + + /// Required origin for adding and removing a member in a single action. + type SwapOrigin: EnsureOrigin; + + /// Required origin for resetting membership. + type ResetOrigin: EnsureOrigin; + + /// The receiver of the signal for when the membership has been initialized. This happens pre- + /// genesis and will usually be the same as `MembershipChanged`. If you need to do something + /// different on initialization, then you can change this accordingly. + type MembershipInitialized: ChangeMembers; + + /// The receiver of the signal for when the membership has changed. + type MembershipChanged: ChangeMembers; +} + +decl_storage! { + trait Store for Module, I: Instance=DefaultInstance> as Membership { + /// The current membership, stored as an ordered Vec. + Members get(members): Vec; + } + add_extra_genesis { + config(members): Vec; + config(phantom): sr_std::marker::PhantomData; + build(| + storage: &mut sr_primitives::StorageOverlay, + _: &mut sr_primitives::ChildrenStorageOverlay, + config: &GenesisConfig + | { + sr_io::with_storage(storage, || { + let mut members = config.members.clone(); + members.sort(); + T::MembershipInitialized::set_members_sorted(&members[..], &[]); + >::put(members); + }); + }) + } +} + +decl_event!( + pub enum Event where + ::AccountId, + { + /// The given member was added; see the transaction for who. + MemberAdded, + /// The given member was removed; see the transaction for who. + MemberRemoved, + /// Two members were swapped; see the transaction for who. + MembersSwapped, + /// The membership was reset; see the transaction for who the new set is. + MembersReset, + /// Phantom member, never used. + Dummy(sr_std::marker::PhantomData<(AccountId, I)>), + } +); + +decl_module! { + pub struct Module, I: Instance=DefaultInstance> + for enum Call + where origin: T::Origin + { + fn deposit_event() = default; + + /// Add a member `who` to the set. + /// + /// May only be called from `AddOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn add_member(origin, who: T::AccountId) { + T::AddOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + let mut members = >::get(); + let location = members.binary_search(&who).err().ok_or("already a member")?; + members.insert(location, who.clone()); + >::put(&members); + + T::MembershipChanged::change_members_sorted(&[who], &[], &members[..]); + + Self::deposit_event(RawEvent::MemberAdded); + } + + /// Remove a member `who` from the set. + /// + /// May only be called from `RemoveOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn remove_member(origin, who: T::AccountId) { + T::RemoveOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + let mut members = >::get(); + let location = members.binary_search(&who).ok().ok_or("not a member")?; + members.remove(location); + >::put(&members); + + T::MembershipChanged::change_members_sorted(&[], &[who], &members[..]); + + Self::deposit_event(RawEvent::MemberRemoved); + } + + /// Swap out one member `remove` for another `add`. + /// + /// May only be called from `SwapOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn swap_member(origin, remove: T::AccountId, add: T::AccountId) { + T::SwapOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + if remove == add { return Ok(()) } + + let mut members = >::get(); + let location = members.binary_search(&remove).ok().ok_or("not a member")?; + members[location] = add.clone(); + let _location = members.binary_search(&add).err().ok_or("already a member")?; + members.sort(); + >::put(&members); + + T::MembershipChanged::change_members_sorted( + &[add], + &[remove], + &members[..], + ); + + Self::deposit_event(RawEvent::MembersSwapped); + } + + /// Change the membership to a new set, disregarding the existing membership. Be nice and + /// pass `members` pre-sorted. + /// + /// May only be called from `ResetOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn reset_members(origin, members: Vec) { + T::ResetOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + let mut members = members; + members.sort(); + >::mutate(|m| { + T::MembershipChanged::set_members_sorted(&members[..], m); + *m = members; + }); + + Self::deposit_event(RawEvent::MembersReset); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::cell::RefCell; + use srml_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types}; + use sr_io::with_externalities; + use primitives::{H256, Blake2Hasher}; + // The testing primitives are very useful for avoiding having to work with signatures + // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. + use sr_primitives::{ + Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header + }; + use system::EnsureSignedBy; + + impl_outer_origin! { + pub enum Origin for Test {} + } + + // For testing the module, we construct most of a mock runtime. This means + // first constructing a configuration type (`Test`) which `impl`s each of the + // configuration traits of modules we want to use. + #[derive(Clone, Eq, PartialEq)] + pub struct Test; + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + } + impl system::Trait for Test { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = (); + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type WeightMultiplierUpdate = (); + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + } + parameter_types! { + pub const One: u64 = 1; + pub const Two: u64 = 2; + pub const Three: u64 = 3; + pub const Four: u64 = 4; + pub const Five: u64 = 5; + } + + thread_local! { + static MEMBERS: RefCell> = RefCell::new(vec![]); + } + + pub struct TestChangeMembers; + impl ChangeMembers for TestChangeMembers { + fn change_members_sorted(incoming: &[u64], outgoing: &[u64], new: &[u64]) { + let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec()); + old_plus_incoming.extend_from_slice(incoming); + old_plus_incoming.sort(); + let mut new_plus_outgoing = new.to_vec(); + new_plus_outgoing.extend_from_slice(outgoing); + new_plus_outgoing.sort(); + assert_eq!(old_plus_incoming, new_plus_outgoing); + + MEMBERS.with(|m| *m.borrow_mut() = new.to_vec()); + } + } + + impl Trait for Test { + type Event = (); + type AddOrigin = EnsureSignedBy; + type RemoveOrigin = EnsureSignedBy; + type SwapOrigin = EnsureSignedBy; + type ResetOrigin = EnsureSignedBy; + type MembershipInitialized = TestChangeMembers; + type MembershipChanged = TestChangeMembers; + } + + type Membership = Module; + + // This function basically just builds a genesis storage key/value store according to + // our desired mockup. + fn new_test_ext() -> sr_io::TestExternalities { + let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + // We use default for brevity, but you can configure as desired if needed. + t.extend(GenesisConfig::{ + members: vec![10, 20, 30], + .. Default::default() + }.build_storage().unwrap().0); + t.into() + } + + #[test] + fn query_membership_works() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Membership::members(), vec![10, 20, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), vec![10, 20, 30]); + }); + } + + #[test] + fn add_member_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::add_member(Origin::signed(5), 15), "bad origin"); + assert_noop!(Membership::add_member(Origin::signed(1), 10), "already a member"); + assert_ok!(Membership::add_member(Origin::signed(1), 15)); + assert_eq!(Membership::members(), vec![10, 15, 20, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } + + #[test] + fn remove_member_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::remove_member(Origin::signed(5), 20), "bad origin"); + assert_noop!(Membership::remove_member(Origin::signed(2), 15), "not a member"); + assert_ok!(Membership::remove_member(Origin::signed(2), 20)); + assert_eq!(Membership::members(), vec![10, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } + + #[test] + fn swap_member_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::swap_member(Origin::signed(5), 10, 25), "bad origin"); + assert_noop!(Membership::swap_member(Origin::signed(3), 15, 25), "not a member"); + assert_noop!(Membership::swap_member(Origin::signed(3), 10, 30), "already a member"); + assert_ok!(Membership::swap_member(Origin::signed(3), 20, 20)); + assert_eq!(Membership::members(), vec![10, 20, 30]); + assert_ok!(Membership::swap_member(Origin::signed(3), 10, 25)); + assert_eq!(Membership::members(), vec![20, 25, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } + + #[test] + fn reset_members_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::reset_members(Origin::signed(1), vec![20, 40, 30]), "bad origin"); + assert_ok!(Membership::reset_members(Origin::signed(4), vec![20, 40, 30])); + assert_eq!(Membership::members(), vec![20, 30, 40]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } +} diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml index 66d47f4c35..d084ab4261 100644 --- a/srml/session/Cargo.toml +++ b/srml/session/Cargo.toml @@ -18,6 +18,7 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = [dev-dependencies] primitives = { package = "substrate-primitives", path = "../../core/primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../../core/application-crypto" } lazy_static = "1.0" [features] diff --git a/srml/session/src/historical.rs b/srml/session/src/historical.rs index e35df3011c..815d782cf9 100644 --- a/srml/session/src/historical.rs +++ b/srml/session/src/historical.rs @@ -100,9 +100,9 @@ impl Module { /// Specialization of the crate-level `OnSessionEnding` which returns the old /// set of full identification when changing the validator set. pub trait OnSessionEnding: crate::OnSessionEnding { - /// Returns the set of new validators, if any, along with the old validators - /// and their full identifications. - fn on_session_ending(ending: SessionIndex, applied_at: SessionIndex) + /// If there was a validator set change, its returns the set of new validators along with the + /// old validators and their full identifications. + fn on_session_ending(ending: SessionIndex, will_apply_at: SessionIndex) -> Option<(Vec, Vec<(ValidatorId, FullIdentification)>)>; } @@ -312,11 +312,8 @@ impl> srml_support::traits::KeyOwnerProofSystem<(KeyTyp mod tests { use super::*; use runtime_io::with_externalities; - use primitives::Blake2Hasher; - use sr_primitives::{ - traits::OnInitialize, - testing::{UintAuthorityId, UINT_DUMMY_KEY}, - }; + use primitives::{Blake2Hasher, crypto::key_types::DUMMY}; + use sr_primitives::{traits::OnInitialize, testing::UintAuthorityId}; use crate::mock::{ NEXT_VALIDATORS, force_new_session, set_next_validators, Test, System, Session, @@ -329,7 +326,7 @@ mod tests { let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; let (storage, _child_storage) = crate::GenesisConfig:: { keys: NEXT_VALIDATORS.with(|l| - l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect() + l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i).into())).collect() ), }.build_storage().unwrap(); t.extend(storage); @@ -346,15 +343,10 @@ mod tests { Session::on_initialize(1); let encoded_key_1 = UintAuthorityId(1).encode(); - let proof = Historical::prove((UINT_DUMMY_KEY, &encoded_key_1[..])).unwrap(); + let proof = Historical::prove((DUMMY, &encoded_key_1[..])).unwrap(); // proof-checking in the same session is OK. - assert!( - Historical::check_proof( - (UINT_DUMMY_KEY, &encoded_key_1[..]), - proof.clone(), - ).is_some() - ); + assert!(Historical::check_proof((DUMMY, &encoded_key_1[..]), proof.clone()).is_some()); set_next_validators(vec![1, 2, 4]); force_new_session(); @@ -370,12 +362,7 @@ mod tests { assert!(Session::current_index() > proof.session); // proof-checking in the next session is also OK. - assert!( - Historical::check_proof( - (UINT_DUMMY_KEY, &encoded_key_1[..]), - proof.clone(), - ).is_some() - ); + assert!(Historical::check_proof((DUMMY, &encoded_key_1[..]), proof.clone()).is_some()); set_next_validators(vec![1, 2, 5]); diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 8b9e8b1566..3aded46ea0 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -121,9 +121,9 @@ use rstd::{prelude::*, marker::PhantomData, ops::{Sub, Rem}}; use codec::Decode; -use sr_primitives::KeyTypeId; +use sr_primitives::{KeyTypeId, AppKey}; use sr_primitives::weights::SimpleDispatchInfo; -use sr_primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey}; +use sr_primitives::traits::{Convert, Zero, Member, OpaqueKeys}; use srml_support::{ dispatch::Result, ConsensusEngineId, StorageValue, StorageDoubleMap, for_each_tuple, decl_module, decl_event, decl_storage, @@ -172,10 +172,13 @@ pub trait OnSessionEnding { /// Handle the fact that the session is ending, and optionally provide the new validator set. /// /// `ending_index` is the index of the currently ending session. - /// The returned validator set, if any, will not be applied until `next_index`. - /// `next_index` is guaranteed to be at least `ending_index + 1`, since session indices don't - /// repeat. - fn on_session_ending(ending_index: SessionIndex, next_index: SessionIndex) -> Option>; + /// The returned validator set, if any, will not be applied until `will_apply_at`. + /// `will_apply_at` is guaranteed to be at least `ending_index + 1`, since session indices don't + /// repeat, but it could be some time after in case we are staging authority set changes. + fn on_session_ending( + ending_index: SessionIndex, + will_apply_at: SessionIndex + ) -> Option>; } impl OnSessionEnding for () { @@ -198,7 +201,7 @@ pub trait SessionHandler { /// One session-key type handler. pub trait OneSessionHandler { /// The key type expected. - type Key: Decode + Default + TypedKey; + type Key: Decode + Default + AppKey; fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued_validators: I) where I: Iterator, ValidatorId: 'a; @@ -222,10 +225,10 @@ macro_rules! impl_session_handlers { ) { $( let our_keys: Box> = Box::new(validators.iter() - .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as TypedKey>::KEY_TYPE) + .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as AppKey>::ID) .unwrap_or_default()))); let queued_keys: Box> = Box::new(queued_validators.iter() - .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as TypedKey>::KEY_TYPE) + .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as AppKey>::ID) .unwrap_or_default()))); $t::on_new_session(changed, our_keys, queued_keys); )* @@ -562,7 +565,7 @@ mod tests { use super::*; use srml_support::assert_ok; use runtime_io::with_externalities; - use primitives::Blake2Hasher; + use primitives::{Blake2Hasher, crypto::key_types::DUMMY}; use sr_primitives::{ traits::OnInitialize, testing::UintAuthorityId, @@ -576,7 +579,7 @@ mod tests { let mut t = system::GenesisConfig::default().build_storage::().unwrap(); GenesisConfig:: { keys: NEXT_VALIDATORS.with(|l| - l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect() + l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i).into())).collect() ), }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); runtime_io::TestExternalities::new_with_children(t) @@ -599,8 +602,8 @@ mod tests { #[test] fn put_get_keys() { with_externalities(&mut new_test_ext(), || { - Session::put_keys(&10, &UintAuthorityId(10)); - assert_eq!(Session::load_keys(&10), Some(UintAuthorityId(10))); + Session::put_keys(&10, &UintAuthorityId(10).into()); + assert_eq!(Session::load_keys(&10), Some(UintAuthorityId(10).into())); }) } @@ -609,9 +612,9 @@ mod tests { let mut ext = new_test_ext(); with_externalities(&mut ext, || { assert_eq!(Session::validators(), vec![1, 2, 3]); - assert_eq!(Session::load_keys(&1), Some(UintAuthorityId(1))); + assert_eq!(Session::load_keys(&1), Some(UintAuthorityId(1).into())); - let id = ::KEY_TYPE; + let id = DUMMY; assert_eq!(Session::key_owner(id, UintAuthorityId(1).get_raw(id)), Some(1)); Session::on_free_balance_zero(&1); @@ -629,8 +632,8 @@ mod tests { force_new_session(); initialize_block(1); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), ]); assert_eq!(Session::validators(), vec![1, 2, 3]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); @@ -638,20 +641,20 @@ mod tests { force_new_session(); initialize_block(2); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), ]); assert_eq!(Session::validators(), vec![1, 2]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]); set_next_validators(vec![1, 2, 4]); - assert_ok!(Session::set_keys(Origin::signed(4), UintAuthorityId(4), vec![])); + assert_ok!(Session::set_keys(Origin::signed(4), UintAuthorityId(4).into(), vec![])); force_new_session(); initialize_block(3); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), - (4, UintAuthorityId(4)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), + (4, UintAuthorityId(4).into()), ]); assert_eq!(Session::validators(), vec![1, 2]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]); @@ -659,9 +662,9 @@ mod tests { force_new_session(); initialize_block(4); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), - (4, UintAuthorityId(4)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), + (4, UintAuthorityId(4).into()), ]); assert_eq!(Session::validators(), vec![1, 2, 4]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]); @@ -704,7 +707,7 @@ mod tests { // Block 3: Set new key for validator 2; no visible change. initialize_block(3); - assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5), vec![])); + assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5).into(), vec![])); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); // Block 4: Session rollover; no visible change. @@ -726,11 +729,11 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); Session::on_initialize(1); - assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1), vec![]).is_err()); - assert!(Session::set_keys(Origin::signed(1), UintAuthorityId(10), vec![]).is_ok()); + assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1).into(), vec![]).is_err()); + assert!(Session::set_keys(Origin::signed(1), UintAuthorityId(10).into(), vec![]).is_ok()); // is fine now that 1 has migrated off. - assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1), vec![]).is_ok()); + assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1).into(), vec![]).is_ok()); }); } @@ -760,7 +763,7 @@ mod tests { initialize_block(5); assert!(!session_changed()); - assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5), vec![])); + assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5).into(), vec![])); force_new_session(); initialize_block(6); assert!(!session_changed()); @@ -799,4 +802,18 @@ mod tests { assert!(P::should_end_session(13)); } + + #[test] + fn session_keys_generate_output_works_as_set_keys_input() { + with_externalities(&mut new_test_ext(), || { + let new_keys = mock::MockSessionKeys::generate(None); + assert_ok!( + Session::set_keys( + Origin::signed(2), + ::Keys::decode(&mut &new_keys[..]).expect("Decode keys"), + vec![], + ) + ); + }); + } } diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index 734f5bbde4..66bf93032d 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -19,13 +19,24 @@ use super::*; use std::cell::RefCell; use srml_support::{impl_outer_origin, parameter_types}; -use primitives::H256; +use primitives::{crypto::key_types::DUMMY, H256}; use sr_primitives::{ - Perbill, - traits::{BlakeTwo256, IdentityLookup, ConvertInto}, + Perbill, impl_opaque_keys, traits::{BlakeTwo256, IdentityLookup, ConvertInto}, testing::{Header, UintAuthorityId} }; +impl_opaque_keys! { + pub struct MockSessionKeys { + #[id(DUMMY)] + pub dummy: UintAuthorityId, + } +} + +impl From for MockSessionKeys { + fn from(dummy: UintAuthorityId) -> Self { + Self { dummy } + } +} impl_outer_origin! { pub enum Origin for Test {} @@ -58,7 +69,9 @@ impl SessionHandler for TestSessionHandler { ) { SESSION_CHANGED.with(|l| *l.borrow_mut() = changed); AUTHORITIES.with(|l| - *l.borrow_mut() = validators.iter().map(|(_, id)| id.get::(0).unwrap_or_default()).collect() + *l.borrow_mut() = validators.iter() + .map(|(_, id)| id.get::(DUMMY).unwrap_or_default()) + .collect() ); } fn on_disabled(_validator_index: usize) {} @@ -119,10 +132,12 @@ parameter_types! { pub const MinimumPeriod: u64 = 5; pub const AvailableBlockRatio: Perbill = Perbill::one(); } + impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; @@ -135,13 +150,13 @@ impl system::Trait for Test { type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; } + impl timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; } - impl Trait for Test { type ShouldEndSession = TestShouldEndSession; #[cfg(feature = "historical")] @@ -151,7 +166,7 @@ impl Trait for Test { type SessionHandler = TestSessionHandler; type ValidatorId = u64; type ValidatorIdOf = ConvertInto; - type Keys = UintAuthorityId; + type Keys = MockSessionKeys; type Event = (); type SelectInitialValidators = (); } diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 344ef70e3b..787c4f13b7 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -110,6 +110,7 @@ impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = BlockNumber; + type Call = (); type Hash = H256; type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = AccountId; diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index bc6cd145ce..f8b8fb5483 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -238,6 +238,23 @@ pub trait StorageMap { /// Take the value under a key. fn take>(key: &K, storage: &mut S) -> Self::Query; + /// Swap the values of two keys. + fn swap>(key1: &K, key2: &K, storage: &mut S) { + let k1 = Self::key_for(key1); + let k2 = Self::key_for(key2); + let v1 = storage.get_raw(&k1[..]); + if let Some(val) = storage.get_raw(&k2[..]) { + storage.put_raw(&k1[..], &val[..]); + } else { + storage.kill(&k1[..]) + } + if let Some(val) = v1 { + storage.put_raw(&k2[..], &val[..]); + } else { + storage.kill(&k2[..]) + } + } + /// Store a value to be associated with the given key from the map. fn insert>(key: &K, val: &V, storage: &mut S) { storage.put(&Self::key_for(key)[..], val); diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index 46b6603d91..385fad42eb 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -191,6 +191,9 @@ pub trait StorageMap { /// Load the value associated with the given key from the map. fn get>(key: KeyArg) -> Self::Query; + /// Swap the values of two keys. + fn swap, KeyArg2: Borrow>(key1: KeyArg1, key2: KeyArg2); + /// Store a value to be associated with the given key from the map. fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg); @@ -227,6 +230,10 @@ impl StorageMap for U where U: hashed::generator::S U::get(key.borrow(), &RuntimeStorage) } + fn swap, KeyArg2: Borrow>(key1: KeyArg1, key2: KeyArg2) { + U::swap(key1.borrow(), key2.borrow(), &mut RuntimeStorage) + } + fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg) { U::insert(key.borrow(), val.borrow(), &mut RuntimeStorage) } diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 5f1d7c32ef..2766ba0a98 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -18,7 +18,7 @@ //! //! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module. -use crate::rstd::{result, marker::PhantomData, ops::Div}; +use crate::rstd::{prelude::*, result, marker::PhantomData, ops::Div}; use crate::codec::{Codec, Encode, Decode}; use primitives::u32_trait::Value as U32; use crate::sr_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; @@ -631,12 +631,61 @@ impl WithdrawReasons { } /// Trait for type that can handle incremental changes to a set of account IDs. -pub trait ChangeMembers { +pub trait ChangeMembers { + /// A number of members `incoming` just joined the set and replaced some `outgoing` ones. The + /// new set is given by `new`, and need not be sorted. + fn change_members(incoming: &[AccountId], outgoing: &[AccountId], mut new: Vec) { + new.sort_unstable(); + Self::change_members_sorted(incoming, outgoing, &new[..]); + } + /// A number of members `_incoming` just joined the set and replaced some `_outgoing` ones. The - /// new set is thus given by `_new`. - fn change_members(_incoming: &[AccountId], _outgoing: &[AccountId], _new: &[AccountId]); + /// new set is thus given by `sorted_new` and **must be sorted**. + /// + /// NOTE: This is the only function that needs to be implemented in `ChangeMembers`. + fn change_members_sorted( + incoming: &[AccountId], + outgoing: &[AccountId], + sorted_new: &[AccountId], + ); + + /// Set the new members; they **must already be sorted**. This will compute the diff and use it to + /// call `change_members_sorted`. + fn set_members_sorted(new_members: &[AccountId], old_members: &[AccountId]) { + let mut old_iter = old_members.iter(); + let mut new_iter = new_members.iter(); + let mut incoming = Vec::new(); + let mut outgoing = Vec::new(); + let mut old_i = old_iter.next(); + let mut new_i = new_iter.next(); + loop { + match (old_i, new_i) { + (None, None) => break, + (Some(old), Some(new)) if old == new => { + old_i = old_iter.next(); + new_i = new_iter.next(); + } + (Some(old), Some(new)) if old < new => { + outgoing.push(old.clone()); + old_i = old_iter.next(); + } + (Some(old), None) => { + outgoing.push(old.clone()); + old_i = old_iter.next(); + } + (_, Some(new)) => { + incoming.push(new.clone()); + new_i = new_iter.next(); + } + } + } + + Self::change_members_sorted(&incoming[..], &outgoing[..], &new_members); + } } -impl ChangeMembers for () { - fn change_members(_incoming: &[T], _outgoing: &[T], _new_set: &[T]) {} +impl ChangeMembers for () { + fn change_members(_: &[T], _: &[T], _: Vec) {} + fn change_members_sorted(_: &[T], _: &[T], _: &[T]) {} + fn set_members_sorted(_: &[T], _: &[T]) {} } diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index 8e13e92d3f..8b67ba50bd 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -63,6 +63,7 @@ impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index d3a87cd38b..f41a566724 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -154,6 +154,9 @@ pub trait Trait: 'static + Eq + Clone { /// The aggregated `Origin` type used by dispatchable calls. type Origin: Into, Self::Origin>> + From>; + /// The aggregated `Call` type. + type Call; + /// Account index (aka nonce) type. This stores the number of previous transactions associated with a sender /// account. type Index: @@ -839,7 +842,7 @@ impl CheckWeight { let added_weight = info.weight.min(limit); let next_weight = current_weight.saturating_add(added_weight); if next_weight > limit { - return Err(DispatchError::Resource) + return Err(DispatchError::Exhausted) } Ok(next_weight) } @@ -854,7 +857,7 @@ impl CheckWeight { let added_len = len as u32; let next_len = current_len.saturating_add(added_len); if next_len > limit { - return Err(DispatchError::Resource) + return Err(DispatchError::Exhausted) } Ok(next_len) } @@ -876,6 +879,7 @@ impl CheckWeight { impl SignedExtension for CheckWeight { type AccountId = T::AccountId; + type Call = T::Call; type AdditionalSigned = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } @@ -883,6 +887,7 @@ impl SignedExtension for CheckWeight { fn pre_dispatch( self, _who: &Self::AccountId, + _call: &Self::Call, info: DispatchInfo, len: usize, ) -> Result<(), DispatchError> { @@ -896,6 +901,7 @@ impl SignedExtension for CheckWeight { fn validate( &self, _who: &Self::AccountId, + _call: &Self::Call, info: DispatchInfo, len: usize, ) -> Result { @@ -936,6 +942,7 @@ impl rstd::fmt::Debug for CheckNonce { impl SignedExtension for CheckNonce { type AccountId = T::AccountId; + type Call = T::Call; type AdditionalSigned = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } @@ -943,6 +950,7 @@ impl SignedExtension for CheckNonce { fn pre_dispatch( self, who: &Self::AccountId, + _call: &Self::Call, _info: DispatchInfo, _len: usize, ) -> Result<(), DispatchError> { @@ -959,6 +967,7 @@ impl SignedExtension for CheckNonce { fn validate( &self, who: &Self::AccountId, + _call: &Self::Call, info: DispatchInfo, _len: usize, ) -> Result { @@ -1006,6 +1015,7 @@ impl rstd::fmt::Debug for CheckEra { impl SignedExtension for CheckEra { type AccountId = T::AccountId; + type Call = T::Call; type AdditionalSigned = T::Hash; fn additional_signed(&self) -> Result { let current_u64 = >::block_number().saturated_into::(); @@ -1035,6 +1045,7 @@ impl CheckGenesis { impl SignedExtension for CheckGenesis { type AccountId = T::AccountId; + type Call = ::Call; type AdditionalSigned = T::Hash; fn additional_signed(&self) -> Result { Ok(>::block_hash(T::BlockNumber::zero())) @@ -1080,6 +1091,7 @@ mod tests { impl Trait for Test { type Origin = Origin; + type Call = (); type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -1106,6 +1118,8 @@ mod tests { type System = Module; + const CALL: &::Call = &(); + fn new_test_ext() -> runtime_io::TestExternalities { GenesisConfig::default().build_storage::().unwrap().0.into() } @@ -1259,14 +1273,14 @@ mod tests { let info = DispatchInfo::default(); let len = 0_usize; // stale - assert!(CheckNonce::(0).validate(&1, info, len).is_err()); - assert!(CheckNonce::(0).pre_dispatch(&1, info, len).is_err()); + assert!(CheckNonce::(0).validate(&1, CALL, info, len).is_err()); + assert!(CheckNonce::(0).pre_dispatch(&1, CALL, info, len).is_err()); // correct - assert!(CheckNonce::(1).validate(&1, info, len).is_ok()); - assert!(CheckNonce::(1).pre_dispatch(&1, info, len).is_ok()); + assert!(CheckNonce::(1).validate(&1, CALL, info, len).is_ok()); + assert!(CheckNonce::(1).pre_dispatch(&1, CALL, info, len).is_ok()); // future - assert!(CheckNonce::(5).validate(&1, info, len).is_ok()); - assert!(CheckNonce::(5).pre_dispatch(&1, info, len).is_err()); + assert!(CheckNonce::(5).validate(&1, CALL, info, len).is_ok()); + assert!(CheckNonce::(5).pre_dispatch(&1, CALL, info, len).is_err()); }) } @@ -1287,7 +1301,7 @@ mod tests { let reset_check_weight = |i, f, s| { AllExtrinsicsWeight::put(s); - let r = CheckWeight::(PhantomData).pre_dispatch(&1, i, len); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, i, len); if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } }; @@ -1304,7 +1318,7 @@ mod tests { let len = 0_usize; assert_eq!(System::all_extrinsics_weight(), 0); - let r = CheckWeight::(PhantomData).pre_dispatch(&1, free, len); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, free, len); assert!(r.is_ok()); assert_eq!(System::all_extrinsics_weight(), 0); }) @@ -1318,7 +1332,7 @@ mod tests { let normal_limit = normal_weight_limit(); assert_eq!(System::all_extrinsics_weight(), 0); - let r = CheckWeight::(PhantomData).pre_dispatch(&1, max, len); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, max, len); assert!(r.is_ok()); assert_eq!(System::all_extrinsics_weight(), normal_limit); }) @@ -1335,15 +1349,15 @@ mod tests { // given almost full block AllExtrinsicsWeight::put(normal_limit); // will not fit. - assert!(CheckWeight::(PhantomData).pre_dispatch(&1, normal, len).is_err()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, normal, len).is_err()); // will fit. - assert!(CheckWeight::(PhantomData).pre_dispatch(&1, op, len).is_ok()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, op, len).is_ok()); // likewise for length limit. let len = 100_usize; AllExtrinsicsLen::put(normal_length_limit()); - assert!(CheckWeight::(PhantomData).pre_dispatch(&1, normal, len).is_err()); - assert!(CheckWeight::(PhantomData).pre_dispatch(&1, op, len).is_ok()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, normal, len).is_err()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, op, len).is_ok()); }) } @@ -1355,11 +1369,11 @@ mod tests { let len = 0_usize; assert_eq!( - CheckWeight::(PhantomData).validate(&1, normal, len).unwrap().priority, + CheckWeight::(PhantomData).validate(&1, CALL, normal, len).unwrap().priority, 100, ); assert_eq!( - CheckWeight::(PhantomData).validate(&1, op, len).unwrap().priority, + CheckWeight::(PhantomData).validate(&1, CALL, op, len).unwrap().priority, Bounded::max_value(), ); }) @@ -1372,7 +1386,7 @@ mod tests { let normal_limit = normal_weight_limit() as usize; let reset_check_weight = |tx, s, f| { AllExtrinsicsLen::put(0); - let r = CheckWeight::(PhantomData).pre_dispatch(&1, tx, s); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, tx, s); if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } }; diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index bc9533e6e6..1b52252618 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -358,6 +358,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 1cf3277199..0183fcd899 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -382,6 +382,7 @@ mod tests { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; diff --git a/subkey/src/main.rs b/subkey/src/main.rs index c123e88ec2..5b16bde28d 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -88,7 +88,7 @@ impl Crypto for Sr25519 { fn execute(matches: clap::ArgMatches) where <::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default, - <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, + <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec, { let extra = |i: Index, f: Balance| { ( diff --git a/test-utils/chain-spec-builder/src/main.rs b/test-utils/chain-spec-builder/src/main.rs index 211e8321e3..13b4cc38a1 100644 --- a/test-utils/chain-spec-builder/src/main.rs +++ b/test-utils/chain-spec-builder/src/main.rs @@ -1,6 +1,6 @@ use clap::{App, load_yaml}; -use node_cli::chain_spec; +use node_cli::chain_spec::{self, AccountId}; use substrate_service::chain_ops::build_spec; fn genesis_constructor() -> chain_spec::GenesisConfig { @@ -13,11 +13,11 @@ fn genesis_constructor() -> chain_spec::GenesisConfig { let endowed_accounts = matches.values_of("endowed_account_seed") .unwrap() - .map(chain_spec::get_account_id_from_seed) + .map(chain_spec::get_from_seed::) .collect(); let sudo_key_seed = matches.value_of("sudo_key_seed").unwrap(); - let sudo_key = chain_spec::get_account_id_from_seed(sudo_key_seed); + let sudo_key = chain_spec::get_from_seed::(sudo_key_seed); let enable_println = true; -- GitLab From a081e1f7b46dd2171a0655144173efdb63668da6 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 7 Aug 2019 21:48:39 +0300 Subject: [PATCH 097/151] remove leaves tracking from lignt backend (#3311) --- core/client/db/src/light.rs | 70 +++---------------------------------- 1 file changed, 4 insertions(+), 66 deletions(-) diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 4ce0d0498c..3e60e9e7a1 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -26,7 +26,6 @@ use client::backend::{AuxStore, NewBlockState}; use client::blockchain::{BlockStatus, Cache as BlockchainCache, HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo}; use client::cht; -use client::leaves::{LeafSet, FinalizationDisplaced}; use client::error::{Error as ClientError, Result as ClientResult}; use client::light::blockchain::Storage as LightBlockchainStorage; use codec::{Decode, Encode}; @@ -54,11 +53,10 @@ const HEADER_CHT_PREFIX: u8 = 0; const CHANGES_TRIE_CHT_PREFIX: u8 = 1; /// Light blockchain storage. Stores most recent headers + CHTs for older headers. -/// Locks order: meta, leaves, cache. +/// Locks order: meta, cache. pub struct LightStorage { db: Arc, meta: RwLock, Block::Hash>>, - leaves: RwLock>>, cache: Arc>, } @@ -96,7 +94,6 @@ impl LightStorage fn from_kvdb(db: Arc) -> ClientResult { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; - let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; let cache = DbCache::new( db.clone(), columns::KEY_LOOKUP, @@ -110,7 +107,6 @@ impl LightStorage db, meta: RwLock::new(meta), cache: Arc::new(DbCacheSync(RwLock::new(cache))), - leaves: RwLock::new(leaves), }) } @@ -264,7 +260,6 @@ impl LightStorage { transaction: &mut DBTransaction, header: &Block::Header, hash: Block::Hash, - displaced: &mut Option>>, ) -> ClientResult<()> { let meta = self.meta.read(); if &meta.finalized_hash != header.parent_hash() { @@ -338,12 +333,6 @@ impl LightStorage { } } - let new_displaced = self.leaves.write().finalize_height(header.number().clone()); - match displaced { - x @ &mut None => *x = Some(new_displaced), - &mut Some(ref mut displaced) => displaced.merge(new_displaced), - } - Ok(()) } @@ -399,7 +388,6 @@ impl LightBlockchainStorage for LightStorage leaf_state: NewBlockState, aux_ops: Vec<(Vec, Option>)>, ) -> ClientResult<()> { - let mut finalization_displaced_leaves = None; let mut transaction = DBTransaction::new(); let hash = header.hash(); @@ -445,14 +433,10 @@ impl LightBlockchainStorage for LightStorage &mut transaction, &header, hash, - &mut finalization_displaced_leaves, )?; } { - let mut leaves = self.leaves.write(); - let displaced_leaf = leaves.import(hash, number, parent_hash); - let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) .on_block_insert( @@ -464,23 +448,7 @@ impl LightBlockchainStorage for LightStorage .into_ops(); debug!("Light DB Commit {:?} ({})", hash, number); - let write_result = self.db.write(transaction).map_err(db_err); - if let Err(e) = write_result { - let mut leaves = self.leaves.write(); - let mut undo = leaves.undo(); - - // revert leaves set update if there was one. - if let Some(displaced_leaf) = displaced_leaf { - undo.undo_import(displaced_leaf); - } - - if let Some(finalization_displaced) = finalization_displaced_leaves { - undo.undo_finalization(finalization_displaced); - } - - return Err(e); - } - + self.db.write(transaction).map_err(db_err)?; cache.commit(cache_ops); } @@ -522,11 +490,10 @@ impl LightBlockchainStorage for LightStorage fn finalize_header(&self, id: BlockId) -> ClientResult<()> { if let Some(header) = self.header(id)? { - let mut displaced = None; let mut transaction = DBTransaction::new(); let hash = header.hash(); let number = *header.number(); - self.note_finalized(&mut transaction, &header, hash.clone(), &mut displaced)?; + self.note_finalized(&mut transaction, &header, hash.clone())?; { let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) @@ -536,12 +503,7 @@ impl LightBlockchainStorage for LightStorage )? .into_ops(); - if let Err(e) = self.db.write(transaction).map_err(db_err) { - if let Some(displaced) = displaced { - self.leaves.write().undo().undo_finalization(displaced); - } - return Err(e); - } + self.db.write(transaction).map_err(db_err)?; cache.commit(cache_ops); } self.update_meta(hash, header.number().clone(), false, true); @@ -1066,30 +1028,6 @@ pub(crate) mod tests { assert_eq!(db.get_aux(&[3]).unwrap(), Some(vec![103])); } - #[test] - fn test_leaves_pruned_on_finality() { - let db = LightStorage::::new_test(); - let block0 = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - - let block1_a = insert_block(&db, HashMap::new(), || default_header(&block0, 1)); - let block1_b = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block0, 1, [1; 32].into())); - let block1_c = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block0, 1, [2; 32].into())); - - assert_eq!(db.leaves.read().hashes(), vec![block1_a, block1_b, block1_c]); - - let block2_a = insert_block(&db, HashMap::new(), || default_header(&block1_a, 2)); - let block2_b = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block1_b, 2, [1; 32].into())); - let block2_c = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block1_b, 2, [2; 32].into())); - - assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c, block1_c]); - - db.finalize_header(BlockId::hash(block1_a)).unwrap(); - db.finalize_header(BlockId::hash(block2_a)).unwrap(); - - // leaves at same height stay. Leaves at lower heights pruned. - assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c]); - } - #[test] fn cache_can_be_initialized_after_genesis_inserted() { let db = LightStorage::::new_test(); -- GitLab From c3b9d6c75ad6b9321bdcdaa93910f07faf918f85 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Wed, 7 Aug 2019 20:49:21 +0200 Subject: [PATCH 098/151] Handle telemetry socket errors (#3321) * Handle telemetry socket errors * Line width --- core/telemetry/src/worker/node.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs index d6193d4cc6..11b1f2a81e 100644 --- a/core/telemetry/src/worker/node.rs +++ b/core/telemetry/src/worker/node.rs @@ -87,7 +87,11 @@ impl Node { impl Node where TTrans: Clone + Unpin, TTrans::Dial: Unpin, - TTrans::Output: Sink + Stream + Unpin, TSinkErr: fmt::Debug { + TTrans::Output: Sink + + Stream> + + Unpin, + TSinkErr: fmt::Debug +{ /// Sends a WebSocket frame to the node. Returns an error if we are not connected to the node. /// /// After calling this method, you should call `poll` in order for it to be properly processed. @@ -175,7 +179,10 @@ fn gen_rand_reconnect_delay() -> Delay { } impl NodeSocketConnected -where TTrans::Output: Sink + Stream + Unpin { +where TTrans::Output: Sink + + Stream> + + Unpin +{ /// Processes the queue of messages for the connected socket. /// /// The address is passed for logging purposes only. @@ -208,13 +215,18 @@ where TTrans::Output: Sink + Stream + Unpin { Poll::Ready(Ok(())) => self.need_flush = false, } - } else if let Poll::Ready(_) = Stream::poll_next(Pin::new(&mut self.sink), cx) { - // We poll the telemetry `Stream` because the underlying implementation relies on - // this in order to answer PINGs. - // We don't do anything with incoming messages, however. - } else { - break + match Stream::poll_next(Pin::new(&mut self.sink), cx) { + Poll::Ready(Some(Ok(_))) => { + // We poll the telemetry `Stream` because the underlying implementation relies on + // this in order to answer PINGs. + // We don't do anything with incoming messages, however. + }, + Poll::Ready(Some(Err(err))) => { + return Poll::Ready(Err(err)) + }, + Poll::Pending | Poll::Ready(None) => break, + } } } -- GitLab From e9b2113c6aadce658c107abd9961b8b329f36607 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 7 Aug 2019 21:08:21 +0200 Subject: [PATCH 099/151] Remove support for mplex (#3312) --- core/network/src/lib.rs | 2 -- core/network/src/transport.rs | 9 +++------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 28437901e2..bbb1f08556 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -89,8 +89,6 @@ //! //! The following multiplexing protocols are supported: //! -//! - [Mplex](https://github.com/libp2p/specs/tree/master/mplex). Support for mplex will likely -//! be deprecated in the future. //! - [Yamux](https://github.com/hashicorp/yamux/blob/master/spec.md). //! //! ## Substreams diff --git a/core/network/src/transport.rs b/core/network/src/transport.rs index 901ec18581..389a662661 100644 --- a/core/network/src/transport.rs +++ b/core/network/src/transport.rs @@ -17,14 +17,14 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, bandwidth, wasm_ext + identity, secio, yamux, bandwidth, wasm_ext }; #[cfg(not(target_os = "unknown"))] use libp2p::{tcp, dns, websocket, noise}; #[cfg(not(target_os = "unknown"))] use libp2p::core::{upgrade, either::EitherError, either::EitherOutput}; use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; -use std::{io, sync::Arc, time::Duration, usize}; +use std::{io, sync::Arc, time::Duration}; pub use self::bandwidth::BandwidthSinks; @@ -55,9 +55,6 @@ pub fn build_transport( let secio_config = secio::SecioConfig::new(keypair); // Build configuration objects for multiplexing mechanisms. - let mut mplex_config = mplex::MplexConfig::new(); - mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); - mplex_config.max_buffer_len(usize::MAX); let yamux_config = yamux::Config::default(); // Build the base layer of the transport. @@ -116,7 +113,7 @@ pub fn build_transport( // Multiplexing let transport = transport.and_then(move |(stream, peer_id), endpoint| { let peer_id2 = peer_id.clone(); - let upgrade = core::upgrade::SelectUpgrade::new(yamux_config, mplex_config) + let upgrade = yamux_config .map_inbound(move |muxer| (peer_id, muxer)) .map_outbound(move |muxer| (peer_id2, muxer)); -- GitLab From f4346169587b06aa42327484a3d504faa3a7c888 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 7 Aug 2019 21:21:44 +0200 Subject: [PATCH 100/151] Make Verifier::verify mutable (#3165) * Make Verifier::verify mutable * Fix GrandPa tests * Fix doctest * Fix more doctests --- core/consensus/aura/src/lib.rs | 20 +++--- core/consensus/babe/src/lib.rs | 4 +- core/consensus/babe/src/tests.rs | 8 +-- core/consensus/common/src/block_import.rs | 2 +- core/consensus/common/src/import_queue.rs | 6 +- .../common/src/import_queue/basic_queue.rs | 71 +++++++++++-------- core/finality-grandpa/src/light_import.rs | 6 +- core/finality-grandpa/src/tests.rs | 6 +- core/network/src/test/block_import.rs | 8 +-- core/network/src/test/mod.rs | 37 +++++++--- core/service/src/lib.rs | 6 +- 11 files changed, 102 insertions(+), 72 deletions(-) diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index ffce6dad32..ac711ba2bd 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -516,7 +516,7 @@ impl Verifier for AuraVerifier where P::Signature: Encode + Decode, { fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, @@ -696,13 +696,11 @@ pub fn import_queue( register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; initialize_authorities_cache(&*client)?; - let verifier = Arc::new( - AuraVerifier { - client: client.clone(), - inherent_data_providers, - phantom: PhantomData, - } - ); + let verifier = AuraVerifier { + client: client.clone(), + inherent_data_providers, + phantom: PhantomData, + }; Ok(BasicQueue::new( verifier, block_import, @@ -783,7 +781,7 @@ mod tests { } fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) - -> Arc + -> Self::Verifier { match client { PeersClient::Full(client) => { @@ -796,11 +794,11 @@ mod tests { ).expect("Registers aura inherent data provider"); assert_eq!(slot_duration.get(), SLOT_DURATION); - Arc::new(AuraVerifier { + AuraVerifier { client, inherent_data_providers, phantom: Default::default(), - }) + } }, PeersClient::Light(_) => unreachable!("No (yet) tests for light client + Aura"), } diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index c8b9f25559..873913e59b 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -624,7 +624,7 @@ impl Verifier for BabeVerifier where C::Api: BlockBuilderApi + BabeApi, { fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, @@ -1182,7 +1182,7 @@ pub fn import_queue, I, RA, PRA>( let timestamp_core = verifier.time_source.clone(); let queue = BasicQueue::new( - Arc::new(verifier), + verifier, Box::new(block_import.clone()), justification_import, finality_proof_import, diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index f1983a9962..eaa4fbe099 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -97,7 +97,7 @@ impl Verifier for TestVerifier { /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. fn verify( - &self, + &mut self, origin: BlockOrigin, mut header: TestHeader, justification: Option, @@ -124,7 +124,7 @@ impl TestNetFactory for BabeTestNet { /// KLUDGE: this function gets the mutator from thread-local storage. fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) - -> Arc + -> Self::Verifier { let api = client.as_full().expect("only full clients are used in test"); trace!(target: "babe", "Creating a verifier"); @@ -137,7 +137,7 @@ impl TestNetFactory for BabeTestNet { ).expect("Registers babe inherent data provider"); trace!(target: "babe", "Provider registered"); - Arc::new(TestVerifier { + TestVerifier { inner: BabeVerifier { api, inherent_data_providers, @@ -145,7 +145,7 @@ impl TestNetFactory for BabeTestNet { time_source: Default::default(), }, mutator: MUTATOR.with(|s| s.borrow().clone()), - }) + } } fn peer(&mut self, i: usize) -> &mut Peer { diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 722bf1caed..1910a7e775 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -244,6 +244,6 @@ pub trait FinalityProofImport { hash: B::Hash, number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(B::Hash, NumberFor), Self::Error>; } diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 99ca6e7ad7..f4febb5e23 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -25,7 +25,7 @@ //! instantiated. The `BasicQueue` and `BasicVerifier` traits allow serial //! queues to be instantiated simply. -use std::{sync::Arc, collections::HashMap}; +use std::collections::HashMap; use sr_primitives::{Justification, traits::{Block as BlockT, Header as _, NumberFor}}; use crate::{error::Error as ConsensusError, well_known_cache_keys::Id as CacheKeyId}; use crate::block_import::{ @@ -71,7 +71,7 @@ pub trait Verifier: Send + Sync { /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, @@ -170,7 +170,7 @@ pub fn import_single_block>( import_handle: &mut dyn BlockImport, block_origin: BlockOrigin, block: IncomingBlock, - verifier: Arc, + verifier: &mut V, ) -> Result>, BlockImportError> { let peer = block.origin; diff --git a/core/consensus/common/src/import_queue/basic_queue.rs b/core/consensus/common/src/import_queue/basic_queue.rs index 851662dbc6..da6dcd0293 100644 --- a/core/consensus/common/src/import_queue/basic_queue.rs +++ b/core/consensus/common/src/import_queue/basic_queue.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{mem, pin::Pin, sync::Arc, time::Duration}; +use std::{mem, pin::Pin, time::Duration}; use futures::{prelude::*, channel::mpsc, task::SpawnExt as _, task::Context, task::Poll}; use futures_timer::Delay; use sr_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; @@ -48,7 +48,7 @@ impl BasicQueue { /// This creates a background task, and calls `on_start` on the justification importer and /// finality proof importer. pub fn new>( - verifier: Arc, + verifier: V, block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, @@ -134,18 +134,17 @@ enum ToWorkerMsg { ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), } -struct BlockImportWorker> { +struct BlockImportWorker { result_sender: BufferedLinkSender, justification_import: Option>, finality_proof_import: Option>, - verifier: Arc, delay_between_blocks: Duration, } -impl> BlockImportWorker { - fn new( +impl BlockImportWorker { + fn new>( result_sender: BufferedLinkSender, - verifier: Arc, + verifier: V, block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, @@ -154,7 +153,6 @@ impl> BlockImportWorker { let mut worker = BlockImportWorker { result_sender, - verifier, justification_import, finality_proof_import, delay_between_blocks: Duration::new(0, 0), @@ -178,7 +176,7 @@ impl> BlockImportWorker { // `Future`, and `block_import` is `None`. // - Something else, in which case `block_import` is `Some` and `importing` is None. // - let mut block_import = Some(block_import); + let mut block_import_verifier = Some((block_import, verifier)); let mut importing = None; let future = futures::future::poll_fn(move |cx| { @@ -194,15 +192,15 @@ impl> BlockImportWorker { if let Some(imp_fut) = importing.as_mut() { match Future::poll(Pin::new(imp_fut), cx) { Poll::Pending => return Poll::Pending, - Poll::Ready(bi) => { - block_import = Some(bi); + Poll::Ready((bi, verif)) => { + block_import_verifier = Some((bi, verif)); importing = None; }, } } debug_assert!(importing.is_none()); - debug_assert!(block_import.is_some()); + debug_assert!(block_import_verifier.is_some()); // Grab the next action request sent to the import queue. let msg = match Stream::poll_next(Pin::new(&mut port), cx) { @@ -215,11 +213,14 @@ impl> BlockImportWorker { ToWorkerMsg::ImportBlocks(origin, blocks) => { // On blocks import request, we merely *start* the process and store // a `Future` into `importing`. - let bi = block_import.take().expect("block_import is always Some; qed"); - importing = Some(worker.import_a_batch_of_blocks(bi, origin, blocks)); + let (bi, verif) = block_import_verifier.take() + .expect("block_import_verifier is always Some; qed"); + importing = Some(worker.import_a_batch_of_blocks(bi, verif, origin, blocks)); }, ToWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { - worker.import_finality_proof(who, hash, number, proof); + let (_, verif) = block_import_verifier.as_mut() + .expect("block_import_verifier is always Some; qed"); + worker.import_finality_proof(verif, who, hash, number, proof); }, ToWorkerMsg::ImportJustification(who, hash, number, justification) => { worker.import_justification(who, hash, number, justification); @@ -236,23 +237,30 @@ impl> BlockImportWorker { /// /// For lifetime reasons, the `BlockImport` implementation must be passed by value, and is /// yielded back in the output once the import is finished. - fn import_a_batch_of_blocks( + fn import_a_batch_of_blocks>( &mut self, block_import: BoxBlockImport, + verifier: V, origin: BlockOrigin, blocks: Vec> - ) -> impl Future> { + ) -> impl Future, V)> { let mut result_sender = self.result_sender.clone(); - import_many_blocks(block_import, origin, blocks, self.verifier.clone(), self.delay_between_blocks) - .then(move |(imported, count, results, block_import)| { + import_many_blocks(block_import, origin, blocks, verifier, self.delay_between_blocks) + .then(move |(imported, count, results, block_import, verifier)| { result_sender.blocks_processed(imported, count, results); - future::ready(block_import) + future::ready((block_import, verifier)) }) } - fn import_finality_proof(&mut self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { - let verifier = &*self.verifier; + fn import_finality_proof>( + &mut self, + verifier: &mut V, + who: Origin, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec + ) { let result = self.finality_proof_import.as_mut().map(|finality_proof_import| { finality_proof_import.import_finality_proof(hash, number, finality_proof, verifier) .map_err(|e| { @@ -307,12 +315,12 @@ fn import_many_blocks>( import_handle: BoxBlockImport, blocks_origin: BlockOrigin, blocks: Vec>, - verifier: Arc, + verifier: V, delay_between_blocks: Duration, ) -> impl Future>, BlockImportError>, B::Hash, -)>, BoxBlockImport)> { +)>, BoxBlockImport, V)> { let count = blocks.len(); let blocks_range = match ( @@ -332,6 +340,7 @@ fn import_many_blocks>( let mut blocks = blocks.into_iter(); let mut import_handle = Some(import_handle); let mut waiting = None; + let mut verifier = Some(verifier); // Blocks in the response/drain should be in ascending order. @@ -352,16 +361,20 @@ fn import_many_blocks>( // No block left to import, success! let import_handle = import_handle.take() .expect("Future polled again after it has finished"); + let verifier = verifier.take() + .expect("Future polled again after it has finished"); let results = mem::replace(&mut results, Vec::new()); - return Poll::Ready((imported, count, results, import_handle)); + return Poll::Ready((imported, count, results, import_handle, verifier)); }, }; - // We extract the content of `import_handle` only when the future ends, therefore - // `import_handle` is always `Some` here. It is illegal to poll a `Future` again after it - // has ended. + // We extract the content of `import_handle` and `verifier` only when the future ends, + // therefore `import_handle` and `verifier` are always `Some` here. It is illegal to poll + // a `Future` again after it has ended. let import_handle = import_handle.as_mut() .expect("Future polled again after it has finished"); + let verifier = verifier.as_mut() + .expect("Future polled again after it has finished"); let block_number = block.header.as_ref().map(|h| h.number().clone()); let block_hash = block.hash; @@ -373,7 +386,7 @@ fn import_many_blocks>( &mut **import_handle, blocks_origin.clone(), block, - verifier.clone(), + verifier, ) }; diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 4dc934303c..6ecc24bd2b 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -174,7 +174,7 @@ impl, RA> FinalityProofImport hash: Block::Hash, number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(Block::Hash, NumberFor), Self::Error> { do_import_finality_proof::<_, _, _, _, GrandpaJustification>( &*self.client, @@ -290,7 +290,7 @@ fn do_import_finality_proof, RA, J>( _hash: Block::Hash, _number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(Block::Hash, NumberFor), ConsensusError> where B: Backend + 'static, @@ -608,7 +608,7 @@ pub mod tests { hash: Block::Hash, number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(Block::Hash, NumberFor), Self::Error> { self.0.import_finality_proof(hash, number, finality_proof, verifier) } diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 8b0cc3bc0c..45a91b336a 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -97,10 +97,8 @@ impl TestNetFactory for GrandpaTestNet { } } - fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) - -> Arc - { - Arc::new(PassThroughVerifier(false)) // use non-instant finality. + fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) -> Self::Verifier { + PassThroughVerifier(false) // use non-instant finality. } fn make_block_import(&self, client: PeersClient) diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index ce58755a89..ceb0451166 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -45,7 +45,7 @@ fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) #[test] fn import_single_good_block_works() { let (_, _hash, number, peer_id, block) = prepare_good_block(); - match import_single_block(&mut test_client::new(), BlockOrigin::File, block, Arc::new(PassThroughVerifier(true))) { + match import_single_block(&mut test_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier(true)) { Ok(BlockImportResult::ImportedUnknown(ref num, ref aux, ref org)) if *num == number && *aux == Default::default() && *org == Some(peer_id) => {} _ => panic!() @@ -55,7 +55,7 @@ fn import_single_good_block_works() { #[test] fn import_single_good_known_block_is_ignored() { let (mut client, _hash, number, _, block) = prepare_good_block(); - match import_single_block(&mut client, BlockOrigin::File, block, Arc::new(PassThroughVerifier(true))) { + match import_single_block(&mut client, BlockOrigin::File, block, &mut PassThroughVerifier(true)) { Ok(BlockImportResult::ImportedKnown(ref n)) if *n == number => {} _ => panic!() } @@ -65,7 +65,7 @@ fn import_single_good_known_block_is_ignored() { fn import_single_good_block_without_header_fails() { let (_, _, _, peer_id, mut block) = prepare_good_block(); block.header = None; - match import_single_block(&mut test_client::new(), BlockOrigin::File, block, Arc::new(PassThroughVerifier(true))) { + match import_single_block(&mut test_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier(true)) { Err(BlockImportError::IncompleteHeader(ref org)) if *org == Some(peer_id) => {} _ => panic!() } @@ -75,7 +75,7 @@ fn import_single_good_block_without_header_fails() { fn async_import_queue_drops() { // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { - let verifier = Arc::new(PassThroughVerifier(true)); + let verifier = PassThroughVerifier(true); let queue = BasicQueue::new(verifier, Box::new(test_client::new()), None, None); drop(queue); } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 110201057c..f12b4c8237 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -68,7 +68,7 @@ pub struct PassThroughVerifier(pub bool); /// This `Verifier` accepts all data as valid. impl Verifier for PassThroughVerifier { fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, @@ -212,7 +212,7 @@ pub struct Peer> { client: PeersClient, /// We keep a copy of the verifier so that we can invoke it for locally-generated blocks, /// instead of going through the import queue. - verifier: Arc>, + verifier: VerifierAdapter>, /// We keep a copy of the block_import so that we can invoke it for locally-generated blocks, /// instead of going through the import queue. block_import: Box>, @@ -395,6 +395,27 @@ impl> BlockImport for BlockImportAdapter>`. Used internally. +struct VerifierAdapter(Arc>>); + +impl Clone for VerifierAdapter { + fn clone(&self) -> Self { + VerifierAdapter(self.0.clone()) + } +} + +impl> Verifier for VerifierAdapter { + fn verify( + &mut self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + body: Option> + ) -> Result<(BlockImportParams, Option)>>), String> { + self.0.lock().verify(origin, header, justification, body) + } +} + pub trait TestNetFactory: Sized { type Specialization: NetworkSpecialization + SpecializationFactory; type Verifier: 'static + Verifier; @@ -402,7 +423,7 @@ pub trait TestNetFactory: Sized { /// These two need to be implemented! fn from_config(config: &ProtocolConfig) -> Self; - fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc; + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Self::Verifier; /// Get reference to peer. fn peer(&mut self, i: usize) -> &mut Peer; @@ -448,6 +469,7 @@ pub trait TestNetFactory: Sized { fn add_full_peer(&mut self, config: &ProtocolConfig) { let client = Arc::new(test_client::new()); let verifier = self.make_verifier(PeersClient::Full(client.clone()), config); + let verifier = VerifierAdapter(Arc::new(Mutex::new(Box::new(verifier) as Box<_>))); let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) = self.make_block_import(PeersClient::Full(client.clone())); let block_import = BlockImportAdapter(Arc::new(Mutex::new(block_import))); @@ -507,6 +529,7 @@ pub trait TestNetFactory: Sized { let client = Arc::new(test_client::new_light()); let verifier = self.make_verifier(PeersClient::Light(client.clone()), &config); + let verifier = VerifierAdapter(Arc::new(Mutex::new(Box::new(verifier) as Box<_>))); let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) = self.make_block_import(PeersClient::Light(client.clone())); let block_import = BlockImportAdapter(Arc::new(Mutex::new(block_import))); @@ -625,9 +648,9 @@ impl TestNetFactory for TestNet { } fn make_verifier(&self, _client: PeersClient, _config: &ProtocolConfig) - -> Arc + -> Self::Verifier { - Arc::new(PassThroughVerifier(false)) + PassThroughVerifier(false) } fn peer(&mut self, i: usize) -> &mut Peer<(), Self::Specialization> { @@ -670,9 +693,7 @@ impl TestNetFactory for JustificationTestNet { JustificationTestNet(TestNet::from_config(config)) } - fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) - -> Arc - { + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Self::Verifier { self.0.make_verifier(client, config) } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index f6f038cdf5..f28d41019b 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -891,7 +891,7 @@ impl network::TransactionPool, ComponentBlock< /// # struct MyVerifier; /// # impl Verifier for MyVerifier { /// # fn verify( -/// # &self, +/// # &mut self, /// # origin: BlockOrigin, /// # header: B::Header, /// # justification: Option, @@ -929,11 +929,11 @@ impl network::TransactionPool, ComponentBlock< /// LightService = LightComponents /// { |config| >::new(config) }, /// FullImportQueue = BasicQueue -/// { |_, client, _| Ok(BasicQueue::new(Arc::new(MyVerifier), Box::new(client), None, None)) }, +/// { |_, client, _| Ok(BasicQueue::new(MyVerifier, Box::new(client), None, None)) }, /// LightImportQueue = BasicQueue /// { |_, client| { /// let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; -/// Ok((BasicQueue::new(Arc::new(MyVerifier), Box::new(client), None, None), fprb)) +/// Ok((BasicQueue::new(MyVerifier, Box::new(client), None, None), fprb)) /// }}, /// SelectChain = LongestChain, Self::Block> /// { |config: &FactoryFullConfiguration, client: Arc>| { -- GitLab From 4499cb697ee26803b0ba207980e66dcd88e24ad0 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 7 Aug 2019 21:22:27 +0200 Subject: [PATCH 101/151] Rename CustomProto to LegacyProto (#3313) --- .../behaviour.rs | 38 +++++++++---------- .../{custom_proto => legacy_proto}/handler.rs | 2 +- .../src/{custom_proto => legacy_proto}/mod.rs | 2 +- .../{custom_proto => legacy_proto}/tests.rs | 32 ++++++++-------- .../{custom_proto => legacy_proto}/upgrade.rs | 0 core/network/src/lib.rs | 2 +- core/network/src/protocol.rs | 24 ++++++------ 7 files changed, 50 insertions(+), 50 deletions(-) rename core/network/src/{custom_proto => legacy_proto}/behaviour.rs (97%) rename core/network/src/{custom_proto => legacy_proto}/handler.rs (99%) rename core/network/src/{custom_proto => legacy_proto}/mod.rs (93%) rename core/network/src/{custom_proto => legacy_proto}/tests.rs (92%) rename core/network/src/{custom_proto => legacy_proto}/upgrade.rs (100%) diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/legacy_proto/behaviour.rs similarity index 97% rename from core/network/src/custom_proto/behaviour.rs rename to core/network/src/legacy_proto/behaviour.rs index 1cfa16ea6b..790c1d158d 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/legacy_proto/behaviour.rs @@ -15,8 +15,8 @@ // along with Substrate. If not, see . use crate::{DiscoveryNetBehaviour, config::ProtocolId}; -use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; -use crate::custom_proto::upgrade::RegisteredProtocol; +use crate::legacy_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; +use crate::legacy_proto::upgrade::RegisteredProtocol; use crate::protocol::message::Message; use fnv::FnvHashMap; use futures::prelude::*; @@ -34,7 +34,7 @@ use tokio_io::{AsyncRead, AsyncWrite}; /// /// ## How it works /// -/// The role of the `CustomProto` is to synchronize the following components: +/// The role of the `LegacyProto` is to synchronize the following components: /// /// - The libp2p swarm that opens new connections and reports disconnects. /// - The connection handler (see `handler.rs`) that handles individual connections. @@ -60,7 +60,7 @@ use tokio_io::{AsyncRead, AsyncWrite}; /// Note that this "banning" system is not an actual ban. If a "banned" node tries to connect to /// us, we accept the connection. The "banning" system is only about delaying dialing attempts. /// -pub struct CustomProto { +pub struct LegacyProto { /// List of protocols to open with peers. Never modified. protocol: RegisteredProtocol, @@ -79,7 +79,7 @@ pub struct CustomProto { next_incoming_index: peerset::IncomingIndex, /// Events to produce from `poll()`. - events: SmallVec<[NetworkBehaviourAction, CustomProtoOut>; 4]>, + events: SmallVec<[NetworkBehaviourAction, LegacyProtoOut>; 4]>, /// Marker to pin the generics. marker: PhantomData, @@ -186,9 +186,9 @@ struct IncomingPeer { incoming_id: peerset::IncomingIndex, } -/// Event that can be emitted by the `CustomProto`. +/// Event that can be emitted by the `LegacyProto`. #[derive(Debug)] -pub enum CustomProtoOut { +pub enum LegacyProtoOut { /// Opened a custom protocol with the remote. CustomProtocolOpen { /// Version of the protocol that has been opened. @@ -225,7 +225,7 @@ pub enum CustomProtoOut { }, } -impl CustomProto { +impl LegacyProto { /// Creates a `CustomProtos`. pub fn new( protocol: impl Into, @@ -234,7 +234,7 @@ impl CustomProto { ) -> Self { let protocol = RegisteredProtocol::new(protocol, versions); - CustomProto { + LegacyProto { protocol, peerset, peers: FnvHashMap::default(), @@ -606,7 +606,7 @@ impl CustomProto { } } -impl DiscoveryNetBehaviour for CustomProto { +impl DiscoveryNetBehaviour for LegacyProto { fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); @@ -615,13 +615,13 @@ impl DiscoveryNetBehaviour for CustomProto } } -impl NetworkBehaviour for CustomProto +impl NetworkBehaviour for LegacyProto where TSubstream: AsyncRead + AsyncWrite, B: BlockT, { type ProtocolsHandler = CustomProtoHandlerProto; - type OutEvent = CustomProtoOut; + type OutEvent = LegacyProtoOut; fn new_handler(&mut self) -> Self::ProtocolsHandler { CustomProtoHandlerProto::new(self.protocol.clone()) @@ -714,7 +714,7 @@ where } if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), reason: "Disconnected by libp2p".into(), }; @@ -731,7 +731,7 @@ where self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer_deadline }); if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), reason: "Disconnected by libp2p".into(), }; @@ -748,7 +748,7 @@ where if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), reason: "Disconnected by libp2p".into(), }; @@ -833,7 +833,7 @@ where }; debug!(target: "sub-libp2p", "External API <= Closed({:?})", source); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { reason, peer_id: source.clone(), }; @@ -891,7 +891,7 @@ where }; debug!(target: "sub-libp2p", "External API <= Open({:?})", source); - let event = CustomProtoOut::CustomProtocolOpen { + let event = LegacyProtoOut::CustomProtocolOpen { version, peer_id: source, endpoint, @@ -904,7 +904,7 @@ where debug_assert!(self.is_open(&source)); trace!(target: "sub-libp2p", "Handler({:?}) => Message", source); trace!(target: "sub-libp2p", "External API <= Message({:?})", source); - let event = CustomProtoOut::CustomMessage { + let event = LegacyProtoOut::CustomMessage { peer_id: source, message, }; @@ -918,7 +918,7 @@ where trace!(target: "sub-libp2p", "External API <= Clogged({:?})", source); warn!(target: "sub-libp2p", "Queue of packets to send to {:?} is \ pretty large", source); - self.events.push(NetworkBehaviourAction::GenerateEvent(CustomProtoOut::Clogged { + self.events.push(NetworkBehaviourAction::GenerateEvent(LegacyProtoOut::Clogged { peer_id: source, messages, })); diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/legacy_proto/handler.rs similarity index 99% rename from core/network/src/custom_proto/handler.rs rename to core/network/src/legacy_proto/handler.rs index 5cdedf4940..3fe88d3cfd 100644 --- a/core/network/src/custom_proto/handler.rs +++ b/core/network/src/legacy_proto/handler.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::upgrade::{RegisteredProtocol, RegisteredProtocolEvent, RegisteredProtocolSubstream}; +use crate::legacy_proto::upgrade::{RegisteredProtocol, RegisteredProtocolEvent, RegisteredProtocolSubstream}; use crate::protocol::message::Message; use futures::prelude::*; use futures03::{compat::Compat, TryFutureExt as _}; diff --git a/core/network/src/custom_proto/mod.rs b/core/network/src/legacy_proto/mod.rs similarity index 93% rename from core/network/src/custom_proto/mod.rs rename to core/network/src/legacy_proto/mod.rs index 99f4f0183a..bbe795528b 100644 --- a/core/network/src/custom_proto/mod.rs +++ b/core/network/src/legacy_proto/mod.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -pub use self::behaviour::{CustomProto, CustomProtoOut}; +pub use self::behaviour::{LegacyProto, LegacyProtoOut}; mod behaviour; mod handler; diff --git a/core/network/src/custom_proto/tests.rs b/core/network/src/legacy_proto/tests.rs similarity index 92% rename from core/network/src/custom_proto/tests.rs rename to core/network/src/legacy_proto/tests.rs index 94456b1a0f..8fd47843df 100644 --- a/core/network/src/custom_proto/tests.rs +++ b/core/network/src/legacy_proto/tests.rs @@ -26,7 +26,7 @@ use rand::seq::SliceRandom; use std::{io, time::Duration, time::Instant}; use test_client::runtime::Block; use crate::message::generic::Message; -use crate::custom_proto::{CustomProto, CustomProtoOut}; +use crate::legacy_proto::{LegacyProto, LegacyProtoOut}; /// Builds two nodes that have each other as bootstrap nodes. /// This is to be used only for testing, and a panic will happen if something goes wrong. @@ -71,7 +71,7 @@ fn build_nodes() }); let behaviour = CustomProtoWithAddr { - inner: CustomProto::new(&b"test"[..], &[1], peerset), + inner: LegacyProto::new(&b"test"[..], &[1], peerset), addrs: addrs .iter() .enumerate() @@ -101,12 +101,12 @@ fn build_nodes() /// Wraps around the `CustomBehaviour` network behaviour, and adds hardcoded node addresses to it. struct CustomProtoWithAddr { - inner: CustomProto>, + inner: LegacyProto>, addrs: Vec<(PeerId, Multiaddr)>, } impl std::ops::Deref for CustomProtoWithAddr { - type Target = CustomProto>; + type Target = LegacyProto>; fn deref(&self) -> &Self::Target { &self.inner @@ -121,8 +121,8 @@ impl std::ops::DerefMut for CustomProtoWithAddr { impl NetworkBehaviour for CustomProtoWithAddr { type ProtocolsHandler = - > as NetworkBehaviour>::ProtocolsHandler; - type OutEvent = > as NetworkBehaviour>::OutEvent; + > as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = > as NetworkBehaviour>::OutEvent; fn new_handler(&mut self) -> Self::ProtocolsHandler { self.inner.new_handler() @@ -205,7 +205,7 @@ fn two_nodes_transfer_lots_of_packets() { let fut1 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service1.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { peer_id, .. }) => { for n in 0 .. NUM_PACKETS { service1.send_packet( &peer_id, @@ -222,8 +222,8 @@ fn two_nodes_transfer_lots_of_packets() { let fut2 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service2.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, - Some(CustomProtoOut::CustomMessage { message: Message::ChainSpecific(message), .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { .. }) => {}, + Some(LegacyProtoOut::CustomMessage { message: Message::ChainSpecific(message), .. }) => { assert_eq!(message.len(), 1); packet_counter += 1; if packet_counter == NUM_PACKETS { @@ -261,7 +261,7 @@ fn basic_two_nodes_requests_in_parallel() { let fut1 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service1.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { peer_id, .. }) => { for msg in to_send.drain(..) { service1.send_packet(&peer_id, msg); } @@ -274,8 +274,8 @@ fn basic_two_nodes_requests_in_parallel() { let fut2 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service2.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, - Some(CustomProtoOut::CustomMessage { message, .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { .. }) => {}, + Some(LegacyProtoOut::CustomMessage { message, .. }) => { let pos = to_receive.iter().position(|m| *m == message).unwrap(); to_receive.remove(pos); if to_receive.is_empty() { @@ -313,7 +313,7 @@ fn reconnect_after_disconnect() { let mut service1_not_ready = false; match service1.poll().unwrap() { - Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { match service1_state { ServiceState::NotConnected => { service1_state = ServiceState::FirstConnec; @@ -325,7 +325,7 @@ fn reconnect_after_disconnect() { ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { match service1_state { ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | @@ -337,7 +337,7 @@ fn reconnect_after_disconnect() { } match service2.poll().unwrap() { - Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { match service2_state { ServiceState::NotConnected => { service2_state = ServiceState::FirstConnec; @@ -349,7 +349,7 @@ fn reconnect_after_disconnect() { ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { match service2_state { ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | diff --git a/core/network/src/custom_proto/upgrade.rs b/core/network/src/legacy_proto/upgrade.rs similarity index 100% rename from core/network/src/custom_proto/upgrade.rs rename to core/network/src/legacy_proto/upgrade.rs diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index bbb1f08556..33f9e5d2eb 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -170,7 +170,7 @@ mod behaviour; mod chain; -mod custom_proto; +mod legacy_proto; mod debug_info; mod discovery; mod on_demand_layer; diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 9d4a537ed2..88252d7786 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use crate::{DiscoveryNetBehaviour, config::ProtocolId}; -use crate::custom_proto::{CustomProto, CustomProtoOut}; +use crate::legacy_proto::{LegacyProto, LegacyProtoOut}; use futures::prelude::*; use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::{Multiaddr, PeerId}; @@ -111,7 +111,7 @@ pub struct Protocol, H: ExHashT> { /// When asked for a proof of finality, we use this struct to build one. finality_proof_provider: Option>>, /// Handles opening the unique substream and sending and receiving raw messages. - behaviour: CustomProto>, + behaviour: LegacyProto>, } /// A peer that we are connected to @@ -150,7 +150,7 @@ pub struct PeerInfo { } struct LightDispatchIn<'a, B: BlockT> { - behaviour: &'a mut CustomProto>, + behaviour: &'a mut LegacyProto>, peerset: peerset::PeersetHandle, } @@ -281,7 +281,7 @@ pub trait Context { /// Protocol context. struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { - behaviour: &'a mut CustomProto>, + behaviour: &'a mut LegacyProto>, context_data: &'a mut ContextData, peerset_handle: &'a peerset::PeersetHandle, } @@ -289,7 +289,7 @@ struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { impl<'a, B: BlockT + 'a, H: 'a + ExHashT> ProtocolContext<'a, B, H> { fn new( context_data: &'a mut ContextData, - behaviour: &'a mut CustomProto>, + behaviour: &'a mut LegacyProto>, peerset_handle: &'a peerset::PeersetHandle, ) -> Self { ProtocolContext { context_data, peerset_handle, behaviour } @@ -363,7 +363,7 @@ impl, H: ExHashT> Protocol { let sync = ChainSync::new(config.roles, chain.clone(), &info, finality_proof_request_builder); let (peerset, peerset_handle) = peerset::Peerset::from_config(peerset_config); let versions = &((MIN_VERSION as u8)..=(CURRENT_VERSION as u8)).collect::>(); - let behaviour = CustomProto::new(protocol_id, versions, peerset); + let behaviour = LegacyProto::new(protocol_id, versions, peerset); let protocol = Protocol { tick_timeout: Box::new(futures_timer::Interval::new(TICK_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), @@ -1479,7 +1479,7 @@ pub enum CustomMessageOutcome { } fn send_message( - behaviour: &mut CustomProto>, + behaviour: &mut LegacyProto>, peers: &mut HashMap>, who: PeerId, mut message: Message, @@ -1500,7 +1500,7 @@ fn send_message( impl, H: ExHashT> NetworkBehaviour for Protocol { - type ProtocolsHandler = > as NetworkBehaviour>::ProtocolsHandler; + type ProtocolsHandler = > as NetworkBehaviour>::ProtocolsHandler; type OutEvent = CustomMessageOutcome; fn new_handler(&mut self) -> Self::ProtocolsHandler { @@ -1568,7 +1568,7 @@ Protocol { }; let outcome = match event { - CustomProtoOut::CustomProtocolOpen { peer_id, version, .. } => { + LegacyProtoOut::CustomProtocolOpen { peer_id, version, .. } => { debug_assert!( version <= CURRENT_VERSION as u8 && version >= MIN_VERSION as u8 @@ -1576,13 +1576,13 @@ Protocol { self.on_peer_connected(peer_id); CustomMessageOutcome::None } - CustomProtoOut::CustomProtocolClosed { peer_id, .. } => { + LegacyProtoOut::CustomProtocolClosed { peer_id, .. } => { self.on_peer_disconnected(peer_id); CustomMessageOutcome::None }, - CustomProtoOut::CustomMessage { peer_id, message } => + LegacyProtoOut::CustomMessage { peer_id, message } => self.on_custom_message(peer_id, message), - CustomProtoOut::Clogged { peer_id, messages } => { + LegacyProtoOut::Clogged { peer_id, messages } => { debug!(target: "sync", "{} clogging messages:", messages.len()); for msg in messages.into_iter().take(5) { debug!(target: "sync", "{:?}", msg); -- GitLab From 4f92dfaa841ddc4050a541b169639cf959113564 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Wed, 7 Aug 2019 20:48:30 +0100 Subject: [PATCH 102/151] Derive CompactAs for Perbill/mill/U128 (#3327) * Derive CompactAs for Perbill/mill/U128 * Increment impl_version --- core/sr-primitives/src/lib.rs | 57 +++-------------------------------- node/runtime/src/lib.rs | 2 +- 2 files changed, 5 insertions(+), 54 deletions(-) diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 3c4c69f084..b0b76277de 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -39,7 +39,7 @@ pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; use rstd::{prelude::*, ops, convert::{TryInto, TryFrom}}; use primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; -use codec::{Encode, Decode}; +use codec::{Encode, Decode, CompactAs}; #[cfg(feature = "std")] pub mod testing; @@ -173,7 +173,7 @@ pub type ConsensusEngineId = [u8; 4]; /// Permill is parts-per-million (i.e. after multiplying by this, divide by 1000000). #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Ord, PartialOrd))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, CompactAs, Default, Copy, Clone, PartialEq, Eq)] pub struct Permill(u32); impl Permill { @@ -263,26 +263,10 @@ impl From for Permill { } } -impl codec::CompactAs for Permill { - type As = u32; - fn encode_as(&self) -> &u32 { - &self.0 - } - fn decode_from(x: u32) -> Permill { - Permill(x) - } -} - -impl From> for Permill { - fn from(x: codec::Compact) -> Permill { - x.0 - } -} - /// Perbill is parts-per-billion. It stores a value between 0 and 1 in fixed point and /// provides a means to multiply some other value by that. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] +#[derive(Encode, Decode, CompactAs, Default, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] pub struct Perbill(u32); impl Perbill { @@ -375,23 +359,6 @@ impl From for Perbill { } } -impl codec::CompactAs for Perbill { - type As = u32; - fn encode_as(&self) -> &u32 { - &self.0 - } - fn decode_from(x: u32) -> Perbill { - Perbill(x) - } -} - -impl From> for Perbill { - fn from(x: codec::Compact) -> Perbill { - x.0 - } -} - - /// A fixed point number by the scale of 1 billion. /// /// cannot hold a value larger than +-`9223372036854775807 / 1_000_000_000` (~9 billion). @@ -516,7 +483,7 @@ impl CheckedAdd for Fixed64 { /// PerU128 is parts-per-u128-max-value. It stores a value between 0 and 1 in fixed point. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, CompactAs, Default, Copy, Clone, PartialEq, Eq)] pub struct PerU128(u128); const U128: u128 = u128::max_value(); @@ -546,22 +513,6 @@ impl ::rstd::ops::Deref for PerU128 { } } -impl codec::CompactAs for PerU128 { - type As = u128; - fn encode_as(&self) -> &u128 { - &self.0 - } - fn decode_from(x: u128) -> PerU128 { - Self(x) - } -} - -impl From> for PerU128 { - fn from(x: codec::Compact) -> PerU128 { - x.0 - } -} - /// Signature verify that can work with any known signature types.. #[derive(Eq, PartialEq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 0ecbec7601..ce1aaa6b73 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 131, - impl_version: 131, + impl_version: 132, apis: RUNTIME_API_VERSIONS, }; -- GitLab From f3a74eff35c56a5a8d3ea87cee63a311d7c85210 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 7 Aug 2019 22:11:12 +0200 Subject: [PATCH 103/151] Staking optimisation (#3300) * staking code api * doc + test * version bump * index fn * rename function * doc * adress comments * add complexity comment --- srml/staking/src/lib.rs | 73 ++++++++++++++++++++++++++-------- srml/staking/src/mock.rs | 10 +++-- srml/staking/src/tests.rs | 84 ++++++++++++++++++++++++++------------- 3 files changed, 119 insertions(+), 48 deletions(-) diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 11aa4f3c7d..d1d690f75f 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -175,7 +175,8 @@ //! //! Total reward is split among validators and their nominators depending on the number of points //! they received during the era. Points are added to a validator using -//! [`add_reward_points_to_validator`](./enum.Call.html#variant.add_reward_points_to_validator). +//! [`reward_by_ids`](./enum.Call.html#variant.reward_by_ids) or +//! [`reward_by_indices`](./enum.Call.html#variant.reward_by_indices). //! //! [`Module`](./struct.Module.html) implements //! [`authorship::EventHandler`](../srml_authorship/trait.EventHandler.html) to add reward points @@ -325,6 +326,18 @@ pub struct EraRewards { rewards: Vec, } +impl EraRewards { + /// Add the reward to the validator at the given index. Index must be valid + /// (i.e. `index < current_elected.len()`). + fn add_points_to_index(&mut self, index: u32, points: u32) { + if let Some(new_total) = self.total.checked_add(points) { + self.total = new_total; + self.rewards.resize((index as usize + 1).max(self.rewards.len()), 0); + self.rewards[index as usize] += points; // Addition is less than total + } + } +} + /// Indicates the initial status of the staker. #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum StakerStatus { @@ -1399,22 +1412,46 @@ impl Module { } } - /// Add reward points to validator. + /// Add reward points to validators using their stash account ID. + /// + /// Validators are keyed by stash account ID and must be in the current elected set. + /// + /// For each element in the iterator the given number of points in u32 is added to the + /// validator, thus duplicates are handled. /// /// At the end of the era each the total payout will be distributed among validator /// relatively to their points. - pub fn add_reward_points_to_validator(validator: T::AccountId, points: u32) { - >::current_elected().iter() - .position(|elected| *elected == validator) - .map(|index| { - CurrentEraRewards::mutate(|rewards| { - if let Some(new_total) = rewards.total.checked_add(points) { - rewards.total = new_total; - rewards.rewards.resize((index + 1).max(rewards.rewards.len()), 0); - rewards.rewards[index] += points; // Addition is less than total - } - }); - }); + /// + /// COMPLEXITY: Complexity is `number_of_validator_to_reward x current_elected_len`. + /// If you need to reward lots of validator consider using `reward_by_indices`. + pub fn reward_by_ids(validators_points: impl IntoIterator) { + CurrentEraRewards::mutate(|rewards| { + let current_elected = >::current_elected(); + for (validator, points) in validators_points.into_iter() { + if let Some(index) = current_elected.iter() + .position(|elected| *elected == validator) + { + rewards.add_points_to_index(index as u32, points); + } + } + }); + } + + /// Add reward points to validators using their validator index. + /// + /// For each element in the iterator the given number of points in u32 is added to the + /// validator, thus duplicates are handled. + pub fn reward_by_indices(validators_points: impl IntoIterator) { + // TODO: This can be optimised once #3302 is implemented. + let current_elected_len = >::current_elected().len() as u32; + + CurrentEraRewards::mutate(|rewards| { + for (validator_index, points) in validators_points.into_iter() { + if validator_index < current_elected_len { + rewards.add_points_to_index(validator_index, points); + } + } + }); } } @@ -1444,11 +1481,13 @@ impl OnFreeBalanceZero for Module { /// * 1 point to the producer of each referenced uncle block. impl authorship::EventHandler for Module { fn note_author(author: T::AccountId) { - Self::add_reward_points_to_validator(author, 20); + Self::reward_by_ids(vec![(author, 20)]); } fn note_uncle(author: T::AccountId, _age: T::BlockNumber) { - Self::add_reward_points_to_validator(>::author(), 2); - Self::add_reward_points_to_validator(author, 1); + Self::reward_by_ids(vec![ + (>::author(), 2), + (author, 1) + ]) } } diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 787c4f13b7..a281d818a2 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -422,10 +422,12 @@ pub fn current_total_payout_for_duration(duration: u64) -> u64 { res } -pub fn add_reward_points_to_all_elected() { - for v in >::current_elected() { - >::add_reward_points_to_validator(v, 1); - } +pub fn reward_all_elected() { + let rewards = >::current_elected().iter() + .map(|v| (*v, 1)) + .collect::>(); + + >::reward_by_ids(rewards) } pub fn validator_controllers() -> Vec { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index 96c8b9d5f2..cf0ef31526 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -357,12 +357,12 @@ fn rewards_should_work() { Session::on_initialize(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - >::add_reward_points_to_validator(11, 50); - >::add_reward_points_to_validator(11, 50); + >::reward_by_ids(vec![(11, 50)]); + >::reward_by_ids(vec![(11, 50)]); // This is the second validator of the current elected set. - >::add_reward_points_to_validator(21, 50); + >::reward_by_ids(vec![(21, 50)]); // This must be no-op as it is not an elected validator. - >::add_reward_points_to_validator(1001, 10_000); + >::reward_by_ids(vec![(1001, 10_000)]); // Compute total payout now for whole duration as other parameter won't change let total_payout = current_total_payout_for_duration(9 * 5); @@ -412,7 +412,7 @@ fn multi_era_reward_should_work() { let total_payout_0 = current_total_payout_for_duration(3); assert!(total_payout_0 > 10); // Test is meaningfull if reward something dbg!(>::slot_stake()); - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(11, 1)]); start_session(0); start_session(1); @@ -426,7 +426,7 @@ fn multi_era_reward_should_work() { let total_payout_1 = current_total_payout_for_duration(3); assert!(total_payout_1 > 10); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 101); + >::reward_by_ids(vec![(11, 101)]); // new era is triggered here. start_session(5); @@ -631,10 +631,10 @@ fn nominating_and_rewards_should_work() { // the total reward for era 0 let total_payout_0 = current_total_payout_for_duration(3); assert!(total_payout_0 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(41, 1); - >::add_reward_points_to_validator(31, 1); - >::add_reward_points_to_validator(21, 10); // must be no-op - >::add_reward_points_to_validator(11, 10); // must be no-op + >::reward_by_ids(vec![(41, 1)]); + >::reward_by_ids(vec![(31, 1)]); + >::reward_by_ids(vec![(21, 10)]); // must be no-op + >::reward_by_ids(vec![(11, 10)]); // must be no-op start_era(1); @@ -706,10 +706,10 @@ fn nominating_and_rewards_should_work() { // the total reward for era 1 let total_payout_1 = current_total_payout_for_duration(3); assert!(total_payout_1 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(41, 10); // must be no-op - >::add_reward_points_to_validator(31, 10); // must be no-op - >::add_reward_points_to_validator(21, 2); - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(41, 10)]); // must be no-op + >::reward_by_ids(vec![(31, 10)]); // must be no-op + >::reward_by_ids(vec![(21, 2)]); + >::reward_by_ids(vec![(11, 1)]); start_era(2); @@ -772,7 +772,7 @@ fn nominators_also_get_slashed() { let total_payout = current_total_payout_for_duration(3); assert!(total_payout > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(11, 1)]); // new era, pay rewards, start_era(1); @@ -967,7 +967,7 @@ fn reward_destination_works() { // Compute total payout now for whole duration as other parameter won't change let total_payout_0 = current_total_payout_for_duration(3); assert!(total_payout_0 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(11, 1)]); start_era(1); @@ -989,7 +989,7 @@ fn reward_destination_works() { // Compute total payout now for whole duration as other parameter won't change let total_payout_1 = current_total_payout_for_duration(3); assert!(total_payout_1 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(11, 1)]); start_era(2); @@ -1016,7 +1016,7 @@ fn reward_destination_works() { // Compute total payout now for whole duration as other parameter won't change let total_payout_2 = current_total_payout_for_duration(3); assert!(total_payout_2 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(11, 1)]); start_era(3); @@ -1070,7 +1070,7 @@ fn validator_payment_prefs_work() { // Compute total payout now for whole duration as other parameter won't change let total_payout_0 = current_total_payout_for_duration(3); assert!(total_payout_0 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 1); + >::reward_by_ids(vec![(11, 1)]); start_era(1); @@ -1284,8 +1284,8 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment( // Compute total payout now for whole duration as other parameter won't change let total_payout_0 = current_total_payout_for_duration(3); assert!(total_payout_0 > 100); // Test is meaningfull if reward something - >::add_reward_points_to_validator(11, 1); - >::add_reward_points_to_validator(21, 1); + >::reward_by_ids(vec![(11, 1)]); + >::reward_by_ids(vec![(21, 1)]); // New era --> rewards are paid --> stakes are changed start_era(1); @@ -1777,7 +1777,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { let total_payout_0 = current_total_payout_for_duration(3); assert!(total_payout_0 > 100); // Test is meaningfull if reward something - add_reward_points_to_all_elected(); + reward_all_elected(); start_era(1); // 2 is elected. @@ -1792,7 +1792,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { let total_payout_1 = current_total_payout_for_duration(3); assert!(total_payout_1 > 100); // Test is meaningfull if reward something - add_reward_points_to_all_elected(); + reward_all_elected(); start_era(2); assert_eq_uvec!(validator_controllers(), vec![20, 10, 2]); @@ -2090,14 +2090,44 @@ fn reward_from_authorship_event_handler_works() { // An uncle author that is not currently elected doesn't get rewards, // but the block producer does get reward for referencing it. >::note_uncle(31, 1); + // Rewarding the same two times works. + >::note_uncle(11, 1); // Not mandatory but must be coherent with rewards assert_eq!(>::get(), vec![21, 11]); - // 21 is rewarded as an uncle procuder - // 11 is rewarded as a block procuder and unclde referencer - assert_eq!(CurrentEraRewards::get().rewards, vec![1, 20+2*2]); - assert_eq!(CurrentEraRewards::get().total, 25); + // 21 is rewarded as an uncle producer + // 11 is rewarded as a block procuder and uncle referencer and uncle producer + assert_eq!(CurrentEraRewards::get().rewards, vec![1, 20+2*3 + 1]); + assert_eq!(CurrentEraRewards::get().total, 28); + }) +} + +#[test] +fn add_reward_points_fns_works() { + with_externalities(&mut ExtBuilder::default() + .build(), + || { + let validators = >::current_elected(); + // Not mandatory but must be coherent with rewards + assert_eq!(validators, vec![21, 11]); + + >::reward_by_indices(vec![ + (0, 1), + (1, 1), + (2, 1), + (1, 1), + ]); + + >::reward_by_ids(vec![ + (21, 1), + (11, 1), + (31, 1), + (11, 1), + ]); + + assert_eq!(CurrentEraRewards::get().rewards, vec![2, 4]); + assert_eq!(CurrentEraRewards::get().total, 6); }) } -- GitLab From e269dbf02b5f497e8c9d1cfd7de302c2c40da178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 8 Aug 2019 00:05:15 +0200 Subject: [PATCH 104/151] More tests and some cleanup (#3331) --- core/cli/src/lib.rs | 3 -- core/keystore/src/lib.rs | 28 ++++++++++-- core/primitives/src/testing.rs | 73 +++++++++++++++++++++++++----- core/primitives/src/traits.rs | 6 +-- core/rpc/src/author/mod.rs | 3 +- core/rpc/src/author/tests.rs | 83 ++++++++++++++-------------------- 6 files changed, 126 insertions(+), 70 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 0f6769a699..6be285ee37 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -463,7 +463,6 @@ where config.disable_grandpa = cli.no_grandpa; config.grandpa_voter = cli.grandpa_voter; - let is_dev = cli.shared_params.dev; let client_id = config.client_id(); @@ -481,14 +480,12 @@ where cli.pool_config, )?; - if cli.shared_params.dev { config.dev_key_seed = cli.keyring.account .map(|a| format!("//{}", a)) .or_else(|| Some("//Alice".into())); } - let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; let ws_interface: &str = if cli.ws_external { "0.0.0.0" } else { "127.0.0.1" }; diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 5a6df04b77..9125ddbda6 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -190,10 +190,10 @@ impl Store { let file = File::open(path)?; let phrase: String = serde_json::from_reader(&file)?; - let pair = Pair::from_phrase( + let pair = Pair::from_string( &phrase, self.password.as_ref().map(|p| &***p), - ).map_err(|_| Error::InvalidPhrase)?.0; + ).map_err(|_| Error::InvalidPhrase)?; if &pair.public() == public { Ok(pair) @@ -318,7 +318,7 @@ impl BareCryptoStore for Store { mod tests { use super::*; use tempdir::TempDir; - use primitives::crypto::Ss58Codec; + use primitives::crypto::{Ss58Codec, key_types}; #[test] fn basic_store() { @@ -400,4 +400,26 @@ mod tests { assert_eq!(public_keys, store_pubs); } + + #[test] + fn store_unknown_and_extract_it() { + let temp_dir = TempDir::new("keystore").unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); + + let secret_uri = "//Alice"; + let key_pair = sr25519::AppPair::from_string(secret_uri, None).expect("Generates key pair"); + + store.write().insert_unknown( + key_types::SR25519, + secret_uri, + key_pair.public().as_ref(), + ).expect("Inserts unknown key"); + + let store_key_pair = store.read().key_pair_by_type::( + &key_pair.public(), + key_types::SR25519, + ).expect("Gets key pair from keystore"); + + assert_eq!(key_pair.public(), store_key_pair.public()); + } } diff --git a/core/primitives/src/testing.rs b/core/primitives/src/testing.rs index 6d91c83ccb..932c8b9cb1 100644 --- a/core/primitives/src/testing.rs +++ b/core/primitives/src/testing.rs @@ -24,7 +24,7 @@ use crate::{ed25519, sr25519, crypto::{Public, Pair, KeyTypeId}}; #[derive(Default)] pub struct KeyStore { /// `KeyTypeId` maps to public keys and public keys map to private keys. - keys: std::collections::HashMap, Vec>>, + keys: std::collections::HashMap, String>>, } #[cfg(feature = "std")] @@ -41,7 +41,7 @@ impl crate::traits::BareCryptoStore for KeyStore { self.keys.get(&id) .map(|keys| keys.values() - .map(|s| sr25519::Pair::from_seed_slice(s).expect("`sr25519` seed slice is valid")) + .map(|s| sr25519::Pair::from_string(s, None).expect("`sr25519` seed slice is valid")) .map(|p| p.public()) .collect() ) @@ -56,12 +56,12 @@ impl crate::traits::BareCryptoStore for KeyStore { match seed { Some(seed) => { let pair = sr25519::Pair::from_string(seed, None).expect("Generates an `sr25519` pair."); - self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), seed.into()); Ok(pair.public()) }, None => { - let (pair, _) = sr25519::Pair::generate(); - self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + let (pair, phrase, _) = sr25519::Pair::generate_with_phrase(None); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), phrase); Ok(pair.public()) } } @@ -71,7 +71,7 @@ impl crate::traits::BareCryptoStore for KeyStore { self.keys.get(&id) .and_then(|inner| inner.get(pub_key.as_slice()) - .map(|s| sr25519::Pair::from_seed_slice(s).expect("`sr25519` seed slice is valid")) + .map(|s| sr25519::Pair::from_string(s, None).expect("`sr25519` seed slice is valid")) ) } @@ -79,7 +79,7 @@ impl crate::traits::BareCryptoStore for KeyStore { self.keys.get(&id) .map(|keys| keys.values() - .map(|s| ed25519::Pair::from_seed_slice(s).expect("`ed25519` seed slice is valid")) + .map(|s| ed25519::Pair::from_string(s, None).expect("`ed25519` seed slice is valid")) .map(|p| p.public()) .collect() ) @@ -94,12 +94,12 @@ impl crate::traits::BareCryptoStore for KeyStore { match seed { Some(seed) => { let pair = ed25519::Pair::from_string(seed, None).expect("Generates an `ed25519` pair."); - self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), seed.into()); Ok(pair.public()) }, None => { - let (pair, _) = ed25519::Pair::generate(); - self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), pair.to_raw_vec()); + let (pair, phrase, _) = ed25519::Pair::generate_with_phrase(None); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), phrase); Ok(pair.public()) } } @@ -109,7 +109,58 @@ impl crate::traits::BareCryptoStore for KeyStore { self.keys.get(&id) .and_then(|inner| inner.get(pub_key.as_slice()) - .map(|s| ed25519::Pair::from_seed_slice(s).expect("`ed25519` seed slice is valid")) + .map(|s| ed25519::Pair::from_string(s, None).expect("`ed25519` seed slice is valid")) ) } + + fn insert_unknown(&mut self, id: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()> { + self.keys.entry(id).or_default().insert(public.to_owned(), suri.to_string()); + Ok(()) + } + + fn password(&self) -> Option<&str> { + None + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{sr25519, crypto::key_types, traits::BareCryptoStore}; + + #[test] + fn store_key_and_extract() { + let store = KeyStore::new(); + + let public = store.write() + .ed25519_generate_new(key_types::ED25519, None) + .expect("Genrates key"); + + let store_key_pair = store.read() + .ed25519_key_pair(key_types::ED25519, &public) + .expect("Key should exists in store"); + + assert_eq!(public, store_key_pair.public()); + } + + #[test] + fn store_unknown_and_extract_it() { + let store = KeyStore::new(); + + let secret_uri = "//Alice"; + let key_pair = sr25519::Pair::from_string(secret_uri, None).expect("Generates key pair"); + + store.write().insert_unknown( + key_types::SR25519, + secret_uri, + key_pair.public().as_ref(), + ).expect("Inserts unknown key"); + + let store_key_pair = store.read().sr25519_key_pair( + key_types::SR25519, + &key_pair.public(), + ).expect("Gets key pair from keystore"); + + assert_eq!(key_pair.public(), store_key_pair.public()); + } } diff --git a/core/primitives/src/traits.rs b/core/primitives/src/traits.rs index 6fa84088db..8e2f0c0213 100644 --- a/core/primitives/src/traits.rs +++ b/core/primitives/src/traits.rs @@ -59,12 +59,10 @@ pub trait BareCryptoStore: Send + Sync { /// Places it into the file system store. /// /// `Err` if there's some sort of weird filesystem error, but should generally be `Ok`. - fn insert_unknown(&mut self, _key_type: KeyTypeId, _suri: &str, _public: &[u8]) -> Result<(), ()> { - Err(()) - } + fn insert_unknown(&mut self, _key_type: KeyTypeId, _suri: &str, _public: &[u8]) -> Result<(), ()>; /// Get the password for this store. - fn password(&self) -> Option<&str> { None } + fn password(&self) -> Option<&str>; } /// A pointer to the key store. diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 226fd2b105..47f481f00f 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -141,7 +141,8 @@ impl AuthorApi, BlockHash

> for Author whe { type Metadata = crate::metadata::Metadata; - fn insert_key(&self, + fn insert_key( + &self, key_type: String, suri: String, maybe_public: Option, diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 93c39a4bc5..18a2e41739 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -23,12 +23,12 @@ use transaction_pool::{ txpool::Pool, ChainApi, }; -use primitives::{H256, blake2_256, hexdisplay::HexDisplay, traits::BareCryptoStore}; +use primitives::{ + H256, blake2_256, hexdisplay::HexDisplay, traits::BareCryptoStore, testing::KeyStore, + ed25519, crypto::key_types, +}; use test_client::{self, AccountKeyring, runtime::{Extrinsic, Transfer}}; use tokio::runtime; -use std::collections::HashMap; -use sr_primitives::KeyTypeId; -use parking_lot::RwLock; fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { let tx = Transfer { @@ -40,50 +40,11 @@ fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { tx.into_signed_tx() } -#[derive(Default)] -struct TestKeyStore { - keys: HashMap, String>>, -} - -impl BareCryptoStore for TestKeyStore { - fn sr25519_public_keys(&self, _id: KeyTypeId) -> Vec { vec![] } - fn sr25519_generate_new(&mut self, _id: KeyTypeId, _seed: Option<&str>) - -> std::result::Result - { - Err("unimplemented".into()) - } - fn sr25519_key_pair(&self, _id: KeyTypeId, _pub_key: &sr25519::Public) -> Option { - None - } - fn ed25519_public_keys(&self, _id: KeyTypeId) -> Vec { vec![] } - fn ed25519_generate_new(&mut self, _id: KeyTypeId, _seed: Option<&str>) - -> std::result::Result - { - Err("unimplemented".into()) - } - fn ed25519_key_pair(&self, _id: KeyTypeId, _pub_key: &ed25519::Public) -> Option { - None - } - - fn insert_unknown(&mut self, key_type: KeyTypeId, suri: &str, public: &[u8]) - -> std::result::Result<(), ()> - { - self.keys - .entry(key_type) - .or_default() - .insert(public.to_owned(), suri.to_owned()); - Ok(()) - } - - fn password(&self) -> Option<&str> { None } -} - #[test] fn submit_transaction_should_not_cause_error() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); - let keystore = TestKeyStore::default(); - let keystore = Arc::new(RwLock::new(keystore)); + let keystore = KeyStore::new(); let p = Author { client: client.clone(), pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), @@ -106,7 +67,7 @@ fn submit_transaction_should_not_cause_error() { fn submit_rich_transaction_should_not_cause_error() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); - let keystore = Arc::new(RwLock::new(TestKeyStore::default())); + let keystore = KeyStore::new(); let p = Author { client: client.clone(), pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))), @@ -131,7 +92,7 @@ fn should_watch_extrinsic() { let mut runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); - let keystore = Arc::new(RwLock::new(TestKeyStore::default())); + let keystore = KeyStore::new(); let p = Author { client, pool: pool.clone(), @@ -173,7 +134,7 @@ fn should_return_pending_extrinsics() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); - let keystore = Arc::new(RwLock::new(TestKeyStore::default())); + let keystore = KeyStore::new(); let p = Author { client, pool: pool.clone(), @@ -193,7 +154,7 @@ fn should_remove_extrinsics() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); - let keystore = Arc::new(RwLock::new(TestKeyStore::default())); + let keystore = KeyStore::new(); let p = Author { client, pool: pool.clone(), @@ -217,3 +178,29 @@ fn should_remove_extrinsics() { assert_eq!(removed.len(), 3); } + +#[test] +fn should_insert_key() { + let runtime = runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let keystore = KeyStore::new(); + let p = Author { + client: client.clone(), + pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), + subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), + }; + + let suri = "//Alice"; + let key_pair = ed25519::Pair::from_string(suri, None).expect("Generates keypair"); + p.insert_key( + String::from_utf8(key_types::ED25519.0.to_vec()).expect("Keytype is a valid string"), + suri.to_string(), + Some(key_pair.public().0.to_vec().into()), + ).expect("Insert key"); + + let store_key_pair = keystore.read() + .ed25519_key_pair(key_types::ED25519, &key_pair.public()).expect("Key exists in store"); + + assert_eq!(key_pair.public(), store_key_pair.public()); +} \ No newline at end of file -- GitLab From 872173f0a110e70b8b11effdf46ae4b88bc45f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 8 Aug 2019 00:10:36 +0200 Subject: [PATCH 105/151] Make `DefaultByte` implement `Send + Sync` (#3333) * Make `DefaultByte` implement `Send + Sync` * Update runtime version. --- node/runtime/src/lib.rs | 2 +- srml/metadata/src/lib.rs | 2 +- srml/support/procedural/src/storage/transformation.rs | 6 ++++++ srml/support/src/dispatch.rs | 8 ++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index ce1aaa6b73..2d6a8eb2ca 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 131, - impl_version: 132, + impl_version: 133, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index 329b543d1a..bf7c379000 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -210,7 +210,7 @@ pub struct ModuleConstantMetadata { } /// A technical trait to store lazy initiated vec value as static dyn pointer. -pub trait DefaultByte { +pub trait DefaultByte: Send + Sync { fn default_byte(&self) -> Vec; } diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 2e33493964..2c96e5a23b 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -1069,6 +1069,12 @@ fn store_functions_to_metadata ( } } + unsafe impl<#traitinstance: #traittype, #instance #bound_instantiable> Send + for #struct_name<#traitinstance, #instance> #where_clause {} + + unsafe impl<#traitinstance: #traittype, #instance #bound_instantiable> Sync + for #struct_name<#traitinstance, #instance> #where_clause {} + #[cfg(not(feature = "std"))] impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::metadata::DefaultByte for #struct_name<#traitinstance, #instance> #where_clause diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index 0391d2995f..294fe3795e 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -1431,6 +1431,14 @@ macro_rules! __impl_module_constants_metadata { $crate::dispatch::Encode::encode(&value) } } + + unsafe impl<$const_trait_instance: 'static + $const_trait_name $( + , $const_instance: $const_instantiable)? + > Send for $default_byte_name <$const_trait_instance $(, $const_instance)?> {} + + unsafe impl<$const_trait_instance: 'static + $const_trait_name $( + , $const_instance: $const_instantiable)? + > Sync for $default_byte_name <$const_trait_instance $(, $const_instance)?> {} )* &[ $( -- GitLab From d6eb5dd881ad833d229d2de851b15330a928726e Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 8 Aug 2019 00:56:29 +0200 Subject: [PATCH 106/151] Set uncles inherent (#3317) * Include uncles * Filter missing uncles * Moved inherent registration to a new crate * Ignore invalid inherent encoding --- Cargo.lock | 15 +++ Cargo.toml | 1 + core/client/src/client.rs | 23 +++- core/client/src/lib.rs | 2 +- core/consensus/babe/Cargo.toml | 1 + core/consensus/babe/src/lib.rs | 10 +- core/consensus/uncles/Cargo.toml | 15 +++ core/consensus/uncles/src/lib.rs | 66 ++++++++++ node/runtime/src/lib.rs | 8 +- srml/authorship/Cargo.toml | 2 + srml/authorship/src/lib.rs | 219 +++++++++++++++++++++++-------- srml/finality-tracker/src/lib.rs | 17 +-- 12 files changed, 308 insertions(+), 71 deletions(-) create mode 100644 core/consensus/uncles/Cargo.toml create mode 100644 core/consensus/uncles/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 62969a0efa..93ddce4971 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3738,6 +3738,7 @@ dependencies = [ "sr-std 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", + "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", ] @@ -4457,6 +4458,7 @@ dependencies = [ "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-consensus-slots 2.0.0", + "substrate-consensus-uncles 2.0.0", "substrate-executor 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", @@ -4553,6 +4555,19 @@ dependencies = [ "substrate-test-runtime-client 2.0.0", ] +[[package]] +name = "substrate-consensus-uncles" +version = "2.0.0" +dependencies = [ + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "srml-authorship 0.1.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "substrate-executor" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index 298882e9a6..be6c89c2b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ members = [ "core/consensus/common", "core/consensus/rhd", "core/consensus/slots", + "core/consensus/uncles", "core/executor", "core/executor/runtime-test", "core/finality-grandpa", diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 7213db0c9f..fa60c80e3a 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -170,6 +170,13 @@ pub trait BlockBody { ) -> error::Result::Extrinsic>>>; } +/// Provide a list of potential uncle headers for a given block. +pub trait ProvideUncles { + /// Gets the uncles of the block with `target_hash` going back `max_generation` ancestors. + fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) + -> error::Result>; +} + /// Client info #[derive(Debug)] pub struct ClientInfo { @@ -1329,7 +1336,7 @@ impl Client where ancestor_hash = *current.parent_hash(); ancestor = load_header(ancestor_hash)?; } - + trace!("Collected {} uncles", uncles.len()); Ok(uncles) } @@ -1353,6 +1360,20 @@ impl Client where } } +impl ProvideUncles for Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, +{ + fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) -> error::Result> { + Ok(Client::uncles(self, target_hash, max_generation)? + .into_iter() + .filter_map(|hash| Client::header(self, &BlockId::Hash(hash)).unwrap_or(None)) + .collect() + ) + } +} + impl ChainHeaderBackend for Client where B: backend::Backend, E: CallExecutor + Send + Sync, diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index ba5f316d0c..99cbecbe89 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -115,7 +115,7 @@ pub use crate::client::{ new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, FinalityNotification, - LongestChain, BlockOf, + LongestChain, BlockOf, ProvideUncles, utils, }; #[cfg(feature = "std")] diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 9e1fb6bd4b..8184033735 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -22,6 +22,7 @@ keystore = { package = "substrate-keystore", path = "../../keystore" } srml-babe = { path = "../../../srml/babe" } client = { package = "substrate-client", path = "../../client" } consensus-common = { package = "substrate-consensus-common", path = "../common" } +uncles = { package = "substrate-consensus-uncles", path = "../uncles" } slots = { package = "substrate-consensus-slots", path = "../slots" } sr-primitives = { path = "../../sr-primitives" } fork-tree = { path = "../../utils/fork-tree" } diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 873913e59b..eb4b0c5195 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -67,6 +67,7 @@ use client::{ block_builder::api::BlockBuilder as BlockBuilderApi, blockchain::{self, HeaderBackend, ProvideCache}, BlockchainEvents, CallExecutor, Client, runtime_api::ApiExt, error::Result as ClientResult, backend::{AuxStore, Backend}, + ProvideUncles, utils::is_descendent_of, }; use fork_tree::ForkTree; @@ -182,9 +183,9 @@ pub fn start_babe(BabeParams { consensus_common::Error, > where B: BlockT, - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + ProvideCache + ProvideUncles + Send + Sync + 'static, C::Api: BabeApi, - SC: SelectChain, + SC: SelectChain + 'static, E::Proposer: Proposer, >::Create: Unpin + Send + 'static, H: Header, @@ -203,6 +204,11 @@ pub fn start_babe(BabeParams { keystore, }; register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; + uncles::register_uncles_inherent_data_provider( + client.clone(), + select_chain.clone(), + &inherent_data_providers, + )?; Ok(slots::start_slot_worker( config.0, select_chain, diff --git a/core/consensus/uncles/Cargo.toml b/core/consensus/uncles/Cargo.toml new file mode 100644 index 0000000000..98b8adee8b --- /dev/null +++ b/core/consensus/uncles/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "substrate-consensus-uncles" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Generic uncle inclusion utilities for consensus" +edition = "2018" + +[dependencies] +client = { package = "substrate-client", path = "../../client" } +primitives = { package = "substrate-primitives", path = "../../primitives" } +sr-primitives = { path = "../../sr-primitives" } +srml-authorship = { path = "../../../srml/authorship" } +consensus_common = { package = "substrate-consensus-common", path = "../common" } +inherents = { package = "substrate-inherents", path = "../../inherents" } +log = "0.4" diff --git a/core/consensus/uncles/src/lib.rs b/core/consensus/uncles/src/lib.rs new file mode 100644 index 0000000000..5638a23175 --- /dev/null +++ b/core/consensus/uncles/src/lib.rs @@ -0,0 +1,66 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Uncles functionality for Substrate. +//! +#![deny(warnings)] +#![forbid(unsafe_code, missing_docs)] + +use consensus_common::SelectChain; +use inherents::{InherentDataProviders}; +use log::warn; +use client::ProvideUncles; +use sr_primitives::traits::{Block as BlockT, Header}; +use std::sync::Arc; + +/// Maximum uncles generations we may provide to the runtime. +const MAX_UNCLE_GENERATIONS: u32 = 8; + +/// Register uncles inherent data provider, if not registered already. +pub fn register_uncles_inherent_data_provider( + client: Arc, + select_chain: SC, + inherent_data_providers: &InherentDataProviders, +) -> Result<(), consensus_common::Error> where + B: BlockT, + C: ProvideUncles + Send + Sync + 'static, + SC: SelectChain + 'static, +{ + if !inherent_data_providers.has_provider(&srml_authorship::INHERENT_IDENTIFIER) { + inherent_data_providers + .register_provider(srml_authorship::InherentDataProvider::new(move || { + { + let chain_head = match select_chain.best_chain() { + Ok(x) => x, + Err(e) => { + warn!(target: "uncles", "Unable to get chain head: {:?}", e); + return Vec::new(); + } + }; + match client.uncles(chain_head.hash(), MAX_UNCLE_GENERATIONS.into()) { + Ok(uncles) => uncles, + Err(e) => { + warn!(target: "uncles", "Unable to get uncles: {:?}", e); + Vec::new() + } + } + } + })) + .map_err(|err| consensus_common::Error::InherentData(err.into()))?; + } + Ok(()) +} + diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 2d6a8eb2ca..9f247c6320 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 131, - impl_version: 133, + spec_version: 134, + impl_version: 134, apis: RUNTIME_API_VERSIONS, }; @@ -179,7 +179,7 @@ impl timestamp::Trait for Runtime { } parameter_types! { - pub const UncleGenerations: u64 = 0; + pub const UncleGenerations: u64 = 5; } impl authorship::Trait for Runtime { @@ -421,7 +421,7 @@ construct_runtime!( System: system::{Module, Call, Storage, Config, Event}, Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Authorship: authorship::{Module, Call, Storage}, + Authorship: authorship::{Module, Call, Storage, Inherent}, Indices: indices, Balances: balances, Staking: staking::{default, OfflineWorker}, diff --git a/srml/authorship/Cargo.toml b/srml/authorship/Cargo.toml index f470675b4b..e7f7b0941b 100644 --- a/srml/authorship/Cargo.toml +++ b/srml/authorship/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" [dependencies] primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } @@ -19,6 +20,7 @@ default = ["std"] std = [ "codec/std", "primitives/std", + "inherents/std", "sr-primitives/std", "rstd/std", "srml-support/std", diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index fb0f451930..d6ea0326fa 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -20,7 +20,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::prelude::*; +use rstd::{result, prelude::*}; use rstd::collections::btree_set::BTreeSet; use srml_support::{decl_module, decl_storage, for_each_tuple, StorageValue}; use srml_support::traits::{FindAuthor, VerifySeal, Get}; @@ -29,6 +29,61 @@ use codec::{Encode, Decode}; use system::ensure_none; use sr_primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; use sr_primitives::weights::SimpleDispatchInfo; +use inherents::{ + RuntimeString, InherentIdentifier, ProvideInherent, + InherentData, MakeFatalError, +}; + +/// The identifier for the `uncles` inherent. +pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"uncles00"; + +/// Auxiliary trait to extract uncles inherent data. +pub trait UnclesInherentData { + /// Get uncles. + fn uncles(&self) -> Result, RuntimeString>; +} + +impl UnclesInherentData for InherentData { + fn uncles(&self) -> Result, RuntimeString> { + Ok(self.get_data(&INHERENT_IDENTIFIER)?.unwrap_or_default()) + } +} + +/// Provider for inherent data. +#[cfg(feature = "std")] +pub struct InherentDataProvider { + inner: F, + _marker: std::marker::PhantomData, +} + +#[cfg(feature = "std")] +impl InherentDataProvider { + pub fn new(uncles_oracle: F) -> Self { + InherentDataProvider { inner: uncles_oracle, _marker: Default::default() } + } +} + +#[cfg(feature = "std")] +impl inherents::ProvideInherentData for InherentDataProvider +where F: Fn() -> Vec +{ + fn inherent_identifier(&self) -> &'static InherentIdentifier { + &INHERENT_IDENTIFIER + } + + fn provide_inherent_data(&self, inherent_data: &mut InherentData) -> Result<(), RuntimeString> { + let uncles = (self.inner)(); + if !uncles.is_empty() { + inherent_data.put_data(INHERENT_IDENTIFIER, &uncles) + } else { + Ok(()) + } + } + + fn error_to_string(&self, _error: &[u8]) -> Option { + Some(format!("no further information")) + } +} pub trait Trait: system::Trait { /// Find the author of a block. @@ -101,16 +156,16 @@ pub trait FilterUncle { /// Do additional filtering on a seal-checked uncle block, with the accumulated /// filter. - fn filter_uncle(header: &Header, acc: Self::Accumulator) - -> Result<(Option, Self::Accumulator), &'static str>; + fn filter_uncle(header: &Header, acc: &mut Self::Accumulator) + -> Result, &'static str>; } impl FilterUncle for () { type Accumulator = (); - fn filter_uncle(_: &H, acc: Self::Accumulator) - -> Result<(Option, Self::Accumulator), &'static str> + fn filter_uncle(_: &H, _acc: &mut Self::Accumulator) + -> Result, &'static str> { - Ok((None, acc)) + Ok(None) } } @@ -124,10 +179,10 @@ impl> FilterUncle { type Accumulator = (); - fn filter_uncle(header: &Header, _acc: ()) - -> Result<(Option, ()), &'static str> + fn filter_uncle(header: &Header, _acc: &mut ()) + -> Result, &'static str> { - T::verify_seal(header).map(|author| (author, ())) + T::verify_seal(header) } } @@ -147,8 +202,8 @@ where { type Accumulator = BTreeSet<(Header::Number, Author)>; - fn filter_uncle(header: &Header, mut acc: Self::Accumulator) - -> Result<(Option, Self::Accumulator), &'static str> + fn filter_uncle(header: &Header, acc: &mut Self::Accumulator) + -> Result, &'static str> { let author = T::verify_seal(header)?; let number = header.number(); @@ -159,7 +214,7 @@ where } } - Ok((author, acc)) + Ok(author) } } @@ -256,6 +311,39 @@ impl Module { fn verify_and_import_uncles(new_uncles: Vec) -> DispatchResult { let now = >::block_number(); + let mut uncles = ::Uncles::get(); + uncles.push(UncleEntryItem::InclusionHeight(now)); + + let mut acc: >::Accumulator = Default::default(); + + for uncle in new_uncles { + let prev_uncles = uncles.iter().filter_map(|entry| + match entry { + UncleEntryItem::InclusionHeight(_) => None, + UncleEntryItem::Uncle(h, _) => Some(h), + }); + let author = Self::verify_uncle(&uncle, prev_uncles, &mut acc)?; + let hash = uncle.hash(); + + T::EventHandler::note_uncle( + author.clone().unwrap_or_default(), + now - uncle.number().clone(), + ); + uncles.push(UncleEntryItem::Uncle(hash, author)); + } + + ::Uncles::put(&uncles); + Ok(()) + } + + fn verify_uncle<'a, I: IntoIterator>( + uncle: &T::Header, + existing_uncles: I, + accumulator: &mut >::Accumulator, + ) -> Result, &'static str> + { + let now = >::block_number(); + let (minimum_height, maximum_height) = { let uncle_generations = T::UncleGenerations::get(); let min = if now >= uncle_generations { @@ -267,55 +355,82 @@ impl Module { (min, now) }; - let mut uncles = ::Uncles::get(); - uncles.push(UncleEntryItem::InclusionHeight(now)); + let hash = uncle.hash(); - let mut acc: >::Accumulator = Default::default(); + if uncle.number() < &One::one() { + return Err("uncle is genesis"); + } - for uncle in new_uncles { - let hash = uncle.hash(); + if uncle.number() > &maximum_height { + return Err("uncle is too high in chain"); + } - if uncle.number() < &One::one() { - return Err("uncle is genesis"); + { + let parent_number = uncle.number().clone() - One::one(); + let parent_hash = >::block_hash(&parent_number); + if &parent_hash != uncle.parent_hash() { + return Err("uncle parent not in chain"); } + } - if uncle.number() > &maximum_height { - return Err("uncles too high in chain"); - } + if uncle.number() < &minimum_height { + return Err("uncle not recent enough to be included"); + } - { - let parent_number = uncle.number().clone() - One::one(); - let parent_hash = >::block_hash(&parent_number); - if &parent_hash != uncle.parent_hash() { - return Err("uncle parent not in chain"); - } - } + let duplicate = existing_uncles.into_iter().find(|h| **h == hash).is_some(); + let in_chain = >::block_hash(uncle.number()) == hash; - if uncle.number() < &minimum_height { - return Err("uncle not recent enough to be included"); - } + if duplicate || in_chain { + return Err("uncle already included") + } - let duplicate = uncles.iter().find(|entry| match entry { - UncleEntryItem::InclusionHeight(_) => false, - UncleEntryItem::Uncle(h, _) => h == &hash, - }).is_some(); + // check uncle validity. + T::FilterUncle::filter_uncle(&uncle, accumulator) + } +} - let in_chain = >::block_hash(uncle.number()) == hash; +impl ProvideInherent for Module { + type Call = Call; + type Error = MakeFatalError<()>; + const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; + + fn create_inherent(data: &InherentData) -> Option { + let uncles = data.uncles().unwrap_or_default(); + let mut set_uncles = Vec::new(); + + if !uncles.is_empty() { + let prev_uncles = ::Uncles::get(); + let mut existing_hashes: Vec<_> = prev_uncles.into_iter().filter_map(|entry| + match entry { + UncleEntryItem::InclusionHeight(_) => None, + UncleEntryItem::Uncle(h, _) => Some(h), + } + ).collect(); - if duplicate || in_chain { return Err("uncle already included") } + let mut acc: >::Accumulator = Default::default(); - // check uncle validity. - let (author, temp_acc) = T::FilterUncle::filter_uncle(&uncle, acc)?; - acc = temp_acc; + for uncle in uncles { + match Self::verify_uncle(&uncle, &existing_hashes, &mut acc) { + Ok(_) => { + let hash = uncle.hash(); + set_uncles.push(uncle); + existing_hashes.push(hash); + } + Err(_) => { + // skip this uncle + } + } + } + } - T::EventHandler::note_uncle( - author.clone().unwrap_or_default(), - now - uncle.number().clone(), - ); - uncles.push(UncleEntryItem::Uncle(hash, author)); + if set_uncles.is_empty() { + None + } else { + Some(Call::set_uncles(set_uncles)) } + } - ::Uncles::put(&uncles); + fn check_inherent(_call: &Self::Call, _data: &InherentData) -> result::Result<(), Self::Error> { Ok(()) } } @@ -601,7 +716,7 @@ mod tests { let author_a = 42; let author_b = 43; - let mut acc: Option<>::Accumulator> = Some(Default::default()); + let mut acc: >::Accumulator = Default::default(); let header_a1 = seal_header( create_header(1, Default::default(), [1; 32].into()), author_a, @@ -621,13 +736,7 @@ mod tests { ); let mut check_filter = move |uncle| { - match Filter::filter_uncle(uncle, acc.take().unwrap()) { - Ok((author, a)) => { - acc = Some(a); - Ok(author) - } - Err(e) => Err(e), - } + Filter::filter_uncle(uncle, &mut acc) }; // same height, different author is OK. diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index f074b27aa0..a4026f21b3 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -244,15 +244,16 @@ impl ProvideInherent for Module { const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; fn create_inherent(data: &InherentData) -> Option { - let final_num = - data.finalized_number().expect("Gets and decodes final number inherent data"); - - // make hint only when not same as last to avoid bloat. - Self::recent_hints().last().and_then(|last| if last == &final_num { - None + if let Ok(final_num) = data.finalized_number() { + // make hint only when not same as last to avoid bloat. + Self::recent_hints().last().and_then(|last| if last == &final_num { + None + } else { + Some(Call::final_hint(final_num)) + }) } else { - Some(Call::final_hint(final_num)) - }) + None + } } fn check_inherent(_call: &Self::Call, _data: &InherentData) -> result::Result<(), Self::Error> { -- GitLab From 9b3e9f32cd5243d2eeff3d5d8337033aa64c091b Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 8 Aug 2019 01:01:16 +0200 Subject: [PATCH 107/151] Fixed test block conditions (#3332) --- core/network/src/protocol.rs | 5 +++++ core/network/src/protocol/sync.rs | 7 +++++-- core/network/src/service.rs | 5 +++++ core/network/src/test/mod.rs | 3 +++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 88252d7786..b561322b5b 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -442,6 +442,11 @@ impl, H: ExHashT> Protocol { self.sync.status().num_peers } + /// Number of blocks in the import queue. + pub fn num_queued_blocks(&self) -> u32 { + self.sync.status().queued_blocks + } + /// Starts a new data demand request. /// /// The parameter contains a `Sender` where the result, once received, must be sent. diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs index 12f0ac6568..80b0662c6b 100644 --- a/core/network/src/protocol/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -198,7 +198,9 @@ pub struct Status { /// Target sync block number. pub best_seen_block: Option>, /// Number of peers participating in syncing. - pub num_peers: u32 + pub num_peers: u32, + /// Number of blocks queued for import + pub queued_blocks: u32, } /// A peer did not behave as expected and should be reported. @@ -317,7 +319,8 @@ impl ChainSync { Status { state: sync_state, best_seen_block: best_seen, - num_peers: self.peers.len() as u32 + num_peers: self.peers.len() as u32, + queued_blocks: self.queue_blocks.len() as u32, } } diff --git a/core/network/src/service.rs b/core/network/src/service.rs index ff5db5f702..eed5de85ed 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -280,6 +280,11 @@ impl, H: ExHashT> NetworkWorker self.network_service.user_protocol().num_sync_peers() } + /// Number of blocks in the import queue. + pub fn num_queued_blocks(&self) -> u32 { + self.network_service.user_protocol().num_queued_blocks() + } + /// Adds an address for a node. pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { self.network_service.add_known_address(peer_id, addr); diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index f12b4c8237..091047394b 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -591,6 +591,9 @@ pub trait TestNetFactory: Sized { // Return `NotReady` if there's a mismatch in the highest block number. let mut highest = None; for peer in self.peers().iter() { + if peer.is_major_syncing() || peer.network.num_queued_blocks() != 0 { + return Async::NotReady + } match (highest, peer.client.info().chain.best_number) { (None, b) => highest = Some(b), (Some(ref a), ref b) if a == b => {}, -- GitLab From 2fca4d278d46e528b18dc7f0f8aa4f7e995f83f3 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 8 Aug 2019 09:32:07 +0200 Subject: [PATCH 108/151] Reintroduce mplex (reverts #3312) (#3328) This reverts commit e9b2113c6aadce658c107abd9961b8b329f36607. --- core/network/src/lib.rs | 2 ++ core/network/src/transport.rs | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 33f9e5d2eb..e5714c66f2 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -89,6 +89,8 @@ //! //! The following multiplexing protocols are supported: //! +//! - [Mplex](https://github.com/libp2p/specs/tree/master/mplex). Support for mplex will likely +//! be deprecated in the future. //! - [Yamux](https://github.com/hashicorp/yamux/blob/master/spec.md). //! //! ## Substreams diff --git a/core/network/src/transport.rs b/core/network/src/transport.rs index 389a662661..901ec18581 100644 --- a/core/network/src/transport.rs +++ b/core/network/src/transport.rs @@ -17,14 +17,14 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - identity, secio, yamux, bandwidth, wasm_ext + mplex, identity, secio, yamux, bandwidth, wasm_ext }; #[cfg(not(target_os = "unknown"))] use libp2p::{tcp, dns, websocket, noise}; #[cfg(not(target_os = "unknown"))] use libp2p::core::{upgrade, either::EitherError, either::EitherOutput}; use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; -use std::{io, sync::Arc, time::Duration}; +use std::{io, sync::Arc, time::Duration, usize}; pub use self::bandwidth::BandwidthSinks; @@ -55,6 +55,9 @@ pub fn build_transport( let secio_config = secio::SecioConfig::new(keypair); // Build configuration objects for multiplexing mechanisms. + let mut mplex_config = mplex::MplexConfig::new(); + mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); + mplex_config.max_buffer_len(usize::MAX); let yamux_config = yamux::Config::default(); // Build the base layer of the transport. @@ -113,7 +116,7 @@ pub fn build_transport( // Multiplexing let transport = transport.and_then(move |(stream, peer_id), endpoint| { let peer_id2 = peer_id.clone(); - let upgrade = yamux_config + let upgrade = core::upgrade::SelectUpgrade::new(yamux_config, mplex_config) .map_inbound(move |muxer| (peer_id, muxer)) .map_outbound(move |muxer| (peer_id2, muxer)); -- GitLab From 983cdeb91c08273028f19953eb6865236efa00ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 8 Aug 2019 09:33:45 +0200 Subject: [PATCH 109/151] Clean up CLI interface (#3334) * Clean up CLI interface - Removes `--validator` and `--grandpa-voter` - Make `--alice` etc work without `--dev` * Style fixes --- core/cli/src/lib.rs | 34 +++++++++-------------------- core/cli/src/params.rs | 10 --------- core/service/src/config.rs | 4 ---- core/service/test/src/lib.rs | 1 - node/cli/src/service.rs | 42 +++++++++++++++++++----------------- 5 files changed, 32 insertions(+), 59 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 6be285ee37..6c2a36121e 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -433,14 +433,11 @@ where ), }; - let role = - if cli.light { - service::Roles::LIGHT - } else if cli.validator || cli.shared_params.dev { - service::Roles::AUTHORITY - } else { - service::Roles::FULL - }; + let role = if cli.light { + service::Roles::LIGHT + } else { + service::Roles::AUTHORITY + }; let exec = cli.execution_strategies; let exec_all_or = |strat: params::ExecutionStrategy| exec.execution.unwrap_or(strat).into(); @@ -461,7 +458,6 @@ where config.roles = role; config.disable_grandpa = cli.no_grandpa; - config.grandpa_voter = cli.grandpa_voter; let is_dev = cli.shared_params.dev; @@ -475,26 +471,16 @@ where is_dev, )?; - fill_transaction_pool_configuration::( - &mut config, - cli.pool_config, - )?; + fill_transaction_pool_configuration::(&mut config, cli.pool_config)?; - if cli.shared_params.dev { - config.dev_key_seed = cli.keyring.account - .map(|a| format!("//{}", a)) - .or_else(|| Some("//Alice".into())); - } + config.dev_key_seed = cli.keyring.account.map(|a| format!("//{}", a)); let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; let ws_interface: &str = if cli.ws_external { "0.0.0.0" } else { "127.0.0.1" }; - config.rpc_http = Some( - parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)? - ); - config.rpc_ws = Some( - parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)? - ); + config.rpc_http = Some(parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)?); + config.rpc_ws = Some(parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)?); + config.rpc_ws_max_connections = cli.ws_max_connections; config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| if is_dev { log::warn!("Running in --dev mode, RPC CORS has been disabled."); diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 6f92e8c9b4..702416aa0c 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -311,19 +311,10 @@ pub struct ExecutionStrategies { /// The `run` command used to run a node. #[derive(Debug, StructOpt, Clone)] pub struct RunCmd { - /// Enable validator mode - #[structopt(long = "validator")] - pub validator: bool, - /// Disable GRANDPA when running in validator mode #[structopt(long = "no-grandpa")] pub no_grandpa: bool, - /// Run GRANDPA voter even when no additional key seed via `--key` is specified. This can for example be of interest - /// when running a sentry node in front of a validator, thus needing to forward GRANDPA gossip messages. - #[structopt(long = "grandpa-voter")] - pub grandpa_voter: bool, - /// Experimental: Run in light client mode #[structopt(long = "light")] pub light: bool, @@ -505,7 +496,6 @@ impl AugmentClap for Keyring { .long(&a.name) .help(&a.help) .conflicts_with_all(&conflicts_with_strs) - .requires("dev") .takes_value(false) ) }) diff --git a/core/service/src/config.rs b/core/service/src/config.rs index b5019c8263..97eba357e3 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -85,9 +85,6 @@ pub struct Configuration { pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, - /// Run GRANDPA voter even when no additional key seed is specified. This can for example be of interest when - /// running a sentry node in front of a validator, thus needing to forward GRANDPA gossip messages. - pub grandpa_voter: bool, /// Node keystore's password pub keystore_password: Option>, /// Development key seed. @@ -128,7 +125,6 @@ impl Configuration ( offchain_worker: false, force_authoring: false, disable_grandpa: false, - grandpa_voter: false, dev_key_seed: key_seed, } } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 86247668f7..0fc97e99d5 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -146,26 +146,28 @@ construct_service_factory! { keystore: Some(service.keystore()), }; - if service.config.roles.is_authority() { - let telemetry_on_connect = TelemetryOnConnect { - telemetry_connection_sinks: service.telemetry_on_connect_stream(), - }; - let grandpa_config = grandpa::GrandpaParams { - config: config, - link: link_half, - network: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), - on_exit: service.on_exit(), - telemetry_on_connect: Some(telemetry_on_connect), - }; - service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); - } else if !service.config.grandpa_voter { - service.spawn_task(Box::new(grandpa::run_grandpa_observer( - config, - link_half, - service.network(), - service.on_exit(), - )?)); + if !service.config.disable_grandpa { + if service.config.roles.is_authority() { + let telemetry_on_connect = TelemetryOnConnect { + telemetry_connection_sinks: service.telemetry_on_connect_stream(), + }; + let grandpa_config = grandpa::GrandpaParams { + config: config, + link: link_half, + network: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + on_exit: service.on_exit(), + telemetry_on_connect: Some(telemetry_on_connect), + }; + service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); + } else { + service.spawn_task(Box::new(grandpa::run_grandpa_observer( + config, + link_half, + service.network(), + service.on_exit(), + )?)); + } } Ok(service) -- GitLab From d5560b6f497666fdcf3c312c99e37263e6b53f5b Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 8 Aug 2019 09:34:09 +0200 Subject: [PATCH 110/151] Improve console output (#3326) * Cache idle state * Display import error by default --- core/client/src/client.rs | 8 +++++++- core/network/src/protocol/sync.rs | 32 ++++++++++++++++++++++++++----- core/service/src/lib.rs | 2 +- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/core/client/src/client.rs b/core/client/src/client.rs index fa60c80e3a..0360c532d2 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1242,6 +1242,9 @@ impl Client where let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) + }).map_err(|e| { + warn!("Block finalization error:\n{:?}", e); + e }) } @@ -1501,7 +1504,10 @@ impl<'a, B, E, Block, RA> consensus::BlockImport for &'a Client Result { self.lock_import_and_run(|operation| { self.apply_block(operation, import_block, new_cache) - }).map_err(|e| ConsensusError::ClientImport(e.to_string()).into()) + }).map_err(|e| { + warn!("Block import error:\n{:?}", e); + ConsensusError::ClientImport(e.to_string()).into() + }) } /// Check block preconditions. diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs index 80b0662c6b..bd67c6cde7 100644 --- a/core/network/src/protocol/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -119,7 +119,9 @@ pub struct ChainSync { queue_blocks: HashSet, /// The best block number that we are currently importing. best_importing_number: NumberFor, - request_builder: Option> + request_builder: Option>, + /// A flag that caches idle state with no pending requests. + is_idle: bool, } /// All the data we have about a Peer that we are trying to sync with @@ -289,7 +291,8 @@ impl ChainSync { required_block_attributes, queue_blocks: Default::default(), best_importing_number: Zero::zero(), - request_builder + request_builder, + is_idle: false, } } @@ -346,7 +349,6 @@ impl ChainSync { info!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); return Err(BadPeer(who, i32::min_value())) } - // If there are more than `MAJOR_SYNC_BLOCKS` in the import queue then we have // enough to do in the import queue that it's not worth kicking off // an ancestor search, which is what we do in the next match case below. @@ -398,6 +400,7 @@ impl ChainSync { ), recently_announced: Default::default() }); + self.is_idle = false; Ok(Some(ancestry_request::(common_best))) } @@ -410,6 +413,7 @@ impl ChainSync { state: PeerSyncState::Available, recently_announced: Default::default(), }); + self.is_idle = false; Ok(None) } } @@ -487,12 +491,16 @@ impl ChainSync { /// Get an iterator over all block requests of all peers. pub fn block_requests(&mut self) -> impl Iterator)> + '_ { + if self.is_idle { + return Either::Left(std::iter::empty()) + } if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { trace!(target: "sync", "Too many blocks in the queue."); return Either::Left(std::iter::empty()) } let blocks = &mut self.blocks; let attrs = &self.required_block_attributes; + let mut have_requests = false; let iter = self.peers.iter_mut().filter_map(move |(id, peer)| { if !peer.state.is_available() { trace!(target: "sync", "Peer {} is busy", id); @@ -500,13 +508,17 @@ impl ChainSync { } if let Some((range, req)) = peer_block_request(id, peer, blocks, attrs) { peer.state = PeerSyncState::DownloadingNew(range.start); - trace!(target: "sync", "new block request for {}", id); + trace!(target: "sync", "New block request for {}", id); + have_requests = true; Some((id.clone(), req)) } else { - trace!(target: "sync", "no new block request for {}", id); + trace!(target: "sync", "No new block request for {}", id); None } }); + if !have_requests { + self.is_idle = true; + } Either::Right(iter) } @@ -526,6 +538,7 @@ impl ChainSync { trace!(target: "sync", "Reversing incoming block list"); blocks.reverse() } + self.is_idle = false; match &mut peer.state { PeerSyncState::DownloadingNew(start_block) => { self.blocks.clear_peer_download(&who); @@ -641,6 +654,7 @@ impl ChainSync { return Ok(OnBlockJustification::Nothing) }; + self.is_idle = false; if let PeerSyncState::DownloadingJustification(hash) = peer.state { peer.state = PeerSyncState::Available; @@ -679,6 +693,7 @@ impl ChainSync { return Ok(OnBlockFinalityProof::Nothing) }; + self.is_idle = false; if let PeerSyncState::DownloadingFinalityProof(hash) = peer.state { peer.state = PeerSyncState::Available; @@ -792,6 +807,7 @@ impl ChainSync { self.best_importing_number = Zero::zero() } + self.is_idle = false; output.into_iter() } @@ -805,10 +821,12 @@ impl ChainSync { number, ) } + self.is_idle = false; } pub fn on_finality_proof_import(&mut self, req: (B::Hash, NumberFor), res: Result<(B::Hash, NumberFor), ()>) { self.extra_finality_proofs.try_finalize_root(req, res, true); + self.is_idle = false; } /// Notify about finalization of the given block. @@ -863,6 +881,7 @@ impl ChainSync { ); peer.common_number = new_common_number; } + self.is_idle = false; } /// Call when a node announces a new block. @@ -908,6 +927,7 @@ impl ChainSync { } else if known { peer.common_number = number } + self.is_idle = false; // known block case if known || self.is_already_downloading(&hash) { @@ -987,6 +1007,7 @@ impl ChainSync { self.peers.remove(&who); self.extra_justifications.peer_disconnected(&who); self.extra_finality_proofs.peer_disconnected(&who); + self.is_idle = false; } /// Restart the sync process. @@ -1000,6 +1021,7 @@ impl ChainSync { let info = self.client.info(); self.best_queued_hash = info.chain.best_hash; self.best_queued_number = info.chain.best_number; + self.is_idle = false; debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); let old_peers = std::mem::replace(&mut self.peers, HashMap::new()); old_peers.into_iter().filter_map(move |(id, _)| { diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index f28d41019b..8b8c0893d3 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -671,7 +671,7 @@ fn build_network_future< let polling_dur = before_polling.elapsed(); log!( target: "service", - if polling_dur >= Duration::from_millis(50) { Level::Warn } else { Level::Trace }, + if polling_dur >= Duration::from_millis(50) { Level::Debug } else { Level::Trace }, "Polling the network future took {:?}", polling_dur ); -- GitLab From 27cb884a013c09fc785e88bb0424d6b3aea8fcc0 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 8 Aug 2019 09:35:12 +0200 Subject: [PATCH 111/151] Switch offchain workers to new futures (#3285) * Switch offchain workers to new futures * Fix tests --- Cargo.lock | 3 +-- core/offchain/Cargo.toml | 3 +-- core/offchain/src/api.rs | 6 +++--- core/offchain/src/lib.rs | 11 ++++------- core/service/src/components.rs | 6 ++++-- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 93ddce4971..5e763195a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4732,7 +4732,7 @@ name = "substrate-offchain" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4745,7 +4745,6 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index ed201c9316..3ee8e8580d 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../core/client" } -futures = "0.1.25" +futures-preview = "0.3.0-alpha.17" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } @@ -23,7 +23,6 @@ keystore = { package = "substrate-keystore", path = "../keystore" } env_logger = "0.6" client-db = { package = "substrate-client-db", path = "../../core/client/db/", default-features = true } test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } -tokio = "0.1.7" [features] default = [] diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index c13b79131b..468e98a566 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -23,7 +23,7 @@ use std::{ }; use client::backend::OffchainStorage; -use futures::{Stream, Future, sync::mpsc}; +use futures::{StreamExt as _, Future, future, channel::mpsc}; use log::{info, debug, warn, error}; use network::{PeerId, Multiaddr, NetworkStateInfo}; use codec::{Encode, Decode}; @@ -297,14 +297,14 @@ impl AsyncApi { } /// Run a processing task for the API - pub fn process(mut self) -> impl Future { + pub fn process(mut self) -> impl Future { let receiver = self.receiver.take().expect("Take invoked only once."); receiver.for_each(move |msg| { match msg { ExtMessage::SubmitExtrinsic(ext) => self.submit_extrinsic(ext), } - Ok(()) + future::ready(()) }) } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index 5525546f25..075a2bd837 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -98,7 +98,7 @@ impl OffchainWorkers< number: &::Number, pool: &Arc>, network_state: Arc, - ) -> impl Future where + ) -> impl Future where A: ChainApi + 'static, { let runtime = self.client.runtime_api(); @@ -129,9 +129,9 @@ impl OffchainWorkers< log::error!("Error running offchain workers at {:?}: {:?}", at, e); } }); - futures::future::Either::A(runner.process()) + futures::future::Either::Left(runner.process()) } else { - futures::future::Either::B(futures::future::ok(())) + futures::future::Either::Right(futures::future::ready(())) } } } @@ -152,7 +152,6 @@ fn spawn_worker(f: impl FnOnce() -> () + Send + 'static) { #[cfg(test)] mod tests { use super::*; - use futures::Future; use network::{Multiaddr, PeerId}; struct MockNetworkStateInfo(); @@ -171,7 +170,6 @@ mod tests { fn should_call_into_runtime_and_produce_extrinsic() { // given let _ = env_logger::try_init(); - let runtime = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), transaction_pool::ChainApi::new(client.clone()))); let db = client_db::offchain::LocalStorage::new_test(); @@ -179,10 +177,9 @@ mod tests { // when let offchain = OffchainWorkers::new(client, db); - runtime.executor().spawn(offchain.on_block_imported(&0u64, &pool, network_state.clone())); + futures::executor::block_on(offchain.on_block_imported(&0u64, &pool, network_state)); // then - runtime.shutdown_on_idle().wait().unwrap(); assert_eq!(pool.status().ready, 1); assert_eq!(pool.ready().next().unwrap().is_propagateable(), false); } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 47781aa79d..d2b6131ed0 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -36,7 +36,7 @@ use crate::config::Configuration; use primitives::{Blake2Hasher, H256, traits::BareCryptoStorePtr}; use rpc::{self, apis::system::SystemInfo}; use futures::{prelude::*, future::Executor}; -use futures03::channel::mpsc; +use futures03::{FutureExt as _, channel::mpsc, compat::Compat}; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. @@ -279,7 +279,9 @@ impl OffchainWorker for C where pool: &Arc>, network_state: &Arc, ) -> error::Result + Send>> { - Ok(Box::new(offchain.on_block_imported(number, pool, network_state.clone()))) + let future = offchain.on_block_imported(number, pool, network_state.clone()) + .map(|()| Ok(())); + Ok(Box::new(Compat::new(future))) } } -- GitLab From e4a92a91aac36100a750bc5b273bf3097b37a28a Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Thu, 8 Aug 2019 19:56:04 +1200 Subject: [PATCH 112/151] add post_dispatch (#3229) * add post_dispatch * Update traits.rs * Update checked_extrinsic.rs * Update traits.rs * Update traits.rs * fix build issue * update runtime version * fix test build issue --- .../src/generic/checked_extrinsic.rs | 14 ++++--- .../src/generic/unchecked_extrinsic.rs | 2 + core/sr-primitives/src/traits.rs | 37 ++++++++++++++----- node/runtime/src/lib.rs | 4 +- srml/balances/src/lib.rs | 1 + srml/system/src/lib.rs | 6 +++ 6 files changed, 46 insertions(+), 18 deletions(-) diff --git a/core/sr-primitives/src/generic/checked_extrinsic.rs b/core/sr-primitives/src/generic/checked_extrinsic.rs index 44a0758267..08d7b10386 100644 --- a/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -77,14 +77,16 @@ where info: DispatchInfo, len: usize, ) -> Result { - let maybe_who = if let Some((id, extra)) = self.signed { - Extra::pre_dispatch(extra, &id, &self.function, info, len)?; - Some(id) + let (maybe_who, pre) = if let Some((id, extra)) = self.signed { + let pre = Extra::pre_dispatch(extra, &id, &self.function, info, len)?; + (Some(id), pre) } else { - Extra::pre_dispatch_unsigned(&self.function, info, len)?; - None + let pre = Extra::pre_dispatch_unsigned(&self.function, info, len)?; + (None, pre) }; - Ok(self.function.dispatch(Origin::from(maybe_who))) + let res = self.function.dispatch(Origin::from(maybe_who)); + Extra::post_dispatch(pre, info, len); + Ok(res) } } diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index 17157c4a19..cb9330cfaa 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -236,6 +236,8 @@ mod tests { type AccountId = u64; type Call = (); type AdditionalSigned = (); + type Pre = (); + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 442aa9b0ac..7272bd3488 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -808,6 +808,9 @@ pub trait SignedExtension: /// from the transaction using the `additional_signed` function. type AdditionalSigned: Encode; + /// The type that encodes information that can be passed from pre_dispatch to post-dispatch. + type Pre: Default; + /// Construct any additional data that should be in the signed payload of the transaction. Can /// also perform any pre-signature-verification checks and return an error if needed. fn additional_signed(&self) -> Result; @@ -830,8 +833,8 @@ pub trait SignedExtension: call: &Self::Call, info: DispatchInfo, len: usize, - ) -> Result<(), DispatchError> { - self.validate(who, call, info, len).map(|_| ()) + ) -> Result { + self.validate(who, call, info, len).map(|_| Self::Pre::default()) } /// Validate an unsigned transaction for the transaction queue. Normally the default @@ -848,9 +851,16 @@ pub trait SignedExtension: call: &Self::Call, info: DispatchInfo, len: usize, - ) -> Result<(), DispatchError> { - Self::validate_unsigned(call, info, len).map(|_| ()) + ) -> Result { + Self::validate_unsigned(call, info, len).map(|_| Self::Pre::default()) } + + /// Do any post-flight stuff for a transaction. + fn post_dispatch( + _pre: Self::Pre, + _info: DispatchInfo, + _len: usize, + ) { } } macro_rules! tuple_impl_indexed { @@ -866,6 +876,7 @@ macro_rules! tuple_impl_indexed { type AccountId = AccountId; type Call = Call; type AdditionalSigned = ($($direct::AdditionalSigned,)+); + type Pre = ($($direct::Pre,)+); fn additional_signed(&self) -> Result { Ok(( $(self.$index.additional_signed()?,)+ )) } @@ -885,9 +896,8 @@ macro_rules! tuple_impl_indexed { call: &Self::Call, info: DispatchInfo, len: usize, - ) -> Result<(), DispatchError> { - $(self.$index.pre_dispatch(who, call, info, len)?;)+ - Ok(()) + ) -> Result { + Ok(($(self.$index.pre_dispatch(who, call, info, len)?,)+)) } fn validate_unsigned( call: &Self::Call, @@ -901,9 +911,15 @@ macro_rules! tuple_impl_indexed { call: &Self::Call, info: DispatchInfo, len: usize, - ) -> Result<(), DispatchError> { - $($direct::pre_dispatch_unsigned(call, info, len)?;)+ - Ok(()) + ) -> Result { + Ok(($($direct::pre_dispatch_unsigned(call, info, len)?,)+)) + } + fn post_dispatch( + pre: Self::Pre, + info: DispatchInfo, + len: usize, + ) { + $($direct::post_dispatch(pre.$index, info, len);)+ } } @@ -931,6 +947,7 @@ impl SignedExtension for () { type AccountId = u64; type AdditionalSigned = (); type Call = (); + type Pre = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 9f247c6320..05d6845a57 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 134, - impl_version: 134, + spec_version: 135, + impl_version: 135, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 4d0306af28..66d0ee0284 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -1216,6 +1216,7 @@ impl, I: Instance + Clone + Eq> SignedExtension for TakeFees { type AccountId = T::AccountId; type Call = T::Call; type AdditionalSigned = (); + type Pre = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } fn validate( diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index f41a566724..571ec6ad6c 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -881,6 +881,7 @@ impl SignedExtension for CheckWeight { type AccountId = T::AccountId; type Call = T::Call; type AdditionalSigned = (); + type Pre = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } @@ -944,6 +945,7 @@ impl SignedExtension for CheckNonce { type AccountId = T::AccountId; type Call = T::Call; type AdditionalSigned = (); + type Pre = (); fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } @@ -1017,6 +1019,8 @@ impl SignedExtension for CheckEra { type AccountId = T::AccountId; type Call = T::Call; type AdditionalSigned = T::Hash; + type Pre = (); + fn additional_signed(&self) -> Result { let current_u64 = >::block_number().saturated_into::(); let n = (self.0).0.birth(current_u64).saturated_into::(); @@ -1047,6 +1051,8 @@ impl SignedExtension for CheckGenesis { type AccountId = T::AccountId; type Call = ::Call; type AdditionalSigned = T::Hash; + type Pre = (); + fn additional_signed(&self) -> Result { Ok(>::block_hash(T::BlockNumber::zero())) } -- GitLab From ab490568dc0b42786b2e61a6c1f6633d7ad41ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 8 Aug 2019 09:56:49 +0200 Subject: [PATCH 113/151] grandpa: track multiple live rounds in voter set state (#3298) * grandpa: track multiple live rounds in voter set state * grandpa: don't assume rounds are completed in-order * grandpa: fix tests * grandpa: don't assume round is being tracked on Environment::completed * grandpa: fix missing import in test --- core/finality-grandpa/src/aux_schema.rs | 92 +++---- .../src/communication/gossip.rs | 33 +-- .../src/communication/tests.rs | 20 +- core/finality-grandpa/src/environment.rs | 253 ++++++++++++------ core/finality-grandpa/src/lib.rs | 27 +- core/finality-grandpa/src/observer.rs | 24 +- core/finality-grandpa/src/tests.rs | 1 + 7 files changed, 246 insertions(+), 204 deletions(-) diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 5f430b17fe..78c1741d51 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -30,7 +30,9 @@ use fg_primitives::AuthorityId; use crate::authorities::{AuthoritySet, SharedAuthoritySet, PendingChange, DelayKind}; use crate::consensus_changes::{SharedConsensusChanges, ConsensusChanges}; -use crate::environment::{CompletedRound, CompletedRounds, HasVoted, SharedVoterSetState, VoterSetState}; +use crate::environment::{ + CompletedRound, CompletedRounds, CurrentRounds, HasVoted, SharedVoterSetState, VoterSetState, +}; use crate::NewAuthoritySet; const VERSION_KEY: &[u8] = b"grandpa_schema_version"; @@ -155,6 +157,9 @@ fn migrate_from_version0( let base = last_round_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(last_round_number + 1, HasVoted::No); + let set_state = VoterSetState::Live { completed_rounds: CompletedRounds::new( CompletedRound { @@ -166,7 +171,7 @@ fn migrate_from_version0( set_id, &new_set, ), - current_round: HasVoted::No, + current_rounds, }; backend.insert_aux(&[(SET_STATE_KEY, set_state.encode().as_slice())], &[])?; @@ -223,9 +228,12 @@ fn migrate_from_version1( let base = set_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(last_round_number + 1, HasVoted::No); + VoterSetState::Live { completed_rounds: completed_rounds(last_round_number, set_state, base), - current_round: HasVoted::No, + current_rounds, } }, None => { @@ -233,10 +241,11 @@ fn migrate_from_version1( let base = set_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - VoterSetState::Live { - completed_rounds: completed_rounds(0, set_state, base), - current_round: HasVoted::No, - } + VoterSetState::live( + set_id, + &set, + base, + ) }, }; @@ -300,19 +309,11 @@ pub(crate) fn load_persistent( let base = state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - votes: Vec::new(), - base, - state, - }, - set.current().0, - &set, - ), - current_round: HasVoted::No, - } + VoterSetState::live( + set.current().0, + &set, + base, + ) } }; @@ -338,19 +339,12 @@ pub(crate) fn load_persistent( let base = state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - let genesis_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - votes: Vec::new(), - state, - base, - }, - 0, - &genesis_set, - ), - current_round: HasVoted::No, - }; + let genesis_state = VoterSetState::live( + 0, + &genesis_set, + base, + ); + backend.insert_aux( &[ (AUTHORITY_SET_KEY, genesis_set.encode().as_slice()), @@ -396,23 +390,11 @@ pub(crate) fn update_authority_set( // we also overwrite the "last completed round" entry with a blank slate // because from the perspective of the finality gadget, the chain has // reset. - let round_state = RoundState::genesis(( - new_set.canon_hash.clone(), - new_set.canon_number.clone(), - )); - let set_state = VoterSetState::::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - state: round_state, - votes: Vec::new(), - base: (new_set.canon_hash, new_set.canon_number), - }, - new_set.set_id, - &set, - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::::live( + new_set.set_id, + &set, + (new_set.canon_hash, new_set.canon_number), + ); let encoded = set_state.encode(); write_aux(&[ @@ -527,6 +509,9 @@ mod test { }, ); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(round_number + 1, HasVoted::No); + assert_eq!( &*set_state.read(), &VoterSetState::Live { @@ -540,7 +525,7 @@ mod test { set_id, &*authority_set.inner().read(), ), - current_round: HasVoted::No, + current_rounds, }, ); } @@ -614,6 +599,9 @@ mod test { }, ); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(round_number + 1, HasVoted::No); + assert_eq!( &*set_state.read(), &VoterSetState::Live { @@ -627,7 +615,7 @@ mod test { set_id, &*authority_set.inner().read(), ), - current_round: HasVoted::No, + current_rounds, }, ); } diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index 5eb912c957..20a629b6ae 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -1248,26 +1248,16 @@ mod tests { // dummy voter set state fn voter_set_state() -> SharedVoterSetState { use crate::authorities::AuthoritySet; - use crate::environment::{CompletedRound, CompletedRounds, HasVoted, VoterSetState}; - use grandpa::round::State as RoundState; + use crate::environment::VoterSetState; use primitives::H256; - let state = RoundState::genesis((H256::zero(), 0)); - let base = state.prevote_ghost.unwrap(); + let base = (H256::zero(), 0); let voters = AuthoritySet::genesis(Vec::new()); - let set_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - state, - number: 0, - votes: Vec::new(), - base, - }, - 0, - &voters, - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + 0, + &voters, + base, + ); set_state.into() } @@ -1542,16 +1532,19 @@ mod tests { let set_state: SharedVoterSetState = { let mut completed_rounds = voter_set_state().read().completed_rounds(); - assert!(completed_rounds.push(environment::CompletedRound { + completed_rounds.push(environment::CompletedRound { number: 1, state: grandpa::round::State::genesis(Default::default()), base: Default::default(), votes: Default::default(), - })); + }); + + let mut current_rounds = environment::CurrentRounds::new(); + current_rounds.insert(2, environment::HasVoted::No); let set_state = environment::VoterSetState::::Live { completed_rounds, - current_round: environment::HasVoted::No, + current_rounds, }; set_state.into() diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 70e9413cd9..de5a084039 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -141,26 +141,18 @@ fn config() -> crate::Config { // dummy voter set state fn voter_set_state() -> SharedVoterSetState { use crate::authorities::AuthoritySet; - use crate::environment::{CompletedRound, CompletedRounds, HasVoted, VoterSetState}; + use crate::environment::VoterSetState; use grandpa::round::State as RoundState; use primitives::H256; let state = RoundState::genesis((H256::zero(), 0)); let base = state.prevote_ghost.unwrap(); let voters = AuthoritySet::genesis(Vec::new()); - let set_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - state, - number: 0, - votes: Vec::new(), - base, - }, - 0, - &voters, - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + 0, + &voters, + base, + ); set_state.into() } diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 93b176a430..5761093c5e 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::collections::VecDeque; +use std::collections::BTreeMap; use std::iter::FromIterator; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -74,11 +74,12 @@ pub struct CompletedRound { pub votes: Vec>, } -// Data about last completed rounds within a single voter set. Stores NUM_LAST_COMPLETED_ROUNDS and always -// contains data about at least one round (genesis). +// Data about last completed rounds within a single voter set. Stores +// NUM_LAST_COMPLETED_ROUNDS and always contains data about at least one round +// (genesis). #[derive(Debug, Clone, PartialEq)] pub struct CompletedRounds { - rounds: VecDeque>, + rounds: Vec>, set_id: u64, voters: Vec, } @@ -117,8 +118,8 @@ impl CompletedRounds { ) -> CompletedRounds { - let mut rounds = VecDeque::with_capacity(NUM_LAST_COMPLETED_ROUNDS); - rounds.push_back(genesis); + let mut rounds = Vec::with_capacity(NUM_LAST_COMPLETED_ROUNDS); + rounds.push(genesis); let voters = voters.current().1.iter().map(|(a, _)| a.clone()).collect(); CompletedRounds { rounds, set_id, voters } @@ -131,32 +132,38 @@ impl CompletedRounds { /// Iterate over all completed rounds. pub fn iter(&self) -> impl Iterator> { - self.rounds.iter() + self.rounds.iter().rev() } /// Returns the last (latest) completed round. pub fn last(&self) -> &CompletedRound { - self.rounds.back() + self.rounds.first() .expect("inner is never empty; always contains at least genesis; qed") } - /// Push a new completed round, returns false if the given round is older - /// than the last completed round. - pub fn push(&mut self, completed_round: CompletedRound) -> bool { - if self.last().number >= completed_round.number { - return false; - } + /// Push a new completed round, oldest round is evicted if number of rounds + /// is higher than `NUM_LAST_COMPLETED_ROUNDS`. + pub fn push(&mut self, completed_round: CompletedRound) { + use std::cmp::Reverse; + + match self.rounds.binary_search_by_key( + &Reverse(completed_round.number), + |completed_round| Reverse(completed_round.number), + ) { + Ok(idx) => self.rounds[idx] = completed_round, + Err(idx) => self.rounds.insert(idx, completed_round), + }; - if self.rounds.len() == NUM_LAST_COMPLETED_ROUNDS { - self.rounds.pop_front(); + if self.rounds.len() > NUM_LAST_COMPLETED_ROUNDS { + self.rounds.pop(); } - - self.rounds.push_back(completed_round); - - true } } +/// A map with voter status information for currently live rounds, +/// which votes have we cast and what are they. +pub type CurrentRounds = BTreeMap>; + /// The state of the current voter set, whether it is currently active or not /// and information related to the previously completed rounds. Current round /// voting status is used when restarting the voter, i.e. it will re-use the @@ -168,8 +175,8 @@ pub enum VoterSetState { Live { /// The previously completed rounds. completed_rounds: CompletedRounds, - /// Vote status for the current round. - current_round: HasVoted, + /// Voter status for the currently live rounds. + current_rounds: CurrentRounds, }, /// The voter is paused, i.e. not casting or importing any votes. Paused { @@ -179,6 +186,35 @@ pub enum VoterSetState { } impl VoterSetState { + /// Create a new live VoterSetState with round 0 as a completed round using + /// the given genesis state and the given authorities. Round 1 is added as a + /// current round (with state `HasVoted::No`). + pub(crate) fn live( + set_id: u64, + authority_set: &AuthoritySet>, + genesis_state: (Block::Hash, NumberFor), + ) -> VoterSetState { + let state = RoundState::genesis((genesis_state.0, genesis_state.1)); + let completed_rounds = CompletedRounds::new( + CompletedRound { + number: 0, + state, + base: (genesis_state.0, genesis_state.1), + votes: Vec::new(), + }, + set_id, + authority_set, + ); + + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(1, HasVoted::No); + + VoterSetState::Live { + completed_rounds, + current_rounds, + } + } + /// Returns the last completed rounds. pub(crate) fn completed_rounds(&self) -> CompletedRounds { match self { @@ -198,10 +234,28 @@ impl VoterSetState { completed_rounds.last().clone(), } } + + /// Returns the voter set state validating that it includes the given round + /// in current rounds and that the voter isn't paused. + pub fn with_current_round(&self, round: u64) + -> Result<(&CompletedRounds, &CurrentRounds), Error> + { + if let VoterSetState::Live { completed_rounds, current_rounds } = self { + if current_rounds.contains_key(&round) { + return Ok((completed_rounds, current_rounds)); + } else { + let msg = "Voter acting on a live round we are not tracking."; + return Err(Error::Safety(msg.to_string())); + } + } else { + let msg = "Voter acting while in paused state."; + return Err(Error::Safety(msg.to_string())); + } + } } /// Whether we've voted already during a prior run of the program. -#[derive(Debug, Decode, Encode, PartialEq)] +#[derive(Clone, Debug, Decode, Encode, PartialEq)] pub enum HasVoted { /// Has not voted already in this round. No, @@ -290,10 +344,16 @@ impl SharedVoterSetState { } /// Return vote status information for the current round. - pub(crate) fn has_voted(&self) -> HasVoted { + pub(crate) fn has_voted(&self, round: u64) -> HasVoted { match &*self.inner.read() { - VoterSetState::Live { current_round: HasVoted::Yes(id, vote), .. } => - HasVoted::Yes(id.clone(), vote.clone()), + VoterSetState::Live { current_rounds, .. } => { + current_rounds.get(&round).and_then(|has_voted| match has_voted { + HasVoted::Yes(id, vote) => + Some(HasVoted::Yes(id.clone(), vote.clone())), + _ => None, + }) + .unwrap_or(HasVoted::No) + }, _ => HasVoted::No, } } @@ -502,7 +562,7 @@ where let local_key = crate::is_voter(&self.voters, &self.config.keystore); - let has_voted = match self.voter_set_state.has_voted() { + let has_voted = match self.voter_set_state.has_voted(round) { HasVoted::Yes(id, vote) => { if local_key.as_ref().map(|k| k.public() == id).unwrap_or(false) { HasVoted::Yes(id, vote) @@ -541,7 +601,7 @@ where } } - fn proposed(&self, _round: u64, propose: PrimaryPropose) -> Result<(), Self::Error> { + fn proposed(&self, round: u64, propose: PrimaryPropose) -> Result<(), Self::Error> { let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { @@ -550,23 +610,26 @@ where }; self.update_voter_set_state(|voter_set_state| { - let completed_rounds = match voter_set_state { - VoterSetState::Live { completed_rounds, current_round: HasVoted::No } => completed_rounds, - VoterSetState::Live { current_round, .. } if !current_round.can_propose() => { - // we've already proposed in this round (in a previous run), - // ignore the given vote and don't update the voter set - // state - return Ok(None); - }, - _ => { - let msg = "Voter proposing after prevote/precommit or while paused."; - return Err(Error::Safety(msg.to_string())); - }, - }; + let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; + let current_round = current_rounds.get(&round) + .expect("checked in with_current_round that key exists; qed."); + + if !current_round.can_propose() { + // we've already proposed in this round (in a previous run), + // ignore the given vote and don't update the voter set + // state + return Ok(None); + } + + let mut current_rounds = current_rounds.clone(); + let current_round = current_rounds.get_mut(&round) + .expect("checked previously that key exists; qed."); + + *current_round = HasVoted::Yes(local_id, Vote::Propose(propose)); let set_state = VoterSetState::::Live { completed_rounds: completed_rounds.clone(), - current_round: HasVoted::Yes(local_id, Vote::Propose(propose)), + current_rounds, }; #[allow(deprecated)] @@ -578,7 +641,7 @@ where Ok(()) } - fn prevoted(&self, _round: u64, prevote: Prevote) -> Result<(), Self::Error> { + fn prevoted(&self, round: u64, prevote: Prevote) -> Result<(), Self::Error> { let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { @@ -587,26 +650,28 @@ where }; self.update_voter_set_state(|voter_set_state| { - let (completed_rounds, propose) = match voter_set_state { - VoterSetState::Live { completed_rounds, current_round: HasVoted::No } => - (completed_rounds, None), - VoterSetState::Live { completed_rounds, current_round: HasVoted::Yes(_, Vote::Propose(propose)) } => - (completed_rounds, Some(propose)), - VoterSetState::Live { current_round, .. } if !current_round.can_prevote() => { - // we've already prevoted in this round (in a previous run), - // ignore the given vote and don't update the voter set - // state - return Ok(None); - }, - _ => { - let msg = "Voter prevoting after precommit or while paused."; - return Err(Error::Safety(msg.to_string())); - }, - }; + let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; + let current_round = current_rounds.get(&round) + .expect("checked in with_current_round that key exists; qed."); + + if !current_round.can_prevote() { + // we've already prevoted in this round (in a previous run), + // ignore the given vote and don't update the voter set + // state + return Ok(None); + } + + let propose = current_round.propose(); + + let mut current_rounds = current_rounds.clone(); + let current_round = current_rounds.get_mut(&round) + .expect("checked previously that key exists; qed."); + + *current_round = HasVoted::Yes(local_id, Vote::Prevote(propose.cloned(), prevote)); let set_state = VoterSetState::::Live { completed_rounds: completed_rounds.clone(), - current_round: HasVoted::Yes(local_id, Vote::Prevote(propose.cloned(), prevote)), + current_rounds, }; #[allow(deprecated)] @@ -618,7 +683,7 @@ where Ok(()) } - fn precommitted(&self, _round: u64, precommit: Precommit) -> Result<(), Self::Error> { + fn precommitted(&self, round: u64, precommit: Precommit) -> Result<(), Self::Error> { let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { @@ -627,24 +692,38 @@ where }; self.update_voter_set_state(|voter_set_state| { - let (completed_rounds, propose, prevote) = match voter_set_state { - VoterSetState::Live { completed_rounds, current_round: HasVoted::Yes(_, Vote::Prevote(propose, prevote)) } => - (completed_rounds, propose, prevote), - VoterSetState::Live { current_round, .. } if !current_round.can_precommit() => { - // we've already precommitted in this round (in a previous run), - // ignore the given vote and don't update the voter set - // state - return Ok(None); - }, + let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; + let current_round = current_rounds.get(&round) + .expect("checked in with_current_round that key exists; qed."); + + if !current_round.can_precommit() { + // we've already precommitted in this round (in a previous run), + // ignore the given vote and don't update the voter set + // state + return Ok(None); + } + + let propose = current_round.propose(); + let prevote = match current_round { + HasVoted::Yes(_, Vote::Prevote(_, prevote)) => prevote, _ => { - let msg = "Voter precommitting while paused."; + let msg = "Voter precommitting before prevoting."; return Err(Error::Safety(msg.to_string())); - } + }, }; + let mut current_rounds = current_rounds.clone(); + let current_round = current_rounds.get_mut(&round) + .expect("checked previously that key exists; qed."); + + *current_round = HasVoted::Yes( + local_id, + Vote::Precommit(propose.cloned(), prevote.clone(), precommit), + ); + let set_state = VoterSetState::::Live { completed_rounds: completed_rounds.clone(), - current_round: HasVoted::Yes(local_id, Vote::Precommit(propose.clone(), prevote.clone(), precommit)), + current_rounds, }; #[allow(deprecated)] @@ -673,25 +752,37 @@ where ); self.update_voter_set_state(|voter_set_state| { - let mut completed_rounds = voter_set_state.completed_rounds(); + // NOTE: we don't use `with_current_round` here, it is possible that + // we are not currently tracking this round if it is a round we + // caught up to. + let (completed_rounds, current_rounds) = + if let VoterSetState::Live { completed_rounds, current_rounds } = voter_set_state { + (completed_rounds, current_rounds) + } else { + let msg = "Voter acting while in paused state."; + return Err(Error::Safety(msg.to_string())); + }; + + let mut completed_rounds = completed_rounds.clone(); // TODO: Future integration will store the prevote and precommit index. See #2611. let votes = historical_votes.seen().clone(); - // NOTE: the Environment assumes that rounds are *always* completed in-order. - if !completed_rounds.push(CompletedRound { + completed_rounds.push(CompletedRound { number: round, state: state.clone(), base, votes, - }) { - let msg = "Voter completed round that is older than the last completed round."; - return Err(Error::Safety(msg.to_string())); - }; + }); + + // remove the round from live rounds and start tracking the next round + let mut current_rounds = current_rounds.clone(); + current_rounds.remove(&round); + current_rounds.insert(round + 1, HasVoted::No); let set_state = VoterSetState::::Live { completed_rounds, - current_round: HasVoted::No, + current_rounds, }; #[allow(deprecated)] diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index a0df661f0c..474d0ae24b 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -75,7 +75,7 @@ use serde_json; use srml_finality_tracker; use grandpa::Error as GrandpaError; -use grandpa::{voter, round::State as RoundState, BlockNumberOps, voter_set::VoterSet}; +use grandpa::{voter, BlockNumberOps, voter_set::VoterSet}; use std::fmt; use std::sync::Arc; @@ -103,7 +103,7 @@ pub use light_import::light_block_import; pub use observer::run_grandpa_observer; use aux_schema::PersistentData; -use environment::{CompletedRound, CompletedRounds, Environment, HasVoted, SharedVoterSetState, VoterSetState}; +use environment::{Environment, SharedVoterSetState, VoterSetState}; use import::GrandpaBlockImport; use until_imported::UntilGlobalMessageBlocksImported; use communication::NetworkBridge; @@ -635,22 +635,11 @@ pub fn run_grandpa_voter, N, RA, SC, X>( // start the new authority set using the block where the // set changed (not where the signal happened!) as the base. - let genesis_state = RoundState::genesis((new.canon_hash, new.canon_number)); - - let set_state = VoterSetState::Live { - // always start at round 0 when changing sets. - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - state: genesis_state, - base: (new.canon_hash, new.canon_number), - votes: Vec::new(), - }, - new.set_id, - &*authority_set.inner().read(), - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + new.set_id, + &*authority_set.inner().read(), + (new.canon_hash, new.canon_number), + ); #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; @@ -763,4 +752,4 @@ fn is_voter( .find_map(|(p, _)| keystore.read().key_pair::(&p).ok()), None => None, } -} \ No newline at end of file +} diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index f347b678b6..2532ee8098 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -20,7 +20,7 @@ use futures::prelude::*; use futures::future::{self, Loop as FutureLoop}; use grandpa::{ - BlockNumberOps, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet + BlockNumberOps, Error as GrandpaError, voter, voter_set::VoterSet }; use log::{debug, info, warn}; @@ -36,7 +36,6 @@ use crate::{ use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; use crate::consensus_changes::SharedConsensusChanges; -use crate::environment::{CompletedRound, CompletedRounds, HasVoted}; use fg_primitives::AuthorityId; struct ObserverChain<'a, Block: BlockT, B, E, RA>(&'a Client); @@ -238,22 +237,11 @@ pub fn run_grandpa_observer, N, RA, SC>( VoterCommand::ChangeAuthorities(new) => { // start the new authority set using the block where the // set changed (not where the signal happened!) as the base. - let genesis_state = RoundState::genesis((new.canon_hash, new.canon_number)); - - let set_state = VoterSetState::Live:: { - // always start at round 0 when changing sets. - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - state: genesis_state, - base: (new.canon_hash, new.canon_number), - votes: Vec::new(), - }, - new.set_id, - &*authority_set.inner().read(), - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + new.set_id, + &*authority_set.inner().read(), + (new.canon_hash, new.canon_number), + ); #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 45a91b336a..7c2b024f5c 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -17,6 +17,7 @@ //! Tests and test helpers for GRANDPA. use super::*; +use environment::HasVoted; use network::test::{Block, DummySpecialization, Hash, TestNetFactory, Peer, PeersClient}; use network::test::{PassThroughVerifier}; use network::config::{ProtocolConfig, Roles, BoxFinalityProofRequestBuilder}; -- GitLab From 8155ea356080a5539569ffd44805117231fc8a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 8 Aug 2019 11:00:04 +0200 Subject: [PATCH 114/151] Adds `author_rotateKeys` RPC (#3337) * Adds `author_rotateKeys` RPC `author_rotateKeys` will rotate all session keys, store them into the keystore and returns their encoded public keys as result. These encoded public keys can be used directly to send the transaction to the chain. * Review comments --- Cargo.lock | 14 +++---------- core/primitives/src/crypto.rs | 4 +++- core/rpc/Cargo.toml | 3 ++- core/rpc/src/author/mod.rs | 19 ++++++++++++++++-- core/rpc/src/author/tests.rs | 36 +++++++++++++++++++++++++++++++++- core/rpc/src/state/tests.rs | 3 ++- core/service/Cargo.toml | 2 +- core/service/src/components.rs | 14 +++++++++---- core/test-runtime/Cargo.toml | 2 ++ core/test-runtime/src/lib.rs | 27 ++++++++++++++++++++++--- node/primitives/Cargo.toml | 2 +- 11 files changed, 100 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e763195a4..bcadbe2e74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2339,7 +2339,7 @@ name = "node-primitives" version = "2.0.0" dependencies = [ "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2858,15 +2858,6 @@ name = "ppv-lite86" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pretty_assertions" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "pretty_assertions" version = "0.6.1" @@ -4837,6 +4828,7 @@ dependencies = [ "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", @@ -5040,6 +5032,7 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", @@ -6364,7 +6357,6 @@ dependencies = [ "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" "checksum pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c1d2cfa5a714db3b5f24f0915e74fcdf91d09d496ba61329705dda7774d2af" "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" -"checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" "checksum primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e44400d651ca5276415dc8e00541c5c9d03844f1f0a87ad28f0a8fadcb2300bc" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 56a8528369..0adf50e160 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -18,7 +18,9 @@ //! Cryptographic utilities. // end::description[] -use rstd::convert::{TryFrom, TryInto}; +#[cfg(feature = "std")] +use rstd::convert::TryInto; +use rstd::convert::TryFrom; #[cfg(feature = "std")] use parking_lot::Mutex; #[cfg(feature = "std")] diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index 3072ba4783..ab05eb4e24 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -21,6 +21,7 @@ client = { package = "substrate-client", path = "../client" } substrate-executor = { path = "../executor" } network = { package = "substrate-network", path = "../network" } primitives = { package = "substrate-primitives", path = "../primitives" } +session = { package = "substrate-session", path = "../session" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } transaction_pool = { package = "substrate-transaction-pool", path = "../transaction-pool" } sr-primitives = { path = "../sr-primitives" } @@ -33,4 +34,4 @@ futures = "0.1.17" sr-io = { path = "../sr-io" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } rustc-hex = "2.0" -tokio = "0.1.17" +tokio = "0.1.17" \ No newline at end of file diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 47f481f00f..d797e87da5 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -33,9 +33,9 @@ use log::warn; use codec::{Encode, Decode}; use primitives::{ Bytes, Blake2Hasher, H256, ed25519, sr25519, crypto::{Pair, Public, key_types}, - traits::BareCryptoStorePtr + traits::BareCryptoStorePtr, }; -use sr_primitives::{generic, traits}; +use sr_primitives::{generic, traits::{self, ProvideRuntimeApi}}; use self::error::{Error, Result}; use transaction_pool::{ txpool::{ @@ -47,6 +47,7 @@ use transaction_pool::{ watcher::Status, }, }; +use session::SessionKeys; pub use self::gen_client::Client as AuthorClient; @@ -68,6 +69,10 @@ pub trait AuthorApi { maybe_public: Option ) -> Result; + /// Generate new session keys and returns the corresponding public keys. + #[rpc(name = "author_rotateKeys")] + fn rotate_keys(&self) -> Result; + /// Returns all pending extrinsics, potentially grouped by sender. #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; @@ -138,6 +143,8 @@ impl AuthorApi, BlockHash

> for Author whe P::Block: traits::Block, P::Error: 'static, RA: Send + Sync + 'static, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: SessionKeys, { type Metadata = crate::metadata::Metadata; @@ -170,6 +177,14 @@ impl AuthorApi, BlockHash

> for Author whe Ok(public.into()) } + fn rotate_keys(&self) -> Result { + let best_block_hash = self.client.info().chain.best_hash; + self.client.runtime_api().generate_session_keys( + &generic::BlockId::Hash(best_block_hash), + None, + ).map(Into::into).map_err(Into::into) + } + fn submit_extrinsic(&self, ext: Bytes) -> Result> { let xt = Decode::decode(&mut &ext[..])?; let best_block_hash = self.client.info().chain.best_hash; diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 18a2e41739..0fdff9989b 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -27,7 +27,10 @@ use primitives::{ H256, blake2_256, hexdisplay::HexDisplay, traits::BareCryptoStore, testing::KeyStore, ed25519, crypto::key_types, }; -use test_client::{self, AccountKeyring, runtime::{Extrinsic, Transfer}}; +use test_client::{ + self, AccountKeyring, runtime::{Extrinsic, Transfer, SessionKeys}, DefaultTestClientBuilderExt, + TestClientBuilderExt, +}; use tokio::runtime; fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { @@ -203,4 +206,35 @@ fn should_insert_key() { .ed25519_key_pair(key_types::ED25519, &key_pair.public()).expect("Key exists in store"); assert_eq!(key_pair.public(), store_key_pair.public()); +} + +#[test] +fn should_rotate_keys() { + let runtime = runtime::Runtime::new().unwrap(); + let keystore = KeyStore::new(); + let client = Arc::new(test_client::TestClientBuilder::new().set_keystore(keystore.clone()).build()); + let p = Author { + client: client.clone(), + pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), + subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), + }; + + let new_public_keys = p.rotate_keys().expect("Rotates the keys"); + + let session_keys = SessionKeys::decode(&mut &new_public_keys[..]) + .expect("SessionKeys decode successfully"); + + let ed25519_key_pair = keystore.read().ed25519_key_pair( + key_types::ED25519, + &session_keys.ed25519.clone().into(), + ).expect("ed25519 key exists in store"); + + let sr25519_key_pair = keystore.read().sr25519_key_pair( + key_types::SR25519, + &session_keys.sr25519.clone().into(), + ).expect("sr25519 key exists in store"); + + assert_eq!(session_keys.ed25519, ed25519_key_pair.public().into()); + assert_eq!(session_keys.sr25519, sr25519_key_pair.public().into()); } \ No newline at end of file diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 6a8eefa10b..6b4ddc9b92 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -260,7 +260,8 @@ fn should_return_runtime_version() { \"specVersion\":1,\"implVersion\":1,\"apis\":[[\"0xdf6acb689907609b\",2],\ [\"0x37e397fc7c91f5e4\",1],[\"0xd2bc9897eed08f15\",1],[\"0x40fe3ad401f8959a\",3],\ [\"0xc6e9a76309f39b09\",1],[\"0xdd718d5cc53262d4\",1],[\"0xcbca25e39f142387\",1],\ - [\"0xf78b278be53f454c\",1]]}"; + [\"0xf78b278be53f454c\",1],[\"0xab3c0572291feb8b\",1]]}"; + assert_eq!( serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), result, diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 2bcb180570..c2a17371da 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -23,8 +23,8 @@ keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../primitives" } +session = { package = "substrate-session", path = "../session" } app-crypto = { package = "substrate-application-crypto", path = "../application-crypto" } -substrate-session = { path = "../session" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index d2b6131ed0..2ca99e0b31 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -156,13 +156,13 @@ pub trait InitialSessionKeys { impl InitialSessionKeys for C where ComponentClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: substrate_session::SessionKeys>, + as ProvideRuntimeApi>::Api: session::SessionKeys>, { fn generate_intial_session_keys( client: Arc>, seeds: Vec, ) -> error::Result<()> { - substrate_session::generate_initial_session_keys(client, seeds).map_err(Into::into) + session::generate_initial_session_keys(client, seeds).map_err(Into::into) } } @@ -180,7 +180,8 @@ pub trait StartRPC { impl StartRPC for C where ComponentClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: runtime_api::Metadata>, + as ProvideRuntimeApi>::Api: + runtime_api::Metadata> + session::SessionKeys>, { fn start_rpc( client: Arc>, @@ -193,7 +194,12 @@ impl StartRPC for C where let subscriptions = rpc::apis::Subscriptions::new(task_executor.clone()); let chain = rpc::apis::chain::Chain::new(client.clone(), subscriptions.clone()); let state = rpc::apis::state::State::new(client.clone(), subscriptions.clone()); - let author = rpc::apis::author::Author::new(client, transaction_pool, subscriptions, keystore); + let author = rpc::apis::author::Author::new( + client, + transaction_pool, + subscriptions, + keystore, + ); let system = rpc::apis::system::System::new(rpc_system_info, system_send_back); rpc::rpc_handler::, ComponentExHash, _, _, _, _>( state, diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 98d110a574..13186056ce 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -19,6 +19,7 @@ babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../ rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } sr-primitives = { path = "../sr-primitives", default-features = false } +session = { package = "substrate-session", path = "../session", default-features = false } runtime_version = { package = "sr-version", path = "../sr-version", default-features = false } runtime_support = { package = "srml-support", path = "../../srml/support", default-features = false } substrate-trie = { path = "../trie", default-features = false } @@ -69,4 +70,5 @@ std = [ "srml-timestamp/std", "srml-system/std", "app-crypto/std", + "session/std", ] diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index e2c7c27876..54c922c216 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -37,15 +37,15 @@ use substrate_client::{ impl_runtime_apis, }; use sr_primitives::{ - ApplyResult, create_runtime_str, Perbill, + ApplyResult, create_runtime_str, Perbill, impl_opaque_keys, transaction_validity::{TransactionValidity, ValidTransaction}, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, - GetNodeBlockType, GetRuntimeBlockType, Verify, IdentityLookup + GetNodeBlockType, GetRuntimeBlockType, Verify, IdentityLookup, }, }; use runtime_version::RuntimeVersion; -pub use primitives::hash::H256; +pub use primitives::{hash::H256, crypto::key_types}; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; use runtime_support::{impl_outer_origin, parameter_types}; @@ -434,6 +434,15 @@ fn code_using_trie() -> u64 { } else { 103 } } +impl_opaque_keys! { + pub struct SessionKeys { + #[id(key_types::ED25519)] + pub ed25519: ed25519::AppPublic, + #[id(key_types::SR25519)] + pub sr25519: sr25519::AppPublic, + } +} + #[cfg(not(feature = "std"))] /// Mutable static variables should be always observed to have /// the initialized value at the start of a runtime call. @@ -612,6 +621,12 @@ cfg_if! { runtime_io::submit_transaction(&ex).unwrap(); } } + + impl session::SessionKeys for Runtime { + fn generate_session_keys(_: Option>) -> Vec { + SessionKeys::generate(None) + } + } } } else { impl_runtime_apis! { @@ -816,6 +831,12 @@ cfg_if! { runtime_io::submit_transaction(&ex).unwrap() } } + + impl session::SessionKeys for Runtime { + fn generate_session_keys(_: Option>) -> Vec { + SessionKeys::generate(None) + } + } } } } diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index 05fb231205..654347273f 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -13,7 +13,7 @@ sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] substrate-serializer = { path = "../../core/serializer" } -pretty_assertions = "0.5" +pretty_assertions = "0.6.1" [features] default = ["std"] -- GitLab From c0f977cc34da5521a5336e0ad173ce19343883c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 8 Aug 2019 13:11:46 +0200 Subject: [PATCH 115/151] Make `--dev` to `--alice` again (#3338) --- core/cli/src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 6c2a36121e..564065e0a6 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -473,7 +473,14 @@ where fill_transaction_pool_configuration::(&mut config, cli.pool_config)?; - config.dev_key_seed = cli.keyring.account.map(|a| format!("//{}", a)); + config.dev_key_seed = cli.keyring.account + .map(|a| format!("//{}", a)).or_else(|| { + if is_dev { + Some("//Alice".into()) + } else { + None + } + }); let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; let ws_interface: &str = if cli.ws_external { "0.0.0.0" } else { "127.0.0.1" }; -- GitLab From 225c1b529ad9e211ff32596b862f3f682810bd15 Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Thu, 8 Aug 2019 15:02:04 +0200 Subject: [PATCH 116/151] srml-contracts: Refactor away some duplication in runtime functions. (#3257) * srml-contracts: Storage access micro-optimization. * srml-contracts: Refactor runtime functions to reduce duplication. * Bump node runtime impl version. --- node/runtime/src/lib.rs | 2 +- srml/contracts/src/lib.rs | 5 +- srml/contracts/src/wasm/runtime.rs | 92 ++++++++++++------------------ 3 files changed, 41 insertions(+), 58 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 05d6845a57..dafd69b3d3 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 135, - impl_version: 135, + impl_version: 136, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index ccb6709384..15e6d9bc67 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -528,10 +528,10 @@ decl_module! { code: Vec ) -> Result { let origin = ensure_signed(origin)?; - let schedule = >::current_schedule(); let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; + let schedule = >::current_schedule(); let result = wasm::save_code::(code, &mut gas_meter, &schedule); if let Ok(code_hash) = result { Self::deposit_event(RawEvent::CodeStored(code_hash)); @@ -812,10 +812,9 @@ decl_storage! { impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::AccountId) { - if let Some(ContractInfo::Alive(info)) = >::get(who) { + if let Some(ContractInfo::Alive(info)) = >::take(who) { child::kill_storage(&info.trie_id); } - >::remove(who); } } diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index 2c631d71d5..1fdc1a2c1a 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -212,6 +212,24 @@ fn read_sandbox_memory_into_buf( ctx.memory().get(ptr, buf).map_err(Into::into) } +/// Read designated chunk from the sandbox memory, consuming an appropriate amount of +/// gas, and attempt to decode into the specified type. +/// +/// Returns `Err` if one of the following conditions occurs: +/// +/// - calculating the gas cost resulted in overflow. +/// - out of gas +/// - requested buffer is not within the bounds of the sandbox memory. +/// - the buffer contents cannot be decoded as the required type. +fn read_sandbox_memory_as( + ctx: &mut Runtime, + ptr: u32, + len: u32, +) -> Result { + let buf = read_sandbox_memory(ctx, ptr, len)?; + D::decode(&mut &buf[..]).map_err(|_| sandbox::HostError) +} + /// Write the given buffer to the designated location in the sandbox memory, consuming /// an appropriate amount of gas. /// @@ -322,16 +340,10 @@ define_env!(Env, , input_data_ptr: u32, input_data_len: u32 ) -> u32 => { - let callee = { - let callee_buf = read_sandbox_memory(ctx, callee_ptr, callee_len)?; - <::T as system::Trait>::AccountId::decode(&mut &callee_buf[..]) - .map_err(|_| sandbox::HostError)? - }; - let value = { - let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; - BalanceOf::<::T>::decode(&mut &value_buf[..]) - .map_err(|_| sandbox::HostError)? - }; + let callee: <::T as system::Trait>::AccountId = + read_sandbox_memory_as(ctx, callee_ptr, callee_len)?; + let value: BalanceOf<::T> = + read_sandbox_memory_as(ctx, value_ptr, value_len)?; let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; // Grab the scratch buffer and put in its' place an empty one. @@ -397,15 +409,10 @@ define_env!(Env, , input_data_ptr: u32, input_data_len: u32 ) -> u32 => { - let code_hash = { - let code_hash_buf = read_sandbox_memory(ctx, code_hash_ptr, code_hash_len)?; - ::T>>::decode(&mut &code_hash_buf[..]).map_err(|_| sandbox::HostError)? - }; - let value = { - let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; - BalanceOf::<::T>::decode(&mut &value_buf[..]) - .map_err(|_| sandbox::HostError)? - }; + let code_hash: CodeHash<::T> = + read_sandbox_memory_as(ctx, code_hash_ptr, code_hash_len)?; + let value: BalanceOf<::T> = + read_sandbox_memory_as(ctx, value_ptr, value_len)?; let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; // Clear the scratch buffer in any case. @@ -566,11 +573,8 @@ define_env!(Env, , // All calls made it to the top-level context will be dispatched before // finishing the execution of the calling extrinsic. ext_dispatch_call(ctx, call_ptr: u32, call_len: u32) => { - let call = { - let call_buf = read_sandbox_memory(ctx, call_ptr, call_len)?; - <<::T as Trait>::Call>::decode(&mut &call_buf[..]) - .map_err(|_| sandbox::HostError)? - }; + let call: <::T as Trait>::Call = + read_sandbox_memory_as(ctx, call_ptr, call_len)?; // Charge gas for dispatching this call. let fee = { @@ -615,25 +619,12 @@ define_env!(Env, , delta_ptr: u32, delta_count: u32 ) => { - let dest = { - let dest_buf = read_sandbox_memory(ctx, dest_ptr, dest_len)?; - <::T as system::Trait>::AccountId::decode(&mut &dest_buf[..]) - .map_err(|_| sandbox::HostError)? - }; - let code_hash = { - let code_hash_buf = read_sandbox_memory(ctx, code_hash_ptr, code_hash_len)?; - ::T>>::decode(&mut &code_hash_buf[..]) - .map_err(|_| sandbox::HostError)? - }; - let rent_allowance = { - let rent_allowance_buf = read_sandbox_memory( - ctx, - rent_allowance_ptr, - rent_allowance_len - )?; - BalanceOf::<::T>::decode(&mut &rent_allowance_buf[..]) - .map_err(|_| sandbox::HostError)? - }; + let dest: <::T as system::Trait>::AccountId = + read_sandbox_memory_as(ctx, dest_ptr, dest_len)?; + let code_hash: CodeHash<::T> = + read_sandbox_memory_as(ctx, code_hash_ptr, code_hash_len)?; + let rent_allowance: BalanceOf<::T> = + read_sandbox_memory_as(ctx, rent_allowance_ptr, rent_allowance_len)?; let delta = { // We don't use `with_capacity` here to not eagerly allocate the user specified amount // of memory. @@ -712,13 +703,9 @@ define_env!(Env, , // - data_ptr - a pointer to a raw data buffer which will saved along the event. // - data_len - the length of the data buffer. ext_deposit_event(ctx, topics_ptr: u32, topics_len: u32, data_ptr: u32, data_len: u32) => { - let mut topics = match topics_len { + let mut topics: Vec::::T>> = match topics_len { 0 => Vec::new(), - _ => { - let topics_buf = read_sandbox_memory(ctx, topics_ptr, topics_len)?; - Vec::::T>>::decode(&mut &topics_buf[..]) - .map_err(|_| sandbox::HostError)? - } + _ => read_sandbox_memory_as(ctx, topics_ptr, topics_len)?, }; // If there are more than `max_event_topics`, then trap. @@ -754,11 +741,8 @@ define_env!(Env, , // Should be decodable as a `T::Balance`. Traps otherwise. // - value_len: length of the value buffer. ext_set_rent_allowance(ctx, value_ptr: u32, value_len: u32) => { - let value = { - let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; - BalanceOf::<::T>::decode(&mut &value_buf[..]) - .map_err(|_| sandbox::HostError)? - }; + let value: BalanceOf<::T> = + read_sandbox_memory_as(ctx, value_ptr, value_len)?; ctx.ext.set_rent_allowance(value); Ok(()) -- GitLab From c36d24778a2cd7e2356555a753321054358ffc97 Mon Sep 17 00:00:00 2001 From: cheme Date: Thu, 8 Aug 2019 15:05:25 +0200 Subject: [PATCH 117/151] Child storage tests and genesis fix. (#3185) * Using child storage, (srml-support only), test failing . * fix simple tests. * Enumerable by requiring owned struct (previous form only allow &'static). Broken tests are from genesis init. * implement for_child_keys_with_prefix * indent * clear_child_prefix fix. * clear_child_prefix fix 2. * fix for storage_impl, if/when allowing child and not child this could be reverted. * Fix lot of urlinked child genesis, still need to look upon actual genesis srml module code. Probably still a lot of broken code needing debugging. * switch well_known_key to their associated module child trie. Fix a genesis init (balance). Complete some testing. Comment some tests before using. * fixing test runtime child keys * latest commit fix broken genesis init * fix system balances child name. * Important fix: storage_root from test externalities need children (it is already the case for ext). * executive root with child calculation * Avoid empty trie on test ext. * Symetric removal of key for system. * commenting changes related tests. * Remove child module specifics. * fix issues. * fix some formatting * fix bench and bump runtime * Remove extend_storage_overlays, assimilate_storage do the same as is proper considering srml macro. * Fix warning for assimilate. * Removing kill as they do not impact any test cases. * Use tuple of storage map instead of two parameters. This changes the behavior of decl_storage genesis build closure (breaking api). * Do not use build storage before assimilate. * fix error * Update core/state-machine/src/backend.rs --- Cargo.lock | 1 + core/client/db/src/lib.rs | 4 + core/client/db/src/storage_cache.rs | 4 + core/client/src/genesis.rs | 17 +---- core/client/src/light/backend.rs | 23 ++++++ core/executor/src/wasm_executor.rs | 25 ++++++- core/service/src/chain_spec.rs | 28 +++++-- core/sr-io/src/lib.rs | 5 +- core/sr-io/with_std.rs | 37 ++++------ core/sr-io/without_std.rs | 16 ++++ core/sr-primitives/src/lib.rs | 59 +++++---------- core/state-machine/src/backend.rs | 36 +++++++-- core/state-machine/src/basic.rs | 48 +++++++++--- core/state-machine/src/ext.rs | 27 ++++++- core/state-machine/src/lib.rs | 21 ++++++ core/state-machine/src/overlayed_changes.rs | 32 ++++++++ core/state-machine/src/proving_backend.rs | 4 + core/state-machine/src/testing.rs | 73 +++++++++++-------- core/state-machine/src/trie_backend.rs | 4 + .../state-machine/src/trie_backend_essence.rs | 25 ++++++- core/test-runtime/client/Cargo.toml | 3 +- core/test-runtime/client/src/lib.rs | 13 +++- core/test-runtime/src/genesismap.rs | 31 +++++++- core/test-runtime/src/system.rs | 7 +- node-template/runtime/src/template.rs | 2 +- node/cli/res/flaming-fir.json | 6 +- node/executor/src/lib.rs | 30 ++++---- node/runtime/src/lib.rs | 2 +- srml/assets/src/lib.rs | 2 +- srml/aura/src/mock.rs | 6 +- srml/authorship/src/lib.rs | 2 +- srml/balances/src/mock.rs | 9 ++- srml/collective/src/lib.rs | 2 +- srml/contracts/src/tests.rs | 6 +- srml/council/src/lib.rs | 6 +- srml/democracy/src/lib.rs | 6 +- srml/elections/src/lib.rs | 2 +- srml/example/src/lib.rs | 8 +- srml/executive/src/lib.rs | 10 +-- srml/finality-tracker/src/lib.rs | 6 +- srml/generic-asset/src/lib.rs | 5 +- srml/generic-asset/src/mock.rs | 17 ++--- srml/grandpa/src/mock.rs | 6 +- srml/indices/src/mock.rs | 6 +- srml/membership/src/lib.rs | 9 +-- srml/session/src/historical.rs | 7 +- srml/session/src/lib.rs | 7 +- srml/staking/src/lib.rs | 3 +- srml/staking/src/mock.rs | 10 +-- .../procedural/src/storage/transformation.rs | 27 ++++--- srml/support/src/lib.rs | 2 +- srml/support/src/metadata.rs | 2 +- srml/support/src/storage/storage_items.rs | 4 +- srml/support/test/tests/final_keys.rs | 2 +- srml/support/test/tests/instance.rs | 4 +- srml/system/benches/bench.rs | 2 +- srml/system/src/lib.rs | 21 +++--- srml/timestamp/src/lib.rs | 6 +- srml/treasury/src/lib.rs | 6 +- 59 files changed, 523 insertions(+), 271 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bcadbe2e74..524e710f88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5044,6 +5044,7 @@ dependencies = [ name = "substrate-test-runtime-client" version = "2.0.0" dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 250af8ea60..967dcffc86 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -144,6 +144,10 @@ impl StateBackend for RefTrackingState { self.state.for_keys_in_child_storage(storage_key, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.state.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn storage_root(&self, delta: I) -> (H256, Self::Transaction) where I: IntoIterator, Option>)> diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index f6277747d8..8b3e81212e 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -540,6 +540,10 @@ impl, B: BlockT> StateBackend for CachingState< self.state.for_keys_in_child_storage(storage_key, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.state.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)>, diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index a7700b7d9f..f02be3116a 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -45,7 +45,7 @@ mod tests { use state_machine::{self, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage}; use state_machine::backend::InMemory; use test_client::{ - runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}, + runtime::genesismap::{GenesisConfig, insert_genesis_block}, runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, AccountKeyring, Sr25519Keyring, }; @@ -156,10 +156,7 @@ mod tests { 1000, None, ).genesis_map(); - let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); - let block = construct_genesis_block::(state_root); - let genesis_hash = block.header.hash(); - storage.extend(additional_storage_with_genesis(&block).into_iter()); + let genesis_hash = insert_genesis_block(&mut storage); let backend = InMemory::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); @@ -187,10 +184,7 @@ mod tests { 1000, None, ).genesis_map(); - let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); - let block = construct_genesis_block::(state_root); - let genesis_hash = block.header.hash(); - storage.extend(additional_storage_with_genesis(&block).into_iter()); + let genesis_hash = insert_genesis_block(&mut storage); let backend = InMemory::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); @@ -218,10 +212,7 @@ mod tests { 68, None, ).genesis_map(); - let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); - let block = construct_genesis_block::(state_root); - let genesis_hash = block.header.hash(); - storage.extend(additional_storage_with_genesis(&block).into_iter()); + let genesis_hash = insert_genesis_block(&mut storage); let backend = InMemory::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 4730297656..888c9d2033 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -381,6 +381,15 @@ where // whole state is not available on light node } + fn for_child_keys_with_prefix( + &self, + _storage_key: &[u8], + _prefix: &[u8], + _action: A, + ) { + // whole state is not available on light node + } + fn storage_root(&self, _delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> @@ -456,6 +465,20 @@ where } } + fn for_child_keys_with_prefix( + &self, + storage_key: &[u8], + prefix: &[u8], + action: A, + ) { + match *self { + OnDemandOrGenesisState::OnDemand(ref state) => + StateBackend::::for_child_keys_with_prefix(state, storage_key, prefix, action), + OnDemandOrGenesisState::Genesis(ref state) => + state.for_child_keys_with_prefix(storage_key, prefix, action), + } + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 2c69c8ba05..73ee2c40d7 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -281,6 +281,23 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.ext.clear_prefix(&prefix); Ok(()) }, + ext_clear_child_prefix( + storage_key_data: *const u8, + storage_key_len: u32, + prefix_data: *const u8, + prefix_len: u32 + ) => { + let storage_key = this.memory.get( + storage_key_data, + storage_key_len as usize + ).map_err(|_| "Invalid attempt to determine storage_key in ext_clear_child_prefix")?; + let storage_key = ChildStorageKey::from_vec(storage_key) + .ok_or_else(|| "ext_clear_child_prefix: child storage key is not valid")?; + let prefix = this.memory.get(prefix_data, prefix_len as usize) + .map_err(|_| "Invalid attempt to determine prefix in ext_clear_child_prefix")?; + this.ext.clear_child_prefix(storage_key, &prefix); + Ok(()) + }, ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32) => { let storage_key = this.memory.get( storage_key_data, @@ -1496,11 +1513,11 @@ mod tests { assert_eq!(output, b"all ok!".to_vec()); - let expected = TestExternalities::new(map![ + let expected = TestExternalities::new((map![ b"input".to_vec() => b"Hello world".to_vec(), b"foo".to_vec() => b"bar".to_vec(), b"baz".to_vec() => b"bar".to_vec() - ]); + ], map![])); assert_eq!(ext, expected); } @@ -1519,11 +1536,11 @@ mod tests { assert_eq!(output, b"all ok!".to_vec()); - let expected: TestExternalities<_> = map![ + let expected = TestExternalities::new((map![ b"aaa".to_vec() => b"1".to_vec(), b"aab".to_vec() => b"2".to_vec(), b"bbb".to_vec() => b"5".to_vec() - ]; + ], map![])); assert_eq!(expected, ext); } diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index ecd77af082..bae353ceb9 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -72,10 +72,16 @@ impl<'a, G: RuntimeGenesis> BuildStorage for &'a ChainSpec { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { match self.genesis.resolve()? { Genesis::Runtime(gc) => gc.build_storage(), - Genesis::Raw(map) => Ok((map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), Default::default())), + Genesis::Raw(map, children_map) => Ok(( + map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), + children_map.into_iter().map(|(sk, map)| ( + sk.0, + map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), + )).collect(), + )), } } - fn assimilate_storage(self, _: &mut StorageOverlay, _: &mut ChildrenStorageOverlay) -> Result<(), String> { + fn assimilate_storage(self, _: &mut (StorageOverlay, ChildrenStorageOverlay)) -> Result<(), String> { Err("`assimilate_storage` not implemented for `ChainSpec`.".into()) } } @@ -85,7 +91,10 @@ impl<'a, G: RuntimeGenesis> BuildStorage for &'a ChainSpec { #[serde(deny_unknown_fields)] enum Genesis { Runtime(G), - Raw(HashMap), + Raw( + HashMap, + HashMap>, + ), } #[derive(Serialize, Deserialize, Clone)] @@ -218,11 +227,20 @@ impl ChainSpec { }; let genesis = match (raw, self.genesis.resolve()?) { (true, Genesis::Runtime(g)) => { - let storage = g.build_storage()?.0.into_iter() + let storage = g.build_storage()?; + let top = storage.0.into_iter() .map(|(k, v)| (StorageKey(k), StorageData(v))) .collect(); + let children = storage.1.into_iter() + .map(|(sk, child)| ( + StorageKey(sk), + child.into_iter() + .map(|(k, v)| (StorageKey(k), StorageData(v))) + .collect(), + )) + .collect(); - Genesis::Raw(storage) + Genesis::Raw(top, children) }, (_, genesis) => genesis, }; diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 7227ef4f0d..cafdf8066e 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -141,6 +141,9 @@ export_api! { /// Clear the storage entries with a key that starts with the given prefix. fn clear_prefix(prefix: &[u8]); + /// Clear the child storage entries with a key that starts with the given prefix. + fn clear_child_prefix(storage_key: &[u8], prefix: &[u8]); + /// "Commit" all existing operations and compute the resultant storage root. fn storage_root() -> [u8; 32]; @@ -401,7 +404,7 @@ mod imp { #[cfg(feature = "std")] pub use self::imp::{ - StorageOverlay, ChildrenStorageOverlay, with_storage, with_storage_and_children, + StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities }; #[cfg(not(feature = "std"))] diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 8774412c1c..b1e55634fc 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -141,6 +141,13 @@ impl StorageApi for () { ); } + fn clear_child_prefix(storage_key: &[u8], prefix: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.clear_child_prefix(storage_key, prefix) + }); + } + fn storage_root() -> [u8; 32] { ext::with(|ext| ext.storage_root() @@ -455,36 +462,20 @@ pub type StorageOverlay = HashMap, Vec>; /// A set of key value pairs for children storage; pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; -/// Execute the given closure with global functions available whose functionality routes into -/// externalities that draw from and populate `storage`. Forwards the value that the closure returns. -pub fn with_storage R>(storage: &mut StorageOverlay, f: F) -> R { - let mut alt_storage = Default::default(); - rstd::mem::swap(&mut alt_storage, storage); - let mut ext = BasicExternalities::new(alt_storage); - let r = ext::using(&mut ext, f); - *storage = ext.into_storages().0; - r -} - /// Execute the given closure with global functions available whose functionality routes into /// externalities that draw from and populate `storage` and `children_storage`. /// Forwards the value that the closure returns. -pub fn with_storage_and_children R>( - storage: &mut StorageOverlay, - children_storage: &mut ChildrenStorageOverlay, +pub fn with_storage R>( + storage: &mut (StorageOverlay, ChildrenStorageOverlay), f: F ) -> R { let mut alt_storage = Default::default(); - let mut alt_children_storage = Default::default(); rstd::mem::swap(&mut alt_storage, storage); - rstd::mem::swap(&mut alt_children_storage, children_storage); - let mut ext = BasicExternalities::new_with_children(alt_storage, alt_children_storage); + let mut ext = BasicExternalities::new(alt_storage.0, alt_storage.1); let r = ext::using(&mut ext, f); - let storage_tuple = ext.into_storages(); - *storage = storage_tuple.0; - *children_storage = storage_tuple.1; + *storage = ext.into_storages(); r } @@ -524,7 +515,7 @@ mod std_tests { true })); - t = BasicExternalities::new(map![b"foo".to_vec() => b"bar".to_vec()]); + t = BasicExternalities::new(map![b"foo".to_vec() => b"bar".to_vec()], map![]); assert!(!with_externalities(&mut t, || { assert_eq!(storage(b"hello"), None); @@ -537,7 +528,7 @@ mod std_tests { fn read_storage_works() { let mut t = BasicExternalities::new(map![ b":test".to_vec() => b"\x0b\0\0\0Hello world".to_vec() - ]); + ], map![]); with_externalities(&mut t, || { let mut v = [0u8; 4]; @@ -556,7 +547,7 @@ mod std_tests { b":abcd".to_vec() => b"\x0b\0\0\0Hello world".to_vec(), b":abc".to_vec() => b"\x0b\0\0\0Hello world".to_vec(), b":abdd".to_vec() => b"\x0b\0\0\0Hello world".to_vec() - ]); + ], map![]); with_externalities(&mut t, || { clear_prefix(b":abc"); diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 09b3cc0e2e..7d26d3d23b 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -213,6 +213,13 @@ pub mod ext { fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; /// Remove storage entries which key starts with given prefix. fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); + /// Remove child storage entries which key starts with given prefix. + fn ext_clear_child_prefix( + storage_key_data: *const u8, + storage_key_len: u32, + prefix_data: *const u8, + prefix_len: u32 + ); /// Gets the value of the given key from storage. /// /// The host allocates the memory for storing the value. @@ -703,6 +710,15 @@ impl StorageApi for () { } } + fn clear_child_prefix(storage_key: &[u8], prefix: &[u8]) { + unsafe { + ext_clear_child_prefix.get()( + storage_key.as_ptr(), storage_key.len() as u32, + prefix.as_ptr(), prefix.len() as u32 + ); + } + } + fn kill_child_storage(storage_key: &[u8]) { unsafe { ext_kill_child_storage.get()( diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index b0b76277de..9246cd3ff6 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -113,16 +113,14 @@ pub use serde::{Serialize, Deserialize, de::DeserializeOwned}; pub trait BuildStorage: Sized { /// Build the storage out of this builder. fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { - let mut storage = Default::default(); - let mut child_storage = Default::default(); - self.assimilate_storage(&mut storage, &mut child_storage)?; - Ok((storage, child_storage)) + let mut storage = (Default::default(), Default::default()); + self.assimilate_storage(&mut storage)?; + Ok(storage) } /// Assimilate the storage for this module into pre-existing overlays. fn assimilate_storage( self, - storage: &mut StorageOverlay, - child_storage: &mut ChildrenStorageOverlay + storage: &mut (StorageOverlay, ChildrenStorageOverlay), ) -> Result<(), String>; } @@ -132,26 +130,10 @@ pub trait BuildModuleGenesisStorage: Sized { /// Create the module genesis storage into the given `storage` and `child_storage`. fn build_module_genesis_storage( self, - storage: &mut StorageOverlay, - child_storage: &mut ChildrenStorageOverlay + storage: &mut (StorageOverlay, ChildrenStorageOverlay), ) -> Result<(), String>; } -#[cfg(feature = "std")] -impl BuildStorage for StorageOverlay { - fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { - Ok((self, Default::default())) - } - fn assimilate_storage( - self, - storage: &mut StorageOverlay, - _child_storage: &mut ChildrenStorageOverlay - ) -> Result<(), String> { - storage.extend(self); - Ok(()) - } -} - #[cfg(feature = "std")] impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { @@ -159,11 +141,16 @@ impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { } fn assimilate_storage( self, - storage: &mut StorageOverlay, - child_storage: &mut ChildrenStorageOverlay + storage: &mut (StorageOverlay, ChildrenStorageOverlay), )-> Result<(), String> { - storage.extend(self.0); - child_storage.extend(self.1); + storage.0.extend(self.0); + for (k, other_map) in self.1.into_iter() { + if let Some(map) = storage.1.get_mut(&k) { + map.extend(other_map); + } else { + storage.1.insert(k, other_map); + } + } Ok(()) } } @@ -773,8 +760,7 @@ macro_rules! impl_outer_config { impl $crate::BuildStorage for $main { fn assimilate_storage( self, - top: &mut $crate::StorageOverlay, - children: &mut $crate::ChildrenStorageOverlay + storage: &mut ($crate::StorageOverlay, $crate::ChildrenStorageOverlay), ) -> std::result::Result<(), String> { $( if let Some(extra) = self.[< $snake $(_ $instance )? >] { @@ -784,8 +770,7 @@ macro_rules! impl_outer_config { $snake; $( $instance )?; extra; - top; - children; + storage; } } )* @@ -799,13 +784,11 @@ macro_rules! impl_outer_config { $module:ident; $instance:ident; $extra:ident; - $top:ident; - $children:ident; + $storage:ident; ) => { $crate::BuildModuleGenesisStorage::<$runtime, $module::$instance>::build_module_genesis_storage( $extra, - $top, - $children, + $storage, )?; }; (@CALL_FN @@ -813,13 +796,11 @@ macro_rules! impl_outer_config { $module:ident; ; $extra:ident; - $top:ident; - $children:ident; + $storage:ident; ) => { $crate::BuildModuleGenesisStorage::<$runtime, $module::__InherentHiddenInstance>::build_module_genesis_storage( $extra, - $top, - $children, + $storage, )?; } } diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index 795393f331..0feb6e84d0 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -70,10 +70,14 @@ pub trait Backend { /// Retrieve all entries keys of child storage and call `f` for each of those keys. fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F); - /// Retrieve all entries keys of which start with the given prefix and + /// Retrieve all entries keys which start with the given prefix and /// call `f` for each of those keys. fn for_keys_with_prefix(&self, prefix: &[u8], f: F); + /// Retrieve all child entries keys which start with the given prefix and + /// call `f` for each of those keys. + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F); + /// Calculate the storage root, with given delta over what is already stored in /// the backend, and produce a "transaction" that can be used to commit. /// Does not include child storage updates. @@ -103,11 +107,7 @@ pub trait Backend { /// Get all keys of child storage with given prefix fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { let mut all = Vec::new(); - self.for_keys_in_child_storage(child_storage_key, |k| { - if k.starts_with(prefix) { - all.push(k.to_vec()); - } - }); + self.for_child_keys_with_prefix(child_storage_key, prefix, |k| all.push(k.to_vec())); all } @@ -248,6 +248,25 @@ impl From>, HashMap, Vec>>> for In } } +impl From<( + HashMap, Vec>, + HashMap, HashMap, Vec>>, +)> for InMemory { + fn from(inners: ( + HashMap, Vec>, + HashMap, HashMap, Vec>>, + )) -> Self { + let mut inner: HashMap>, HashMap, Vec>> + = inners.1.into_iter().map(|(k, v)| (Some(k), v)).collect(); + inner.insert(None, inners.0); + InMemory { + inner: inner, + trie: None, + _hasher: PhantomData, + } + } +} + impl From, Vec>> for InMemory { fn from(inner: HashMap, Vec>) -> Self { let mut expanded = HashMap::new(); @@ -306,6 +325,11 @@ impl Backend for InMemory { self.inner.get(&Some(storage_key.to_vec())).map(|map| map.keys().for_each(|k| f(&k))); } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.inner.get(&Some(storage_key.to_vec())) + .map(|map| map.keys().filter(|key| key.starts_with(prefix)).map(|k| &**k).for_each(f)); + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)>, diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 85f5fa28b6..1d36a0ddad 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -20,7 +20,7 @@ use std::collections::HashMap; use std::iter::FromIterator; use crate::backend::{Backend, InMemory}; use hash_db::Hasher; -use trie::TrieConfiguration; +use trie::{TrieConfiguration, default_child_trie_root}; use trie::trie_types::Layout; use primitives::offchain; use primitives::storage::well_known_keys::is_child_storage_key; @@ -35,13 +35,9 @@ pub struct BasicExternalities { } impl BasicExternalities { - /// Create a new instance of `BasicExternalities` - pub fn new(top: HashMap, Vec>) -> Self { - Self::new_with_children(top, Default::default()) - } - /// Create a new instance of `BasicExternalities` with children - pub fn new_with_children( + /// Create a new instance of `BasicExternalities` + pub fn new( top: HashMap, Vec>, children: HashMap, HashMap, Vec>>, ) -> Self { @@ -80,7 +76,7 @@ impl FromIterator<(Vec, Vec)> for BasicExternalities { } impl Default for BasicExternalities { - fn default() -> Self { Self::new(Default::default()) } + fn default() -> Self { Self::new(Default::default(), Default::default()) } } impl From, Vec>> for BasicExternalities { @@ -105,6 +101,10 @@ impl Externalities for BasicExternalities where H::Out: Ord { self.children.get(storage_key.as_ref()).and_then(|child| child.get(key)).cloned() } + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + Externalities::::child_storage(self, storage_key, key) + } + fn place_storage(&mut self, key: Vec, maybe_value: Option>) { if is_child_storage_key(&key) { warn!(target: "trie", "Refuse to set child storage key via main storage"); @@ -147,9 +147,32 @@ impl Externalities for BasicExternalities where H::Out: Ord { self.top.retain(|key, _| !key.starts_with(prefix)); } + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]) { + if let Some(child) = self.children.get_mut(storage_key.as_ref()) { + child.retain(|key, _| !key.starts_with(prefix)); + } + } + fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { + let mut top = self.top.clone(); + let keys: Vec<_> = self.children.keys().map(|k| k.to_vec()).collect(); + // Single child trie implementation currently allows using the same child + // empty root for all child trie. Using null storage key until multiple + // type of child trie support. + let empty_hash = default_child_trie_root::>(&[]); + for storage_key in keys { + let child_root = self.child_storage_root( + ChildStorageKey::::from_slice(storage_key.as_slice()) + .expect("Map only feed by valid keys; qed") + ); + if &empty_hash[..] == &child_root[..] { + top.remove(&storage_key); + } else { + top.insert(storage_key, child_root); + } + } Layout::::trie_root(self.top.clone()) } @@ -159,7 +182,7 @@ impl Externalities for BasicExternalities where H::Out: Ord { InMemory::::default().child_storage_root(storage_key.as_ref(), delta).0 } else { - vec![] + default_child_trie_root::>(storage_key.as_ref()) } } @@ -212,7 +235,7 @@ mod tests { fn children_works() { let child_storage = b":child_storage:default:test".to_vec(); - let mut ext = BasicExternalities::new_with_children( + let mut ext = BasicExternalities::new( Default::default(), map![ child_storage.clone() => map![ @@ -240,7 +263,10 @@ mod tests { #[test] fn basic_externalities_is_empty() { // Make sure no values are set by default in `BasicExternalities`. - let (storage, child_storage) = BasicExternalities::new(Default::default()).into_storages(); + let (storage, child_storage) = BasicExternalities::new( + Default::default(), + Default::default(), + ).into_storages(); assert!(storage.is_empty()); assert!(child_storage.is_empty()); } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index f7ff649925..896b07c647 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -204,6 +204,22 @@ where self.backend.child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } + fn child_storage_hash(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option { + let _guard = panic_handler::AbortGuard::force_abort(); + self.overlay.child_storage(storage_key.as_ref(), key).map(|x| x.map(|x| H::hash(x))).unwrap_or_else(|| + self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) + } + + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + let _guard = panic_handler::AbortGuard::force_abort(); + self.backend.child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL) + } + + fn original_child_storage_hash(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option { + let _guard = panic_handler::AbortGuard::force_abort(); + self.backend.child_storage_hash(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL) + } + fn exists_storage(&self, key: &[u8]) -> bool { let _guard = panic_handler::AbortGuard::force_abort(); match self.overlay.storage(key) { @@ -263,6 +279,16 @@ where }); } + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]) { + let _guard = panic_handler::AbortGuard::force_abort(); + + self.mark_dirty(); + self.overlay.clear_child_prefix(storage_key.as_ref(), prefix); + self.backend.for_child_keys_with_prefix(storage_key.as_ref(), prefix, |key| { + self.overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); + } + fn chain_id(&self) -> u64 { 42 } @@ -276,7 +302,6 @@ where let child_storage_keys = self.overlay.prospective.children.keys() .chain(self.overlay.committed.children.keys()); - let child_delta_iter = child_storage_keys.map(|storage_key| (storage_key.clone(), self.overlay.committed.children.get(storage_key) .into_iter() diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 6279966cae..bd46e0935b 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -155,15 +155,33 @@ pub trait Externalities { self.storage(key).map(|v| H::hash(&v)) } + /// Get child storage value hash. This may be optimized for large values. + fn child_storage_hash(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option { + self.child_storage(storage_key, key).map(|v| H::hash(&v)) + } + /// Read original runtime storage, ignoring any overlayed changes. fn original_storage(&self, key: &[u8]) -> Option>; + /// Read original runtime child storage, ignoring any overlayed changes. + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option>; + /// Get original storage value hash, ignoring any overlayed changes. /// This may be optimized for large values. fn original_storage_hash(&self, key: &[u8]) -> Option { self.original_storage(key).map(|v| H::hash(&v)) } + /// Get original child storage value hash, ignoring any overlayed changes. + /// This may be optimized for large values. + fn original_child_storage_hash( + &self, + storage_key: ChildStorageKey, + key: &[u8], + ) -> Option { + self.original_child_storage(storage_key, key).map(|v| H::hash(&v)) + } + /// Read child runtime storage. fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option>; @@ -203,6 +221,9 @@ pub trait Externalities { /// Clear storage entries which keys are start with the given prefix. fn clear_prefix(&mut self, prefix: &[u8]); + /// Clear child storage entries which keys are start with the given prefix. + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]); + /// Set or clear a storage entry (`key`) of current contract being called (effective immediately). fn place_storage(&mut self, key: Vec, value: Option>); diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index edc03baa39..9efafab20f 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -220,6 +220,38 @@ impl OverlayedChanges { } } + pub(crate) fn clear_child_prefix(&mut self, storage_key: &[u8], prefix: &[u8]) { + let extrinsic_index = self.extrinsic_index(); + let map_entry = self.prospective.children.entry(storage_key.to_vec()).or_default(); + + for (key, entry) in map_entry.1.iter_mut() { + if key.starts_with(prefix) { + *entry = None; + + if let Some(extrinsic) = extrinsic_index { + map_entry.0.get_or_insert_with(Default::default) + .insert(extrinsic); + } + } + } + + if let Some(child_committed) = self.committed.children.get(storage_key) { + // Then do the same with keys from commited changes. + // NOTE that we are making changes in the prospective change set. + for key in child_committed.1.keys() { + if key.starts_with(prefix) { + let entry = map_entry.1.entry(key.clone()).or_default(); + *entry = None; + + if let Some(extrinsic) = extrinsic_index { + map_entry.0.get_or_insert_with(Default::default) + .insert(extrinsic); + } + } + } + } + } + /// Discard prospective changes to state. pub fn discard_prospective(&mut self) { self.prospective.clear(); diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 5862c19e8d..5e8f618c82 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -174,6 +174,10 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.for_keys_with_prefix(prefix, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.backend.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn pairs(&self) -> Vec<(Vec, Vec)> { self.backend.pairs() } diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 0722eda456..5026abcb2f 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -17,7 +17,6 @@ //! Test implementation for Externalities. use std::collections::{HashMap}; -use std::iter::FromIterator; use hash_db::Hasher; use crate::backend::{InMemory, Backend}; use primitives::storage::well_known_keys::is_child_storage_key; @@ -46,22 +45,12 @@ pub struct TestExternalities { impl TestExternalities { /// Create a new instance of `TestExternalities` with storage. - pub fn new(storage: HashMap, Vec>) -> Self { - Self::new_with_children((storage, Default::default())) - } - - /// Create a new instance of `TestExternalities` with storage and children. - pub fn new_with_children(storage: StorageTuple) -> Self { - Self::new_with_code_with_children(&[], storage) + pub fn new(storage: StorageTuple) -> Self { + Self::new_with_code(&[], storage) } /// Create a new instance of `TestExternalities` with code and storage. - pub fn new_with_code(code: &[u8], storage: HashMap, Vec>) -> Self { - Self::new_with_code_with_children(code, (storage, Default::default())) - } - - /// Create a new instance of `TestExternalities` with code, storage and children. - pub fn new_with_code_with_children(code: &[u8], mut storage: StorageTuple) -> Self { + pub fn new_with_code(code: &[u8], mut storage: StorageTuple) -> Self { let mut overlay = OverlayedChanges::default(); assert!(storage.0.keys().all(|key| !is_child_storage_key(key))); @@ -137,25 +126,13 @@ impl PartialEq for TestExternalities } } -impl FromIterator<(Vec, Vec)> for TestExternalities { - fn from_iter, Vec)>>(iter: I) -> Self { - Self::new(iter.into_iter().collect()) - } -} - impl Default for TestExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From, Vec>> for TestExternalities { - fn from(hashmap: HashMap, Vec>) -> Self { - Self::from_iter(hashmap) - } -} - impl From for TestExternalities { fn from(storage: StorageTuple) -> Self { - Self::new_with_children(storage) + Self::new(storage) } } @@ -184,6 +161,13 @@ impl Externalities for TestExternalities ) } + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + self.backend + .child_storage(storage_key.as_ref(), key) + .map(|x| x.map(|x| x.to_vec())) + .expect(EXT_NOT_ALLOWED_TO_FAIL) + } + fn place_storage(&mut self, key: Vec, maybe_value: Option>) { if is_child_storage_key(&key) { panic!("Refuse to directly set child storage key"); @@ -225,20 +209,45 @@ impl Externalities for TestExternalities }); } + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]) { + + self.overlay.clear_child_prefix(storage_key.as_ref(), prefix); + + let backend = &self.backend; + let overlay = &mut self.overlay; + backend.for_child_keys_with_prefix(storage_key.as_ref(), prefix, |key| { + overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); + } + fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { + + let child_storage_keys = + self.overlay.prospective.children.keys() + .chain(self.overlay.committed.children.keys()); + + let child_delta_iter = child_storage_keys.map(|storage_key| + (storage_key.clone(), self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))))); + + // compute and memoize let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + self.backend.full_storage_root(delta, child_delta_iter).0 - self.backend.storage_root(delta).0 } fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { let storage_key = storage_key.as_ref(); - let (root, _, _) = { + let (root, is_empty, _) = { let delta = self.overlay.committed.children.get(storage_key) .into_iter() .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) @@ -248,7 +257,11 @@ impl Externalities for TestExternalities self.backend.child_storage_root(storage_key, delta) }; - self.overlay.set_storage(storage_key.into(), Some(root.clone())); + if is_empty { + self.overlay.set_storage(storage_key.into(), None); + } else { + self.overlay.set_storage(storage_key.into(), Some(root.clone())); + } root } diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 739044dd50..53c293b7ad 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -82,6 +82,10 @@ impl, H: Hasher> Backend for TrieBackend where self.essence.for_keys_in_child_storage(storage_key, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.essence.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn pairs(&self) -> Vec<(Vec, Vec)> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index 06ed92cbae..aeb265c2e2 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -119,7 +119,27 @@ impl, H: Hasher> TrieBackendEssence { } /// Execute given closure for all keys starting with prefix. - pub fn for_keys_with_prefix(&self, prefix: &[u8], mut f: F) { + pub fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + let root_vec = match self.storage(storage_key) { + Ok(v) => v.unwrap_or(default_child_trie_root::>(storage_key)), + Err(e) => { + debug!(target: "trie", "Error while iterating child storage: {}", e); + return; + } + }; + let mut root = H::Out::default(); + root.as_mut().copy_from_slice(&root_vec); + + self.keys_with_prefix_inner(&root, prefix, f) + } + + /// Execute given closure for all keys starting with prefix. + pub fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + self.keys_with_prefix_inner(&self.root, prefix, f) + } + + + fn keys_with_prefix_inner(&self, root: &H::Out, prefix: &[u8], mut f: F) { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, @@ -127,7 +147,7 @@ impl, H: Hasher> TrieBackendEssence { }; let mut iter = move || -> Result<(), Box>> { - let trie = TrieDB::::new(&eph, &self.root)?; + let trie = TrieDB::::new(&eph, root)?; let mut iter = trie.iter()?; iter.seek(prefix)?; @@ -149,6 +169,7 @@ impl, H: Hasher> TrieBackendEssence { debug!(target: "trie", "Error while iterating by prefix: {}", e); } } + } pub(crate) struct Ephemeral<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { diff --git a/core/test-runtime/client/Cargo.toml b/core/test-runtime/client/Cargo.toml index 5e6a676990..6545048759 100644 --- a/core/test-runtime/client/Cargo.toml +++ b/core/test-runtime/client/Cargo.toml @@ -8,7 +8,8 @@ edition = "2018" generic-test-client = { package = "substrate-test-client", path = "../../test-client" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime = { package = "substrate-test-runtime", path = "../../test-runtime", default-features = false } -sr-primitives = { path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } [features] default = [ diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs index 03f7bb3ddb..f1cbb6fd8c 100644 --- a/core/test-runtime/client/src/lib.rs +++ b/core/test-runtime/client/src/lib.rs @@ -101,15 +101,22 @@ pub struct GenesisParameters { impl generic_test_client::GenesisInit for GenesisParameters { fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { + use codec::Encode; let mut storage = genesis_config(self.support_changes_trie, self.heap_pages_override).genesis_map(); + let child_roots = storage.1.iter().map(|(sk, child_map)| { + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + child_map.clone().into_iter() + ); + (sk.clone(), state_root.encode()) + }); let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.clone().into_iter() + storage.0.clone().into_iter().chain(child_roots) ); let block: runtime::Block = client::genesis::construct_genesis_block(state_root); - storage.extend(additional_storage_with_genesis(&block)); + storage.0.extend(additional_storage_with_genesis(&block)); - (storage, Default::default()) + storage } } diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index 8d5be8355e..7686ed08bc 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -21,7 +21,7 @@ use runtime_io::{blake2_256, twox_128}; use super::{AuthorityId, AccountId, WASM_BINARY}; use codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; -use sr_primitives::traits::Block; +use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { @@ -50,7 +50,10 @@ impl GenesisConfig { } } - pub fn genesis_map(&self) -> HashMap, Vec> { + pub fn genesis_map(&self) -> ( + HashMap, Vec>, + HashMap, HashMap, Vec>>, + ) { let wasm_runtime = WASM_BINARY.to_vec(); let mut map: HashMap, Vec> = self.balances.iter() .map(|&(ref account, balance)| (account.to_keyed_vec(b"balance:"), vec![].and(&balance))) @@ -67,10 +70,32 @@ impl GenesisConfig { map.insert(well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), changes_trie_config.encode()); } map.insert(twox_128(&b"sys:auth"[..])[..].to_vec(), self.authorities.encode()); - map + (map, Default::default()) } } +pub fn insert_genesis_block( + storage: &mut ( + HashMap, Vec>, + HashMap, HashMap, Vec>>, + ) +) -> primitives::hash::H256 { + + let child_roots = storage.1.iter().map(|(sk, child_map)| { + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + child_map.clone().into_iter() + ); + (sk.clone(), state_root.encode()) + }); + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + storage.0.clone().into_iter().chain(child_roots) + ); + let block: crate::Block = substrate_client::genesis::construct_genesis_block(state_root); + let genesis_hash = block.header.hash(); + storage.0.extend(additional_storage_with_genesis(&block)); + genesis_hash +} + pub fn additional_storage_with_genesis(genesis_block: &crate::Block) -> HashMap, Vec> { map![ twox_128(&b"latest"[..]).to_vec() => genesis_block.hash().as_fixed_bytes().to_vec() diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index a1e407bd6e..44673aa5b8 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -201,13 +201,12 @@ pub fn finalize_block() -> Header { let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); let txs = txs.iter().map(Vec::as_slice).collect::>(); let extrinsics_root = enumerated_trie_root::(&txs).into(); - // let mut digest = Digest::default(); let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); let o_new_authorities = ::take(); - // This MUST come after all changes to storage are done. Otherwise we will fail the + // This MUST come after all changes to storage are done. Otherwise we will fail the // “Storage root does not match that calculated” assertion. let storage_root = BlakeTwo256::storage_root(); let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash); @@ -323,13 +322,13 @@ mod tests { Sr25519Keyring::Bob.to_raw_public(), Sr25519Keyring::Charlie.to_raw_public() ]; - TestExternalities::new(map![ + TestExternalities::new((map![ twox_128(b"latest").to_vec() => vec![69u8; 32], twox_128(b"sys:auth").to_vec() => authorities.encode(), blake2_256(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => { vec![111u8, 0, 0, 0, 0, 0, 0, 0] } - ]) + ], map![])) } fn block_import_works(block_executor: F) where F: Fn(Block, &mut TestExternalities) { diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index baf157a4fe..aa399a8edd 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -116,7 +116,7 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().into() } #[test] diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json index f4865d3c73..851aaa21b4 100644 --- a/node/cli/res/flaming-fir.json +++ b/node/cli/res/flaming-fir.json @@ -21,7 +21,7 @@ "protocolId": "fir", "consensusEngine": null, "genesis": { - "raw": { + "raw": [{ "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973a6e391e5d17627fa5aaa7a76b39ebee4b139bff595608fe41aea21aa7ea48053": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", @@ -99,6 +99,8 @@ "0x717a2ee9c64ad3424e10e4461ec08296": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000008700000000000000af0000000000000001000000000000000100000000000000040000000000010010000000004000000020000000", "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663" - } + }, + { + }] } } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index d012d35778..990210696a 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -174,7 +174,7 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { 69_u128.encode() }, @@ -187,7 +187,7 @@ mod tests { blake2_256(&>::key_for(0)).to_vec() => { vec![0u8; 32] } - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, @@ -210,7 +210,7 @@ mod tests { #[test] fn bad_extrinsic_with_native_equivalent_code_gives_error() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { 69_u128.encode() }, @@ -223,7 +223,7 @@ mod tests { blake2_256(&>::key_for(0)).to_vec() => { vec![0u8; 32] } - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, @@ -246,7 +246,7 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (111 * DOLLARS).encode() }, @@ -255,7 +255,7 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, @@ -282,7 +282,7 @@ mod tests { #[test] fn successful_execution_with_foreign_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (111 * DOLLARS).encode() }, @@ -291,7 +291,7 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, @@ -328,7 +328,7 @@ mod tests { } fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { - let mut ext = TestExternalities::new_with_code_with_children(code, GenesisConfig { + let mut ext = TestExternalities::new_with_code(code, GenesisConfig { system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { digest_interval: 2, @@ -875,7 +875,7 @@ mod tests { #[test] fn panic_execution_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { 0_u128.encode() }, @@ -884,7 +884,7 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = WasmExecutor::new() .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); @@ -897,7 +897,7 @@ mod tests { #[test] fn successful_execution_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (111 * DOLLARS).encode() }, @@ -906,7 +906,7 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = WasmExecutor::new() .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); @@ -1057,7 +1057,7 @@ mod tests { // - 1 MILLICENTS in substrate node. // - 1 milldot based on current polkadot runtime. // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (100 * DOLLARS).encode() }, @@ -1069,7 +1069,7 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let tip = 1_000_000; let xt = sign(CheckedExtrinsic { diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index dafd69b3d3..653c0858ff 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 135, + spec_version: 136, impl_version: 136, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index bacf722d5d..d5ae95c559 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -288,7 +288,7 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().into() } #[test] diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index 7c5d862a50..aac3f63f97 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -74,10 +74,10 @@ impl Trait for Test { } pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig::{ + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig::{ authorities: authorities.into_iter().map(|a| UintAuthorityId(a).to_public_key()).collect(), - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index d6ea0326fa..44fa04a2f3 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -562,7 +562,7 @@ mod tests { } fn new_test_ext() -> runtime_io::TestExternalities { - let t = system::GenesisConfig::default().build_storage::().unwrap().0; + let t = system::GenesisConfig::default().build_storage::().unwrap(); t.into() } diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index ccca018ae0..954d500a10 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -18,7 +18,8 @@ #![cfg(test)] -use sr_primitives::{Perbill, traits::{Convert, IdentityLookup}, testing::Header, weights::{DispatchInfo, Weight}}; +use sr_primitives::{Perbill, traits::{Convert, IdentityLookup}, testing::Header, + weights::{DispatchInfo, Weight}}; use primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{impl_outer_origin, parameter_types}; @@ -179,8 +180,8 @@ impl ExtBuilder { } pub fn build(self) -> runtime_io::TestExternalities { self.set_associated_consts(); - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig:: { balances: if self.monied { vec![ (1, 10 * self.existential_deposit), @@ -201,7 +202,7 @@ impl ExtBuilder { } else { vec![] }, - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } } diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index 8c4820715b..9dafa6721c 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -433,7 +433,7 @@ mod tests { phantom: Default::default(), }), collective: None, - }.build_storage().unwrap().0.into() + }.build_storage().unwrap().into() } #[test] diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index e12849f6fb..fa11c4f4df 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -277,12 +277,12 @@ impl ExtBuilder { balances::GenesisConfig:: { balances: vec![], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); + }.assimilate_storage(&mut t).unwrap(); GenesisConfig:: { current_schedule: Default::default(), gas_price: self.gas_price, - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } } diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 712b2ca835..787abdb078 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -259,7 +259,7 @@ mod tests { (6, 60 * self.balance_factor) ], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); + }.assimilate_storage(&mut t).unwrap(); seats::GenesisConfig:: { active_council: if self.with_council { vec![ (1, 10), @@ -269,8 +269,8 @@ mod tests { desired_seats: 2, presentation_duration: 2, term_duration: 5, - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } } diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index c3debc1f06..ee110f27e9 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -1094,9 +1094,9 @@ mod tests { balances::GenesisConfig::{ balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - GenesisConfig::default().assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + GenesisConfig::default().assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } type System = system::Module; diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index fe00182a89..a96588e84a 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -1314,7 +1314,7 @@ mod tests { presentation_duration: 2, term_duration: 5, }), - }.build_storage().unwrap().0.into() + }.build_storage().unwrap().into() } } diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 2d4fa43fb5..0cfad989b1 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -575,15 +575,15 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> sr_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); // We use default for brevity, but you can configure as desired if needed. - t.extend(balances::GenesisConfig::::default().build_storage().unwrap().0); - t.extend(GenesisConfig::{ + balances::GenesisConfig::::default().assimilate_storage(&mut t).unwrap(); + GenesisConfig::{ dummy: 42, // we configure the map with (key, value) pairs. bar: vec![(1, 2), (2, 3)], foo: 24, - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 70b4a9073d..9c29c95f10 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -465,10 +465,10 @@ mod tests { balances::GenesisConfig:: { balances: vec![(1, 211)], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); + }.assimilate_storage(&mut t).unwrap(); let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 69)); let weight = xt.get_dispatch_info().weight as u64; - let mut t = runtime_io::TestExternalities::::new_with_children(t); + let mut t = runtime_io::TestExternalities::::new(t); with_externalities(&mut t, || { Executive::initialize_block(&Header::new( 1, @@ -485,11 +485,11 @@ mod tests { } fn new_test_ext(balance_factor: u64) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + balances::GenesisConfig:: { balances: vec![(1, 111 * balance_factor)], vesting: vec![], - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index a4026f21b3..26a0e0d415 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -338,7 +338,7 @@ mod tests { #[test] fn median_works() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { FinalityTracker::update_hint(Some(500)); assert_eq!(FinalityTracker::median(), 250); assert!(NOTIFICATIONS.with(|n| n.borrow().is_empty())); @@ -348,7 +348,7 @@ mod tests { #[test] fn notifies_when_stalled() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); @@ -367,7 +367,7 @@ mod tests { #[test] fn recent_notifications_prevent_stalling() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 9120188f3b..c93df7c0be 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -479,12 +479,11 @@ decl_storage! { config(endowed_accounts): Vec; build(| - storage: &mut sr_primitives::StorageOverlay, - _: &mut sr_primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig| { config.assets.iter().for_each(|asset_id| { config.endowed_accounts.iter().for_each(|account_id| { - storage.insert( + storage.0.insert( >::key_for(asset_id, account_id), ::encode(&config.initial_balance) ); diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index 4f8e5d886f..2c348a0175 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -20,7 +20,11 @@ #![cfg(test)] -use sr_primitives::{Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}}; +use sr_primitives::{ + Perbill, + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, +}; use primitives::{Blake2Hasher, H256}; use support::{parameter_types, impl_outer_event, impl_outer_origin}; @@ -114,10 +118,9 @@ impl ExtBuilder { // builds genesis config pub fn build(self) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); - t.extend( - GenesisConfig:: { + GenesisConfig:: { assets: vec![self.asset_id], endowed_accounts: self.accounts, initial_balance: self.initial_balance, @@ -125,10 +128,7 @@ impl ExtBuilder { staking_asset_id: 16000, spending_asset_id: 16001, } - .build_storage() - .unwrap() - .0, - ); + .assimilate_storage(&mut t).unwrap(); t.into() } @@ -140,6 +140,5 @@ pub fn new_test_ext() -> runtime_io::TestExternalities { system::GenesisConfig::default() .build_storage::() .unwrap() - .0 .into() } diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index 055fc4673a..e3c53510de 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -82,10 +82,10 @@ pub fn to_authorities(vec: Vec<(u64, u64)>) -> Vec<(AuthorityId, u64)> { } pub fn new_test_ext(authorities: Vec<(u64, u64)>) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig { authorities: to_authorities(authorities), - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index d3ddfb0e09..50b38eae28 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -102,10 +102,10 @@ pub fn new_test_ext() -> runtime_io::TestExternalities { for i in 1..5 { h.insert(i); } } - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig:: { ids: vec![1, 2, 3, 4] - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/membership/src/lib.rs b/srml/membership/src/lib.rs index 805ec368bb..1545719e20 100644 --- a/srml/membership/src/lib.rs +++ b/srml/membership/src/lib.rs @@ -64,8 +64,7 @@ decl_storage! { config(members): Vec; config(phantom): sr_std::marker::PhantomData; build(| - storage: &mut sr_primitives::StorageOverlay, - _: &mut sr_primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig | { sr_io::with_storage(storage, || { @@ -282,12 +281,12 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> sr_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); // We use default for brevity, but you can configure as desired if needed. - t.extend(GenesisConfig::{ + GenesisConfig::{ members: vec![10, 20, 30], .. Default::default() - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/session/src/historical.rs b/srml/session/src/historical.rs index 815d782cf9..c0ffdeb464 100644 --- a/srml/session/src/historical.rs +++ b/srml/session/src/historical.rs @@ -323,13 +323,12 @@ mod tests { type Historical = Module; fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - let (storage, _child_storage) = crate::GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + crate::GenesisConfig:: { keys: NEXT_VALIDATORS.with(|l| l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i).into())).collect() ), - }.build_storage().unwrap(); - t.extend(storage); + }.assimilate_storage(&mut t).unwrap(); runtime_io::TestExternalities::new(t) } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 3aded46ea0..53c5c9b394 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -320,8 +320,7 @@ decl_storage! { add_extra_genesis { config(keys): Vec<(T::ValidatorId, T::Keys)>; build(| - storage: &mut sr_primitives::StorageOverlay, - _: &mut sr_primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig | { runtime_io::with_storage(storage, || { @@ -581,8 +580,8 @@ mod tests { keys: NEXT_VALIDATORS.with(|l| l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i).into())).collect() ), - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } fn initialize_block(block: u64) { diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index d1d690f75f..e8fd4501a9 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -634,8 +634,7 @@ decl_storage! { config(stakers): Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>; build(| - storage: &mut sr_primitives::StorageOverlay, - _: &mut sr_primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig | { with_storage(storage, || { diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index a281d818a2..2459eda4e4 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -253,7 +253,7 @@ impl ExtBuilder { } pub fn build(self) -> runtime_io::TestExternalities { self.set_associated_consts(); - let (mut t, mut c) = system::GenesisConfig::default().build_storage::().unwrap(); + let mut storage = system::GenesisConfig::default().build_storage::().unwrap(); let balance_factor = if self.existential_deposit > 0 { 256 } else { @@ -285,7 +285,7 @@ impl ExtBuilder { (999, 1_000_000_000_000), ], vesting: vec![], - }.assimilate_storage(&mut t, &mut c); + }.assimilate_storage(&mut storage); let stake_21 = if self.fair { 1000 } else { 2000 }; let stake_31 = if self.validator_pool { balance_factor * 1000 } else { 1 }; @@ -310,13 +310,13 @@ impl ExtBuilder { offline_slash: Perbill::from_percent(5), offline_slash_grace: 0, invulnerables: vec![], - }.assimilate_storage(&mut t, &mut c); + }.assimilate_storage(&mut storage); let _ = session::GenesisConfig:: { keys: validators.iter().map(|x| (*x, UintAuthorityId(*x))).collect(), - }.assimilate_storage(&mut t, &mut c); + }.assimilate_storage(&mut storage); - let mut ext = t.into(); + let mut ext = storage.into(); runtime_io::with_externalities(&mut ext, || { let validators = Session::validators(); SESSION.with(|x| diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 2c96e5a23b..d378907cb1 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -380,7 +380,7 @@ fn decl_store_extra_genesis( } let mut has_scall = false; - let mut scall = quote!{ ( |_, _, _| {} ) }; + let mut scall = quote!{ ( |_, _| {} ) }; let mut genesis_extrafields = TokenStream2::new(); let mut genesis_extrafields_default = TokenStream2::new(); @@ -536,23 +536,24 @@ fn decl_store_extra_genesis( ), String > #fn_where_clause { - let mut storage = Default::default(); - let mut child_storage = Default::default(); - self.assimilate_storage::<#fn_traitinstance>(&mut storage, &mut child_storage)?; - Ok((storage, child_storage)) + let mut storage = (Default::default(), Default::default()); + self.assimilate_storage::<#fn_traitinstance>(&mut storage)?; + Ok(storage) } /// Assimilate the storage for this module into pre-existing overlays. pub fn assimilate_storage #fn_generic ( self, - r: &mut #scrate::sr_primitives::StorageOverlay, - c: &mut #scrate::sr_primitives::ChildrenStorageOverlay, + tuple_storage: &mut ( + #scrate::sr_primitives::StorageOverlay, + #scrate::sr_primitives::ChildrenStorageOverlay, + ), ) -> std::result::Result<(), String> #fn_where_clause { - let storage = r; + let storage = &mut tuple_storage.0; #builders - #scall(storage, c, &self); + #scall(tuple_storage, &self); Ok(()) } @@ -564,10 +565,12 @@ fn decl_store_extra_genesis( { fn build_module_genesis_storage( self, - r: &mut #scrate::sr_primitives::StorageOverlay, - c: &mut #scrate::sr_primitives::ChildrenStorageOverlay, + storage: &mut ( + #scrate::sr_primitives::StorageOverlay, + #scrate::sr_primitives::ChildrenStorageOverlay, + ), ) -> std::result::Result<(), String> { - self.assimilate_storage::<#fn_traitinstance> (r, c) + self.assimilate_storage::<#fn_traitinstance> (storage) } } }; diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index abc9d7d215..5623cab70f 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -327,7 +327,7 @@ mod tests { } fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::default().build_storage().unwrap().0.into() + GenesisConfig::default().build_storage().unwrap().into() } type Map = Data; diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index 8fc4045dba..4bc1f906da 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -324,7 +324,7 @@ mod tests { StorageMethod : Option; } add_extra_genesis { - build(|_, _, _| {}); + build(|_, _| {}); } } } diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index 57082c4e99..06cb8fc55b 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -379,7 +379,7 @@ mod tests { COMPLEXTYPE3: ([u32;25]); } add_extra_genesis { - build(|_, _, _| {}); + build(|_, _| {}); } } @@ -755,7 +755,7 @@ mod test2 { add_extra_genesis { config(_marker) : ::std::marker::PhantomData; config(extra_field) : u32 = 32; - build(|_, _, _| {}); + build(|_, _| {}); } } diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs index 0b16db3de7..9c770075c4 100644 --- a/srml/support/test/tests/final_keys.rs +++ b/srml/support/test/tests/final_keys.rs @@ -53,7 +53,7 @@ impl Trait for Test { } fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::::default().build_storage().unwrap().0.into() + GenesisConfig::::default().build_storage().unwrap().into() } #[test] diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 55bbc73807..440fb9e779 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -75,7 +75,7 @@ mod module1 { add_extra_genesis { config(test) : T::BlockNumber; - build(|_, _, config: &Self| { + build(|_, config: &Self| { println!("{}", config.test); }); } @@ -299,7 +299,7 @@ fn new_test_ext() -> runtime_io::TestExternalities { }), module2_Instance2: None, module2_Instance3: None, - }.build_storage().unwrap().0.into() + }.build_storage().unwrap().into() } #[test] diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index 8b67ba50bd..521123118d 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -82,7 +82,7 @@ impl module::Trait for Runtime { } fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().into() } fn deposit_events(n: usize) { diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 571ec6ad6c..eb4c4a907a 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -411,17 +411,16 @@ decl_storage! { config(code): Vec; build( - |storage: &mut sr_primitives::StorageOverlay, - _: &mut sr_primitives::ChildrenStorageOverlay, + |storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig| { use codec::Encode; - storage.insert(well_known_keys::CODE.to_vec(), config.code.clone()); - storage.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode()); + storage.0.insert(well_known_keys::CODE.to_vec(), config.code.clone()); + storage.0.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode()); if let Some(ref changes_trie_config) = config.changes_trie_config { - storage.insert( + storage.0.insert( well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), changes_trie_config.encode()); } @@ -683,11 +682,11 @@ impl Module { /// Get the basic externalities for this module, useful for tests. #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { - TestExternalities::new(map![ + TestExternalities::new((map![ twox_128(&>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(), twox_128(>::key()).to_vec() => T::BlockNumber::one().encode(), twox_128(>::key()).to_vec() => [69u8; 32].encode() - ]) + ], map![])) } /// Set the block number to something in particular. Can be used as an alternative to @@ -803,13 +802,15 @@ impl Module { /// To be called immediately after `note_applied_extrinsic` of the last extrinsic of the block /// has been called. pub fn note_finished_extrinsics() { - let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX).unwrap_or_default(); + let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX) + .unwrap_or_default(); ExtrinsicCount::put(extrinsic_index); } /// Remove all extrinsic data and save the extrinsics trie root. pub fn derive_extrinsics() { - let extrinsics = (0..ExtrinsicCount::get().unwrap_or_default()).map(ExtrinsicData::take).collect(); + let extrinsics = (0..ExtrinsicCount::get().unwrap_or_default()) + .map(ExtrinsicData::take).collect(); let xts_root = extrinsics_data_root::(extrinsics); >::put(xts_root); } @@ -1127,7 +1128,7 @@ mod tests { const CALL: &::Call = &(); fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::default().build_storage::().unwrap().0.into() + GenesisConfig::default().build_storage::().unwrap().into() } fn normal_weight_limit() -> Weight { diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 1b52252618..bef2e2b876 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -384,7 +384,7 @@ mod tests { #[test] fn timestamp_works() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); assert_eq!(Timestamp::now(), 69); @@ -395,7 +395,7 @@ mod tests { #[should_panic(expected = "Timestamp must be updated only once in the block")] fn double_timestamp_should_fail() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); let _ = Timestamp::dispatch(Call::set(70), Origin::NONE); @@ -406,7 +406,7 @@ mod tests { #[should_panic(expected = "Timestamp must increment by at least between sequential blocks")] fn block_period_minimum_enforced() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); let _ = Timestamp::dispatch(Call::set(46), Origin::NONE); }); diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 0183fcd899..21c670e152 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -439,11 +439,11 @@ mod tests { type Treasury = Module; fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig::{ + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + balances::GenesisConfig::{ balances: vec![(0, 100), (1, 99), (2, 1)], vesting: vec![], - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } -- GitLab From 35128f745f39a0fa24bfc6f5f26f8d12b2be1edd Mon Sep 17 00:00:00 2001 From: Logan Saether Date: Thu, 8 Aug 2019 15:08:14 +0200 Subject: [PATCH 118/151] Fix documentation set_controller (#3340) The documentation for the `set_controller` function was copied from the function above it, however it does not do the same thing. Fixed the documentation to fit the correct description of what `set_controller` does. --- srml/staking/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index e8fd4501a9..0d2ba102d1 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -952,7 +952,7 @@ decl_module! { >::insert(stash, payee); } - /// (Re-)set the payment target for a controller. + /// (Re-)set the controller of a stash. /// /// Effects will be felt at the beginning of the next era. /// -- GitLab From a8449beb14a51a46fb38142892d722ec08479d22 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 8 Aug 2019 16:14:30 +0200 Subject: [PATCH 119/151] Service various cleanups (#3238) * Remove generic from sign() * Remove mandatory RuntimeGenesis trait req * Remove requirement from Configuration * Relax trait bounds of core/cli * Move method * The config field is no longer public * Remove Components from bounds of functions * Implement DerefMut for LightComponents * Implement Executor for Full/LightComponents * Fix bad merge * Fix forgotten config() * Fix build --- core/cli/src/lib.rs | 72 ++++++++++++++------------- core/service/src/chain_spec.rs | 4 +- core/service/src/components.rs | 26 ++++++++++ core/service/src/lib.rs | 89 ++++++++++++++++++++-------------- node-template/src/service.rs | 4 +- node/cli/src/factory_impl.rs | 6 +-- node/cli/src/lib.rs | 2 +- node/cli/src/service.rs | 18 +++---- 8 files changed, 133 insertions(+), 88 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 564065e0a6..be1db4f931 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -27,6 +27,7 @@ pub mod informant; use client::ExecutionStrategies; use service::{ + config::Configuration, ServiceFactory, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, PruningMode, ChainSpec, }; @@ -220,17 +221,17 @@ where fdlimit::raise_fd_limit(); match cli_args { - params::CoreParams::Run(params) => run_node::( + params::CoreParams::Run(params) => run_node( params, spec_factory, exit, run_service, impl_name, version, ).map(|_| None), params::CoreParams::BuildSpec(params) => - build_spec::(params, spec_factory, version).map(|_| None), + build_spec(params, spec_factory, version).map(|_| None), params::CoreParams::ExportBlocks(params) => export_blocks::(params, spec_factory, exit, version).map(|_| None), params::CoreParams::ImportBlocks(params) => import_blocks::(params, spec_factory, exit, version).map(|_| None), params::CoreParams::PurgeChain(params) => - purge_chain::(params, spec_factory, version).map(|_| None), + purge_chain(params, spec_factory, version).map(|_| None), params::CoreParams::Revert(params) => revert_chain::(params, spec_factory, version).map(|_| None), params::CoreParams::Custom(params) => Ok(Some(params)), @@ -292,8 +293,8 @@ fn parse_ed25519_secret(hex: &String) -> error::Result( - options: &mut FactoryFullConfiguration, +fn fill_transaction_pool_configuration( + options: &mut Configuration, params: TransactionPoolParams, ) -> error::Result<()> { // ready queue @@ -384,12 +385,13 @@ fn fill_config_keystore_password( Ok(()) } -fn create_run_node_config( +fn create_run_node_config( cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo -) -> error::Result> +) -> error::Result> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, + C: Default, + G: RuntimeGenesis, + S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(&cli.shared_params, spec_factory)?; let mut config = service::Configuration::default_with_spec(spec.clone()); @@ -471,7 +473,7 @@ where is_dev, )?; - fill_transaction_pool_configuration::(&mut config, cli.pool_config)?; + fill_transaction_pool_configuration(&mut config, cli.pool_config)?; config.dev_key_seed = cli.keyring.account .map(|a| format!("//{}", a)).or_else(|| { @@ -516,7 +518,7 @@ where Ok(config) } -fn run_node( +fn run_node( cli: MergeParameters, spec_factory: S, exit: E, @@ -526,12 +528,13 @@ fn run_node( ) -> error::Result<()> where RP: StructOpt + Clone, - F: ServiceFactory, + C: Default, + G: RuntimeGenesis, E: IntoExit, - S: FnOnce(&str) -> Result>>, String>, - RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, + S: FnOnce(&str) -> Result>, String>, + RS: FnOnce(E, RunCmd, RP, Configuration) -> Result<(), String>, { - let config = create_run_node_config::(cli.left.clone(), spec_factory, impl_name, version)?; + let config = create_run_node_config(cli.left.clone(), spec_factory, impl_name, version)?; run_service(exit, cli.left, cli.right, config).map_err(Into::into) } @@ -544,13 +547,13 @@ where // 9803-9874 Unassigned // 9926-9949 Unassigned -fn with_default_boot_node( - spec: &mut ChainSpec>, +fn with_default_boot_node( + spec: &mut ChainSpec, cli: BuildSpecCmd, version: &VersionInfo, ) -> error::Result<()> where - F: ServiceFactory + G: RuntimeGenesis { if spec.boot_nodes().is_empty() { let base_path = base_path(&cli.shared_params, version); @@ -568,20 +571,20 @@ where Ok(()) } -fn build_spec( +fn build_spec( cli: BuildSpecCmd, spec_factory: S, version: &VersionInfo, ) -> error::Result<()> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, + G: RuntimeGenesis, + S: FnOnce(&str) -> Result>, String>, { info!("Building chain spec"); let raw_output = cli.raw; let mut spec = load_spec(&cli.shared_params, spec_factory)?; - with_default_boot_node::(&mut spec, cli, version)?; - let json = service::chain_ops::build_spec::>(spec, raw_output)?; + with_default_boot_node(&mut spec, cli, version)?; + let json = service::chain_ops::build_spec(spec, raw_output)?; print!("{}", json); @@ -589,12 +592,13 @@ where } /// Creates a configuration including the database path. -pub fn create_config_with_db_path( +pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, -) -> error::Result> +) -> error::Result> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, + C: Default, + G: RuntimeGenesis, + S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(cli, spec_factory)?; let base_path = base_path(cli, version); @@ -616,7 +620,7 @@ where E: IntoExit, S: FnOnce(&str) -> Result>>, String>, { - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; + let config = create_config_with_db_path(spec_factory, &cli.shared_params, version)?; info!("DB path: {}", config.database_path.display()); let from = cli.from.unwrap_or(1); @@ -649,7 +653,7 @@ where E: IntoExit, S: FnOnce(&str) -> Result>>, String>, { - let mut config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; + let mut config = create_config_with_db_path(spec_factory, &cli.shared_params, version)?; config.execution_strategies = ExecutionStrategies { importing: cli.execution.into(), other: cli.execution.into(), @@ -679,21 +683,21 @@ where F: ServiceFactory, S: FnOnce(&str) -> Result>>, String>, { - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; + let config = create_config_with_db_path(spec_factory, &cli.shared_params, version)?; let blocks = cli.num; Ok(service::chain_ops::revert_chain::(config, blocks.into())?) } -fn purge_chain( +fn purge_chain( cli: PurgeChainCmd, spec_factory: S, version: &VersionInfo, ) -> error::Result<()> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, + G: RuntimeGenesis, + S: FnOnce(&str) -> Result>, String>, { - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; + let config = create_config_with_db_path::<(), _, _>(spec_factory, &cli.shared_params, version)?; let db_path = config.database_path; if cli.yes == false { diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index bae353ceb9..8d84b4880c 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -127,7 +127,7 @@ impl Clone for ChainSpec { } } -impl ChainSpec { +impl ChainSpec { /// A list of bootnode addresses. pub fn boot_nodes(&self) -> &[String] { &self.spec.boot_nodes @@ -215,7 +215,9 @@ impl ChainSpec { genesis: GenesisSource::Factory(constructor), } } +} +impl ChainSpec { /// Dump to json string. pub fn to_json(self, raw: bool) -> Result { #[derive(Serialize, Deserialize)] diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 2ca99e0b31..fb869df020 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -506,6 +506,16 @@ impl Future for FullComponents { } } +impl Executor + Send>> +for FullComponents { + fn execute( + &self, + future: Box + Send> + ) -> Result<(), futures::future::ExecuteError + Send>>> { + self.service.execute(future) + } +} + impl Components for FullComponents { type Factory = Factory; type Executor = FullExecutor; @@ -606,6 +616,12 @@ impl Deref for LightComponents { } } +impl DerefMut for LightComponents { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.service + } +} + impl Future for LightComponents { type Item = (); type Error = (); @@ -615,6 +631,16 @@ impl Future for LightComponents { } } +impl Executor + Send>> +for LightComponents { + fn execute( + &self, + future: Box + Send> + ) -> Result<(), futures::future::ExecuteError + Send>>> { + self.service.execute(future) + } +} + impl Components for LightComponents { type Factory = Factory; type Executor = LightExecutor; diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 8b8c0893d3..2940bde7cf 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -93,7 +93,7 @@ pub struct Service { /// The elements must then be polled manually. to_poll: Vec + Send>>, /// Configuration of this Service - pub config: FactoryFullConfiguration, + config: FactoryFullConfiguration, rpc_handlers: rpc::RpcHandler, _rpc: Box, _telemetry: Option, @@ -149,13 +149,6 @@ pub struct TelemetryOnConnect { } impl Service { - /// Get event stream for telemetry connection established events. - pub fn telemetry_on_connect_stream(&self) -> TelemetryOnConnectNotifications { - let (sink, stream) = mpsc::unbounded(); - self._telemetry_on_connect_sinks.lock().push(sink); - stream - } - /// Creates a new service. pub fn new( mut config: FactoryFullConfiguration, @@ -200,7 +193,7 @@ impl Service { let transaction_pool = Arc::new( Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? ); - let transaction_pool_adapter = Arc::new(TransactionPoolAdapter:: { + let transaction_pool_adapter = Arc::new(TransactionPoolAdapter { imports_external_transactions: !config.roles.is_light(), pool: transaction_pool.clone(), client: client.clone(), @@ -383,9 +376,9 @@ impl Service { ) }; let rpc_handlers = gen_handler(); - let rpc = start_rpc_servers::(&config, gen_handler)?; + let rpc = start_rpc_servers(&config, gen_handler)?; - let _ = to_spawn_tx.unbounded_send(Box::new(build_network_future::( + let _ = to_spawn_tx.unbounded_send(Box::new(build_network_future( network_mut, client.clone(), network_status_sinks.clone(), @@ -460,6 +453,27 @@ impl Service { }) } + /// Returns a reference to the config passed at initialization. + pub fn config(&self) -> &FactoryFullConfiguration { + &self.config + } + + /// Returns a reference to the config passed at initialization. + /// + /// > **Note**: This method is currently necessary because we extract some elements from the + /// > configuration at the end of the service initialization. It is intended to be + /// > removed. + pub fn config_mut(&mut self) -> &mut FactoryFullConfiguration { + &mut self.config + } + + /// Get event stream for telemetry connection established events. + pub fn telemetry_on_connect_stream(&self) -> TelemetryOnConnectNotifications { + let (sink, stream) = mpsc::unbounded(); + self._telemetry_on_connect_sinks.lock().push(sink); + stream + } + /// Return a shared instance of Telemetry (if enabled) pub fn telemetry(&self) -> Option { self._telemetry.as_ref().map(|t| t.clone()) @@ -577,14 +591,15 @@ impl Executor + Send>> /// /// The `status_sink` contain a list of senders to send a periodic network status to. fn build_network_future< - Components: components::Components, - S: network::specialization::NetworkSpecialization>, + B: BlockT, + C: client::BlockchainEvents, + S: network::specialization::NetworkSpecialization, H: network::ExHashT > ( - mut network: network::NetworkWorker, S, H>, - client: Arc>, - status_sinks: Arc>, NetworkState)>>>>, - rpc_rx: futures03::channel::mpsc::UnboundedReceiver>>, + mut network: network::NetworkWorker, + client: Arc, + status_sinks: Arc, NetworkState)>>>>, + rpc_rx: futures03::channel::mpsc::UnboundedReceiver>, should_have_peers: bool, ) -> impl Future { // Compatibility shim while we're transitionning to stable Futures. @@ -710,8 +725,8 @@ impl Drop for Service where Components: components::Comp /// Starts RPC servers that run in their own thread, and returns an opaque object that keeps them alive. #[cfg(not(target_os = "unknown"))] -fn start_rpc_servers rpc::RpcHandler>( - config: &FactoryFullConfiguration, +fn start_rpc_servers rpc::RpcHandler>( + config: &Configuration, mut gen_handler: H ) -> Result, error::Error> { fn maybe_start_server(address: Option, mut start: F) -> Result, io::Error> @@ -751,8 +766,8 @@ fn start_rpc_servers rpc::RpcHandler>( /// Starts RPC servers that run in their own thread, and returns an opaque object that keeps them alive. #[cfg(target_os = "unknown")] -fn start_rpc_servers rpc::RpcHandler>( - _: &FactoryFullConfiguration, +fn start_rpc_servers rpc::RpcHandler>( + _: &Configuration, _: H ) -> Result, error::Error> { Ok(Box::new(())) @@ -779,16 +794,10 @@ impl RpcSession { } /// Transaction pool adapter. -pub struct TransactionPoolAdapter { +pub struct TransactionPoolAdapter { imports_external_transactions: bool, - pool: Arc>, - client: Arc>, -} - -impl TransactionPoolAdapter { - fn best_block_id(&self) -> Option>> { - Some(BlockId::hash(self.client.info().chain.best_hash)) - } + pool: Arc

, + client: Arc, } /// Get transactions for propagation. @@ -812,14 +821,20 @@ where .collect() } -impl network::TransactionPool, ComponentBlock> for - TransactionPoolAdapter where ::RuntimeApi: Send + Sync +impl network::TransactionPool for + TransactionPoolAdapter> +where + C: network::ClientHandle + Send + Sync, + PoolApi: ChainApi, + B: BlockT, + H: std::hash::Hash + Eq + sr_primitives::traits::Member + serde::Serialize, + E: txpool::error::IntoPoolError + From, { - fn transactions(&self) -> Vec<(ComponentExHash, ComponentExtrinsic)> { + fn transactions(&self) -> Vec<(H, ::Extrinsic)> { transactions_to_propagate(&self.pool) } - fn import(&self, transaction: &ComponentExtrinsic) -> Option> { + fn import(&self, transaction: &::Extrinsic) -> Option { if !self.imports_external_transactions { debug!("Transaction rejected"); return None; @@ -828,12 +843,12 @@ impl network::TransactionPool, ComponentBlock< let encoded = transaction.encode(); match Decode::decode(&mut &encoded[..]) { Ok(uxt) => { - let best_block_id = self.best_block_id()?; + let best_block_id = BlockId::hash(self.client.info().chain.best_hash); match self.pool.submit_one(&best_block_id, uxt) { Ok(hash) => Some(hash), Err(e) => match e.into_pool_error() { Ok(txpool::error::Error::AlreadyImported(hash)) => { - hash.downcast::>().ok() + hash.downcast::().ok() .map(|x| x.as_ref().clone()) }, Ok(e) => { @@ -854,7 +869,7 @@ impl network::TransactionPool, ComponentBlock< } } - fn on_broadcasted(&self, propagations: HashMap, Vec>) { + fn on_broadcasted(&self, propagations: HashMap>) { self.pool.on_broadcasted(propagations) } } diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 31323e11ad..e903f1150b 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -83,8 +83,8 @@ construct_service_factory! { client, proposer, service.network(), - service.config.custom.inherent_data_providers.clone(), - service.config.force_authoring, + service.config().custom.inherent_data_providers.clone(), + service.config().force_authoring, )?; service.spawn_task(Box::new(aura.select(service.on_exit()).then(|_| Ok(())))); } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index 41ac992abb..6e72ff08c1 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -26,10 +26,8 @@ use keyring::sr25519::Keyring; use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall, ExistentialDeposit}; use primitives::{sr25519, crypto::Pair}; use sr_primitives::{generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension}}; -use substrate_service::ServiceFactory; use transaction_factory::RuntimeAdapter; use transaction_factory::modes::Mode; -use crate::service; use inherents::InherentData; use timestamp; use finality_tracker; @@ -140,7 +138,7 @@ impl RuntimeAdapter for FactoryState { let index = self.extract_index(&sender, prior_block_hash); let phase = self.extract_phase(*prior_block_hash); - sign::(CheckedExtrinsic { + sign::(CheckedExtrinsic { signed: Some((sender.clone(), Self::build_extra(index, phase))), function: Call::Balances( BalancesCall::transfer( @@ -233,7 +231,7 @@ fn gen_seed_bytes(seed: u64) -> [u8; 32] { /// Creates an `UncheckedExtrinsic` containing the appropriate signature for /// a `CheckedExtrinsics`. -fn sign( +fn sign( xt: CheckedExtrinsic, key: &sr25519::Pair, additional_signed: ::AdditionalSigned, diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index adf9d81fa7..71cb19001d 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -186,7 +186,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul match &ret { Ok(Some(CustomSubcommands::Factory(cli_args))) => { - let mut config = cli::create_config_with_db_path::( + let mut config = cli::create_config_with_db_path( load_spec, &cli_args.shared_params, &version, diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 0fc97e99d5..e69e0ce233 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -99,11 +99,11 @@ construct_service_factory! { FullComponents::::new(config) }, AuthoritySetup = { |mut service: Self::FullService| { - let (block_import, link_half, babe_link) = service.config.custom.import_setup.take() + let (block_import, link_half, babe_link) = service.config_mut().custom.import_setup.take() .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); // spawn any futures that were created in the previous setup steps - if let Some(tasks) = service.config.custom.tasks_to_spawn.take() { + if let Some(tasks) = service.config_mut().custom.tasks_to_spawn.take() { for task in tasks { service.spawn_task( task.select(service.on_exit()) @@ -129,8 +129,8 @@ construct_service_factory! { block_import, env: proposer, sync_oracle: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), - force_authoring: service.config.force_authoring, + inherent_data_providers: service.config().custom.inherent_data_providers.clone(), + force_authoring: service.config().force_authoring, time_source: babe_link, }; @@ -142,12 +142,12 @@ construct_service_factory! { // FIXME #1578 make this available through chainspec gossip_duration: Duration::from_millis(333), justification_period: 4096, - name: Some(service.config.name.clone()), + name: Some(service.config().name.clone()), keystore: Some(service.keystore()), }; - if !service.config.disable_grandpa { - if service.config.roles.is_authority() { + if !service.config().disable_grandpa { + if service.config().roles.is_authority() { let telemetry_on_connect = TelemetryOnConnect { telemetry_connection_sinks: service.telemetry_on_connect_stream(), }; @@ -155,7 +155,7 @@ construct_service_factory! { config: config, link: link_half, network: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + inherent_data_providers: service.config().custom.inherent_data_providers.clone(), on_exit: service.on_exit(), telemetry_on_connect: Some(telemetry_on_connect), }; @@ -331,7 +331,7 @@ mod tests { let block_factory = |service: &SyncService<::FullService>| { let service = service.get(); let mut inherent_data = service - .config + .config() .custom .inherent_data_providers .create_inherent_data() -- GitLab From c72789cc38cc2df9c4c1575121101f4afbb9db26 Mon Sep 17 00:00:00 2001 From: David Craven Date: Thu, 8 Aug 2019 16:31:50 +0200 Subject: [PATCH 120/151] Remove Decode trait bound. (#3342) --- core/sr-primitives/src/traits.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 7272bd3488..9c6954db28 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -398,7 +398,7 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup fn hash(s: &[u8]) -> Self::Output; /// Produce the hash of some codec-encodable value. - fn hash_of(s: &S) -> Self::Output { + fn hash_of(s: &S) -> Self::Output { Encode::using_encoded(s, Self::hash) } -- GitLab From 360c0ff78cdcc1c3adac39f337ef2fc07a49ced9 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 8 Aug 2019 18:10:32 +0200 Subject: [PATCH 121/151] Fixed warnings (#3345) --- core/cli/src/execution_strategy.rs | 35 ++++++++++++++++++++++++++++++ core/cli/src/lib.rs | 1 + core/cli/src/params.rs | 18 ++------------- core/client/src/genesis.rs | 2 -- 4 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 core/cli/src/execution_strategy.rs diff --git a/core/cli/src/execution_strategy.rs b/core/cli/src/execution_strategy.rs new file mode 100644 index 0000000000..bd3030906e --- /dev/null +++ b/core/cli/src/execution_strategy.rs @@ -0,0 +1,35 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +#![allow(missing_docs)] + +use structopt::clap::{arg_enum, _clap_count_exprs}; + +arg_enum! { + /// How to execute blocks + #[derive(Debug, Clone, Copy)] + pub enum ExecutionStrategy { + // Execute with native build (if available, WebAssembly otherwise). + Native, + // Only execute with the WebAssembly build. + Wasm, + // Execute with both native (where available) and WebAssembly builds. + Both, + // Execute with the native build if possible; if it fails, then execute with WebAssembly. + NativeElseWasm, + } +} + diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index be1db4f931..7dc9519fa8 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -22,6 +22,7 @@ #[macro_use] mod traits; mod params; +mod execution_strategy; pub mod error; pub mod informant; diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 702416aa0c..e3fa04c936 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -20,6 +20,8 @@ use std::path::PathBuf; use structopt::{StructOpt, clap::{arg_enum, _clap_count_exprs, App, AppSettings, SubCommand, Arg}}; use client; +pub use crate::execution_strategy::ExecutionStrategy; + /// Auxiliary macro to implement `GetLogFilter` for all types that have the `shared_params` field. macro_rules! impl_get_log_filter { ( $type:ident ) => { @@ -31,22 +33,6 @@ macro_rules! impl_get_log_filter { } } -arg_enum! { - /// How to execute blocks - #[allow(missing_docs)] - #[derive(Debug, Clone, Copy)] - pub enum ExecutionStrategy { - // Execute with native build (if available, WebAssembly otherwise). - Native, - // Only execute with the WebAssembly build. - Wasm, - // Execute with both native (where available) and WebAssembly builds. - Both, - // Execute with the native build if possible; if it fails, then execute with WebAssembly. - NativeElseWasm, - } -} - impl Into for ExecutionStrategy { fn into(self) -> client::ExecutionStrategy { match self { diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index f02be3116a..3ac93f4f57 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -39,7 +39,6 @@ pub fn construct_genesis_block< #[cfg(test)] mod tests { - use super::*; use codec::{Encode, Decode, Joiner}; use executor::native_executor_instance; use state_machine::{self, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage}; @@ -49,7 +48,6 @@ mod tests { runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, AccountKeyring, Sr25519Keyring, }; - use sr_primitives::traits::BlakeTwo256; use primitives::Blake2Hasher; use hex::*; -- GitLab From 76d47365541549048018453293fe1a4371f260d1 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 8 Aug 2019 23:05:03 +0200 Subject: [PATCH 122/151] remove unneeded as_ref call (#3349) --- core/trie/src/node_codec.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/trie/src/node_codec.rs b/core/trie/src/node_codec.rs index 950f0c726f..03cbdfce52 100644 --- a/core/trie/src/node_codec.rs +++ b/core/trie/src/node_codec.rs @@ -172,7 +172,7 @@ impl NodeCodecT for NodeCodec { None => false, }), bitmap.as_mut()); output[bitmap_index..bitmap_index + BITMAP_LENGTH] - .copy_from_slice(&bitmap.as_ref()[..BITMAP_LENGTH]); + .copy_from_slice(&bitmap[..BITMAP_LENGTH]); output } -- GitLab From 8b96ce62da9c88afbd13405396d1cc8588be67a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 9 Aug 2019 00:53:54 +0100 Subject: [PATCH 123/151] grandpa: fix --no-grandpa flag breaking block production (#3350) --- core/finality-grandpa/src/lib.rs | 2 +- node/cli/src/service.rs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 474d0ae24b..73368a52d8 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -444,7 +444,7 @@ fn global_communication, B, E, N, RA>( /// Register the finality tracker inherent data provider (which is used by /// GRANDPA), if not registered already. -fn register_finality_tracker_inherent_data_provider, RA>( +pub fn register_finality_tracker_inherent_data_provider, RA>( client: Arc>, inherent_data_providers: &InherentDataProviders, ) -> Result<(), consensus_common::Error> where diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index e69e0ce233..554d3a16b6 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -170,6 +170,14 @@ construct_service_factory! { } } + // regardless of whether grandpa is started or not, when + // authoring blocks we expect inherent data regarding what our + // last finalized block is, to be available. + grandpa::register_finality_tracker_inherent_data_provider( + service.client(), + &service.config().custom.inherent_data_providers, + )?; + Ok(service) } }, -- GitLab From 85ee19a82e7b3b37c985ae8188a45860d584f252 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 9 Aug 2019 13:43:32 +0200 Subject: [PATCH 124/151] Introduce AppVerify (#3343) This trait, which works just like `Verify`, except on AppKey types. I'd like for it all just to be `Verify`, but Rust's trait rules concerning upstream changes mean it can't happen. This is a simple workaround needed for some stuff in Polkadot. --- core/sr-primitives/src/traits.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 9c6954db28..7370a5074f 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -35,6 +35,7 @@ use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign, Shl, Shr }; +use crate::AppKey; /// A lazy value. pub trait Lazy { @@ -70,6 +71,28 @@ impl Verify for primitives::sr25519::Signature { } } +/// Means of signature verification of an application key. +pub trait AppVerify { + /// Type of the signer. + type Signer; + /// Verify a signature. Return `true` if signature is valid for the value. + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; +} + +impl< + S: Verify::Public as app_crypto::AppPublic>::Generic> + From, + T: app_crypto::Wraps + app_crypto::AppKey + app_crypto::AppSignature + + AsRef + AsMut + From, +> AppVerify for T { + type Signer = ::Public; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { + use app_crypto::IsWrappedBy; + let inner: &S = self.as_ref(); + let inner_pubkey = ::Generic::from_ref(&signer); + Verify::verify(inner, msg, inner_pubkey) + } +} + /// Some sort of check on the origin is performed by this object. pub trait EnsureOrigin { /// A return type. -- GitLab From 1c260fbea808fe57bf375637b1651ae36ac512ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 9 Aug 2019 12:46:54 +0100 Subject: [PATCH 125/151] grandpa: fix catch up test (#3347) --- core/finality-grandpa/src/tests.rs | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 7c2b024f5c..bbaae1e9b7 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -1509,35 +1509,35 @@ fn voter_catches_up_to_latest_round_when_behind() { wait_for_finality.and_then(move |_| { let peer_id = 2; - let (client, link) = { + let link = { let net = net.lock(); - let link = net.peers[peer_id].data.lock().take().expect("link initialized at startup; qed"); - ( - net.peers[peer_id].client().clone(), - link, - ) + let mut link = net.peers[peer_id].data.lock(); + link.take().expect("link initialized at startup; qed") }; let set_state = link.persistent_data.set_state.clone(); - let wait = client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &50)) - .collect() - .map(|_| set_state); - let voter = voter(None, peer_id, link, net); runtime.spawn(voter).unwrap(); - wait + let start_time = std::time::Instant::now(); + let timeout = Duration::from_secs(5 * 60); + let wait_for_catch_up = futures::future::poll_fn(move || { + // The voter will start at round 1 and since everyone else is + // already at a later round the only way to get to round 4 (or + // later) is by issuing a catch up request. + if set_state.read().last_completed_round().number >= 4 { + Ok(Async::Ready(())) + } else if start_time.elapsed() > timeout { + panic!("Timed out while waiting for catch up to happen") + } else { + Ok(Async::NotReady) + } + }); + + wait_for_catch_up }) - .and_then(|set_state| { - // the last completed round in the new voter is higher than 4 - // which means it caught up to the voters - assert!(set_state.read().last_completed_round().number >= 4); - Ok(()) - }) }; let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); -- GitLab From bc08fe0b588a96f780e2f48cfdc01dd64f2ac408 Mon Sep 17 00:00:00 2001 From: TriplEight Date: Fri, 9 Aug 2019 14:07:41 +0200 Subject: [PATCH 126/151] Check for warnings (#2850) * check for warnings * test run * prebuild wasm binaries, pre-test is not needed for now * will run everywhere but PRs * lost warnings * lost warnings * try warnings with tests * Update expected stderr in UI tests * added to RUSTFLAGS * another way of collecting warnings * bump impl_version * fix int tests parser * revert demis changes and impl version bump * no need to collect warnings in int test --- .gitlab-ci.yml | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bd0fd9f08f..7889b52afa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -121,8 +121,17 @@ test-linux-stable: &test-linux variables: - $DEPLOY_TAG script: - - time cargo test --all --release --verbose --locked + - time cargo test --all --release --verbose --locked | + tee output.log - sccache -s + after_script: + - echo "___Collecting warnings for check_warnings job___" + - awk '/^warning:/,/^$/ { print }' output.log > ${CI_COMMIT_SHORT_SHA}_warnings.log + artifacts: + name: $CI_COMMIT_SHORT_SHA + expire_in: 24 hrs + paths: + - ${CI_COMMIT_SHORT_SHA}_warnings.log test-srml-staking: &test-srml-staking @@ -165,7 +174,7 @@ test-linux-stable-int: &> ${CI_COMMIT_SHORT_SHA}_int_failure.log - sccache -s after_script: - - awk '/FAILED/,0' ${CI_COMMIT_SHORT_SHA}_int_failure.log + - awk '/FAILED|^error\[/,0' ${CI_COMMIT_SHORT_SHA}_int_failure.log artifacts: name: $CI_COMMIT_SHORT_SHA when: on_failure @@ -281,6 +290,25 @@ build-rust-doc-release: - echo "" > ./crate-docs/index.html - sccache -s +check_warnings: + stage: build + <<: *docker-env + except: + variables: + - $DEPLOY_TAG + variables: + GIT_STRATEGY: none + dependencies: + - test-linux-stable + script: + - if [ -s ${CI_COMMIT_SHORT_SHA}_warnings.log ]; then + cat ${CI_COMMIT_SHORT_SHA}_warnings.log; + exit 1; + else + echo "___No warnings___"; + fi + allow_failure: true + #### stage: publish .publish-docker-release: &publish-docker-release -- GitLab From 14a70910ac77c2f4d76d8f132213c84f94f98c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 9 Aug 2019 14:24:18 +0200 Subject: [PATCH 127/151] Adds `--no-validator` CLI flag (#3348) * Implement `is_validator` for offchain-workers * Introduce `--no-validator` flag * Don't run babe/grandpa/im-online when `--no-validator` is given * Fixes compilation * Bump spec version * Improve error handling in executor * Add missing extern function * Revert making error public * Remove `--no-validator` CLI --- core/cli/src/lib.rs | 4 ++-- core/executor/src/error.rs | 4 ++-- core/executor/src/native_executor.rs | 12 +++++++++--- core/executor/src/wasm_executor.rs | 7 +++++++ core/executor/src/wasm_runtimes_cache.rs | 4 ++-- core/offchain/src/api.rs | 15 +++++++++++++-- core/offchain/src/lib.rs | 8 ++++---- core/offchain/src/testing.rs | 4 ++++ core/primitives/src/offchain.rs | 9 +++++++++ core/service/src/components.rs | 4 +++- core/service/src/lib.rs | 4 +++- core/sr-io/src/lib.rs | 5 +++++ core/sr-io/with_std.rs | 6 ++++++ core/sr-io/without_std.rs | 10 ++++++++++ core/state-machine/src/lib.rs | 4 ++++ node/cli/src/service.rs | 16 ++++++++-------- node/runtime/src/lib.rs | 4 ++-- srml/im-online/src/lib.rs | 5 ++++- 18 files changed, 97 insertions(+), 28 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 7dc9519fa8..297896bf83 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -436,6 +436,8 @@ where ), }; + let is_dev = cli.shared_params.dev; + let role = if cli.light { service::Roles::LIGHT } else { @@ -462,8 +464,6 @@ where config.roles = role; config.disable_grandpa = cli.no_grandpa; - let is_dev = cli.shared_params.dev; - let client_id = config.client_id(); fill_network_configuration( cli.network_config, diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index 7b8926d8e9..9bfa05ff5f 100644 --- a/core/executor/src/error.rs +++ b/core/executor/src/error.rs @@ -38,8 +38,8 @@ pub enum Error { #[display(fmt="Method not found: '{}'", _0)] MethodNotFound(String), /// Code is invalid (expected single byte) - #[display(fmt="Invalid Code")] - InvalidCode, + #[display(fmt="Invalid Code: {}", _0)] + InvalidCode(String), /// Could not get runtime version. #[display(fmt="On-chain runtime does not specify version")] VersionInvalid, diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 765b9f076e..937e003353 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -22,7 +22,7 @@ use runtime_version::{NativeVersion, RuntimeVersion}; use codec::{Decode, Encode}; use crate::RuntimeInfo; use primitives::{Blake2Hasher, NativeOrEncoded}; -use log::trace; +use log::{trace, warn}; use crate::RuntimesCache; @@ -107,8 +107,14 @@ impl RuntimeInfo for NativeExecutor { ) -> Option { RUNTIMES_CACHE.with(|cache| { let cache = &mut cache.borrow_mut(); - cache.fetch_runtime(&self.fallback, ext, self.default_heap_pages) - .ok()?.version().clone() + + match cache.fetch_runtime(&self.fallback, ext, self.default_heap_pages) { + Ok(runtime) => runtime.version(), + Err(e) => { + warn!(target: "executor", "Failed to fetch runtime: {:?}", e); + None + } + } }) } } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 73ee2c40d7..185aaba513 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -876,6 +876,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(0) }, + ext_is_validator() -> u32 => { + Ok(if runtime_io::is_validator() { + 1 + } else { + 0 + }) + }, ext_submit_transaction(msg_data: *const u8, len: u32) -> u32 => { let extrinsic = this.memory.get(msg_data, len as usize) .map_err(|_| "OOB while ext_submit_transaction: wasm")?; diff --git a/core/executor/src/wasm_runtimes_cache.rs b/core/executor/src/wasm_runtimes_cache.rs index 812638126d..110a28fe7d 100644 --- a/core/executor/src/wasm_runtimes_cache.rs +++ b/core/executor/src/wasm_runtimes_cache.rs @@ -248,12 +248,12 @@ impl RuntimesCache { ) -> Result, Error> { let code_hash = ext .original_storage_hash(well_known_keys::CODE) - .ok_or(Error::InvalidCode)?; + .ok_or(Error::InvalidCode("`CODE` not found in storage.".into()))?; // This is direct result from fighting with borrowck. let handle_result = |cached_result: &Result, CacheError>| match *cached_result { - Err(_) => Err(Error::InvalidCode), + Err(ref e) => Err(Error::InvalidCode(format!("{:?}", e))), Ok(ref cached_runtime) => Ok(Rc::clone(cached_runtime)), }; diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 468e98a566..225e7c3f72 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -47,11 +47,15 @@ pub(crate) struct Api { db: Storage, network_state: Arc, _at: BlockId, + /// Is this node a potential validator? + is_validator: bool, } fn unavailable_yet(name: &str) -> R { - error!("The {:?} API is not available for offchain workers yet. Follow \ - https://github.com/paritytech/substrate/issues/1458 for details", name); + error!( + "The {:?} API is not available for offchain workers yet. Follow \ + https://github.com/paritytech/substrate/issues/1458 for details", name + ); Default::default() } @@ -63,6 +67,10 @@ where Storage: OffchainStorage, Block: traits::Block, { + fn is_validator(&self) -> bool { + self.is_validator + } + fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { self.sender .unbounded_send(ExtMessage::SubmitExtrinsic(ext)) @@ -277,6 +285,7 @@ impl AsyncApi { db: S, at: BlockId, network_state: Arc, + is_validator: bool, ) -> (Api, AsyncApi) { let (sender, rx) = mpsc::unbounded(); @@ -285,6 +294,7 @@ impl AsyncApi { db, network_state, _at: at, + is_validator, }; let async_api = AsyncApi { @@ -362,6 +372,7 @@ mod tests { db, BlockId::Number(Zero::zero()), mock, + false, ) } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index 075a2bd837..b38b202c62 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -98,9 +98,8 @@ impl OffchainWorkers< number: &::Number, pool: &Arc>, network_state: Arc, - ) -> impl Future where - A: ChainApi + 'static, - { + is_validator: bool, + ) -> impl Future where A: ChainApi + 'static { let runtime = self.client.runtime_api(); let at = BlockId::number(*number); let has_api = runtime.has_api::>(&at); @@ -112,6 +111,7 @@ impl OffchainWorkers< self.db.clone(), at.clone(), network_state.clone(), + is_validator, ); debug!("Spawning offchain workers at {:?}", at); let number = *number; @@ -177,7 +177,7 @@ mod tests { // when let offchain = OffchainWorkers::new(client, db); - futures::executor::block_on(offchain.on_block_imported(&0u64, &pool, network_state)); + futures::executor::block_on(offchain.on_block_imported(&0u64, &pool, network_state, false)); // then assert_eq!(pool.status().ready, 1); diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs index e01e4f5f59..cdf2878c13 100644 --- a/core/offchain/src/testing.rs +++ b/core/offchain/src/testing.rs @@ -134,6 +134,10 @@ impl TestOffchainExt { } impl offchain::Externalities for TestOffchainExt { + fn is_validator(&self) -> bool { + unimplemented!("not needed in tests so far") + } + fn submit_transaction(&mut self, _ex: Vec) -> Result<(), ()> { unimplemented!("not needed in tests so far") } diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index 8ce5863e01..52dbf5fbee 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -232,6 +232,11 @@ impl Timestamp { /// An extended externalities for offchain workers. pub trait Externalities { + /// Returns if the local node is a potential validator. + /// + /// Even if this function returns `true`, it does not mean that any keys are configured + /// and that the validator is registered in the chain. + fn is_validator(&self) -> bool; /// Submit transaction. /// /// The transaction will end up in the pool and be propagated to others. @@ -349,6 +354,10 @@ pub trait Externalities { } impl Externalities for Box { + fn is_validator(&self) -> bool { + (& **self).is_validator() + } + fn submit_transaction(&mut self, ex: Vec) -> Result<(), ()> { (&mut **self).submit_transaction(ex) } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index fb869df020..76387e6c88 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -268,6 +268,7 @@ pub trait OffchainWorker { >, pool: &Arc>, network_state: &Arc, + is_validator: bool, ) -> error::Result + Send>>; } @@ -284,8 +285,9 @@ impl OffchainWorker for C where >, pool: &Arc>, network_state: &Arc, + is_validator: bool, ) -> error::Result + Send>> { - let future = offchain.on_block_imported(number, pool, network_state.clone()) + let future = offchain.on_block_imported(number, pool, network_state.clone(), is_validator) .map(|()| Ok(())); Ok(Box::new(Compat::new(future))) } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 2940bde7cf..3b2d73c124 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -153,7 +153,7 @@ impl Service { pub fn new( mut config: FactoryFullConfiguration, ) -> Result { - let (signal, exit) = ::exit_future::signal(); + let (signal, exit) = exit_future::signal(); // List of asynchronous tasks to spawn. We collect them, then spawn them all at once. let (to_spawn_tx, to_spawn_rx) = @@ -250,6 +250,7 @@ impl Service { let offchain = offchain_workers.as_ref().map(Arc::downgrade); let to_spawn_tx_ = to_spawn_tx.clone(); let network_state_info: Arc = network.clone(); + let is_validator = config.roles.is_authority(); let events = client.import_notification_stream() .map(|v| Ok::<_, ()>(v)).compat() @@ -270,6 +271,7 @@ impl Service { &offchain, &txpool, &network_state_info, + is_validator, ).map_err(|e| warn!("Offchain workers error processing new block: {:?}", e))?; let _ = to_spawn_tx_.unbounded_send(future); } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index cafdf8066e..425d9a714c 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -273,6 +273,11 @@ export_api! { export_api! { pub(crate) trait OffchainApi { + /// Returns if the local node is a potential validator. + /// + /// Even if this function returns `true`, it does not mean that any keys are configured + /// and that the validator is registered in the chain. + fn is_validator() -> bool; /// Submit transaction to the pool. /// /// The transaction will end up in the pool. diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index b1e55634fc..ec9d8f06f0 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -336,6 +336,12 @@ fn with_offchain(f: impl FnOnce(&mut dyn offchain::Externalities) -> R, msg: } impl OffchainApi for () { + fn is_validator() -> bool { + with_offchain(|ext| { + ext.is_validator() + }, "is_validator can be called only in the offchain worker context") + } + fn submit_transaction(data: &T) -> Result<(), ()> { with_offchain(|ext| { ext.submit_transaction(codec::Encode::encode(data)) diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 7d26d3d23b..118a91819a 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -432,6 +432,12 @@ pub mod ext { // Offchain-worker Context //================================ + /// Returns if the local node is a potential validator. + /// + /// - `1` == `true` + /// - `0` == `false` + fn ext_is_validator() -> u32; + /// Submit transaction. /// /// # Returns @@ -964,6 +970,10 @@ impl CryptoApi for () { } impl OffchainApi for () { + fn is_validator() -> bool { + unsafe { ext_is_validator.get()() == 1 } + } + fn submit_transaction(data: &T) -> Result<(), ()> { let encoded_data = codec::Encode::encode(data); let ret = unsafe { diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index bd46e0935b..8c2046e591 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -263,6 +263,10 @@ impl NeverOffchainExt { } impl offchain::Externalities for NeverOffchainExt { + fn is_validator(&self) -> bool { + unreachable!() + } + fn submit_transaction(&mut self, _extrinsic: Vec) -> Result<(), ()> { unreachable!() } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 554d3a16b6..813d23393b 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -138,15 +138,15 @@ construct_service_factory! { let select = babe.select(service.on_exit()).then(|_| Ok(())); service.spawn_task(Box::new(select)); - let config = grandpa::Config { - // FIXME #1578 make this available through chainspec - gossip_duration: Duration::from_millis(333), - justification_period: 4096, - name: Some(service.config().name.clone()), - keystore: Some(service.keystore()), - }; - if !service.config().disable_grandpa { + let config = grandpa::Config { + // FIXME #1578 make this available through chainspec + gossip_duration: Duration::from_millis(333), + justification_period: 4096, + name: Some(service.config().name.clone()), + keystore: Some(service.keystore()), + }; + if service.config().roles.is_authority() { let telemetry_on_connect = TelemetryOnConnect { telemetry_connection_sinks: service.telemetry_on_connect_stream(), diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 653c0858ff..8b6b4d55bd 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 136, - impl_version: 136, + spec_version: 137, + impl_version: 137, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs index 23345ea974..eff811d6ca 100644 --- a/srml/im-online/src/lib.rs +++ b/srml/im-online/src/lib.rs @@ -219,7 +219,10 @@ decl_module! { // Runs after every block. fn offchain_worker(now: T::BlockNumber) { - Self::offchain(now); + // Only send messages if we are a potential validator. + if sr_io::is_validator() { + Self::offchain(now); + } } } } -- GitLab From c10e557ffe3bc023054914a66f77c707a84869fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 9 Aug 2019 14:17:52 +0100 Subject: [PATCH 128/151] node: re-introduce validator flag (#3351) --- core/cli/src/lib.rs | 13 +++-- core/cli/src/params.rs | 6 ++- node/cli/src/service.rs | 105 ++++++++++++++++++++++------------------ 3 files changed, 71 insertions(+), 53 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 297896bf83..9204408eb3 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -438,11 +438,14 @@ where let is_dev = cli.shared_params.dev; - let role = if cli.light { - service::Roles::LIGHT - } else { - service::Roles::AUTHORITY - }; + let role = + if cli.light { + service::Roles::LIGHT + } else if cli.validator || is_dev { + service::Roles::AUTHORITY + } else { + service::Roles::FULL + }; let exec = cli.execution_strategies; let exec_all_or = |strat: params::ExecutionStrategy| exec.execution.unwrap_or(strat).into(); diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index e3fa04c936..b17fc114c4 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -297,7 +297,11 @@ pub struct ExecutionStrategies { /// The `run` command used to run a node. #[derive(Debug, StructOpt, Clone)] pub struct RunCmd { - /// Disable GRANDPA when running in validator mode + /// Enable validator mode + #[structopt(long = "validator")] + pub validator: bool, + + /// Disable GRANDPA voter when running in validator mode, otherwise disables the GRANDPA observer #[structopt(long = "no-grandpa")] pub no_grandpa: bool, diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 813d23393b..f1fba54829 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -113,41 +113,56 @@ construct_service_factory! { } } - let proposer = substrate_basic_authorship::ProposerFactory { - client: service.client(), - transaction_pool: service.transaction_pool(), - }; + if service.config().roles.is_authority() { + let proposer = substrate_basic_authorship::ProposerFactory { + client: service.client(), + transaction_pool: service.transaction_pool(), + }; - let client = service.client(); - let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?; + let client = service.client(); + let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?; + + let babe_config = babe::BabeParams { + config: Config::get_or_compute(&*client)?, + keystore: service.keystore(), + client, + select_chain, + block_import, + env: proposer, + sync_oracle: service.network(), + inherent_data_providers: service.config().custom.inherent_data_providers.clone(), + force_authoring: service.config().force_authoring, + time_source: babe_link, + }; - let babe_config = babe::BabeParams { - config: Config::get_or_compute(&*client)?, - keystore: service.keystore(), - client, - select_chain, - block_import, - env: proposer, - sync_oracle: service.network(), - inherent_data_providers: service.config().custom.inherent_data_providers.clone(), - force_authoring: service.config().force_authoring, - time_source: babe_link, - }; + let babe = start_babe(babe_config)?; + let select = babe.select(service.on_exit()).then(|_| Ok(())); + service.spawn_task(Box::new(select)); + } - let babe = start_babe(babe_config)?; - let select = babe.select(service.on_exit()).then(|_| Ok(())); - service.spawn_task(Box::new(select)); - - if !service.config().disable_grandpa { - let config = grandpa::Config { - // FIXME #1578 make this available through chainspec - gossip_duration: Duration::from_millis(333), - justification_period: 4096, - name: Some(service.config().name.clone()), - keystore: Some(service.keystore()), - }; + let config = grandpa::Config { + // FIXME #1578 make this available through chainspec + gossip_duration: Duration::from_millis(333), + justification_period: 4096, + name: Some(service.config().name.clone()), + keystore: Some(service.keystore()), + }; - if service.config().roles.is_authority() { + match (service.config().roles.is_authority(), service.config().disable_grandpa) { + (false, false) => { + // start the lightweight GRANDPA observer + service.spawn_task(Box::new(grandpa::run_grandpa_observer( + config, + link_half, + service.network(), + service.on_exit(), + )?)); + }, + (false, true) => { + // nothing to do here + }, + (true, false) => { + // start the full GRANDPA voter let telemetry_on_connect = TelemetryOnConnect { telemetry_connection_sinks: service.telemetry_on_connect_stream(), }; @@ -160,24 +175,20 @@ construct_service_factory! { telemetry_on_connect: Some(telemetry_on_connect), }; service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); - } else { - service.spawn_task(Box::new(grandpa::run_grandpa_observer( - config, - link_half, - service.network(), - service.on_exit(), - )?)); - } + }, + (true, true) => { + // since we are an authority, when authoring blocks we + // expect inherent data regarding what our last + // finalized block is, to be available. since we don't + // start the grandpa voter, we need to register the + // inherent data provider ourselves. + grandpa::register_finality_tracker_inherent_data_provider( + service.client(), + &service.config().custom.inherent_data_providers, + )?; + }, } - // regardless of whether grandpa is started or not, when - // authoring blocks we expect inherent data regarding what our - // last finalized block is, to be available. - grandpa::register_finality_tracker_inherent_data_provider( - service.client(), - &service.config().custom.inherent_data_providers, - )?; - Ok(service) } }, -- GitLab From 765aa80ee27eff5e45c5ab97561f3fea75fc5808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 9 Aug 2019 15:53:44 +0100 Subject: [PATCH 129/151] node: setup disabled grandpa properly (#3356) --- core/finality-grandpa/src/lib.rs | 29 ++++++++++++++++++- core/network/src/protocol/consensus_gossip.rs | 22 ++++++++++++++ node/cli/src/service.rs | 13 ++------- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 73368a52d8..f5010debdc 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -444,7 +444,7 @@ fn global_communication, B, E, N, RA>( /// Register the finality tracker inherent data provider (which is used by /// GRANDPA), if not registered already. -pub fn register_finality_tracker_inherent_data_provider, RA>( +fn register_finality_tracker_inherent_data_provider, RA>( client: Arc>, inherent_data_providers: &InherentDataProviders, ) -> Result<(), consensus_common::Error> where @@ -740,6 +740,33 @@ pub fn run_grandpa, N, RA, SC, X>( run_grandpa_voter(grandpa_params) } +/// When GRANDPA is not initialized we still need to register the finality +/// tracker inherent provider which might be expected by the runtime for block +/// authoring. Additionally, we register a gossip message validator that +/// discards all GRANDPA messages (otherwise, we end up banning nodes that send +/// us a `Neighbor` message, since there is no registered gossip validator for +/// the engine id defined in the message.) +pub fn setup_disabled_grandpa, RA, N>( + client: Arc>, + inherent_data_providers: &InherentDataProviders, + network: N, +) -> Result<(), consensus_common::Error> where + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + RA: Send + Sync + 'static, + N: Network + Send + Sync + 'static, + N::In: Send + 'static, +{ + register_finality_tracker_inherent_data_provider( + client, + inherent_data_providers, + )?; + + network.register_validator(Arc::new(network::consensus_gossip::DiscardAll)); + + Ok(()) +} + /// Checks if this node is a voter in the given voter set. /// /// Returns the key pair of the node that is being used in the current voter set or `None`. diff --git a/core/network/src/protocol/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs index c2a2debaea..328fe197ea 100644 --- a/core/network/src/protocol/consensus_gossip.rs +++ b/core/network/src/protocol/consensus_gossip.rs @@ -554,6 +554,28 @@ impl ConsensusGossip { } } +/// A gossip message validator that discards all messages. +pub struct DiscardAll; + +impl Validator for DiscardAll { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + _data: &[u8], + ) -> ValidationResult { + ValidationResult::Discard + } + + fn message_expired<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_topic, _data| true) + } + + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_who, _intent, _topic, _data| false) + } +} + #[cfg(test)] mod tests { use sr_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index f1fba54829..57a360f3ca 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -158,9 +158,6 @@ construct_service_factory! { service.on_exit(), )?)); }, - (false, true) => { - // nothing to do here - }, (true, false) => { // start the full GRANDPA voter let telemetry_on_connect = TelemetryOnConnect { @@ -176,15 +173,11 @@ construct_service_factory! { }; service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); }, - (true, true) => { - // since we are an authority, when authoring blocks we - // expect inherent data regarding what our last - // finalized block is, to be available. since we don't - // start the grandpa voter, we need to register the - // inherent data provider ourselves. - grandpa::register_finality_tracker_inherent_data_provider( + (_, true) => { + grandpa::setup_disabled_grandpa( service.client(), &service.config().custom.inherent_data_providers, + service.network(), )?; }, } -- GitLab From 6e42ab22c3d34bf279f8d947ce6a56a041a3ae24 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 9 Aug 2019 17:25:28 +0200 Subject: [PATCH 130/151] Add a small ban when we get disconnected from a node (#3325) --- core/network/src/legacy_proto/behaviour.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/network/src/legacy_proto/behaviour.rs b/core/network/src/legacy_proto/behaviour.rs index 790c1d158d..1c83329ba0 100644 --- a/core/network/src/legacy_proto/behaviour.rs +++ b/core/network/src/legacy_proto/behaviour.rs @@ -24,6 +24,7 @@ use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt use libp2p::core::{ConnectedPoint, Multiaddr, PeerId}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use log::{debug, error, trace, warn}; +use rand::distributions::{Distribution as _, Uniform}; use sr_primitives::traits::Block as BlockT; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; @@ -746,6 +747,11 @@ where debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); + let ban_dur = Uniform::new(5, 10).sample(&mut rand::thread_rng()); + self.peers.insert(peer_id.clone(), PeerState::Banned { + until: Instant::now() + Duration::from_secs(ban_dur) + }); + if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = LegacyProtoOut::CustomProtocolClosed { -- GitLab From dcbe1be4ebb88c6931c79ca93e36c4374bdde23f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 10 Aug 2019 00:10:53 +0200 Subject: [PATCH 131/151] Switch AuRa to dynamic keystore lookup (#3359) --- Cargo.lock | 1 + core/consensus/aura/Cargo.toml | 3 +- core/consensus/aura/src/lib.rs | 99 +++++++++++++++++++--------------- node-template/src/service.rs | 12 ++--- 4 files changed, 63 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 524e710f88..a207eb8ad9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4407,6 +4407,7 @@ dependencies = [ "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index c27aa5df6d..99ba771693 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -18,7 +18,7 @@ inherents = { package = "substrate-inherents", path = "../../inherents" } srml-aura = { path = "../../../srml/aura" } client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } -substrate-keystore = { path = "../../keystore" } +keystore = { package = "substrate-keystore", path = "../../keystore" } consensus_common = { package = "substrate-consensus-common", path = "../common" } sr-primitives = { path = "../../sr-primitives" } futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } @@ -35,3 +35,4 @@ service = { package = "substrate-service", path = "../../service" } test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.7" env_logger = "0.6" +tempfile = "3.1" diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index ac711ba2bd..fa5b0533b6 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -39,12 +39,8 @@ use consensus_common::import_queue::{ Verifier, BasicQueue, BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport, }; use client::{ - block_builder::api::BlockBuilder as BlockBuilderApi, - blockchain::ProvideCache, - runtime_api::ApiExt, - error::Result as CResult, - backend::AuxStore, - BlockOf + block_builder::api::BlockBuilder as BlockBuilderApi, blockchain::ProvideCache, + runtime_api::ApiExt, error::Result as CResult, backend::AuxStore, BlockOf, }; use sr_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; @@ -67,6 +63,8 @@ use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS use slots::{CheckedHeader, SlotData, SlotWorker, SlotInfo, SlotCompatible}; use slots::{SignedDuration, check_equivocation}; +use keystore::KeyStorePtr; + pub use aura_primitives::*; pub use consensus_common::SyncOracle; pub use digest::CompatibleDigestItem; @@ -103,8 +101,10 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option if authorities.is_empty() { return None } let idx = slot_num % (authorities.len() as u64); - assert!(idx <= usize::max_value() as u64, - "It is impossible to have a vector with length beyond the address space; qed"); + assert!( + idx <= usize::max_value() as u64, + "It is impossible to have a vector with length beyond the address space; qed", + ); let current_author = authorities.get(idx as usize) .expect("authorities not empty; index constrained to list length;\ @@ -132,7 +132,6 @@ impl SlotCompatible for AuraSlotCompatible { /// Start the aura worker. The returned future should be run in a futures executor. pub fn start_aura( slot_duration: SlotDuration, - local_key: Arc

, client: Arc, select_chain: SC, block_import: I, @@ -140,6 +139,7 @@ pub fn start_aura( sync_oracle: SO, inherent_data_providers: InherentDataProviders, force_authoring: bool, + keystore: Option, ) -> Result, consensus_common::Error> where B: BlockT, C: ProvideRuntimeApi + BlockOf + ProvideCache + AuxStore + Send + Sync, @@ -160,9 +160,10 @@ pub fn start_aura( client: client.clone(), block_import: Arc::new(Mutex::new(block_import)), env, - local_key, + keystore, sync_oracle: sync_oracle.clone(), force_authoring, + _key_type: PhantomData::

, }; register_aura_inherent_data_provider( &inherent_data_providers, @@ -182,9 +183,10 @@ struct AuraWorker { client: Arc, block_import: Arc>, env: E, - local_key: Arc

, + keystore: Option, sync_oracle: SO, force_authoring: bool, + _key_type: PhantomData

, } impl SlotWorker for AuraWorker where @@ -209,8 +211,6 @@ impl SlotWorker for AuraWorker w chain_head: B::Header, slot_info: SlotInfo, ) -> Self::OnSlot { - let pair = self.local_key.clone(); - let public_key = self.local_key.public(); let client = self.client.clone(); let block_import = self.block_import.clone(); @@ -220,13 +220,12 @@ impl SlotWorker for AuraWorker w let authorities = match authorities(client.as_ref(), &BlockId::Hash(chain_head.hash())) { Ok(authorities) => authorities, Err(e) => { - warn!( - "Unable to fetch authorities at block {:?}: {:?}", - chain_head.hash(), - e - ); - telemetry!(CONSENSUS_WARN; "aura.unable_fetching_authorities"; - "slot" => ?chain_head.hash(), "err" => ?e + warn!("Unable to fetch authorities at block {:?}: {:?}", chain_head.hash(), e); + + telemetry!( + CONSENSUS_WARN; "aura.unable_fetching_authorities"; + "slot" => ?chain_head.hash(), + "err" => ?e, ); return Box::pin(future::ready(Ok(()))); } @@ -234,22 +233,30 @@ impl SlotWorker for AuraWorker w if !self.force_authoring && self.sync_oracle.is_offline() && authorities.len() > 1 { debug!(target: "aura", "Skipping proposal slot. Waiting for the network."); - telemetry!(CONSENSUS_DEBUG; "aura.skipping_proposal_slot"; - "authorities_len" => authorities.len() + telemetry!( + CONSENSUS_DEBUG; + "aura.skipping_proposal_slot"; + "authorities_len" => authorities.len(), ); return Box::pin(future::ready(Ok(()))); } let maybe_author = slot_author::

(slot_num, &authorities); - let proposal_work = match maybe_author { + let maybe_pair = maybe_author.and_then(|p| + self.keystore.as_ref().and_then(|k| + k.read().key_pair_by_type::

(&p, app_crypto::key_types::AURA).ok() + ) + ); + let proposal_work = match maybe_pair { None => return Box::pin(future::ready(Ok(()))), - Some(author) => if author == &public_key { + Some(pair) => { debug!( target: "aura", "Starting authorship at slot {}; timestamp = {}", slot_num, - timestamp + timestamp, ); telemetry!(CONSENSUS_DEBUG; "aura.starting_authorship"; - "slot_num" => slot_num, "timestamp" => timestamp + "slot_num" => slot_num, + "timestamp" => timestamp, ); // we are the slot author. make a block and sign it. @@ -280,27 +287,22 @@ impl SlotWorker for AuraWorker w Delay::new(remaining_duration) .map_err(|err| consensus_common::Error::FaultyTimer(err).into()) ).map(|v| match v { - futures::future::Either::Left((v, _)) => v, + futures::future::Either::Left((v, _)) => v.map(|v| (v, pair)), futures::future::Either::Right((Ok(_), _)) => Err(consensus_common::Error::ClientImport("Timeout in the AuRa proposer".into())), futures::future::Either::Right((Err(err), _)) => Err(err), }) - } else { - return Box::pin(future::ready(Ok(()))); } }; - Box::pin(proposal_work.map_ok(move |b| { + Box::pin(proposal_work.map_ok(move |(b, pair)| { // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); if slot_after_building != slot_num { - info!( - "Discarding proposal for slot {}; block production took too long", - slot_num - ); + info!("Discarding proposal for slot {}; block production took too long", slot_num); telemetry!(CONSENSUS_INFO; "aura.discarding_proposal_took_too_long"; - "slot" => slot_num + "slot" => slot_num, ); return } @@ -311,7 +313,7 @@ impl SlotWorker for AuraWorker w error!(target: "aura", "FATAL ERROR: Invalid pre-digest: {}!", e); return } else { - trace!(target: "aura", "Got correct number of seals. Good!") + trace!(target: "aura", "Got correct number of seals. Good!") }; let header_num = header.number().clone(); @@ -342,14 +344,14 @@ impl SlotWorker for AuraWorker w telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; "header_num" => ?header_num, "hash_now" => ?import_block.post_header().hash(), - "hash_previously" => ?header_hash + "hash_previously" => ?header_hash, ); if let Err(e) = block_import.lock().import_block(import_block, Default::default()) { - warn!(target: "aura", "Error with block built on {:?}: {:?}", - parent_hash, e); + warn!(target: "aura", "Error with block built on {:?}: {:?}", parent_hash, e); + telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; - "hash" => ?parent_hash, "err" => ?e + "hash" => ?parent_hash, "err" => ?e, ); } })) @@ -358,8 +360,9 @@ impl SlotWorker for AuraWorker w macro_rules! aura_err { ($($i: expr),+) => { - { debug!(target: "aura", $($i),+) - ; format!($($i),+) + { + debug!(target: "aura", $( $i ),+); + format!($( $i ),+) } }; } @@ -820,7 +823,7 @@ mod tests { #[test] #[allow(deprecated)] fn authoring_blocks() { - let _ = ::env_logger::try_init(); + let _ = env_logger::try_init(); let net = AuraTestNet::new(3); let peers = &[ @@ -833,7 +836,15 @@ mod tests { let mut import_notifications = Vec::new(); let mut runtime = current_thread::Runtime::new().unwrap(); + let mut keystore_paths = Vec::new(); for (peer_id, key) in peers { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore."); + + keystore.write().insert_ephemeral_from_seed::(&key.to_seed()) + .expect("Creates authority key"); + keystore_paths.push(keystore_path); + let client = net.lock().peer(*peer_id).client().as_full().expect("full clients are created").clone(); #[allow(deprecated)] let select_chain = LongestChain::new( @@ -856,7 +867,6 @@ mod tests { let aura = start_aura::<_, _, _, _, _, AuthorityPair, _, _, _>( slot_duration, - Arc::new(key.clone().pair().into()), client.clone(), select_chain, client, @@ -864,6 +874,7 @@ mod tests { DummyOracle, inherent_data_providers, false, + Some(keystore), ).expect("Starts aura"); runtime.spawn(aura); diff --git a/node-template/src/service.rs b/node-template/src/service.rs index e903f1150b..e0dba17bbf 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -3,7 +3,6 @@ #![warn(unused_extern_crates)] use std::sync::Arc; -use log::info; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use node_template_runtime::{self, GenesisConfig, opaque::Block, RuntimeApi, WASM_BINARY}; use substrate_service::{ @@ -15,11 +14,11 @@ use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; use futures::prelude::*; use substrate_client::{self as client, LongestChain}; -use primitives::{Pair as PairT}; use inherents::InherentDataProviders; use network::{config::DummyFinalityProofRequestBuilder, construct_simple_protocol}; use substrate_executor::native_executor_instance; use substrate_service::construct_service_factory; +use aura_primitives::sr25519::AuthorityPair as AuraAuthorityPair; pub use substrate_executor::NativeExecutor; // Our native executor instance. @@ -66,8 +65,7 @@ construct_service_factory! { }, AuthoritySetup = { |service: Self::FullService| { - if let Some(key) = None:: { - info!("Using authority key {}", key.public()); + if service.config().roles.is_authority() { let proposer = ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), @@ -75,9 +73,8 @@ construct_service_factory! { let client = service.client(); let select_chain = service.select_chain() .ok_or_else(|| ServiceError::SelectChainRequired)?; - let aura = start_aura( + let aura = start_aura::<_, _, _, _, _, AuraAuthorityPair, _, _, _>( SlotDuration::get_or_compute(&*client)?, - Arc::new(key), client.clone(), select_chain, client, @@ -85,6 +82,7 @@ construct_service_factory! { service.network(), service.config().custom.inherent_data_providers.clone(), service.config().force_authoring, + Some(service.keystore()), )?; service.spawn_task(Box::new(aura.select(service.on_exit()).then(|_| Ok(())))); } @@ -113,7 +111,7 @@ construct_service_factory! { > { |config: &mut FactoryFullConfiguration, client: Arc>| { let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; - import_queue::<_, _, aura_primitives::sr25519::AuthorityPair>( + import_queue::<_, _, AuraAuthorityPair>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, -- GitLab From 087c3cf6aca2414aff43689694c3414168fa8998 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sun, 11 Aug 2019 15:03:06 +0200 Subject: [PATCH 132/151] Scale trait and move to u32 blocknumbers (#3357) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Scale trait and move to u32 blocknumbers. * Fixes * Cleanups * Update node/runtime/src/lib.rs Co-Authored-By: Bastian Köcher * Fix up some of the factory stuff. * Update core/sr-primitives/src/traits.rs Co-Authored-By: Shawn Tabrizi * Move Nonce/Index to u32 (#3361) * Force a non-borked version of upstream crate * Line lengths and runtime version bump --- core/basic-authorship/Cargo.toml | 2 +- core/cli/Cargo.toml | 2 +- core/client/Cargo.toml | 2 +- core/consensus/aura/Cargo.toml | 2 +- core/consensus/babe/Cargo.toml | 2 +- core/consensus/babe/src/lib.rs | 2 +- core/consensus/common/Cargo.toml | 2 +- core/consensus/slots/Cargo.toml | 2 +- core/finality-grandpa/Cargo.toml | 2 +- core/network/Cargo.toml | 2 +- core/offchain/Cargo.toml | 2 +- core/peerset/Cargo.toml | 2 +- core/rpc/Cargo.toml | 4 +-- core/service/Cargo.toml | 2 +- core/sr-primitives/src/traits.rs | 41 +++++++++++++++++++++ core/telemetry/Cargo.toml | 2 +- core/test-client/Cargo.toml | 2 +- node-template/runtime/Cargo.toml | 1 + node-template/runtime/src/lib.rs | 4 +-- node/cli/Cargo.toml | 2 +- node/cli/src/factory_impl.rs | 26 +++++++------- node/cli/src/service.rs | 62 ++++++++++++++++++++++---------- node/executor/src/lib.rs | 18 +++++----- node/primitives/src/lib.rs | 4 +-- node/runtime/src/constants.rs | 14 ++++---- node/runtime/src/lib.rs | 6 ++-- srml/authorship/src/lib.rs | 9 +++-- srml/membership/src/lib.rs | 3 +- srml/timestamp/src/lib.rs | 9 ++--- 29 files changed, 151 insertions(+), 82 deletions(-) diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index e21c0abe68..003eb79349 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] log = "0.4" -futures-preview = "0.3.0-alpha.17" +futures-preview = "=0.3.0-alpha.17" codec = { package = "parity-scale-codec", version = "1.0.0" } sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index 53c320035f..a5af736226 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -18,7 +18,7 @@ lazy_static = "1.3" app_dirs = "1.2" tokio = "0.1.7" futures = "0.1.17" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } fdlimit = "0.1" exit-future = "0.1" serde_json = "1.0" diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 793db37613..d917427a50 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -10,7 +10,7 @@ fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } parking_lot = { version = "0.9.0", optional = true } hex = { package = "hex-literal", version = "0.2", optional = true } -futures-preview = { version = "0.3.0-alpha.17", optional = true } +futures-preview = { version = "=0.3.0-alpha.17", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } executor = { package = "substrate-executor", path = "../executor", optional = true } state-machine = { package = "substrate-state-machine", path = "../state-machine", optional = true } diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 99ba771693..d6ce48841b 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -21,7 +21,7 @@ substrate-telemetry = { path = "../../telemetry" } keystore = { package = "substrate-keystore", path = "../../keystore" } consensus_common = { package = "substrate-consensus-common", path = "../common" } sr-primitives = { path = "../../sr-primitives" } -futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } +futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] } futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" parking_lot = "0.9.0" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 8184033735..9490887ba3 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -26,7 +26,7 @@ uncles = { package = "substrate-consensus-uncles", path = "../uncles" } slots = { package = "substrate-consensus-slots", path = "../slots" } sr-primitives = { path = "../../sr-primitives" } fork-tree = { path = "../../utils/fork-tree" } -futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } +futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] } futures01 = { package = "futures", version = "0.1" } futures-timer = "0.2.1" parking_lot = "0.9.0" diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index eb4b0c5195..ae484de5b6 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -82,7 +82,7 @@ use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, SignedDuration}; mod aux_schema; #[cfg(test)] mod tests; -pub use babe_primitives::AuthorityId; +pub use babe_primitives::{AuthorityId, AuthorityPair, AuthoritySignature}; /// A slot duration. Create with `get_or_compute`. // FIXME: Once Rust has higher-kinded types, the duplication between this diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index 29f30e363d..46c8121207 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -11,7 +11,7 @@ libp2p = { version = "0.11.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -futures-preview = "0.3.0-alpha.17" +futures-preview = "=0.3.0-alpha.17" futures-timer = "0.2.1" rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 857d1e3a6b..f74837a62f 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -12,7 +12,7 @@ primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../common" } inherents = { package = "substrate-inherents", path = "../../inherents" } -futures-preview = "0.3.0-alpha.17" +futures-preview = "=0.3.0-alpha.17" futures-timer = "0.2.1" parking_lot = "0.9.0" log = "0.4" diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 71a0775cd7..22237c5a0b 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] fork-tree = { path = "../../core/utils/fork-tree" } futures = "0.1" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } log = "0.4" parking_lot = "0.9.0" tokio-executor = "0.1.7" diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 0600a60999..dac6ecdd72 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -15,7 +15,7 @@ parking_lot = "0.9.0" bitflags = "1.0" fnv = "1.0" futures = "0.1.17" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } futures-timer = "0.2.1" linked-hash-map = "0.5" linked_hash_set = "0.1.3" diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 3ee8e8580d..4c8891eb6b 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../core/client" } -futures-preview = "0.3.0-alpha.17" +futures-preview = "=0.3.0-alpha.17" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index 9315ff304f..7bf0617a9e 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -8,7 +8,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures-preview = "0.3.0-alpha.17" +futures-preview = "=0.3.0-alpha.17" libp2p = { version = "0.11.0", default-features = false } linked-hash-map = "0.5" log = "0.4" diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index ab05eb4e24..957fe5be0b 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } jsonrpc-core = "12.0.0" jsonrpc-core-client = "12.0.0" jsonrpc-pubsub = "12.0.0" @@ -34,4 +34,4 @@ futures = "0.1.17" sr-io = { path = "../sr-io" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } rustc-hex = "2.0" -tokio = "0.1.17" \ No newline at end of file +tokio = "0.1.17" diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index c2a17371da..bd04cd670e 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1.17" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } parking_lot = "0.9.0" lazy_static = "1.0" log = "0.4" diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 7370a5074f..de700ffec3 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -303,6 +303,47 @@ pub trait CheckedConversion { } impl CheckedConversion for T {} +/// Multiply and divide by a number that isn't necessarily the same type. Basically just the same +/// as `Mul` and `Div` except it can be used for all basic numeric types. +pub trait Scale { + /// The output type of the product of `self` and `Other`. + type Output; + + /// @return the product of `self` and `other`. + fn mul(self, other: Other) -> Self::Output; + + /// @return the integer division of `self` and `other`. + fn div(self, other: Other) -> Self::Output; + + /// @return the modulo remainder of `self` and `other`. + fn rem(self, other: Other) -> Self::Output; +} +macro_rules! impl_scale { + ($self:ty, $other:ty) => { + impl Scale<$other> for $self { + type Output = Self; + fn mul(self, other: $other) -> Self::Output { self * (other as Self) } + fn div(self, other: $other) -> Self::Output { self / (other as Self) } + fn rem(self, other: $other) -> Self::Output { self % (other as Self) } + } + } +} +impl_scale!(u128, u128); +impl_scale!(u128, u64); +impl_scale!(u128, u32); +impl_scale!(u128, u16); +impl_scale!(u128, u8); +impl_scale!(u64, u64); +impl_scale!(u64, u32); +impl_scale!(u64, u16); +impl_scale!(u64, u8); +impl_scale!(u32, u32); +impl_scale!(u32, u16); +impl_scale!(u32, u8); +impl_scale!(u16, u16); +impl_scale!(u16, u8); +impl_scale!(u8, u8); + /// Trait for things that can be clear (have no bits set). For numeric types, essentially the same /// as `Zero`. pub trait Clear { diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index 8647462739..d4332eb9ec 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" bytes = "0.4" parking_lot = "0.9.0" futures01 = { package = "futures", version = "0.1" } -futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } +futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] } futures-timer = "0.2.1" libp2p = { version = "0.11.0", default-features = false, features = ["libp2p-websocket"] } log = "0.4" diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 163cc2ab14..1af77ce2f0 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -9,7 +9,7 @@ client = { package = "substrate-client", path = "../client" } client-db = { package = "substrate-client-db", path = "../client/db", features = ["test-helpers"] } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } executor = { package = "substrate-executor", path = "../executor" } -futures-preview = "0.3.0-alpha.17" +futures-preview = "=0.3.0-alpha.17" hash-db = "0.15.0" keyring = { package = "substrate-keyring", path = "../keyring" } codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 437da9d973..2f41513048 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Anonymous"] edition = "2018" [dependencies] + serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 2b9220c6e5..16235db118 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -48,10 +48,10 @@ pub type AccountSignature = sr25519::Signature; pub type Hash = primitives::H256; /// Index of a block number in the chain. -pub type BlockNumber = u64; +pub type BlockNumber = u32; /// Index of an account's extrinsic in the chain. -pub type Nonce = u64; +pub type Nonce = u32; /// Balance type for the node. pub type Balance = u128; diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index 184ef9382d..c266427439 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -49,7 +49,7 @@ keystore = { package = "substrate-keystore", path = "../../core/keystore" } babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17" } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17" } tempfile = "3.1" [build-dependencies] diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index 6e72ff08c1..6345a851f2 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -39,11 +39,11 @@ pub struct FactoryState { block_no: N, mode: Mode, - start_number: u64, - rounds: u64, - round: u64, - block_in_round: u64, - num: u64, + start_number: u32, + rounds: u32, + round: u32, + block_in_round: u32, + num: u32, } type Number = <::Header as HeaderT>::Number; @@ -77,9 +77,9 @@ impl RuntimeAdapter for FactoryState { ) -> FactoryState { FactoryState { mode, - num: num, + num: num as u32, round: 0, - rounds, + rounds: rounds as u32, block_in_round: 0, block_no: 0, start_number: 0, @@ -150,7 +150,7 @@ impl RuntimeAdapter for FactoryState { } fn inherent_extrinsics(&self) -> InherentData { - let timestamp = self.block_no * MINIMUM_PERIOD; + let timestamp = self.block_no as u64 * MINIMUM_PERIOD; let mut inherent = InherentData::new(); inherent.put_data(timestamp::INHERENT_IDENTIFIER, ×tamp) @@ -194,12 +194,12 @@ impl RuntimeAdapter for FactoryState { // This currently prevents the factory from being used // without a preceding purge of the database. if self.mode == Mode::MasterToN || self.mode == Mode::MasterTo1 { - self.block_no() + self.block_no() as Self::Index } else { match self.round() { 0 => // if round is 0 all transactions will be done with master as a sender - self.block_no(), + self.block_no() as Self::Index, _ => // if round is e.g. 1 every sender account will be new and not yet have // any transactions done @@ -215,12 +215,12 @@ impl RuntimeAdapter for FactoryState { // TODO get correct phase via api. See #2587. // This currently prevents the factory from being used // without a preceding purge of the database. - self.block_no + self.block_no() as Self::Phase } } -fn gen_seed_bytes(seed: u64) -> [u8; 32] { - let mut rng: StdRng = SeedableRng::seed_from_u64(seed); +fn gen_seed_bytes(seed: u32) -> [u8; 32] { + let mut rng: StdRng = SeedableRng::seed_from_u64(seed as u64); let mut seed_bytes = [0u8; 32]; for i in 0..32 { diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 57a360f3ca..35f813efb3 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -88,19 +88,32 @@ construct_service_factory! { RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = node_executor::Executor, - FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, - LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, + FullTransactionPoolApi = + transaction_pool::ChainApi< + client::Client, FullExecutor, Block, RuntimeApi>, + Block + > { + |config, client| + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, + LightTransactionPoolApi = + transaction_pool::ChainApi< + client::Client, LightExecutor, Block, RuntimeApi>, + Block + > { + |config, client| + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, Genesis = GenesisConfig, Configuration = NodeConfig, - FullService = FullComponents - { |config: FactoryFullConfiguration| - FullComponents::::new(config) }, + FullService = FullComponents { + |config: FactoryFullConfiguration| FullComponents::::new(config) + }, AuthoritySetup = { |mut service: Self::FullService| { - let (block_import, link_half, babe_link) = service.config_mut().custom.import_setup.take() - .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); + let (block_import, link_half, babe_link) = + service.config_mut().custom.import_setup.take() + .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); // spawn any futures that were created in the previous setup steps if let Some(tasks) = service.config_mut().custom.tasks_to_spawn.take() { @@ -120,7 +133,8 @@ construct_service_factory! { }; let client = service.client(); - let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?; + let select_chain = service.select_chain() + .ok_or(ServiceError::SelectChainRequired)?; let babe_config = babe::BabeParams { config: Config::get_or_compute(&*client)?, @@ -130,7 +144,8 @@ construct_service_factory! { block_import, env: proposer, sync_oracle: service.network(), - inherent_data_providers: service.config().custom.inherent_data_providers.clone(), + inherent_data_providers: service.config() + .custom.inherent_data_providers.clone(), force_authoring: service.config().force_authoring, time_source: babe_link, }; @@ -167,7 +182,8 @@ construct_service_factory! { config: config, link: link_half, network: service.network(), - inherent_data_providers: service.config().custom.inherent_data_providers.clone(), + inherent_data_providers: + service.config().custom.inherent_data_providers.clone(), on_exit: service.on_exit(), telemetry_on_connect: Some(telemetry_on_connect), }; @@ -187,8 +203,12 @@ construct_service_factory! { }, LightService = LightComponents { |config| >::new(config) }, - FullImportQueue = BabeImportQueue - { |config: &mut FactoryFullConfiguration , client: Arc>, select_chain: Self::SelectChain| { + FullImportQueue = BabeImportQueue { + | + config: &mut FactoryFullConfiguration, + client: Arc>, + select_chain: Self::SelectChain + | { let (block_import, link_half) = grandpa::block_import::<_, _, _, RuntimeApi, FullClient, _>( client.clone(), client.clone(), select_chain @@ -222,7 +242,8 @@ construct_service_factory! { )?; let finality_proof_import = block_import.clone(); - let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); + let finality_proof_request_builder = + finality_proof_import.create_finality_proof_request_builder(); // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. let (import_queue, ..) = import_queue( @@ -254,7 +275,9 @@ construct_service_factory! { mod tests { use std::sync::Arc; use babe::CompatibleDigestItem; - use consensus_common::{Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy}; + use consensus_common::{ + Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy + }; use node_primitives::DigestItem; use node_runtime::{BalancesCall, Call, UncheckedExtrinsic}; use node_runtime::constants::{currency::CENTS, time::SLOT_DURATION}; @@ -306,7 +329,9 @@ mod tests { auxiliary: Vec::new(), } }; - let extrinsic_factory = |service: &SyncService<::FullService>| { + let extrinsic_factory = + |service: &SyncService<::FullService>| + { let payload = ( 0, Call::Balances(BalancesCall::transfer(RawAddress::Id(bob.public().0.into()), 69.into())), @@ -333,7 +358,8 @@ mod tests { #[ignore] fn test_sync() { let keystore_path = tempfile::tempdir().expect("Creates keystore path"); - let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + let keystore = keystore::Store::open(keystore_path.path(), None) + .expect("Creates keystore"); let alice = keystore.write().insert_ephemeral_from_seed::("//Alice") .expect("Creates authority pair"); diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 990210696a..167f90feeb 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -164,7 +164,7 @@ mod tests { }) } - fn from_block_number(n: u64) -> Header { + fn from_block_number(n: u32) -> Header { Header::new(n, Default::default(), Default::default(), [69; 32].into(), Default::default()) } @@ -192,7 +192,7 @@ mod tests { let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -228,7 +228,7 @@ mod tests { let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -260,7 +260,7 @@ mod tests { let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -296,7 +296,7 @@ mod tests { let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -523,7 +523,7 @@ mod tests { (block1, block2) } - fn block_with_size(time: u64, nonce: u64, size: usize) -> (Vec, Hash) { + fn block_with_size(time: u64, nonce: u32, size: usize) -> (Vec, Hash) { construct_block( &mut new_test_ext(COMPACT_CODE, false), 1, @@ -887,7 +887,7 @@ mod tests { ], map![])); let r = WasmExecutor::new() - .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u32))); assert!(r.is_ok()); let r = WasmExecutor::new() .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); @@ -909,7 +909,7 @@ mod tests { ], map![])); let r = WasmExecutor::new() - .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u32))); assert!(r.is_ok()); let r = WasmExecutor::new() .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); @@ -1080,7 +1080,7 @@ mod tests { let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 0895a8675d..431ba17c00 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -25,7 +25,7 @@ use sr_primitives::{ }; /// An index to a block. -pub type BlockNumber = u64; +pub type BlockNumber = u32; /// Alias to 512-bit hash when used in the context of a transaction signature on the chain. pub type Signature = AnySignature; @@ -45,7 +45,7 @@ pub type Balance = u128; pub type Moment = u64; /// Index of a transaction in the chain. -pub type Index = u64; +pub type Index = u32; /// A hash of some data used by the chain. pub type Hash = primitives::H256; diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs index 03f6e34c93..f728efb3be 100644 --- a/node/runtime/src/constants.rs +++ b/node/runtime/src/constants.rs @@ -27,7 +27,7 @@ pub mod currency { /// Time. pub mod time { - use node_primitives::Moment; + use node_primitives::{Moment, BlockNumber}; /// Since BABE is probabilistic this is the average expected block time that /// we are targetting. Blocks will be produced at a minimum duration defined @@ -46,17 +46,17 @@ pub mod time { pub const SLOT_DURATION: Moment = 1650; - pub const EPOCH_DURATION_IN_BLOCKS: Moment = 10 * MINUTES; - pub const EPOCH_DURATION_IN_SLOTS: Moment = { + pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 10 * MINUTES; + pub const EPOCH_DURATION_IN_SLOTS: u64 = { const SLOT_FILL_RATE: f64 = MILLISECS_PER_BLOCK as f64 / SLOT_DURATION as f64; - (EPOCH_DURATION_IN_BLOCKS as f64 * SLOT_FILL_RATE) as Moment + (EPOCH_DURATION_IN_BLOCKS as f64 * SLOT_FILL_RATE) as u64 }; // These time units are defined in number of blocks. - pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; - pub const HOURS: Moment = MINUTES * 60; - pub const DAYS: Moment = HOURS * 24; + pub const MINUTES: BlockNumber = 60 / (SECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; } // CRITICAL NOTE: The system module maintains two constants: a _maximum_ block weight and a diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 8b6b4d55bd..086818c51f 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 137, - impl_version: 137, + spec_version: 138, + impl_version: 138, apis: RUNTIME_API_VERSIONS, }; @@ -179,7 +179,7 @@ impl timestamp::Trait for Runtime { } parameter_types! { - pub const UncleGenerations: u64 = 5; + pub const UncleGenerations: BlockNumber = 5; } impl authorship::Trait for Runtime { diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 44fa04a2f3..32dd140e82 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -478,6 +478,10 @@ mod tests { type MaximumBlockLength = MaximumBlockLength; } + parameter_types! { + pub const UncleGenerations: u64 = 5; + } + impl Trait for Test { type FindAuthor = AuthorGiven; type UncleGenerations = UncleGenerations; @@ -506,10 +510,6 @@ mod tests { } } - parameter_types! { - pub const UncleGenerations: u64 = 5; - } - pub struct VerifyBlock; impl VerifySeal for VerifyBlock { @@ -550,7 +550,6 @@ mod tests { header } - fn create_header(number: u64, parent_hash: H256, state_root: H256) -> Header { Header::new( number, diff --git a/srml/membership/src/lib.rs b/srml/membership/src/lib.rs index 1545719e20..f56a0ca042 100644 --- a/srml/membership/src/lib.rs +++ b/srml/membership/src/lib.rs @@ -80,6 +80,7 @@ decl_storage! { decl_event!( pub enum Event where ::AccountId, + >::Event, { /// The given member was added; see the transaction for who. MemberAdded, @@ -90,7 +91,7 @@ decl_event!( /// The membership was reset; see the transaction for who the new set is. MembersReset, /// Phantom member, never used. - Dummy(sr_std::marker::PhantomData<(AccountId, I)>), + Dummy(sr_std::marker::PhantomData<(AccountId, Event)>), } ); diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index bef2e2b876..502acadf61 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -90,7 +90,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::{result, ops::{Mul, Div}, cmp}; +use rstd::{result, cmp}; use codec::Encode; #[cfg(feature = "std")] use codec::Decode; @@ -98,7 +98,9 @@ use codec::Decode; use inherents::ProvideInherentData; use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple}; use srml_support::traits::{Time, Get}; -use sr_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; +use sr_primitives::traits::{ + SimpleArithmetic, Zero, SaturatedConversion, Scale +}; use sr_primitives::weights::SimpleDispatchInfo; use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; @@ -207,8 +209,7 @@ for_each_tuple!(impl_timestamp_set); pub trait Trait: system::Trait { /// Type used for expressing timestamp. type Moment: Parameter + Default + SimpleArithmetic - + Mul - + Div; + + Scale; /// Something which can be notified when the timestamp is set. Set this to `()` if not needed. type OnTimestampSet: OnTimestampSet; -- GitLab From e0f5dd9f394fd19238388054d76de070db6182f3 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sun, 11 Aug 2019 16:07:40 +0200 Subject: [PATCH 133/151] Refactor parse_and_execute (#3358) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor `parse_and_execute` Adds a new function named `parse_and_prepare`, which prepares the environment and parses the command. Contrary to `parse_and_execute`, `parse_and_prepare` returns a struct that permis the user to execute the command, as opposed to execute it itself. `parse_and_execute` has been modified to use `parse_and_prepare` internally. * Embed dispatch functions directly into run() After the previous commit, we now have a lot of functions whose only one is to call other functions. And these other functions are called only from one location. Let's merge these two for clarity. * Deprecate parse_and_execute and replace it in node and node-template * Apply suggestions from code review Co-Authored-By: Bastian Köcher --- core/cli/src/lib.rs | 483 ++++++++++++++++++++++++--------------- node-template/src/cli.rs | 19 +- node/cli/src/lib.rs | 22 +- 3 files changed, 318 insertions(+), 206 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 9204408eb3..2fe72c583d 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -167,38 +167,29 @@ fn is_node_name_valid(_name: &str) -> Result<(), &str> { Ok(()) } -/// Parse command line interface arguments and executes the desired command. -/// -/// # Return value +/// Parse command line interface arguments and prepares the command for execution. /// -/// A result that indicates if any error occurred. -/// If no error occurred and a custom subcommand was found, the subcommand is returned. -/// The user needs to handle this subcommand on its own. +/// Before returning, this function performs various initializations, such as initializing the +/// panic handler and the logger, or increasing the limit for file descriptors. /// /// # Remarks /// /// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, /// `NoCustom` can be used as type here. +/// /// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom /// parameters are visible to the user as if they were normal run command parameters. If no custom /// parameters are required, `NoCustom` can be used as type here. -pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( - spec_factory: S, - version: &VersionInfo, +pub fn parse_and_prepare<'a, CC, RP, I>( + version: &'a VersionInfo, impl_name: &'static str, args: I, - exit: E, - run_service: RS, -) -> error::Result> +) -> ParseAndPrepare<'a, CC, RP> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, CC: StructOpt + Clone + GetLogFilter, RP: StructOpt + Clone + AugmentClap, - E: IntoExit, - RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, - I: IntoIterator, - T: Into + Clone, + I: IntoIterator, + ::Item: Into + Clone, { panic_handler::set(version.support_url); @@ -222,23 +213,294 @@ where fdlimit::raise_fd_limit(); match cli_args { - params::CoreParams::Run(params) => run_node( - params, spec_factory, exit, run_service, impl_name, version, - ).map(|_| None), - params::CoreParams::BuildSpec(params) => - build_spec(params, spec_factory, version).map(|_| None), - params::CoreParams::ExportBlocks(params) => - export_blocks::(params, spec_factory, exit, version).map(|_| None), - params::CoreParams::ImportBlocks(params) => - import_blocks::(params, spec_factory, exit, version).map(|_| None), - params::CoreParams::PurgeChain(params) => - purge_chain(params, spec_factory, version).map(|_| None), - params::CoreParams::Revert(params) => - revert_chain::(params, spec_factory, version).map(|_| None), - params::CoreParams::Custom(params) => Ok(Some(params)), + params::CoreParams::Run(params) => ParseAndPrepare::Run( + ParseAndPrepareRun { params, impl_name, version } + ), + params::CoreParams::BuildSpec(params) => ParseAndPrepare::BuildSpec( + ParseAndPrepareBuildSpec { params, version } + ), + params::CoreParams::ExportBlocks(params) => ParseAndPrepare::ExportBlocks( + ParseAndPrepareExport { params, version } + ), + params::CoreParams::ImportBlocks(params) => ParseAndPrepare::ImportBlocks( + ParseAndPrepareImport { params, version } + ), + params::CoreParams::PurgeChain(params) => ParseAndPrepare::PurgeChain( + ParseAndPreparePurge { params, version } + ), + params::CoreParams::Revert(params) => ParseAndPrepare::RevertChain( + ParseAndPrepareRevert { params, version } + ), + params::CoreParams::Custom(params) => ParseAndPrepare::CustomCommand(params), + } +} + +/// Output of calling `parse_and_prepare`. +#[must_use] +pub enum ParseAndPrepare<'a, CC, RP> { + /// Command ready to run the main client. + Run(ParseAndPrepareRun<'a, RP>), + /// Command ready to build chain specs. + BuildSpec(ParseAndPrepareBuildSpec<'a>), + /// Command ready to export the chain. + ExportBlocks(ParseAndPrepareExport<'a>), + /// Command ready to import the chain. + ImportBlocks(ParseAndPrepareImport<'a>), + /// Command ready to purge the chain. + PurgeChain(ParseAndPreparePurge<'a>), + /// Command ready to revert the chain. + RevertChain(ParseAndPrepareRevert<'a>), + /// An additional custom command passed to `parse_and_prepare`. + CustomCommand(CC), +} + +/// Command ready to run the main client. +pub struct ParseAndPrepareRun<'a, RP> { + params: MergeParameters, + impl_name: &'static str, + version: &'a VersionInfo, +} + +impl<'a, RP> ParseAndPrepareRun<'a, RP> { + /// Runs the command and runs the main client. + pub fn run( + self, + spec_factory: S, + exit: E, + run_service: RS, + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>, String>, + RP: StructOpt + Clone, + C: Default, + G: RuntimeGenesis, + E: IntoExit, + RS: FnOnce(E, RunCmd, RP, Configuration) -> Result<(), String> + { + let config = create_run_node_config(self.params.left.clone(), spec_factory, self.impl_name, self.version)?; + + run_service(exit, self.params.left, self.params.right, config).map_err(Into::into) + } +} + +/// Command ready to build chain specs. +pub struct ParseAndPrepareBuildSpec<'a> { + params: BuildSpecCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareBuildSpec<'a> { + /// Runs the command and build the chain specs. + pub fn run( + self, + spec_factory: S + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>, String>, + G: RuntimeGenesis + { + info!("Building chain spec"); + let raw_output = self.params.raw; + let mut spec = load_spec(&self.params.shared_params, spec_factory)?; + with_default_boot_node(&mut spec, self.params, self.version)?; + let json = service::chain_ops::build_spec(spec, raw_output)?; + + print!("{}", json); + + Ok(()) + } +} + +/// Command ready to export the chain. +pub struct ParseAndPrepareExport<'a> { + params: ExportBlocksCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareExport<'a> { + /// Runs the command and exports from the chain. + pub fn run( + self, + spec_factory: S, + exit: E, + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>>, String>, + F: ServiceFactory, + E: IntoExit + { + let config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + + info!("DB path: {}", config.database_path.display()); + let from = self.params.from.unwrap_or(1); + let to = self.params.to; + let json = self.params.json; + + let file: Box = match self.params.output { + Some(filename) => Box::new(File::create(filename)?), + None => Box::new(stdout()), + }; + + service::chain_ops::export_blocks::( + config, exit.into_exit(), file, from.into(), to.map(Into::into), json + ).map_err(Into::into) + } +} + +/// Command ready to import the chain. +pub struct ParseAndPrepareImport<'a> { + params: ImportBlocksCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareImport<'a> { + /// Runs the command and imports to the chain. + pub fn run( + self, + spec_factory: S, + exit: E, + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>>, String>, + F: ServiceFactory, + E: IntoExit + { + let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + config.execution_strategies = ExecutionStrategies { + importing: self.params.execution.into(), + other: self.params.execution.into(), + ..Default::default() + }; + + let file: Box = match self.params.input { + Some(filename) => Box::new(File::open(filename)?), + None => { + let mut buffer = Vec::new(); + stdin().read_to_end(&mut buffer)?; + Box::new(Cursor::new(buffer)) + }, + }; + + let fut = service::chain_ops::import_blocks::(config, exit.into_exit(), file)?; + tokio::run(fut); + Ok(()) + } +} + +/// Command ready to purge the chain. +pub struct ParseAndPreparePurge<'a> { + params: PurgeChainCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPreparePurge<'a> { + /// Runs the command and purges the chain. + pub fn run( + self, + spec_factory: S + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>, String>, + G: RuntimeGenesis + { + let config = create_config_with_db_path::<(), _, _>(spec_factory, &self.params.shared_params, self.version)?; + let db_path = config.database_path; + + if !self.params.yes { + print!("Are you sure to remove {:?}? (y/n)", &db_path); + stdout().flush().expect("failed to flush stdout"); + + let mut input = String::new(); + stdin().read_line(&mut input)?; + let input = input.trim(); + + match input.chars().nth(0) { + Some('y') | Some('Y') => {}, + _ => { + println!("Aborted"); + return Ok(()); + }, + } + } + + match fs::remove_dir_all(&db_path) { + Result::Ok(_) => { + println!("{:?} removed.", &db_path); + Ok(()) + }, + Result::Err(ref err) if err.kind() == ErrorKind::NotFound => { + println!("{:?} did not exist.", &db_path); + Ok(()) + }, + Result::Err(err) => Result::Err(err.into()) + } + } +} + +/// Command ready to revert the chain. +pub struct ParseAndPrepareRevert<'a> { + params: RevertCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareRevert<'a> { + /// Runs the command and reverts the chain. + pub fn run( + self, + spec_factory: S + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>>, String>, + F: ServiceFactory { + let config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let blocks = self.params.num; + Ok(service::chain_ops::revert_chain::(config, blocks.into())?) } } +/// Parse command line interface arguments and executes the desired command. +/// +/// # Return value +/// +/// A result that indicates if any error occurred. +/// If no error occurred and a custom subcommand was found, the subcommand is returned. +/// The user needs to handle this subcommand on its own. +/// +/// # Remarks +/// +/// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, +/// `NoCustom` can be used as type here. +/// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom +/// parameters are visible to the user as if they were normal run command parameters. If no custom +/// parameters are required, `NoCustom` can be used as type here. +#[deprecated( + note = "Use parse_and_prepare instead; see the source code of parse_and_execute for how to transition" +)] +pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( + spec_factory: S, + version: &VersionInfo, + impl_name: &'static str, + args: I, + exit: E, + run_service: RS, +) -> error::Result> +where + F: ServiceFactory, + S: FnOnce(&str) -> Result>>, String>, + CC: StructOpt + Clone + GetLogFilter, + RP: StructOpt + Clone + AugmentClap, + E: IntoExit, + RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, + I: IntoIterator, + T: Into + Clone, +{ + match parse_and_prepare::(version, impl_name, args) { + ParseAndPrepare::Run(cmd) => cmd.run(spec_factory, exit, run_service), + ParseAndPrepare::BuildSpec(cmd) => cmd.run(spec_factory), + ParseAndPrepare::ExportBlocks(cmd) => cmd.run::(spec_factory, exit), + ParseAndPrepare::ImportBlocks(cmd) => cmd.run::(spec_factory, exit), + ParseAndPrepare::PurgeChain(cmd) => cmd.run(spec_factory), + ParseAndPrepare::RevertChain(cmd) => cmd.run::(spec_factory), + ParseAndPrepare::CustomCommand(cmd) => return Ok(Some(cmd)) + }?; + + Ok(None) +} + /// Create a `NodeKeyConfig` from the given `NodeKeyParams` in the context /// of an optional network config storage directory. fn node_key_config

(params: NodeKeyParams, net_config_dir: &Option

) @@ -522,27 +784,6 @@ where Ok(config) } -fn run_node( - cli: MergeParameters, - spec_factory: S, - exit: E, - run_service: RS, - impl_name: &'static str, - version: &VersionInfo, -) -> error::Result<()> -where - RP: StructOpt + Clone, - C: Default, - G: RuntimeGenesis, - E: IntoExit, - S: FnOnce(&str) -> Result>, String>, - RS: FnOnce(E, RunCmd, RP, Configuration) -> Result<(), String>, - { - let config = create_run_node_config(cli.left.clone(), spec_factory, impl_name, version)?; - - run_service(exit, cli.left, cli.right, config).map_err(Into::into) -} - // // IANA unassigned port ranges that we could use: // 6717-6766 Unassigned @@ -575,26 +816,6 @@ where Ok(()) } -fn build_spec( - cli: BuildSpecCmd, - spec_factory: S, - version: &VersionInfo, -) -> error::Result<()> -where - G: RuntimeGenesis, - S: FnOnce(&str) -> Result>, String>, -{ - info!("Building chain spec"); - let raw_output = cli.raw; - let mut spec = load_spec(&cli.shared_params, spec_factory)?; - with_default_boot_node(&mut spec, cli, version)?; - let json = service::chain_ops::build_spec(spec, raw_output)?; - - print!("{}", json); - - Ok(()) -} - /// Creates a configuration including the database path. pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, @@ -613,127 +834,11 @@ where Ok(config) } -fn export_blocks( - cli: ExportBlocksCmd, - spec_factory: S, - exit: E, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - E: IntoExit, - S: FnOnce(&str) -> Result>>, String>, -{ - let config = create_config_with_db_path(spec_factory, &cli.shared_params, version)?; - - info!("DB path: {}", config.database_path.display()); - let from = cli.from.unwrap_or(1); - let to = cli.to; - let json = cli.json; - - let file: Box = match cli.output { - Some(filename) => Box::new(File::create(filename)?), - None => Box::new(stdout()), - }; - - service::chain_ops::export_blocks::( - config, exit.into_exit(), file, from.into(), to.map(Into::into), json - ).map_err(Into::into) -} - /// Internal trait used to cast to a dynamic type that implements Read and Seek. trait ReadPlusSeek: Read + Seek {} impl ReadPlusSeek for T {} -fn import_blocks( - cli: ImportBlocksCmd, - spec_factory: S, - exit: E, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - E: IntoExit, - S: FnOnce(&str) -> Result>>, String>, -{ - let mut config = create_config_with_db_path(spec_factory, &cli.shared_params, version)?; - config.execution_strategies = ExecutionStrategies { - importing: cli.execution.into(), - other: cli.execution.into(), - ..Default::default() - }; - - let file: Box = match cli.input { - Some(filename) => Box::new(File::open(filename)?), - None => { - let mut buffer = Vec::new(); - stdin().read_to_end(&mut buffer)?; - Box::new(Cursor::new(buffer)) - }, - }; - - let fut = service::chain_ops::import_blocks::(config, exit.into_exit(), file)?; - tokio::run(fut); - Ok(()) -} - -fn revert_chain( - cli: RevertCmd, - spec_factory: S, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, -{ - let config = create_config_with_db_path(spec_factory, &cli.shared_params, version)?; - let blocks = cli.num; - Ok(service::chain_ops::revert_chain::(config, blocks.into())?) -} - -fn purge_chain( - cli: PurgeChainCmd, - spec_factory: S, - version: &VersionInfo, -) -> error::Result<()> -where - G: RuntimeGenesis, - S: FnOnce(&str) -> Result>, String>, -{ - let config = create_config_with_db_path::<(), _, _>(spec_factory, &cli.shared_params, version)?; - let db_path = config.database_path; - - if cli.yes == false { - print!("Are you sure to remove {:?}? (y/n)", &db_path); - stdout().flush().expect("failed to flush stdout"); - - let mut input = String::new(); - stdin().read_line(&mut input)?; - let input = input.trim(); - - match input.chars().nth(0) { - Some('y') | Some('Y') => {}, - _ => { - println!("Aborted"); - return Ok(()); - }, - } - } - - match fs::remove_dir_all(&db_path) { - Result::Ok(_) => { - println!("{:?} removed.", &db_path); - Ok(()) - }, - Result::Err(ref err) if err.kind() == ErrorKind::NotFound => { - println!("{:?} did not exist.", &db_path); - Ok(()) - }, - Result::Err(err) => Result::Err(err.into()) - } -} - fn parse_address( address: &str, port: Option, diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index b799a5d9ae..5f94afddbc 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -3,7 +3,7 @@ use futures::{future, Future, sync::oneshot}; use std::cell::RefCell; use tokio::runtime::Runtime; pub use substrate_cli::{VersionInfo, IntoExit, error}; -use substrate_cli::{informant, parse_and_execute, NoCustom}; +use substrate_cli::{informant, parse_and_prepare, ParseAndPrepare, NoCustom}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use crate::chain_spec; use std::ops::Deref; @@ -15,9 +15,8 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> T: Into + Clone, E: IntoExit, { - parse_and_execute::( - load_spec, &version, "substrate-node", args, exit, - |exit, _cli_args, _custom_args, config| { + match parse_and_prepare::(&version, "substrate-node", args) { + ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by {}, 2017, 2018", version.author); @@ -37,8 +36,16 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> exit ), }.map_err(|e| format!("{:?}", e)) - } - ).map_err(Into::into).map(|_| ()) + }), + ParseAndPrepare::BuildSpec(cmd) => cmd.run(load_spec), + ParseAndPrepare::ExportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::ImportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::PurgeChain(cmd) => cmd.run(load_spec), + ParseAndPrepare::RevertChain(cmd) => cmd.run::(load_spec), + ParseAndPrepare::CustomCommand(_) => Ok(()) + }?; + + Ok(()) } fn load_spec(id: &str) -> Result, String> { diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index 71cb19001d..6639c4ad0b 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -31,7 +31,7 @@ use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use std::ops::Deref; use log::info; use structopt::{StructOpt, clap::App}; -use cli::{AugmentClap, GetLogFilter}; +use cli::{AugmentClap, GetLogFilter, parse_and_prepare, ParseAndPrepare}; use crate::factory_impl::FactoryState; use transaction_factory::RuntimeAdapter; use client::ExecutionStrategies; @@ -158,9 +158,8 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul T: Into + Clone, E: IntoExit, { - let ret = cli::parse_and_execute::( - load_spec, &version, "substrate-node", args, exit, - |exit, _cli_args, _custom_args, config| { + match parse_and_prepare::(&version, "substrate-node", args) { + ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017-2019"); @@ -181,11 +180,13 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul exit ), }.map_err(|e| format!("{:?}", e)) - } - ); - - match &ret { - Ok(Some(CustomSubcommands::Factory(cli_args))) => { + }), + ParseAndPrepare::BuildSpec(cmd) => cmd.run(load_spec), + ParseAndPrepare::ExportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::ImportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::PurgeChain(cmd) => cmd.run(load_spec), + ParseAndPrepare::RevertChain(cmd) => cmd.run::(load_spec), + ParseAndPrepare::CustomCommand(CustomSubcommands::Factory(cli_args)) => { let mut config = cli::create_config_with_db_path( load_spec, &cli_args.shared_params, @@ -214,8 +215,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul ).map_err(|e| format!("Error in transaction factory: {}", e))?; Ok(()) - }, - _ => ret.map_err(Into::into).map(|_| ()) + } } } -- GitLab From 53c1fedd269371652f1e6725c592c2f48a35e614 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 12 Aug 2019 12:49:51 +0200 Subject: [PATCH 134/151] Rewrite the GrandPa observer work future (#3309) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rewrite the observer work future * Line widths * Update core/finality-grandpa/src/observer.rs Co-Authored-By: André Silva --- core/finality-grandpa/src/observer.rs | 248 +++++++++++++++++--------- 1 file changed, 166 insertions(+), 82 deletions(-) diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 2532ee8098..bce292262e 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -17,7 +17,7 @@ use std::sync::Arc; use futures::prelude::*; -use futures::future::{self, Loop as FutureLoop}; +use futures::{future, sync::mpsc}; use grandpa::{ BlockNumberOps, Error as GrandpaError, voter, voter_set::VoterSet @@ -31,7 +31,7 @@ use primitives::{H256, Blake2Hasher}; use crate::{ global_communication, CommandOrError, CommunicationIn, Config, environment, - LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, + LinkHalf, Network, Error, aux_schema::PersistentData, VoterCommand, VoterSetState, }; use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; @@ -171,34 +171,98 @@ pub fn run_grandpa_observer, N, RA, SC>( voter_commands_rx, } = link; - let PersistentData { authority_set, consensus_changes, set_state } = persistent_data; - let initial_state = (authority_set, consensus_changes, set_state.clone(), voter_commands_rx.into_future()); + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + persistent_data.set_state.clone(), + on_exit.clone() + ); + let observer_work = ObserverWork::new( + client, + network, + persistent_data, + config.keystore.clone(), + voter_commands_rx + ); + + let observer_work = observer_work + .map(|_| ()) + .map_err(|e| { + warn!("GRANDPA Observer failed: {:?}", e); + }); + + let observer_work = network_startup.and_then(move |()| observer_work); + + Ok(observer_work.select(on_exit).map(|_| ()).map_err(|_| ())) +} + +/// Future that powers the observer. +#[must_use] +struct ObserverWork, N: Network, E, Backend, RA> { + observer: Box>> + Send>, + client: Arc>, + network: NetworkBridge, + persistent_data: PersistentData, + keystore: Option, + voter_commands_rx: mpsc::UnboundedReceiver>>, +} - let (network, network_startup) = NetworkBridge::new(network, config.clone(), set_state, on_exit.clone()); +impl ObserverWork +where + B: BlockT, + N: Network, + N::In: Send + 'static, + NumberFor: BlockNumberOps, + RA: 'static + Send + Sync, + E: CallExecutor + Send + Sync + 'static, + Bk: Backend + 'static, +{ + fn new( + client: Arc>, + network: NetworkBridge, + persistent_data: PersistentData, + keystore: Option, + voter_commands_rx: mpsc::UnboundedReceiver>>, + ) -> Self { + + let mut work = ObserverWork { + // `observer` is set to a temporary value and replaced below when + // calling `rebuild_observer`. + observer: Box::new(futures::empty()) as Box<_>, + client, + network, + persistent_data, + keystore, + voter_commands_rx, + }; + work.rebuild_observer(); + work + } - let observer_work = future::loop_fn(initial_state, move |state| { - let (authority_set, consensus_changes, set_state, voter_commands_rx) = state; - let set_id = authority_set.set_id(); - let voters = Arc::new(authority_set.current_authorities()); - let client = client.clone(); + /// Rebuilds the `self.observer` field using the current authority set + /// state. This method should be called when we know that the authority set + /// has changed (e.g. as signalled by a voter command). + fn rebuild_observer(&mut self) { + let set_id = self.persistent_data.authority_set.set_id(); + let voters = Arc::new(self.persistent_data.authority_set.current_authorities()); // start global communication stream for the current set let (global_in, _) = global_communication( set_id, &voters, - &client, - &network, - &config.keystore, + &self.client, + &self.network, + &self.keystore, ); - let last_finalized_number = client.info().chain.finalized_number; + let last_finalized_number = self.client.info().chain.finalized_number; // NOTE: since we are not using `round_communication` we have to // manually note the round with the gossip validator, otherwise we won't // relay round messages. we want all full nodes to contribute to vote // availability. let note_round = { - let network = network.clone(); + let network = self.network.clone(); let voters = voters.clone(); move |round| network.note_round( @@ -210,85 +274,105 @@ pub fn run_grandpa_observer, N, RA, SC>( // create observer for the current set let observer = grandpa_observer( - &client, - &authority_set, - &consensus_changes, + &self.client, + &self.persistent_data.authority_set, + &self.persistent_data.consensus_changes, &voters, last_finalized_number, global_in, note_round, ); - let handle_voter_command = move |command, voter_commands_rx| { - // the observer doesn't use the voter set state, but we need to - // update it on-disk in case we restart as validator in the future. - let set_state = match command { - VoterCommand::Pause(reason) => { - info!(target: "afg", "Pausing old validator set: {}", reason); - - let completed_rounds = set_state.read().completed_rounds(); - let set_state = VoterSetState::Paused { completed_rounds }; - - #[allow(deprecated)] - crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; - - set_state - }, - VoterCommand::ChangeAuthorities(new) => { - // start the new authority set using the block where the - // set changed (not where the signal happened!) as the base. - let set_state = VoterSetState::live( - new.set_id, - &*authority_set.inner().read(), - (new.canon_hash, new.canon_number), - ); - - #[allow(deprecated)] - crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; - - set_state - }, - }; + self.observer = Box::new(observer); + } - Ok(FutureLoop::Continue((authority_set, consensus_changes, set_state.into(), voter_commands_rx))) - }; + fn handle_voter_command( + &mut self, + command: VoterCommand>, + ) -> Result<(), Error> { + // the observer doesn't use the voter set state, but we need to + // update it on-disk in case we restart as validator in the future. + self.persistent_data.set_state = match command { + VoterCommand::Pause(reason) => { + info!(target: "afg", "Pausing old validator set: {}", reason); - // run observer and listen to commands (switch authorities or pause) - observer.select2(voter_commands_rx).then(move |res| match res { - Ok(future::Either::A((_, _))) => { - // observer commit stream doesn't conclude naturally; this could reasonably be an error. - Ok(FutureLoop::Break(())) - }, - Err(future::Either::B(_)) => { - // the `voter_commands_rx` stream should not fail. - Ok(FutureLoop::Break(())) + let completed_rounds = self.persistent_data.set_state.read().completed_rounds(); + let set_state = VoterSetState::Paused { completed_rounds }; + + #[allow(deprecated)] + crate::aux_schema::write_voter_set_state(&**self.client.backend(), &set_state)?; + + set_state }, - Ok(future::Either::B(((None, _), _))) => { - // the `voter_commands_rx` stream should never conclude since it's never closed. - Ok(FutureLoop::Break(())) + VoterCommand::ChangeAuthorities(new) => { + // start the new authority set using the block where the + // set changed (not where the signal happened!) as the base. + let set_state = VoterSetState::live( + new.set_id, + &*self.persistent_data.authority_set.inner().read(), + (new.canon_hash, new.canon_number), + ); + + #[allow(deprecated)] + crate::aux_schema::write_voter_set_state(&**self.client.backend(), &set_state)?; + + set_state }, - Err(future::Either::A((CommandOrError::Error(e), _))) => { + }.into(); + + self.rebuild_observer(); + Ok(()) + } +} + +impl Future for ObserverWork +where + B: BlockT, + N: Network, + N::In: Send + 'static, + NumberFor: BlockNumberOps, + RA: 'static + Send + Sync, + E: CallExecutor + Send + Sync + 'static, + Bk: Backend + 'static, +{ + type Item = (); + type Error = Error; + + fn poll(&mut self) -> Poll { + match self.observer.poll() { + Ok(Async::NotReady) => {} + Ok(Async::Ready(())) => { + // observer commit stream doesn't conclude naturally; this could reasonably be an error. + return Ok(Async::Ready(())) + } + Err(CommandOrError::Error(e)) => { // return inner observer error - Err(e) - }, - Ok(future::Either::B(((Some(command), voter_commands_rx), _))) => { - // some command issued externally - handle_voter_command(command, voter_commands_rx.into_future()) - }, - Err(future::Either::A((CommandOrError::VoterCommand(command), voter_commands_rx))) => { + return Err(e) + } + Err(CommandOrError::VoterCommand(command)) => { // some command issued internally - handle_voter_command(command, voter_commands_rx) - }, - }) - }); - - let observer_work = observer_work - .map(|_| ()) - .map_err(|e| { - warn!("GRANDPA Observer failed: {:?}", e); - }); + self.handle_voter_command(command)?; + futures::task::current().notify(); + } + } - let observer_work = network_startup.and_then(move |()| observer_work); + match self.voter_commands_rx.poll() { + Ok(Async::NotReady) => {} + Err(_) => { + // the `voter_commands_rx` stream should not fail. + return Ok(Async::Ready(())) + } + Ok(Async::Ready(None)) => { + // the `voter_commands_rx` stream should never conclude since it's never closed. + return Ok(Async::Ready(())) + } + Ok(Async::Ready(Some(command))) => { + // some command issued externally + self.handle_voter_command(command)?; + futures::task::current().notify(); + } + } - Ok(observer_work.select(on_exit).map(|_| ()).map_err(|_| ())) + Ok(Async::NotReady) + } } -- GitLab From e8df4a86a49d39fb20156b4c873ec6f829ff2142 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 12 Aug 2019 15:27:39 +0200 Subject: [PATCH 135/151] document that session key generation stores keys (#3366) * document that session key generation stores keys * final typo fix --- core/service/src/components.rs | 9 +++++---- core/service/src/lib.rs | 2 +- core/session/src/lib.rs | 7 +++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 76387e6c88..8140b984dc 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -145,10 +145,11 @@ pub type PoolApi = ::TransactionPoolApi; pub trait RuntimeGenesis: Serialize + DeserializeOwned + BuildStorage {} impl RuntimeGenesis for T {} -/// Something that can create initial session keys from given seeds. +/// Something that can create and store initial session keys from given seeds. pub trait InitialSessionKeys { - /// Generate the initial session keys for the given seeds. - fn generate_intial_session_keys( + /// Generate the initial session keys for the given seeds and store them in + /// an internal keystore. + fn generate_initial_session_keys( client: Arc>, seeds: Vec, ) -> error::Result<()>; @@ -158,7 +159,7 @@ impl InitialSessionKeys for C where ComponentClient: ProvideRuntimeApi, as ProvideRuntimeApi>::Api: session::SessionKeys>, { - fn generate_intial_session_keys( + fn generate_initial_session_keys( client: Arc>, seeds: Vec, ) -> error::Result<()> { diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 3b2d73c124..aece42145a 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -175,7 +175,7 @@ impl Service { let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; let chain_info = client.info().chain; - Components::RuntimeServices::generate_intial_session_keys( + Components::RuntimeServices::generate_initial_session_keys( client.clone(), config.dev_key_seed.clone().map(|s| vec![s]).unwrap_or_default(), )?; diff --git a/core/session/src/lib.rs b/core/session/src/lib.rs index a962f2bfe3..1b40d2d9ba 100644 --- a/core/session/src/lib.rs +++ b/core/session/src/lib.rs @@ -29,6 +29,8 @@ client::decl_runtime_apis! { /// Session keys runtime api. pub trait SessionKeys { /// Generate a set of session keys with optionally using the given seed. + /// The keys should be stored within the keystore exposed via runtime + /// externalities. /// /// The seed needs to be a valid `utf8` string. /// @@ -37,7 +39,8 @@ client::decl_runtime_apis! { } } -/// Generate the initial session keys with the given seeds. +/// Generate the initial session keys with the given seeds and store them in +/// the client's keystore. #[cfg(feature = "std")] pub fn generate_initial_session_keys( client: std::sync::Arc>, @@ -61,4 +64,4 @@ where } Ok(()) -} \ No newline at end of file +} -- GitLab From 7154cc083036667f7884487985257d31557bf117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 12 Aug 2019 15:42:53 +0200 Subject: [PATCH 136/151] Make `--alice` etc implicitly enable `--validator` (#3369) --- core/cli/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 2fe72c583d..ef52904131 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -703,7 +703,7 @@ where let role = if cli.light { service::Roles::LIGHT - } else if cli.validator || is_dev { + } else if cli.validator || is_dev || cli.keyring.account.is_some() { service::Roles::AUTHORITY } else { service::Roles::FULL -- GitLab From a70c8a18ab0c5e43361c0581cc829b72cacb4b88 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 12 Aug 2019 15:47:29 +0200 Subject: [PATCH 137/151] Remove unneeded cruft (#3368) --- srml/democracy/src/lib.rs | 4 ++-- srml/support/src/dispatch.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index ee110f27e9..5a1c61b8ae 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -25,7 +25,7 @@ use sr_primitives::weights::SimpleDispatchInfo; use codec::{Encode, Decode, Input, Output, Error}; use srml_support::{ decl_module, decl_storage, decl_event, ensure, - StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap, + StorageValue, StorageMap, Parameter, Dispatchable, EnumerableStorageMap, traits::{ Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, OnFreeBalanceZero, Get @@ -182,7 +182,7 @@ pub const DEFAULT_EMERGENCY_VOTING_PERIOD: u32 = 0; pub const DEFAULT_COOLOFF_PERIOD: u32 = 0; pub trait Trait: system::Trait + Sized { - type Proposal: Parameter + Dispatchable + IsSubType, Self>; + type Proposal: Parameter + Dispatchable; type Event: From> + Into<::Event>; /// Currency type for this module. diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index 294fe3795e..21a2a817fb 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -1264,7 +1264,7 @@ macro_rules! decl_module { } pub trait IsSubType, R> { - fn is_aux_sub_type(&self) -> Option<&CallableCallFor>; + fn is_sub_type(&self) -> Option<&CallableCallFor>; } /// Implement a meta-dispatch module to dispatch to other dispatchers. @@ -1305,7 +1305,7 @@ macro_rules! impl_outer_dispatch { $( impl $crate::dispatch::IsSubType<$camelcase, $runtime> for $call_type { #[allow(unreachable_patterns)] - fn is_aux_sub_type(&self) -> Option<&$crate::dispatch::CallableCallFor<$camelcase, $runtime>> { + fn is_sub_type(&self) -> Option<&$crate::dispatch::CallableCallFor<$camelcase, $runtime>> { match *self { $call_type::$camelcase(ref r) => Some(r), // May be unreachable -- GitLab From 592fa607f4fdc7e5132718fe68c6cfae616b51f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 12 Aug 2019 14:54:30 +0100 Subject: [PATCH 138/151] node: exit on GRANDPA voter or BABE authoring error (#3353) * node: exit on GRANDPA voter or BABE authoring error * node: exit process with non-zero return code when service fails * service: rename infallible task to essential task * service: revert field name changes * core: fix service testnet --- core/cli/src/error.rs | 13 ++++++++++++- core/finality-grandpa/src/lib.rs | 8 ++++---- core/service/src/components.rs | 4 ++-- core/service/src/lib.rs | 31 ++++++++++++++++++++++++++++--- core/service/test/src/lib.rs | 26 +++++++++++++------------- node-template/src/cli.rs | 23 ++++++++++++++++------- node-template/src/main.rs | 2 +- node/cli/src/lib.rs | 20 +++++++++++++------- node/cli/src/service.rs | 10 ++++++++-- node/src/main.rs | 2 +- 10 files changed, 98 insertions(+), 41 deletions(-) diff --git a/core/cli/src/error.rs b/core/cli/src/error.rs index b052a29710..600e73d44f 100644 --- a/core/cli/src/error.rs +++ b/core/cli/src/error.rs @@ -36,7 +36,17 @@ pub enum Error { Input(String), /// Invalid listen multiaddress #[display(fmt="Invalid listen multiaddress")] - InvalidListenMultiaddress + InvalidListenMultiaddress, + /// Other uncategorized error. + Other(String), +} + +/// Must be implemented explicitly because `derive_more` won't generate this +/// case due to conflicting derive for `Other(String)`. +impl std::convert::From for Error { + fn from(s: String) -> Error { + Error::Input(s) + } } impl std::error::Error for Error { @@ -48,6 +58,7 @@ impl std::error::Error for Error { Error::Client(ref err) => Some(err), Error::Input(_) => None, Error::InvalidListenMultiaddress => None, + Error::Other(_) => None, } } } diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index f5010debdc..5c6835e3bb 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -53,7 +53,7 @@ //! included in the newly-finalized chain. use futures::prelude::*; -use log::{debug, info, warn}; +use log::{debug, error, info}; use futures::sync::mpsc; use client::{ BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError, @@ -680,8 +680,8 @@ pub fn run_grandpa_voter, N, RA, SC, X>( poll_voter.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A(((), _))) => { - // voters don't conclude naturally; this could reasonably be an error. - Ok(FutureLoop::Break(())) + // voters don't conclude naturally + Err(Error::Safety("GRANDPA voter has concluded.".into())) }, Err(future::Either::B(_)) => { // the `voter_commands_rx` stream should not fail. @@ -709,7 +709,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( let voter_work = voter_work .map(|_| ()) .map_err(|e| { - warn!("GRANDPA Voter failed: {:?}", e); + error!("GRANDPA Voter failed: {:?}", e); telemetry!(CONSENSUS_WARN; "afg.voter_failed"; "e" => ?e); }); diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 8140b984dc..3c566b5974 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -502,7 +502,7 @@ impl DerefMut for FullComponents { impl Future for FullComponents { type Item = (); - type Error = (); + type Error = super::Error; fn poll(&mut self) -> Poll { self.service.poll() @@ -627,7 +627,7 @@ impl DerefMut for LightComponents { impl Future for LightComponents { type Item = (); - type Error = (); + type Error = super::Error; fn poll(&mut self) -> Poll { self.service.poll() diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index aece42145a..2b604fbc70 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -28,6 +28,7 @@ pub mod error; use std::io; use std::net::SocketAddr; use std::collections::HashMap; +use std::sync::atomic::{AtomicBool, Ordering}; use std::time::{Duration, Instant}; use futures::sync::mpsc; use parking_lot::Mutex; @@ -82,8 +83,14 @@ pub struct Service { NetworkStatus>, NetworkState )>>>>, transaction_pool: Arc>, + /// A future that resolves when the service has exited, this is useful to + /// make sure any internally spawned futures stop when the service does. exit: exit_future::Exit, + /// A signal that makes the exit future above resolve, fired on service drop. signal: Option, + /// Set to `true` when a spawned essential task has failed. The next time + /// the service future is polled it should complete with an error. + essential_failed: Arc, /// Sender for futures that must be spawned as background tasks. to_spawn_tx: mpsc::UnboundedSender + Send>>, /// Receiver for futures that must be spawned as background tasks. @@ -395,7 +402,7 @@ impl Service { // Telemetry let telemetry = config.telemetry_endpoints.clone().map(|endpoints| { - let is_authority = config.roles == Roles::AUTHORITY; + let is_authority = config.roles.is_authority(); let network_id = network.local_peer_id().to_base58(); let name = config.name.clone(); let impl_name = config.impl_name.to_owned(); @@ -440,12 +447,13 @@ impl Service { network_status_sinks, select_chain, transaction_pool, + exit, signal: Some(signal), + essential_failed: Arc::new(AtomicBool::new(false)), to_spawn_tx, to_spawn_rx, to_poll: Vec::new(), config, - exit, rpc_handlers, _rpc: rpc, _telemetry: telemetry, @@ -491,6 +499,19 @@ impl Service { let _ = self.to_spawn_tx.unbounded_send(Box::new(task)); } + /// Spawns a task in the background that runs the future passed as + /// parameter. The given task is considered essential, i.e. if it errors we + /// trigger a service exit. + pub fn spawn_essential_task(&self, task: impl Future + Send + 'static) { + let essential_failed = self.essential_failed.clone(); + let essential_task = Box::new(task.map_err(move |_| { + error!("Essential task failed. Shutting down service."); + essential_failed.store(true, Ordering::Relaxed); + })); + + let _ = self.to_spawn_tx.unbounded_send(essential_task); + } + /// Returns a handle for spawning tasks. pub fn spawn_task_handle(&self) -> SpawnTaskHandle { SpawnTaskHandle { @@ -548,9 +569,13 @@ impl Service { impl Future for Service where Components: components::Components { type Item = (); - type Error = (); + type Error = Error; fn poll(&mut self) -> Poll { + if self.essential_failed.load(Ordering::Relaxed) { + return Err(Error::Other("Essential task failed.".into())); + } + while let Ok(Async::Ready(Some(task_to_spawn))) = self.to_spawn_rx.poll() { let executor = tokio_executor::DefaultExecutor::current(); if let Err(err) = executor.execute(task_to_spawn) { diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 851ed8e5ec..1b3c43dae7 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -73,9 +73,9 @@ impl From for SyncService { } } -impl> Future for SyncService { +impl> Future for SyncService { type Item = (); - type Error = (); + type Error = service::Error; fn poll(&mut self) -> Poll { self.0.lock().unwrap().poll() @@ -195,8 +195,8 @@ fn node_config ( } impl TestNet where - F::FullService: Future, - F::LightService: Future + F::FullService: Future, + F::LightService: Future, { fn new( temp: &TempDir, @@ -239,7 +239,7 @@ impl TestNet where let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(F::new_full(node_config).expect("Error creating test node service")); - executor.spawn(service.clone()); + executor.spawn(service.clone().map_err(|_| ())); let addr = addr.with(multiaddr::Protocol::P2p(service.get().network().local_peer_id().into())); ((index + nodes), service, addr) })); @@ -250,7 +250,7 @@ impl TestNet where let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(F::new_full(node_config).expect("Error creating test node service")); - executor.spawn(service.clone()); + executor.spawn(service.clone().map_err(|_| ())); let addr = addr.with(multiaddr::Protocol::P2p(service.get().network().local_peer_id().into())); (index, service, addr) })); @@ -261,7 +261,7 @@ impl TestNet where let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(F::new_light(node_config).expect("Error creating test node service")); - executor.spawn(service.clone()); + executor.spawn(service.clone().map_err(|_| ())); let addr = addr.with(multiaddr::Protocol::P2p(service.get().network().local_peer_id().into())); (index, service, addr) })); @@ -272,8 +272,8 @@ impl TestNet where } pub fn connectivity(spec: FactoryChainSpec) where - F::FullService: Future, - F::LightService: Future, + F::FullService: Future, + F::LightService: Future, { const NUM_FULL_NODES: usize = 5; const NUM_LIGHT_NODES: usize = 5; @@ -347,8 +347,8 @@ pub fn connectivity(spec: FactoryChainSpec) where pub fn sync(spec: FactoryChainSpec, mut block_factory: B, mut extrinsic_factory: E) where F: ServiceFactory, - F::FullService: Future, - F::LightService: Future, + F::FullService: Future, + F::LightService: Future, B: FnMut(&SyncService) -> BlockImportParams, E: FnMut(&SyncService) -> FactoryExtrinsic, { @@ -406,8 +406,8 @@ pub fn sync(spec: FactoryChainSpec, mut block_factory: B, mut extrin pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, - F::FullService: Future, - F::LightService: Future, + F::FullService: Future, + F::LightService: Future, { const NUM_FULL_NODES: usize = 10; const NUM_LIGHT_NODES: usize = 0; diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index 5f94afddbc..4d672491c1 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -59,11 +59,11 @@ fn run_until_exit( mut runtime: Runtime, service: T, e: E, -) -> error::Result<()> - where - T: Deref> + Future + Send + 'static, - C: substrate_service::Components, - E: IntoExit, +) -> error::Result<()> where + T: Deref>, + T: Future + Send + 'static, + C: substrate_service::Components, + E: IntoExit, { let (exit_send, exit) = exit_future::signal(); @@ -74,10 +74,19 @@ fn run_until_exit( // but we need to keep holding a reference to the global telemetry guard let _telemetry = service.telemetry(); - let _ = runtime.block_on(service.select(e.into_exit())); + let service_res = { + let exit = e.into_exit().map_err(|_| error::Error::Other("Exit future failed.".into())); + let service = service.map_err(|err| error::Error::Service(err)); + let select = service.select(exit).map(|_| ()).map_err(|(err, _)| err); + runtime.block_on(select) + }; + exit_send.fire(); - Ok(()) + // TODO [andre]: timeout this future #1318 + let _ = runtime.shutdown_on_idle().wait(); + + service_res } // handles ctrl-c diff --git a/node-template/src/main.rs b/node-template/src/main.rs index 5418453a02..18e9638833 100644 --- a/node-template/src/main.rs +++ b/node-template/src/main.rs @@ -21,7 +21,7 @@ fn main() { }; if let Err(e) = cli::run(::std::env::args(), cli::Exit, version) { - eprintln!("Error starting the node: {}\n\n{:?}", e, e); + eprintln!("Fatal error: {}\n\n{:?}", e, e); std::process::exit(1) } } diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index 6639c4ad0b..4e3cfa7f01 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -223,11 +223,11 @@ fn run_until_exit( mut runtime: Runtime, service: T, e: E, -) -> error::Result<()> - where - T: Deref> + Future + Send + 'static, - C: substrate_service::Components, - E: IntoExit, +) -> error::Result<()> where + T: Deref>, + T: Future + Send + 'static, + C: substrate_service::Components, + E: IntoExit, { let (exit_send, exit) = exit_future::signal(); @@ -238,11 +238,17 @@ fn run_until_exit( // but we need to keep holding a reference to the global telemetry guard let _telemetry = service.telemetry(); - let _ = runtime.block_on(service.select(e.into_exit())); + let service_res = { + let exit = e.into_exit().map_err(|_| error::Error::Other("Exit future failed.".into())); + let service = service.map_err(|err| error::Error::Service(err)); + let select = service.select(exit).map(|_| ()).map_err(|(err, _)| err); + runtime.block_on(select) + }; + exit_send.fire(); // TODO [andre]: timeout this future #1318 let _ = runtime.shutdown_on_idle().wait(); - Ok(()) + service_res } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 35f813efb3..0a041e94d3 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -152,7 +152,10 @@ construct_service_factory! { let babe = start_babe(babe_config)?; let select = babe.select(service.on_exit()).then(|_| Ok(())); - service.spawn_task(Box::new(select)); + + // the BABE authoring task is considered infallible, i.e. if it + // fails we take down the service with it. + service.spawn_essential_task(select); } let config = grandpa::Config { @@ -187,7 +190,10 @@ construct_service_factory! { on_exit: service.on_exit(), telemetry_on_connect: Some(telemetry_on_connect), }; - service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); + + // the GRANDPA voter task is considered infallible, i.e. + // if it fails we take down the service with it. + service.spawn_essential_task(grandpa::run_grandpa_voter(grandpa_config)?); }, (_, true) => { grandpa::setup_disabled_grandpa( diff --git a/node/src/main.rs b/node/src/main.rs index 15b603e7a2..ca4a6b4c60 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -55,7 +55,7 @@ fn main() { }; if let Err(e) = cli::run(::std::env::args(), Exit, version) { - eprintln!("Error starting the node: {}\n\n{:?}", e, e); + eprintln!("Fatal error: {}\n\n{:?}", e, e); std::process::exit(1) } } -- GitLab From 16821cdccd50e51831a0a6b909884c8b41818904 Mon Sep 17 00:00:00 2001 From: Juan Aguilar Date: Mon, 12 Aug 2019 16:13:02 +0200 Subject: [PATCH 139/151] Remove enumerate_trie_root in favour of ordered_trie_root #2382 (#3360) --- core/executor/runtime-test/src/lib.rs | 6 +++--- core/executor/src/wasm_executor.rs | 4 ++-- core/sr-io/src/lib.rs | 9 --------- core/sr-io/with_std.rs | 8 -------- core/sr-io/without_std.rs | 28 ++++++++++++++++----------- core/sr-primitives/src/traits.rs | 12 +++--------- core/test-runtime/src/system.rs | 6 +++--- srml/system/src/lib.rs | 2 +- 8 files changed, 29 insertions(+), 46 deletions(-) diff --git a/core/executor/runtime-test/src/lib.rs b/core/executor/runtime-test/src/lib.rs index 49612c271e..5e276a8814 100644 --- a/core/executor/runtime-test/src/lib.rs +++ b/core/executor/runtime-test/src/lib.rs @@ -9,7 +9,7 @@ use rstd::{vec::Vec, slice, vec}; use runtime_io::{ set_storage, storage, clear_prefix, print, blake2_128, blake2_256, - twox_128, twox_256, ed25519_verify, sr25519_verify, enumerated_trie_root + twox_128, twox_256, ed25519_verify, sr25519_verify, ordered_trie_root }; use primitives::{ed25519, sr25519}; @@ -93,8 +93,8 @@ impl_stubs!( let msg = b"all ok!"; [sr25519_verify(&sr25519::Signature(sig), &msg[..], &sr25519::Public(pubkey)) as u8].to_vec() }, - test_enumerated_trie_root => |_| { - enumerated_trie_root::( + test_ordered_trie_root => |_| { + ordered_trie_root::( &[ &b"zero"[..], &b"one"[..], diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 185aaba513..3eed549773 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -1660,12 +1660,12 @@ mod tests { } #[test] - fn enumerated_trie_root_should_work() { + fn ordered_trie_root_should_work() { let mut ext = TestExternalities::::default(); let trie_input = vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]; let test_code = WASM_BINARY; assert_eq!( - WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_ordered_trie_root", &[]).unwrap(), Layout::::ordered_trie_root(trie_input.iter()).as_fixed_bytes().encode() ); } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 425d9a714c..91b27efba0 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -153,15 +153,6 @@ export_api! { /// "Commit" all existing operations and get the resultant storage change root. fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]>; - /// A trie root formed from the enumerated items. - /// TODO [#2382] remove (just use `ordered_trie_root` (NOTE currently not implemented for without_std)) - fn enumerated_trie_root(input: &[&[u8]]) -> H::Out - where - H: Hasher, - H: self::imp::HasherBounds, - H::Out: Ord - ; - /// A trie root formed from the iterated items. fn trie_root(input: I) -> H::Out where diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index ec9d8f06f0..167011608f 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -167,14 +167,6 @@ impl StorageApi for () { ).unwrap_or(Ok(None)).expect("Invalid parent hash passed to storage_changes_root") } - fn enumerated_trie_root(input: &[&[u8]]) -> H::Out - where - H: Hasher, - H::Out: Ord, - { - Layout::::ordered_trie_root(input) - } - fn trie_root(input: I) -> H::Out where I: IntoIterator, diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 118a91819a..954eccc9cf 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -128,8 +128,11 @@ pub mod ext { /// Ensures we use the right crypto when calling into native pub trait ExternTrieCrypto: Hasher { - /// Calculate enumerated trie root. - fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out; + /// A trie root formed from the enumerated items. + fn ordered_trie_root< + A: AsRef<[u8]>, + I: IntoIterator + >(values: I) -> Self::Out; } /// Additional bounds for Hasher trait for without_std. @@ -138,9 +141,16 @@ pub mod ext { // Ensures we use a Blake2_256-flavored Hasher when calling into native impl ExternTrieCrypto for Blake2Hasher { - fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out { - let lengths = values.iter().map(|v| (v.len() as u32).to_le()).collect::>(); - let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); + fn ordered_trie_root< + A: AsRef<[u8]>, + I: IntoIterator + >(items: I) -> Self::Out { + let mut values = Vec::new(); + let mut lengths = Vec::new(); + for v in items.into_iter() { + values.extend_from_slice(v.as_ref()); + lengths.push((v.as_ref().len() as u32).to_le()); + } let mut result: [u8; 32] = Default::default(); unsafe { ext_blake2_256_enumerated_trie_root.get()( @@ -767,10 +777,6 @@ impl StorageApi for () { } } - fn enumerated_trie_root(values: &[&[u8]]) -> H::Out { - H::enumerated_trie_root(values) - } - fn trie_root< H: Hasher + ExternTrieCrypto, I: IntoIterator, @@ -784,8 +790,8 @@ impl StorageApi for () { H: Hasher + ExternTrieCrypto, I: IntoIterator, A: AsRef<[u8]> - >(_input: I) -> H::Out { - unimplemented!() + >(values: I) -> H::Out { + H::ordered_trie_root(values) } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index de700ffec3..5fc0cb5c57 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -466,12 +466,9 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup Encode::using_encoded(s, Self::hash) } - /// Produce the trie-db root of a mapping from indices to byte slices. - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; - - /// Iterator-based version of `enumerated_trie_root`. + /// Iterator-based version of `ordered_trie_root`. fn ordered_trie_root< - I: IntoIterator + Iterator, + I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output; @@ -500,9 +497,6 @@ impl Hash for BlakeTwo256 { fn hash(s: &[u8]) -> Self::Output { runtime_io::blake2_256(s).into() } - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { - runtime_io::enumerated_trie_root::(items).into() - } fn trie_root< I: IntoIterator, A: AsRef<[u8]> + Ord, @@ -511,7 +505,7 @@ impl Hash for BlakeTwo256 { runtime_io::trie_root::(input).into() } fn ordered_trie_root< - I: IntoIterator + Iterator, + I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output { runtime_io::ordered_trie_root::(input).into() diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 44673aa5b8..f3c890cf79 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -18,7 +18,7 @@ //! and depositing logs. use rstd::prelude::*; -use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128, blake2_256}; +use runtime_io::{storage_root, ordered_trie_root, storage_changes_root, twox_128, blake2_256}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; use sr_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; @@ -96,7 +96,7 @@ fn execute_block_with_state_root_handler( // check transaction trie root represents the transactions. let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root::(&txs).into(); + let txs_root = ordered_trie_root::(&txs).into(); info_expect_equal_hash(&txs_root, &header.extrinsics_root); if let Mode::Overwrite = mode { header.extrinsics_root = txs_root; @@ -200,7 +200,7 @@ pub fn finalize_block() -> Header { let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX).unwrap(); let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); let txs = txs.iter().map(Vec::as_slice).collect::>(); - let extrinsics_root = enumerated_trie_root::(&txs).into(); + let extrinsics_root = ordered_trie_root::(&txs).into(); let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index eb4c4a907a..684af7c6b8 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -147,7 +147,7 @@ pub fn extrinsics_root(extrinsics: &[E]) -> H::Output /// Compute the trie root of a list of extrinsics. pub fn extrinsics_data_root(xts: Vec>) -> H::Output { let xts = xts.iter().map(Vec::as_slice).collect::>(); - H::enumerated_trie_root(&xts) + H::ordered_trie_root(&xts) } pub trait Trait: 'static + Eq + Clone { -- GitLab From 46886ba777d4bf7eadbbe32b3de37c88b06ccbe7 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 12 Aug 2019 16:13:59 +0200 Subject: [PATCH 140/151] downgrade logging of malformed packets to debug (#3367) --- core/network/src/legacy_proto/upgrade.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/network/src/legacy_proto/upgrade.rs b/core/network/src/legacy_proto/upgrade.rs index ebd9c431e0..8831d16f91 100644 --- a/core/network/src/legacy_proto/upgrade.rs +++ b/core/network/src/legacy_proto/upgrade.rs @@ -19,7 +19,7 @@ use crate::protocol::message::Message; use bytes::Bytes; use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; use libp2p::tokio_codec::Framed; -use log::warn; +use log::debug; use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; use codec::{Decode, Encode}; @@ -201,7 +201,7 @@ where TSubstream: AsyncRead + AsyncWrite, B: BlockT { Async::Ready(Some(data)) => { let message = as Decode>::decode(&mut &data[..]) .map_err(|err| { - warn!( + debug!( target: "sub-libp2p", "Couldn't decode packet sent by the remote: {:?}: {}", data, err.what(), ); -- GitLab From 215f6cc7d7105a3c337eeabed7a9c65476246d87 Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Mon, 12 Aug 2019 16:16:30 +0200 Subject: [PATCH 141/151] srml-contracts: Contract calls/instantiations to return exit statuses (#3320) * srml-contracts: Rename ext_scratch_copy to ext_scratch_read. This is to disambiguate from the next ext_scratch_write function. * Remove unnecessary OutputBuf and EmptyOutputBuf. * Replace VmExecError with a result type of custom structs. * Do not drop the scratch buffer on traps and regular returns. This just reduces the number of allocations required during nested contract calls and instantiations. * Semantics for returning a status code and data from contract calls. * Remove CallReceipt and InstantiateReceipt. With forthcoming changes to return data from instantiate calls, the two types of receipts become very similar to each other and to ExecReturnValue. Instead, replace them with ExecReturnValue and a regular 2-tuple in the case of instantiation. * Modify contract function signatures to allow returning status codes. * Introduce ext_sandbox_write runtime function. * Test all the things. * Bump node runtime spec version. * Style fixes. --- core/sr-sandbox/src/lib.rs | 5 +- node/executor/src/lib.rs | 4 +- node/runtime/src/lib.rs | 4 +- srml/contracts/COMPLEXITY.md | 10 +- srml/contracts/src/exec.rs | 568 +++++++++++++++++------------ srml/contracts/src/lib.rs | 13 +- srml/contracts/src/tests.rs | 381 ++++++++++++++++++- srml/contracts/src/wasm/mod.rs | 408 ++++++++++++--------- srml/contracts/src/wasm/prepare.rs | 10 +- srml/contracts/src/wasm/runtime.rs | 230 +++++++----- 10 files changed, 1110 insertions(+), 523 deletions(-) diff --git a/core/sr-sandbox/src/lib.rs b/core/sr-sandbox/src/lib.rs index 9cb39236b0..e814a51ace 100755 --- a/core/sr-sandbox/src/lib.rs +++ b/core/sr-sandbox/src/lib.rs @@ -53,8 +53,7 @@ mod imp { /// Error that can occur while using this crate. #[cfg_attr(feature = "std", derive(Debug))] pub enum Error { - /// Module is not valid, couldn't be instantiated or it's `start` function trapped - /// when executed. + /// Module is not valid, couldn't be instantiated. Module, /// Access to a memory or table was made with an address or an index which is out of bounds. @@ -62,7 +61,7 @@ pub enum Error { /// Note that if wasm module makes an out-of-bounds access then trap will occur. OutOfBounds, - /// Failed to invoke an exported function for some reason. + /// Failed to invoke the start function or an exported function for some reason. Execution, } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 167f90feeb..a7dcb879d3 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -690,7 +690,7 @@ mod tests { ;; ) -> u32 (import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "deploy") ) @@ -705,7 +705,7 @@ mod tests { ) ) - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 0) (i32.const 0) (i32.const 4) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 086818c51f..c4c4ca3f8f 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 138, - impl_version: 138, + spec_version: 139, + impl_version: 139, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contracts/COMPLEXITY.md b/srml/contracts/COMPLEXITY.md index 6ae7b8fb73..c582de4264 100644 --- a/srml/contracts/COMPLEXITY.md +++ b/srml/contracts/COMPLEXITY.md @@ -371,7 +371,7 @@ This function returns the size of the scratch buffer. **complexity**: This function is of constant complexity. -## ext_scratch_copy +## ext_scratch_read This function copies slice of data from the scratch buffer to the sandbox memory. The calling code specifies the slice length. Execution of the function consists of the following steps: @@ -379,6 +379,14 @@ This function copies slice of data from the scratch buffer to the sandbox memory **complexity**: The computing complexity of this function is proportional to the length of the slice. No additional memory is required. +## ext_scratch_write + +This function copies slice of data from the sandbox memory to the scratch buffer. The calling code specifies the slice length. Execution of the function consists of the following steps: + +1. Loading a slice from the sandbox memory into the (see sandboxing memory get) + +**complexity**: Complexity is proportional to the length of the slice. + ## ext_set_rent_allowance This function receives the following argument: diff --git a/srml/contracts/src/exec.rs b/srml/contracts/src/exec.rs index eda37d2452..5ba02d43a0 100644 --- a/srml/contracts/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -34,15 +34,54 @@ pub type BlockNumberOf = ::BlockNumber; /// A type that represents a topic of an event. At the moment a hash is used. pub type TopicOf = ::Hash; -#[cfg_attr(test, derive(Debug))] -pub struct InstantiateReceipt { - pub address: AccountId, +/// A status code return to the source of a contract call or instantiation indicating success or +/// failure. A code of 0 indicates success and that changes are applied. All other codes indicate +/// failure and that changes are reverted. The particular code in the case of failure is opaque and +/// may be interpreted by the calling contract. +pub type StatusCode = u8; + +/// The status code indicating success. +pub const STATUS_SUCCESS: StatusCode = 0; + +/// Output of a contract call or instantiation which ran to completion. +#[cfg_attr(test, derive(PartialEq, Eq, Debug))] +pub struct ExecReturnValue { + pub status: StatusCode, + pub data: Vec, } +impl ExecReturnValue { + /// Returns whether the call or instantiation exited with a successful status code. + pub fn is_success(&self) -> bool { + self.status == STATUS_SUCCESS + } +} + +/// An error indicating some failure to execute a contract call or instantiation. This can include +/// VM-specific errors during execution (eg. division by 0, OOB access, failure to satisfy some +/// precondition of a system call, etc.) or errors with the orchestration (eg. out-of-gas errors, a +/// non-existent destination contract, etc.). #[cfg_attr(test, derive(Debug))] -pub struct CallReceipt { - /// Output data received as a result of a call. - pub output_data: Vec, +pub struct ExecError { + pub reason: &'static str, + /// This is an allocated buffer that may be reused. The buffer must be cleared explicitly + /// before reuse. + pub buffer: Vec, +} + +pub type ExecResult = Result; + +/// Evaluate an expression of type Result<_, &'static str> and either resolve to the value if Ok or +/// wrap the error string into an ExecutionError with the provided buffer and return from the +/// enclosing function. This macro is used instead of .map_err(..)? in order to avoid taking +/// ownership of buffer unless there is an error. +macro_rules! try_or_exec_error { + ($e:expr, $buffer:expr) => { + match $e { + Ok(val) => val, + Err(reason) => return Err(ExecError { reason, buffer: $buffer }), + } + } } pub type StorageKey = [u8; 32]; @@ -74,8 +113,8 @@ pub trait Ext { code: &CodeHash, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - ) -> Result>, &'static str>; + input_data: Vec, + ) -> Result<(AccountIdOf, ExecReturnValue), ExecError>; /// Call (possibly transferring some amount of funds) into the specified account. fn call( @@ -83,9 +122,8 @@ pub trait Ext { to: &AccountIdOf, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, - ) -> Result; + input_data: Vec, + ) -> ExecResult; /// Notes a call dispatch. fn note_dispatch_call(&mut self, call: CallOf); @@ -150,66 +188,6 @@ pub trait Loader { fn load_main(&self, code_hash: &CodeHash) -> Result; } -/// An `EmptyOutputBuf` is used as an optimization for reusing empty vectors when -/// available. -/// -/// You can create this structure from a spare vector if you have any and then -/// you can fill it (only once), converting it to `OutputBuf`. -pub struct EmptyOutputBuf(Vec); - -impl EmptyOutputBuf { - /// Create an output buffer from a spare vector which is not longer needed. - /// - /// All contents are discarded, but capacity is preserved. - pub fn from_spare_vec(mut v: Vec) -> Self { - v.clear(); - EmptyOutputBuf(v) - } - - /// Create an output buffer ready for receiving a result. - /// - /// Use this function to create output buffer if you don't have a spare - /// vector. Otherwise, use `from_spare_vec`. - pub fn new() -> Self { - EmptyOutputBuf(Vec::new()) - } - - /// Write to the buffer result of the specified size. - /// - /// Calls closure with the buffer of the requested size. - pub fn fill Result<(), E>>(mut self, size: usize, f: F) -> Result { - assert!(self.0.len() == 0, "the vector is always cleared; it's written only once"); - self.0.resize(size, 0); - f(&mut self.0).map(|()| OutputBuf(self.0)) - } -} - -/// `OutputBuf` is the end result of filling an `EmptyOutputBuf`. -pub struct OutputBuf(Vec); - -#[must_use] -pub enum VmExecResult { - Ok, - Returned(OutputBuf), - /// A program executed some forbidden operation. - /// - /// This can include, e.g.: division by 0, OOB access or failure to satisfy some precondition - /// of a system call. - /// - /// Contains some vm-specific description of an trap. - Trap(&'static str), -} - -impl VmExecResult { - pub fn into_result(self) -> Result, &'static str> { - match self { - VmExecResult::Ok => Ok(Vec::new()), - VmExecResult::Returned(buf) => Ok(buf.0), - VmExecResult::Trap(description) => Err(description), - } - } -} - /// Struct that records a request to deposit an event with a list of topics. #[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq))] pub struct IndexedEvent { @@ -227,9 +205,6 @@ pub struct IndexedEvent { /// /// Execution of code can end by either implicit termination (that is, reached the end of /// executable), explicit termination via returning a buffer or termination due to a trap. -/// -/// You can optionally provide a vector for collecting output if a spare is available. If you don't have -/// it will be created anyway. pub trait Vm { type Executable; @@ -237,10 +212,9 @@ pub trait Vm { &self, exec: &Self::Executable, ext: E, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, + input_data: Vec, gas_meter: &mut GasMeter, - ) -> VmExecResult; + ) -> ExecResult; } #[cfg_attr(test, derive(Debug, PartialEq, Eq))] @@ -353,18 +327,23 @@ where dest: T::AccountId, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, - ) -> Result { + input_data: Vec, + ) -> ExecResult { if self.depth == self.config.max_depth as usize { - return Err("reached maximum depth, cannot make a call"); + return Err(ExecError { + reason: "reached maximum depth, cannot make a call", + buffer: input_data, + }); } if gas_meter .charge(self.config, ExecFeeToken::Call) .is_out_of_gas() { - return Err("not enough gas to pay base call fee"); + return Err(ExecError { + reason: "not enough gas to pay base call fee", + buffer: input_data, + }); } // Assumption: pay_rent doesn't collide with overlay because @@ -374,46 +353,49 @@ where // Calls to dead contracts always fail. if let Some(ContractInfo::Tombstone(_)) = contract_info { - return Err("contract has been evicted"); + return Err(ExecError { + reason: "contract has been evicted", + buffer: input_data, + }); }; let caller = self.self_account.clone(); let dest_trie_id = contract_info.and_then(|i| i.as_alive().map(|i| i.trie_id.clone())); - let output_data = self.with_nested_context(dest.clone(), dest_trie_id, |nested| { + self.with_nested_context(dest.clone(), dest_trie_id, |nested| { if value > BalanceOf::::zero() { - transfer( - gas_meter, - TransferCause::Call, - &caller, - &dest, - value, - nested, - )?; + try_or_exec_error!( + transfer( + gas_meter, + TransferCause::Call, + &caller, + &dest, + value, + nested, + ), + input_data + ); } // If code_hash is not none, then the destination account is a live contract, otherwise // it is a regular account since tombstone accounts have already been rejected. - let output_data = match nested.overlay.get_code_hash(&dest) { + match nested.overlay.get_code_hash(&dest) { Some(dest_code_hash) => { - let executable = nested.loader.load_main(&dest_code_hash)?; + let executable = try_or_exec_error!( + nested.loader.load_main(&dest_code_hash), + input_data + ); nested.vm .execute( &executable, nested.new_call_context(caller, value), input_data, - empty_output_buf, gas_meter, ) - .into_result()? } - None => Vec::new(), - }; - - Ok(output_data) - })?; - - Ok(CallReceipt { output_data }) + None => Ok(ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() }), + } + }) } pub fn instantiate( @@ -421,53 +403,66 @@ where endowment: BalanceOf, gas_meter: &mut GasMeter, code_hash: &CodeHash, - input_data: &[u8], - ) -> Result, &'static str> { + input_data: Vec, + ) -> Result<(T::AccountId, ExecReturnValue), ExecError> { if self.depth == self.config.max_depth as usize { - return Err("reached maximum depth, cannot create"); + return Err(ExecError { + reason: "reached maximum depth, cannot create", + buffer: input_data, + }); } if gas_meter .charge(self.config, ExecFeeToken::Instantiate) .is_out_of_gas() { - return Err("not enough gas to pay base instantiate fee"); + return Err(ExecError { + reason: "not enough gas to pay base instantiate fee", + buffer: input_data, + }); } let caller = self.self_account.clone(); let dest = T::DetermineContractAddress::contract_address_for( code_hash, - input_data, + &input_data, &caller, ); // TrieId has not been generated yet and storage is empty since contract is new. let dest_trie_id = None; - let _ = self.with_nested_context(dest.clone(), dest_trie_id, |nested| { - nested.overlay.create_contract(&dest, code_hash.clone())?; + let output = self.with_nested_context(dest.clone(), dest_trie_id, |nested| { + try_or_exec_error!( + nested.overlay.create_contract(&dest, code_hash.clone()), + input_data + ); // Send funds unconditionally here. If the `endowment` is below existential_deposit // then error will be returned here. - transfer( - gas_meter, - TransferCause::Instantiate, - &caller, - &dest, - endowment, - nested, - )?; - - let executable = nested.loader.load_init(&code_hash)?; - nested.vm + try_or_exec_error!( + transfer( + gas_meter, + TransferCause::Instantiate, + &caller, + &dest, + endowment, + nested, + ), + input_data + ); + + let executable = try_or_exec_error!( + nested.loader.load_init(&code_hash), + input_data + ); + let output = nested.vm .execute( &executable, nested.new_call_context(caller.clone(), endowment), input_data, - EmptyOutputBuf::new(), gas_meter, - ) - .into_result()?; + )?; // Deposit an instantiation event. nested.deferred.push(DeferredAction::DepositEvent { @@ -475,10 +470,10 @@ where topics: Vec::new(), }); - Ok(Vec::new()) + Ok(output) })?; - Ok(InstantiateReceipt { address: dest }) + Ok((dest, output)) } fn new_call_context<'b>(&'b mut self, caller: T::AccountId, value: BalanceOf) @@ -496,19 +491,21 @@ where } fn with_nested_context(&mut self, dest: T::AccountId, trie_id: Option, func: F) - -> Result, &'static str> - where F: FnOnce(&mut ExecutionContext) -> Result, &'static str> + -> ExecResult + where F: FnOnce(&mut ExecutionContext) -> ExecResult { - let (output_data, change_set, deferred) = { + let (output, change_set, deferred) = { let mut nested = self.nested(dest, trie_id); - let output_data = func(&mut nested)?; - (output_data, nested.overlay.into_change_set(), nested.deferred) + let output = func(&mut nested)?; + (output, nested.overlay.into_change_set(), nested.deferred) }; - self.overlay.commit(change_set); - self.deferred.extend(deferred); + if output.is_success() { + self.overlay.commit(change_set); + self.deferred.extend(deferred); + } - Ok(output_data) + Ok(output) } } @@ -673,8 +670,8 @@ where code_hash: &CodeHash, endowment: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - ) -> Result>, &'static str> { + input_data: Vec, + ) -> Result<(AccountIdOf, ExecReturnValue), ExecError> { self.ctx.instantiate(endowment, gas_meter, code_hash, input_data) } @@ -683,11 +680,9 @@ where to: &T::AccountId, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, - ) -> Result { - self.ctx - .call(to.clone(), value, gas_meter, input_data, empty_output_buf) + input_data: Vec, + ) -> ExecResult { + self.ctx.call(to.clone(), value, gas_meter, input_data) } fn note_dispatch_call(&mut self, call: CallOf) { @@ -773,10 +768,11 @@ where #[cfg(test)] mod tests { use super::{ - BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, - Vm, VmExecResult, InstantiateReceipt, RawEvent, DeferredAction, + BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, TransferFeeKind, TransferFeeToken, + Vm, ExecResult, RawEvent, DeferredAction, }; use crate::account_db::AccountDb; + use crate::exec::{ExecReturnValue, ExecError, STATUS_SUCCESS}; use crate::gas::GasMeter; use crate::tests::{ExtBuilder, Test}; use crate::{CodeHash, Config}; @@ -808,16 +804,15 @@ mod tests { struct MockCtx<'a> { ext: &'a mut dyn Ext, - input_data: &'a [u8], - empty_output_buf: Option, + input_data: Vec, gas_meter: &'a mut GasMeter, } #[derive(Clone)] - struct MockExecutable<'a>(Rc VmExecResult + 'a>); + struct MockExecutable<'a>(Rc ExecResult + 'a>); impl<'a> MockExecutable<'a> { - fn new(f: impl Fn(MockCtx) -> VmExecResult + 'a) -> Self { + fn new(f: impl Fn(MockCtx) -> ExecResult + 'a) -> Self { MockExecutable(Rc::new(f)) } } @@ -835,7 +830,7 @@ mod tests { } } - fn insert(&mut self, f: impl Fn(MockCtx) -> VmExecResult + 'a) -> CodeHash { + fn insert(&mut self, f: impl Fn(MockCtx) -> ExecResult + 'a) -> CodeHash { // Generate code hashes as monotonically increasing values. let code_hash = ::Hash::from_low_u64_be(self.counter); @@ -879,19 +874,21 @@ mod tests { &self, exec: &MockExecutable, mut ext: E, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, + input_data: Vec, gas_meter: &mut GasMeter, - ) -> VmExecResult { + ) -> ExecResult { (exec.0)(MockCtx { ext: &mut ext, input_data, - empty_output_buf: Some(empty_output_buf), gas_meter, }) } } + fn exec_success() -> ExecResult { + Ok(ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() }) + } + #[test] fn it_works() { let value = Default::default(); @@ -905,7 +902,7 @@ mod tests { let mut loader = MockLoader::empty(); let exec_ch = loader.insert(|_ctx| { test_data.borrow_mut().push(1); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -914,7 +911,7 @@ mod tests { ctx.overlay.create_contract(&BOB, exec_ch).unwrap(); assert_matches!( - ctx.call(BOB, value, &mut gas_meter, &data, EmptyOutputBuf::new()), + ctx.call(BOB, value, &mut gas_meter, data), Ok(_) ); }); @@ -938,7 +935,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.call(dest, 0, &mut gas_meter, &[], EmptyOutputBuf::new()); + let result = ctx.call(dest, 0, &mut gas_meter, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -948,7 +945,7 @@ mod tests { // This test verifies that base fee for instantiation is taken. with_externalities(&mut ExtBuilder::default().build(), || { let mut loader = MockLoader::empty(); - let code = loader.insert(|_| VmExecResult::Ok); + let code = loader.insert(|_| exec_success()); let vm = MockVm::new(); let cfg = Config::preload(); @@ -958,7 +955,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.instantiate(0, &mut gas_meter, &code, &[]); + let result = ctx.instantiate(0, &mut gas_meter, &code, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -982,19 +979,52 @@ mod tests { ctx.overlay.set_balance(&origin, 100); ctx.overlay.set_balance(&dest, 0); - let result = ctx.call( + let output = ctx.call( dest, 55, &mut GasMeter::::with_limit(1000, 1), - &[], - EmptyOutputBuf::new(), - ); - assert_matches!(result, Ok(_)); + vec![], + ).unwrap(); + + assert!(output.is_success()); assert_eq!(ctx.overlay.get_balance(&origin), 45); assert_eq!(ctx.overlay.get_balance(&dest), 55); }); } + #[test] + fn changes_are_reverted_on_failing_call() { + // This test verifies that a contract is able to transfer + // some funds to another account. + let origin = ALICE; + let dest = BOB; + + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let return_ch = loader.insert( + |_| Ok(ExecReturnValue { status: 1, data: Vec::new() }) + ); + + with_externalities(&mut ExtBuilder::default().build(), || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); + ctx.overlay.create_contract(&BOB, return_ch).unwrap(); + ctx.overlay.set_balance(&origin, 100); + ctx.overlay.set_balance(&dest, 0); + + let output = ctx.call( + dest, + 55, + &mut GasMeter::::with_limit(1000, 1), + vec![], + ).unwrap(); + + assert!(!output.is_success()); + assert_eq!(ctx.overlay.get_balance(&origin), 100); + assert_eq!(ctx.overlay.get_balance(&dest), 0); + }); + } + #[test] fn transfer_fees() { let origin = ALICE; @@ -1015,7 +1045,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.call(dest, 50, &mut gas_meter, &[], EmptyOutputBuf::new()); + let result = ctx.call(dest, 50, &mut gas_meter, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -1044,7 +1074,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.call(dest, 50, &mut gas_meter, &[], EmptyOutputBuf::new()); + let result = ctx.call(dest, 50, &mut gas_meter, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -1065,7 +1095,7 @@ mod tests { &mut ExtBuilder::default().existential_deposit(15).build(), || { let mut loader = MockLoader::empty(); - let code = loader.insert(|_| VmExecResult::Ok); + let code = loader.insert(|_| exec_success()); let vm = MockVm::new(); let cfg = Config::preload(); @@ -1076,7 +1106,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.instantiate(50, &mut gas_meter, &code, &[]); + let result = ctx.instantiate(50, &mut gas_meter, &code, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -1111,37 +1141,61 @@ mod tests { dest, 100, &mut GasMeter::::with_limit(1000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); - assert_matches!(result, Err("balance too low to send value")); + assert_matches!( + result, + Err(ExecError { reason: "balance too low to send value", buffer: _ }) + ); assert_eq!(ctx.overlay.get_balance(&origin), 0); assert_eq!(ctx.overlay.get_balance(&dest), 0); }); } #[test] - fn output_is_returned() { - // Verifies that if a contract returns data, this data + fn output_is_returned_on_success() { + // Verifies that if a contract returns data with a successful exit status, this data // is returned from the execution context. let origin = ALICE; let dest = BOB; let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let return_ch = loader.insert(|mut ctx| { - #[derive(Debug)] - enum Void {} - let empty_output_buf = ctx.empty_output_buf.take().unwrap(); - let output_buf = - empty_output_buf.fill::(4, |data| { - data.copy_from_slice(&[1, 2, 3, 4]); - Ok(()) - }) - .expect("Ok is always returned"); - VmExecResult::Returned(output_buf) + let return_ch = loader.insert( + |_| Ok(ExecReturnValue { status: STATUS_SUCCESS, data: vec![1, 2, 3, 4] }) + ); + + with_externalities(&mut ExtBuilder::default().build(), || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); + ctx.overlay.create_contract(&BOB, return_ch).unwrap(); + + let result = ctx.call( + dest, + 0, + &mut GasMeter::::with_limit(1000, 1), + vec![], + ); + + let output = result.unwrap(); + assert!(output.is_success()); + assert_eq!(output.data, vec![1, 2, 3, 4]); }); + } + + #[test] + fn output_is_returned_on_failure() { + // Verifies that if a contract returns data with a failing exit status, this data + // is returned from the execution context. + let origin = ALICE; + let dest = BOB; + + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let return_ch = loader.insert( + |_| Ok(ExecReturnValue { status: 1, data: vec![1, 2, 3, 4] }) + ); with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); @@ -1152,22 +1206,22 @@ mod tests { dest, 0, &mut GasMeter::::with_limit(1000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); - let output_data = result.unwrap().output_data; - assert_eq!(&output_data, &[1, 2, 3, 4]); + let output = result.unwrap(); + assert!(!output.is_success()); + assert_eq!(output.data, vec![1, 2, 3, 4]); }); } #[test] - fn input_data() { + fn input_data_to_call() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); let input_data_ch = loader.insert(|ctx| { assert_eq!(ctx.input_data, &[1, 2, 3, 4]); - VmExecResult::Ok + exec_success() }); // This one tests passing the input data into a contract via call. @@ -1180,11 +1234,20 @@ mod tests { BOB, 0, &mut GasMeter::::with_limit(10000, 1), - &[1, 2, 3, 4], - EmptyOutputBuf::new(), + vec![1, 2, 3, 4], ); assert_matches!(result, Ok(_)); }); + } + + #[test] + fn input_data_to_instantiate() { + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let input_data_ch = loader.insert(|ctx| { + assert_eq!(ctx.input_data, &[1, 2, 3, 4]); + exec_success() + }); // This one tests passing the input data into a contract via instantiate. with_externalities(&mut ExtBuilder::default().build(), || { @@ -1195,7 +1258,7 @@ mod tests { 0, &mut GasMeter::::with_limit(10000, 1), &input_data_ch, - &[1, 2, 3, 4], + vec![1, 2, 3, 4], ); assert_matches!(result, Ok(_)); }); @@ -1212,22 +1275,23 @@ mod tests { let mut loader = MockLoader::empty(); let recurse_ch = loader.insert(|ctx| { // Try to call into yourself. - let r = ctx - .ext - .call(&BOB, 0, ctx.gas_meter, &[], EmptyOutputBuf::new()); + let r = ctx.ext.call(&BOB, 0, ctx.gas_meter, vec![]); let mut reached_bottom = reached_bottom.borrow_mut(); if !*reached_bottom { // We are first time here, it means we just reached bottom. // Verify that we've got proper error and set `reached_bottom`. - assert_matches!(r, Err("reached maximum depth, cannot make a call")); + assert_matches!( + r, + Err(ExecError { reason: "reached maximum depth, cannot make a call", buffer: _ }) + ); *reached_bottom = true; } else { // We just unwinding stack here. assert_matches!(r, Ok(_)); } - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1239,8 +1303,7 @@ mod tests { BOB, value, &mut GasMeter::::with_limit(100000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); assert_matches!(result, Ok(_)); @@ -1264,16 +1327,15 @@ mod tests { // Call into CHARLIE contract. assert_matches!( - ctx.ext - .call(&CHARLIE, 0, ctx.gas_meter, &[], EmptyOutputBuf::new()), + ctx.ext.call(&CHARLIE, 0, ctx.gas_meter, vec![]), Ok(_) ); - VmExecResult::Ok + exec_success() }); let charlie_ch = loader.insert(|ctx| { // Record the caller for charlie. *witnessed_caller_charlie.borrow_mut() = Some(*ctx.ext.caller()); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1287,8 +1349,7 @@ mod tests { dest, 0, &mut GasMeter::::with_limit(10000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); assert_matches!(result, Ok(_)); @@ -1309,15 +1370,14 @@ mod tests { // Call into charlie contract. assert_matches!( - ctx.ext - .call(&CHARLIE, 0, ctx.gas_meter, &[], EmptyOutputBuf::new()), + ctx.ext.call(&CHARLIE, 0, ctx.gas_meter, vec![]), Ok(_) ); - VmExecResult::Ok + exec_success() }); let charlie_ch = loader.insert(|ctx| { assert_eq!(*ctx.ext.address(), CHARLIE); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1330,8 +1390,7 @@ mod tests { BOB, 0, &mut GasMeter::::with_limit(10000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); assert_matches!(result, Ok(_)); @@ -1343,7 +1402,7 @@ mod tests { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Ok); + let dummy_ch = loader.insert(|_| exec_success()); with_externalities( &mut ExtBuilder::default().existential_deposit(15).build(), @@ -1356,7 +1415,7 @@ mod tests { 0, // <- zero endowment &mut GasMeter::::with_limit(10000, 1), &dummy_ch, - &[], + vec![], ), Err(_) ); @@ -1365,11 +1424,13 @@ mod tests { } #[test] - fn instantiation() { + fn instantiation_work_with_success_output() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Ok); + let dummy_ch = loader.insert( + |_| Ok(ExecReturnValue { status: STATUS_SUCCESS, data: vec![80, 65, 83, 83] }) + ); with_externalities( &mut ExtBuilder::default().existential_deposit(15).build(), @@ -1383,9 +1444,9 @@ mod tests { 100, &mut GasMeter::::with_limit(10000, 1), &dummy_ch, - &[], + vec![], ), - Ok(InstantiateReceipt { address }) => address + Ok((address, ref output)) if output.data == vec![80, 65, 83, 83] => address ); // Check that the newly created account has the expected code hash and @@ -1405,29 +1466,60 @@ mod tests { ); } + #[test] + fn instantiation_fails_with_failing_output() { + let vm = MockVm::new(); + + let mut loader = MockLoader::empty(); + let dummy_ch = loader.insert( + |_| Ok(ExecReturnValue { status: 1, data: vec![70, 65, 73, 76] }) + ); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(15).build(), + || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); + ctx.overlay.set_balance(&ALICE, 1000); + + let created_contract_address = assert_matches!( + ctx.instantiate( + 100, + &mut GasMeter::::with_limit(10000, 1), + &dummy_ch, + vec![], + ), + Ok((address, ref output)) if output.data == vec![70, 65, 73, 76] => address + ); + + // Check that the account has not been created. + assert!(ctx.overlay.get_code_hash(&created_contract_address).is_none()); + assert!(ctx.events().is_empty()); + } + ); + } + #[test] fn instantiation_from_contract() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Ok); + let dummy_ch = loader.insert(|_| exec_success()); let created_contract_address = Rc::new(RefCell::new(None::)); let creator_ch = loader.insert({ let dummy_ch = dummy_ch.clone(); let created_contract_address = Rc::clone(&created_contract_address); move |ctx| { // Instantiate a contract and save it's address in `created_contract_address`. - *created_contract_address.borrow_mut() = - ctx.ext.instantiate( - &dummy_ch, - 15u64, - ctx.gas_meter, - &[] - ) - .unwrap() - .address.into(); - - VmExecResult::Ok + let (address, output) = ctx.ext.instantiate( + &dummy_ch, + 15u64, + ctx.gas_meter, + vec![] + ).unwrap(); + + *created_contract_address.borrow_mut() = address.into(); + Ok(output) } }); @@ -1440,7 +1532,7 @@ mod tests { ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( - ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), + ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), vec![]), Ok(_) ); @@ -1468,11 +1560,13 @@ mod tests { } #[test] - fn instantiation_fails() { + fn instantiation_traps() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Trap("It's a trap!")); + let dummy_ch = loader.insert( + |_| Err(ExecError { reason: "It's a trap!", buffer: Vec::new() }) + ); let creator_ch = loader.insert({ let dummy_ch = dummy_ch.clone(); move |ctx| { @@ -1482,12 +1576,12 @@ mod tests { &dummy_ch, 15u64, ctx.gas_meter, - &[] + vec![] ), - Err("It's a trap!") + Err(ExecError { reason: "It's a trap!", buffer: _ }) ); - VmExecResult::Ok + exec_success() } }); @@ -1500,7 +1594,7 @@ mod tests { ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( - ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), + ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), vec![]), Ok(_) ); @@ -1524,7 +1618,7 @@ mod tests { assert_eq!(ctx.ext.rent_allowance(), >::max_value()); ctx.ext.set_rent_allowance(10); assert_eq!(ctx.ext.rent_allowance(), 10); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1535,7 +1629,7 @@ mod tests { 0, &mut GasMeter::::with_limit(10000, 1), &rent_allowance_ch, - &[], + vec![], ); assert_matches!(result, Ok(_)); }); diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index 15e6d9bc67..9f9fae5292 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -89,7 +89,7 @@ mod rent; #[cfg(test)] mod tests; -use crate::exec::ExecutionContext; +use crate::exec::{ExecutionContext, ExecResult}; use crate::account_db::{AccountDb, DirectAccountDb}; pub use crate::gas::{Gas, GasMeter}; use crate::wasm::{WasmLoader, WasmVm}; @@ -560,7 +560,7 @@ decl_module! { let dest = T::Lookup::lookup(dest)?; Self::execute_wasm(origin, gas_limit, |ctx, gas_meter| { - ctx.call(dest, value, gas_meter, &data, exec::EmptyOutputBuf::new()).map(|_| ()) + ctx.call(dest, value, gas_meter, data) }) } @@ -584,7 +584,8 @@ decl_module! { let origin = ensure_signed(origin)?; Self::execute_wasm(origin, gas_limit, |ctx, gas_meter| { - ctx.instantiate(endowment, gas_meter, &code_hash, &data).map(|_| ()) + ctx.instantiate(endowment, gas_meter, &code_hash, data) + .map(|(_address, output)| output) }) } @@ -631,7 +632,7 @@ impl Module { fn execute_wasm( origin: T::AccountId, gas_limit: Gas, - func: impl FnOnce(&mut ExecutionContext, &mut GasMeter) -> Result + func: impl FnOnce(&mut ExecutionContext, &mut GasMeter) -> ExecResult ) -> Result { // Pay for the gas upfront. // @@ -646,7 +647,7 @@ impl Module { let result = func(&mut ctx, &mut gas_meter); - if result.is_ok() { + if result.as_ref().map(|output| output.is_success()).unwrap_or(false) { // Commit all changes that made it thus far into the persistent storage. DirectAccountDb.commit(ctx.overlay.into_change_set()); } @@ -688,6 +689,8 @@ impl Module { }); result + .map(|_| ()) + .map_err(|e| e.reason) } fn restore_to( diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index fa11c4f4df..9c338a5abd 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -22,7 +22,8 @@ use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; use crate::{ BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, - Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, + Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, + TrieIdGenerator, Schedule, }; use assert_matches::assert_matches; use hex_literal::*; @@ -279,7 +280,10 @@ impl ExtBuilder { vesting: vec![], }.assimilate_storage(&mut t).unwrap(); GenesisConfig:: { - current_schedule: Default::default(), + current_schedule: Schedule { + enable_println: true, + ..Default::default() + }, gas_price: self.gas_price, }.assimilate_storage(&mut t).unwrap(); runtime_io::TestExternalities::new(t) @@ -698,7 +702,7 @@ const CODE_SET_RENT: &str = r#" (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) (import "env" "ext_set_rent_allowance" (func $ext_set_rent_allowance (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) ;; insert a value of 4 bytes into storage @@ -781,7 +785,7 @@ const CODE_SET_RENT: &str = r#" (i32.const 0) (i32.const 4) ) - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 0) (i32.const 0) (get_local $input_size) @@ -1173,7 +1177,7 @@ const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" (module (import "env" "ext_rent_allowance" (func $ext_rent_allowance)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1200,7 +1204,7 @@ const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1304,10 +1308,10 @@ const CODE_RESTORATION: &str = r#" ;; Address of bob (data (i32.const 256) "\02\00\00\00\00\00\00\00") - ;; Code hash of SET_CODE + ;; Code hash of SET_RENT (data (i32.const 264) - "\69\ae\df\b4\f6\c1\c3\98\e9\7f\8a\52\04\de\0f\95" - "\ad\5e\7d\c3\54\09\60\be\ab\11\a8\6c\56\9f\bf\cf" + "\14\eb\65\3c\86\98\d6\b2\3d\8d\3c\4a\54\c6\c4\71" + "\b9\fc\19\36\df\ca\a0\a1\f2\dc\ad\9d\e5\36\0b\25" ) ;; Rent allowance @@ -1445,6 +1449,7 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: } else { // Here we expect that the restoration is succeeded. Check that the restoration // contract `DJANGO` ceased to exist and that `BOB` returned back. + println!("{:?}", ContractInfoOf::::get(BOB)); let bob_contract = ContractInfoOf::::get(BOB).unwrap() .get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 50); @@ -1462,7 +1467,7 @@ const CODE_STORAGE_SIZE: &str = r#" (import "env" "ext_get_storage" (func $ext_get_storage (param i32) (result i32))) (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 16 16)) (func $assert (param i32) @@ -1484,7 +1489,7 @@ const CODE_STORAGE_SIZE: &str = r#" ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 32) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 4) ;; Count of bytes to copy. @@ -1566,3 +1571,357 @@ fn storage_max_value_limit() { } ); } + +const CODE_RETURN_WITH_DATA: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "ext_scratch_write" (func $ext_scratch_write (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + ;; Deploy routine is the same as call. + (func (export "deploy") (result i32) + (call $call) + ) + + ;; Call reads the first 4 bytes (LE) as the exit status and returns the rest as output data. + (func $call (export "call") (result i32) + (local $buf_size i32) + (local $exit_status i32) + + ;; Find out the size of the scratch buffer + (set_local $buf_size (call $ext_scratch_size)) + + ;; Copy scratch buffer into this contract memory. + (call $ext_scratch_read + (i32.const 0) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (get_local $buf_size) ;; Count of bytes to copy. + ) + + ;; Copy all but the first 4 bytes of the input data as the output data. + (call $ext_scratch_write + (i32.const 4) ;; Offset from the start of the scratch buffer. + (i32.sub ;; Count of bytes to copy. + (get_local $buf_size) + (i32.const 4) + ) + ) + + ;; Return the first 4 bytes of the input data as the exit status. + (i32.load (i32.const 0)) + ) +) +"#; + +const CODE_CALLER_CONTRACT: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "ext_balance" (func $ext_balance)) + (import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) + (import "env" "ext_create" (func $ext_create (param i32 i32 i64 i32 i32 i32 i32) (result i32))) + (import "env" "ext_println" (func $ext_println (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func $current_balance (param $sp i32) (result i64) + (call $ext_balance) + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 8)) + ) + (call $ext_scratch_read + (i32.sub (get_local $sp) (i32.const 8)) + (i32.const 0) + (i32.const 8) + ) + (i64.load (i32.sub (get_local $sp) (i32.const 8))) + ) + + (func (export "deploy")) + + (func (export "call") + (local $sp i32) + (local $exit_code i32) + (local $balance i64) + + ;; Input data is the code hash of the contract to be deployed. + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 32) + ) + ) + + ;; Copy code hash from scratch buffer into this contract's memory. + (call $ext_scratch_read + (i32.const 24) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 32) ;; Count of bytes to copy. + ) + + ;; Read current balance into local variable. + (set_local $sp (i32.const 1024)) + (set_local $balance + (call $current_balance (get_local $sp)) + ) + + ;; Fail to deploy the contract since it returns a non-zero exit status. + (set_local $exit_code + (call $ext_create + (i32.const 24) ;; Pointer to the code hash. + (i32.const 32) ;; Length of the code hash. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 9) ;; Pointer to input data buffer address + (i32.const 7) ;; Length of input data buffer + ) + ) + + ;; Check non-zero exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x11)) + ) + + ;; Check that scratch buffer is empty since contract instantiation failed. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 0)) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Fail to deploy the contract due to insufficient gas. + (set_local $exit_code + (call $ext_create + (i32.const 24) ;; Pointer to the code hash. + (i32.const 32) ;; Length of the code hash. + (i64.const 200) ;; How much gas to devote for the execution. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for special trap exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x0100)) + ) + + ;; Check that scratch buffer is empty since contract instantiation failed. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 0)) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Deploy the contract successfully. + (set_local $exit_code + (call $ext_create + (i32.const 24) ;; Pointer to the code hash. + (i32.const 32) ;; Length of the code hash. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for success exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x00)) + ) + + ;; Check that scratch buffer contains the address of the new contract. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 8)) + ) + + ;; Copy contract address from scratch buffer into this contract's memory. + (call $ext_scratch_read + (i32.const 16) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 8) ;; Count of bytes to copy. + ) + + ;; Check that balance has been deducted. + (set_local $balance + (i64.sub (get_local $balance) (i64.load (i32.const 0))) + ) + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Call the new contract and expect it to return failing exit code. + (set_local $exit_code + (call $ext_call + (i32.const 16) ;; Pointer to "callee" address. + (i32.const 8) ;; Length of "callee" address. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 9) ;; Pointer to input data buffer address + (i32.const 7) ;; Length of input data buffer + ) + ) + + ;; Check non-zero exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x11)) + ) + + ;; Check that scratch buffer contains the expected return data. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 3)) + ) + (i32.store + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + ) + (call $ext_scratch_read + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + (i32.const 3) + ) + (call $assert + (i32.eq + (i32.load (i32.sub (get_local $sp) (i32.const 4))) + (i32.const 0x00776655) + ) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Fail to call the contract due to insufficient gas. + (set_local $exit_code + (call $ext_call + (i32.const 16) ;; Pointer to "callee" address. + (i32.const 8) ;; Length of "callee" address. + (i64.const 100) ;; How much gas to devote for the execution. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for special trap exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x0100)) + ) + + ;; Check that scratch buffer is empty since call trapped. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 0)) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Call the contract successfully. + (set_local $exit_code + (call $ext_call + (i32.const 16) ;; Pointer to "callee" address. + (i32.const 8) ;; Length of "callee" address. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for success exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x00)) + ) + + ;; Check that scratch buffer contains the expected return data. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 4)) + ) + (i32.store + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + ) + (call $ext_scratch_read + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + (i32.const 4) + ) + (call $assert + (i32.eq + (i32.load (i32.sub (get_local $sp) (i32.const 4))) + (i32.const 0x77665544) + ) + ) + + ;; Check that balance has been deducted. + (set_local $balance + (i64.sub (get_local $balance) (i64.load (i32.const 0))) + ) + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + ) + + (data (i32.const 0) "\00\80") ;; The value to transfer on instantiation and calls. + ;; Chosen to be greater than existential deposit. + (data (i32.const 8) "\00\11\22\33\44\55\66\77") ;; The input data to instantiations and calls. +) +"#; + +#[test] +fn deploy_and_call_other_contract() { + let (callee_wasm, callee_code_hash) = compile_module::(CODE_RETURN_WITH_DATA).unwrap(); + let (caller_wasm, caller_code_hash) = compile_module::(CODE_CALLER_CONTRACT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, callee_wasm)); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, caller_wasm)); + + assert_ok!(Contract::create( + Origin::signed(ALICE), + 100_000, + 100_000, + caller_code_hash.into(), + vec![], + )); + + // Call BOB contract, which attempts to instantiate and call the callee contract and + // makes various assertions on the results from those calls. + assert_ok!(Contract::call( + Origin::signed(ALICE), + BOB, + 0, + 200_000, + callee_code_hash.as_ref().to_vec(), + )); + } + ); +} diff --git a/srml/contracts/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs index f1db63870b..99578fee27 100644 --- a/srml/contracts/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -19,7 +19,7 @@ use crate::{CodeHash, Schedule, Trait}; use crate::wasm::env_def::FunctionImplProvider; -use crate::exec::{Ext, EmptyOutputBuf, VmExecResult}; +use crate::exec::{Ext, ExecResult}; use crate::gas::GasMeter; use rstd::prelude::*; @@ -110,10 +110,9 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { &self, exec: &WasmExecutable, mut ext: E, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, + input_data: Vec, gas_meter: &mut GasMeter, - ) -> VmExecResult { + ) -> ExecResult { let memory = sandbox::Memory::new(exec.prefab_module.initial, Some(exec.prefab_module.maximum)) .unwrap_or_else(|_| { @@ -134,38 +133,17 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { let mut runtime = Runtime::new( &mut ext, - input_data.to_vec(), - empty_output_buf, + input_data, &self.schedule, memory, gas_meter, ); - // Instantiate the instance from the instrumented module code. - match sandbox::Instance::new(&exec.prefab_module.code, &imports, &mut runtime) { - // No errors or traps were generated on instantiation! That - // means we can now invoke the contract entrypoint. - Ok(mut instance) => { - let err = instance - .invoke(exec.entrypoint_name, &[], &mut runtime) - .err(); - to_execution_result(runtime, err) - } - // `start` function trapped. Treat it in the same manner as an execution error. - Err(err @ sandbox::Error::Execution) => to_execution_result(runtime, Some(err)), - Err(_err @ sandbox::Error::Module) => { - // `Error::Module` is returned only if instantiation or linking failed (i.e. - // wasm binary tried to import a function that is not provided by the host). - // This shouldn't happen because validation process ought to reject such binaries. - // - // Because panics are really undesirable in the runtime code, we treat this as - // a trap for now. Eventually, we might want to revisit this. - return VmExecResult::Trap("validation error"); - } - // Other instantiation errors. - // Return without executing anything. - Err(_) => return VmExecResult::Trap("during start function"), - } + // Instantiate the instance from the instrumented module code and invoke the contract + // entrypoint. + let result = sandbox::Instance::new(&exec.prefab_module.code, &imports, &mut runtime) + .and_then(|mut instance| instance.invoke(exec.entrypoint_name, &[], &mut runtime)); + to_execution_result(runtime, result) } } @@ -174,16 +152,18 @@ mod tests { use super::*; use std::collections::HashMap; use primitives::H256; - use crate::exec::{CallReceipt, Ext, InstantiateReceipt, EmptyOutputBuf, StorageKey}; + use crate::exec::{Ext, StorageKey, ExecError, ExecReturnValue, STATUS_SUCCESS}; use crate::gas::{Gas, GasMeter}; use crate::tests::{Test, Call}; use crate::wasm::prepare::prepare_contract; use crate::CodeHash; use wabt; use hex_literal::hex; + use assert_matches::assert_matches; #[derive(Debug, PartialEq, Eq)] struct DispatchEntry(Call); + #[derive(Debug, PartialEq, Eq)] struct RestoreEntry { dest: u64, @@ -191,6 +171,7 @@ mod tests { rent_allowance: u64, delta: Vec, } + #[derive(Debug, PartialEq, Eq)] struct CreateEntry { code_hash: H256, @@ -198,6 +179,7 @@ mod tests { data: Vec, gas_left: u64, } + #[derive(Debug, PartialEq, Eq)] struct TransferEntry { to: u64, @@ -205,6 +187,7 @@ mod tests { data: Vec, gas_left: u64, } + #[derive(Default)] pub struct MockExt { storage: HashMap>, @@ -217,6 +200,7 @@ mod tests { events: Vec<(Vec, Vec)>, next_account_id: u64, } + impl Ext for MockExt { type T = Test; @@ -234,8 +218,8 @@ mod tests { code_hash: &CodeHash, endowment: u64, gas_meter: &mut GasMeter, - data: &[u8], - ) -> Result, &'static str> { + data: Vec, + ) -> Result<(u64, ExecReturnValue), ExecError> { self.creates.push(CreateEntry { code_hash: code_hash.clone(), endowment, @@ -245,16 +229,15 @@ mod tests { let address = self.next_account_id; self.next_account_id += 1; - Ok(InstantiateReceipt { address }) + Ok((address, ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() })) } fn call( &mut self, to: &u64, value: u64, gas_meter: &mut GasMeter, - data: &[u8], - _output_data: EmptyOutputBuf, - ) -> Result { + data: Vec, + ) -> ExecResult { self.transfers.push(TransferEntry { to: *to, value, @@ -263,9 +246,7 @@ mod tests { }); // Assume for now that it was just a plain transfer. // TODO: Add tests for different call outcomes. - Ok(CallReceipt { - output_data: Vec::new(), - }) + Ok(ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() }) } fn note_dispatch_call(&mut self, call: Call) { self.dispatches.push(DispatchEntry(call)); @@ -321,6 +302,7 @@ mod tests { fn max_value_size(&self) -> u32 { 16_384 } } + impl Ext for &mut MockExt { type T = ::T; @@ -337,8 +319,8 @@ mod tests { code: &CodeHash, value: u64, gas_meter: &mut GasMeter, - input_data: &[u8] - ) -> Result, &'static str> { + input_data: Vec, + ) -> Result<(u64, ExecReturnValue), ExecError> { (**self).instantiate(code, value, gas_meter, input_data) } fn call( @@ -346,10 +328,9 @@ mod tests { to: &u64, value: u64, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf - ) -> Result { - (**self).call(to, value, gas_meter, input_data, empty_output_buf) + input_data: Vec, + ) -> ExecResult { + (**self).call(to, value, gas_meter, input_data) } fn note_dispatch_call(&mut self, call: Call) { (**self).note_dispatch_call(call) @@ -405,11 +386,10 @@ mod tests { fn execute( wat: &str, - input_data: &[u8], - output_data: &mut Vec, + input_data: Vec, ext: E, gas_meter: &mut GasMeter, - ) -> Result<(), &'static str> { + ) -> ExecResult { use crate::exec::Vm; let wasm = wabt::wat2wasm(wat).unwrap(); @@ -426,11 +406,7 @@ mod tests { let cfg = Default::default(); let vm = WasmVm::new(&cfg); - *output_data = vm - .execute(&exec, ext, input_data, EmptyOutputBuf::new(), gas_meter) - .into_result()?; - - Ok(()) + vm.execute(&exec, ext, input_data, gas_meter) } const CODE_TRANSFER: &str = r#" @@ -475,14 +451,12 @@ mod tests { #[test] fn contract_transfer() { let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_TRANSFER, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.transfers, @@ -539,14 +513,12 @@ mod tests { #[test] fn contract_create() { let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_CREATE, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.creates, @@ -601,14 +573,12 @@ mod tests { #[test] fn contract_call_limited_gas() { let mut mock_ext = MockExt::default(); - execute( + let _ = execute( &CODE_TRANSFER_LIMITED_GAS, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.transfers, @@ -625,7 +595,7 @@ mod tests { (module (import "env" "ext_get_storage" (func $ext_get_storage (param i32) (result i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) @@ -661,7 +631,7 @@ mod tests { ) ;; Copy scratch buffer into this contract memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 36) ;; The pointer where to store the scratch buffer contents, ;; 36 = 4 + 32 (i32.const 0) ;; Offset from the start of the scratch buffer. @@ -696,17 +666,14 @@ mod tests { .storage .insert([0x11; 32], [0x22; 32].to_vec()); - let mut return_buf = Vec::new(); - execute( + let output = execute( CODE_GET_STORAGE, - &[], - &mut return_buf, + vec![], mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); - assert_eq!(return_buf, [0x22; 32].to_vec()); + assert_eq!(output, ExecReturnValue { status: STATUS_SUCCESS, data: [0x22; 32].to_vec() }); } /// calls `ext_caller`, loads the address from the scratch buffer and @@ -715,7 +682,7 @@ mod tests { (module (import "env" "ext_caller" (func $ext_caller)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -740,7 +707,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -763,14 +730,12 @@ mod tests { #[test] fn caller() { - execute( + let _ = execute( CODE_CALLER, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); } /// calls `ext_address`, loads the address from the scratch buffer and @@ -779,7 +744,7 @@ mod tests { (module (import "env" "ext_address" (func $ext_address)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -804,7 +769,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -827,21 +792,19 @@ mod tests { #[test] fn address() { - execute( + let _ = execute( CODE_ADDRESS, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); } const CODE_BALANCE: &str = r#" (module (import "env" "ext_balance" (func $ext_balance)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -866,7 +829,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -889,21 +852,19 @@ mod tests { #[test] fn balance() { let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_BALANCE, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_GAS_PRICE: &str = r#" (module (import "env" "ext_gas_price" (func $ext_gas_price)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -928,7 +889,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -951,21 +912,19 @@ mod tests { #[test] fn gas_price() { let mut gas_meter = GasMeter::with_limit(50_000, 1312); - execute( + let _ = execute( CODE_GAS_PRICE, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_GAS_LEFT: &str = r#" (module (import "env" "ext_gas_left" (func $ext_gas_left)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) @@ -991,7 +950,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1012,17 +971,14 @@ mod tests { fn gas_left() { let mut gas_meter = GasMeter::with_limit(50_000, 1312); - let mut return_buf = Vec::new(); - execute( + let output = execute( CODE_GAS_LEFT, - &[], - &mut return_buf, + vec![], MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); - let gas_left = Gas::decode(&mut &return_buf[..]).unwrap(); + let gas_left = Gas::decode(&mut output.data.as_slice()).unwrap(); assert!(gas_left < 50_000, "gas_left must be less than initial"); assert!(gas_left > gas_meter.gas_left(), "gas_left must be greater than final"); } @@ -1031,7 +987,7 @@ mod tests { (module (import "env" "ext_value_transferred" (func $ext_value_transferred)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1056,7 +1012,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1079,14 +1035,12 @@ mod tests { #[test] fn value_transferred() { let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_VALUE_TRANSFERRED, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_DISPATCH_CALL: &str = r#" @@ -1112,14 +1066,12 @@ mod tests { // let's rewrite so as we use this module controlled call or we serialize it in runtime. let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_DISPATCH_CALL, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.dispatches, @@ -1154,24 +1106,21 @@ mod tests { #[test] fn return_from_start_fn() { - let mut output_data = Vec::new(); - execute( + let output = execute( CODE_RETURN_FROM_START_FN, - &[], - &mut output_data, + vec![], MockExt::default(), &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); - assert_eq!(output_data, vec![1, 2, 3, 4]); + assert_eq!(output, ExecReturnValue { status: STATUS_SUCCESS, data: vec![1, 2, 3, 4] }); } const CODE_TIMESTAMP_NOW: &str = r#" (module (import "env" "ext_now" (func $ext_now)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1196,7 +1145,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1219,21 +1168,19 @@ mod tests { #[test] fn now() { let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_TIMESTAMP_NOW, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_RANDOM: &str = r#" (module (import "env" "ext_random" (func $ext_random (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) @@ -1262,7 +1209,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 32) ;; Count of bytes to copy. @@ -1290,20 +1237,20 @@ mod tests { fn random() { let mut gas_meter = GasMeter::with_limit(50_000, 1); - let mut return_buf = Vec::new(); - execute( + let output = execute( CODE_RANDOM, - &[], - &mut return_buf, + vec![], MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); // The mock ext just returns the same data that was passed as the subject. assert_eq!( - &return_buf, - &hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F") + output, + ExecReturnValue { + status: STATUS_SUCCESS, + data: hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F").to_vec(), + }, ); } @@ -1334,14 +1281,12 @@ mod tests { fn deposit_event() { let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_DEPOSIT_EVENT, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut gas_meter - ) - .unwrap(); + ).unwrap(); assert_eq!(mock_ext.events, vec![ (vec![H256::repeat_byte(0x33)], @@ -1387,15 +1332,14 @@ mod tests { // Checks that the runtime traps if there are more than `max_topic_events` topics. let mut gas_meter = GasMeter::with_limit(50_000, 1); - assert_eq!( + assert_matches!( execute( CODE_DEPOSIT_EVENT_MAX_TOPICS, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut gas_meter ), - Err("during execution"), + Err(ExecError { reason: "during execution", buffer: _ }) ); } @@ -1430,15 +1374,14 @@ mod tests { // Checks that the runtime traps if there are duplicates. let mut gas_meter = GasMeter::with_limit(50_000, 1); - assert_eq!( + assert_matches!( execute( CODE_DEPOSIT_EVENT_DUPLICATES, - &[], - &mut Vec::new(), + vec![], MockExt::default(), &mut gas_meter ), - Err("during execution"), + Err(ExecError { reason: "during execution", buffer: _ }) ); } @@ -1448,7 +1391,7 @@ mod tests { (module (import "env" "ext_block_number" (func $ext_block_number)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1473,7 +1416,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1496,14 +1439,137 @@ mod tests { #[test] fn block_number() { - execute( + let _ = execute( CODE_BLOCK_NUMBER, - &[], - &mut Vec::new(), + vec![], + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + } + + // asserts that the size of the input data is 4. + const CODE_SIMPLE_ASSERT: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func (export "deploy")) + + (func (export "call") + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 4) + ) + ) + ) +) +"#; + + #[test] + fn output_buffer_capacity_preserved_on_success() { + let mut input_data = Vec::with_capacity(1_234); + input_data.extend_from_slice(&[1, 2, 3, 4][..]); + + let output = execute( + CODE_SIMPLE_ASSERT, + input_data, + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + + assert_eq!(output.data.len(), 0); + assert_eq!(output.data.capacity(), 1_234); + } + + #[test] + fn output_buffer_capacity_preserved_on_failure() { + let mut input_data = Vec::with_capacity(1_234); + input_data.extend_from_slice(&[1, 2, 3, 4, 5][..]); + + let error = execute( + CODE_SIMPLE_ASSERT, + input_data, MockExt::default(), &mut GasMeter::with_limit(50_000, 1), + ).err().unwrap(); + + assert_eq!(error.buffer.capacity(), 1_234); + } + + const CODE_RETURN_WITH_DATA: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "ext_scratch_write" (func $ext_scratch_write (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + ;; Deploy routine is the same as call. + (func (export "deploy") (result i32) + (call $call) + ) + + ;; Call reads the first 4 bytes (LE) as the exit status and returns the rest as output data. + (func $call (export "call") (result i32) + (local $buf_size i32) + (local $exit_status i32) + + ;; Find out the size of the scratch buffer + (set_local $buf_size (call $ext_scratch_size)) + + ;; Copy scratch buffer into this contract memory. + (call $ext_scratch_read + (i32.const 0) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (get_local $buf_size) ;; Count of bytes to copy. ) - .unwrap(); + + ;; Copy all but the first 4 bytes of the input data as the output data. + (call $ext_scratch_write + (i32.const 4) ;; Offset from the start of the scratch buffer. + (i32.sub ;; Count of bytes to copy. + (get_local $buf_size) + (i32.const 4) + ) + ) + + ;; Return the first 4 bytes of the input data as the exit status. + (i32.load (i32.const 0)) + ) +) +"#; + + #[test] + fn return_with_success_status() { + let output = execute( + CODE_RETURN_WITH_DATA, + hex!("00112233445566778899").to_vec(), + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + + assert_eq!(output, ExecReturnValue { status: 0, data: hex!("445566778899").to_vec() }); + assert!(output.is_success()); } + #[test] + fn return_with_failure_status() { + let output = execute( + CODE_RETURN_WITH_DATA, + hex!("112233445566778899").to_vec(), + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + + assert_eq!(output, ExecReturnValue { status: 17, data: hex!("5566778899").to_vec() }); + assert!(!output.is_success()); + } } diff --git a/srml/contracts/src/wasm/prepare.rs b/srml/contracts/src/wasm/prepare.rs index 8dc137fc01..41269772a8 100644 --- a/srml/contracts/src/wasm/prepare.rs +++ b/srml/contracts/src/wasm/prepare.rs @@ -227,14 +227,20 @@ impl<'a> ContractModule<'a> { }; // Then check the signature. - // Both "call" and "deploy" has a () -> () function type. + // Both "call" and "deploy" has a [] -> [] or [] -> [i32] function type. + // + // The [] -> [] signature predates the [] -> [i32] signature and is supported for + // backwards compatibility. This will likely be removed once ink! is updated to + // generate modules with the new function signatures. let func_ty_idx = func_entries.get(fn_idx as usize) .ok_or_else(|| "export refers to non-existent function")? .type_ref(); let Type::Function(ref func_ty) = types .get(func_ty_idx as usize) .ok_or_else(|| "function has a non-existent type")?; - if !(func_ty.params().is_empty() && func_ty.return_type().is_none()) { + if !func_ty.params().is_empty() || + !(func_ty.return_type().is_none() || + func_ty.return_type() == Some(ValueType::I32)) { return Err("entry point has wrong signature"); } } diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index 1fdc1a2c1a..ecc4dfc7fb 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -18,32 +18,34 @@ use crate::{Schedule, Trait, CodeHash, ComputeDispatchFee, BalanceOf}; use crate::exec::{ - Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey, - TopicOf, + Ext, ExecResult, ExecError, ExecReturnValue, StorageKey, TopicOf, STATUS_SUCCESS, }; use crate::gas::{Gas, GasMeter, Token, GasMeterResult, approx_gas_for_balance}; use sandbox; use system; use rstd::prelude::*; +use rstd::convert::TryInto; use rstd::mem; use codec::{Decode, Encode}; use sr_primitives::traits::{Bounded, SaturatedConversion}; +/// The value returned from ext_call and ext_create contract external functions if the call or +/// instantiation traps. This value is chosen as if the execution does not trap, the return value +/// will always be an 8-bit integer, so 0x0100 is the smallest value that could not be returned. +const TRAP_RETURN_CODE: u32 = 0x0100; + /// Enumerates all possible *special* trap conditions. /// /// In this runtime traps used not only for signaling about errors but also /// to just terminate quickly in some cases. enum SpecialTrap { /// Signals that trap was generated in response to call `ext_return` host function. - Return(OutputBuf), + Return(Vec), } /// Can only be used for one call. pub(crate) struct Runtime<'a, E: Ext + 'a> { ext: &'a mut E, - // A VM can return a result only once and only by value. So - // we wrap output buffer to make it possible to take the buffer out. - empty_output_buf: Option, scratch_buf: Vec, schedule: &'a Schedule, memory: sandbox::Memory, @@ -54,14 +56,12 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { pub(crate) fn new( ext: &'a mut E, input_data: Vec, - empty_output_buf: EmptyOutputBuf, schedule: &'a Schedule, memory: sandbox::Memory, gas_meter: &'a mut GasMeter, ) -> Self { Runtime { ext, - empty_output_buf: Some(empty_output_buf), // Put the input data into the scratch buffer immediately. scratch_buf: input_data, schedule, @@ -78,20 +78,42 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { pub(crate) fn to_execution_result( runtime: Runtime, - sandbox_err: Option, -) -> VmExecResult { - // Check the exact type of the error. It could be plain trap or - // special runtime trap the we must recognize. - match (sandbox_err, runtime.special_trap) { + sandbox_result: Result, +) -> ExecResult { + // Special case. The trap was the result of the execution `return` host function. + if let Some(SpecialTrap::Return(data)) = runtime.special_trap { + return Ok(ExecReturnValue { status: STATUS_SUCCESS, data }); + } + + // Check the exact type of the error. + match sandbox_result { // No traps were generated. Proceed normally. - (None, None) => VmExecResult::Ok, - // Special case. The trap was the result of the execution `return` host function. - (Some(sandbox::Error::Execution), Some(SpecialTrap::Return(buf))) => VmExecResult::Returned(buf), + Ok(sandbox::ReturnValue::Unit) => { + let mut buffer = runtime.scratch_buf; + buffer.clear(); + Ok(ExecReturnValue { status: STATUS_SUCCESS, data: buffer }) + } + Ok(sandbox::ReturnValue::Value(sandbox::TypedValue::I32(exit_code))) => { + let status = (exit_code & 0xFF).try_into() + .expect("exit_code is masked into the range of a u8; qed"); + Ok(ExecReturnValue { status, data: runtime.scratch_buf }) + } + // This should never happen as the return type of exported functions should have been + // validated by the code preparation process. However, because panics are really + // undesirable in the runtime code, we treat this as a trap for now. Eventually, we might + // want to revisit this. + Ok(_) => Err(ExecError { reason: "return type error", buffer: runtime.scratch_buf }), + // `Error::Module` is returned only if instantiation or linking failed (i.e. + // wasm binary tried to import a function that is not provided by the host). + // This shouldn't happen because validation process ought to reject such binaries. + // + // Because panics are really undesirable in the runtime code, we treat this as + // a trap for now. Eventually, we might want to revisit this. + Err(sandbox::Error::Module) => + Err(ExecError { reason: "validation error", buffer: runtime.scratch_buf }), // Any other kind of a trap should result in a failure. - (Some(_), _) => VmExecResult::Trap("during execution"), - // Any other case (such as special trap flag without actual trap) signifies - // a logic error. - _ => unreachable!(), + Err(sandbox::Error::Execution) | Err(sandbox::Error::OutOfBounds) => + Err(ExecError { reason: "during execution", buffer: runtime.scratch_buf }), } } @@ -186,12 +208,29 @@ fn read_sandbox_memory( ) -> Result, sandbox::HostError> { charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReadMemory(len))?; - let mut buf = Vec::new(); - buf.resize(len as usize, 0); + let mut buf = vec![0u8; len as usize]; + ctx.memory.get(ptr, buf.as_mut_slice()).map_err(|_| sandbox::HostError)?; + Ok(buf) +} - ctx.memory().get(ptr, &mut buf)?; +/// Read designated chunk from the sandbox memory into the scratch buffer, consuming an +/// appropriate amount of gas. Resizes the scratch buffer to the specified length on success. +/// +/// Returns `Err` if one of the following conditions occurs: +/// +/// - calculating the gas cost resulted in overflow. +/// - out of gas +/// - requested buffer is not within the bounds of the sandbox memory. +fn read_sandbox_memory_into_scratch( + ctx: &mut Runtime, + ptr: u32, + len: u32, +) -> Result<(), sandbox::HostError> { + charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReadMemory(len))?; - Ok(buf) + ctx.scratch_buf.resize(len as usize, 0); + ctx.memory.get(ptr, ctx.scratch_buf.as_mut_slice()).map_err(|_| sandbox::HostError)?; + Ok(()) } /// Read designated chunk from the sandbox memory into the supplied buffer, consuming @@ -209,7 +248,7 @@ fn read_sandbox_memory_into_buf( ) -> Result<(), sandbox::HostError> { charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReadMemory(buf.len() as u32))?; - ctx.memory().get(ptr, buf).map_err(Into::into) + ctx.memory.get(ptr, buf).map_err(Into::into) } /// Read designated chunk from the sandbox memory, consuming an appropriate amount of @@ -318,8 +357,15 @@ define_env!(Env, , // Make a call to another contract. // - // Returns 0 on the successful execution and puts the result data returned by the callee into - // the scratch buffer. Otherwise, returns a non-zero value and clears the scratch buffer. + // If the called contract runs to completion, then this returns the status code the callee + // returns on exit in the bottom 8 bits of the return value. The top 24 bits are 0s. A status + // code of 0 indicates success, and any other code indicates a failure. On failure, any state + // changes made by the called contract are reverted. The scratch buffer is filled with the + // output data returned by the called contract, even in the case of a failure status. + // + // If the contract traps during execution or otherwise fails to complete successfully, then + // this function clears the scratch buffer and returns 0x0100. As with a failure status, any + // state changes made by the called contract are reverted. // // - callee_ptr: a pointer to the address of the callee contract. // Should be decodable as an `T::AccountId`. Traps otherwise. @@ -344,12 +390,10 @@ define_env!(Env, , read_sandbox_memory_as(ctx, callee_ptr, callee_len)?; let value: BalanceOf<::T> = read_sandbox_memory_as(ctx, value_ptr, value_len)?; - let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; - // Grab the scratch buffer and put in its' place an empty one. - // We will use it for creating `EmptyOutputBuf` container for the call. - let scratch_buf = mem::replace(&mut ctx.scratch_buf, Vec::new()); - let empty_output_buf = EmptyOutputBuf::from_spare_vec(scratch_buf); + // Read input data into the scratch buffer, then take ownership of it. + read_sandbox_memory_into_scratch(ctx, input_data_ptr, input_data_len)?; + let input_data = mem::replace(&mut ctx.scratch_buf, Vec::new()); let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() @@ -364,22 +408,25 @@ define_env!(Env, , &callee, value, nested_meter, - &input_data, - empty_output_buf + input_data, ) - .map_err(|_| ()) + .map_err(|err| err.buffer) } // there is not enough gas to allocate for the nested call. - None => Err(()), + None => Err(input_data), } }); match call_outcome { - Ok(CallReceipt { output_data }) => { - ctx.scratch_buf = output_data; - Ok(0) + Ok(output) => { + ctx.scratch_buf = output.data; + Ok(output.status.into()) + }, + Err(buffer) => { + ctx.scratch_buf = buffer; + ctx.scratch_buf.clear(); + Ok(TRAP_RETURN_CODE) }, - Err(_) => Ok(1), } }, @@ -388,6 +435,20 @@ define_env!(Env, , // This function creates an account and executes the constructor defined in the code specified // by the code hash. // + // If the constructor runs to completion, then this returns the status code that the newly + // created contract returns on exit in the bottom 8 bits of the return value. The top 24 bits + // are 0s. A status code of 0 indicates success, and any other code indicates a failure. On + // failure, any state changes made by the called contract are reverted and the contract is not + // instantiated. On a success status, the scratch buffer is filled with the encoded address of + // the newly created contract. In the case of a failure status, the scratch buffer is cleared. + // + // If the contract traps during execution or otherwise fails to complete successfully, then + // this function clears the scratch buffer and returns 0x0100. As with a failure status, any + // state changes made by the called contract are reverted. + + // This function creates an account and executes initializer code. After the execution, + // the returned buffer is saved as the code of the created account. + // // Returns 0 on the successful contract creation and puts the address of the created contract // into the scratch buffer. Otherwise, returns non-zero value and clears the scratch buffer. // @@ -413,10 +474,10 @@ define_env!(Env, , read_sandbox_memory_as(ctx, code_hash_ptr, code_hash_len)?; let value: BalanceOf<::T> = read_sandbox_memory_as(ctx, value_ptr, value_len)?; - let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; - // Clear the scratch buffer in any case. - ctx.scratch_buf.clear(); + // Read input data into the scratch buffer, then take ownership of it. + read_sandbox_memory_into_scratch(ctx, input_data_ptr, input_data_len)?; + let input_data = mem::replace(&mut ctx.scratch_buf, Vec::new()); let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() @@ -431,21 +492,30 @@ define_env!(Env, , &code_hash, value, nested_meter, - &input_data + input_data ) - .map_err(|_| ()) + .map_err(|err| err.buffer) } // there is not enough gas to allocate for the nested call. - None => Err(()), + None => Err(input_data), } }); match instantiate_outcome { - Ok(InstantiateReceipt { address }) => { - // Write the address to the scratch buffer. - address.encode_to(&mut ctx.scratch_buf); - Ok(0) + Ok((address, output)) => { + let is_success = output.is_success(); + ctx.scratch_buf = output.data; + ctx.scratch_buf.clear(); + if is_success { + // Write the address to the scratch buffer. + address.encode_to(&mut ctx.scratch_buf); + } + Ok(output.status.into()) + }, + Err(buffer) => { + ctx.scratch_buf = buffer; + ctx.scratch_buf.clear(); + Ok(TRAP_RETURN_CODE) }, - Err(_) => Ok(1), } }, @@ -454,33 +524,11 @@ define_env!(Env, , // // This is the only way to return a data buffer to the caller. ext_return(ctx, data_ptr: u32, data_len: u32) => { - match ctx - .gas_meter - .charge( - ctx.schedule, - RuntimeToken::ReturnData(data_len) - ) - { - GasMeterResult::Proceed => (), - GasMeterResult::OutOfGas => return Err(sandbox::HostError), - } + charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReturnData(data_len))?; + + read_sandbox_memory_into_scratch(ctx, data_ptr, data_len)?; + let output_buf = mem::replace(&mut ctx.scratch_buf, Vec::new()); - let empty_output_buf = ctx - .empty_output_buf - .take() - .expect( - "`empty_output_buf` is taken only here; - `ext_return` traps; - `Runtime` can only be used only for one execution; - qed" - ); - let output_buf = empty_output_buf.fill( - data_len as usize, - |slice_mut| { - // Read the memory at the specified pointer to the provided slice. - ctx.memory.get(data_ptr, slice_mut) - } - )?; ctx.special_trap = Some(SpecialTrap::Return(output_buf)); // The trap mechanism is used to immediately terminate the execution. @@ -658,7 +706,7 @@ define_env!(Env, , // Returns the size of the scratch buffer. // - // For more details on the scratch buffer see `ext_scratch_copy`. + // For more details on the scratch buffer see `ext_scratch_read`. ext_scratch_size(ctx) -> u32 => { Ok(ctx.scratch_buf.len() as u32) }, @@ -669,7 +717,7 @@ define_env!(Env, , // In order to get size of the scratch buffer use `ext_scratch_size`. At the start of contract // execution, the scratch buffer is filled with the input data. Whenever a contract calls // function that uses the scratch buffer the contents of the scratch buffer are overwritten. - ext_scratch_copy(ctx, dest_ptr: u32, offset: u32, len: u32) => { + ext_scratch_read(ctx, dest_ptr: u32, offset: u32, len: u32) => { let offset = offset as usize; if offset > ctx.scratch_buf.len() { // Offset can't be larger than scratch buffer length. @@ -694,6 +742,15 @@ define_env!(Env, , Ok(()) }, + // Copy data from contract memory starting from `src_ptr` with length `len` into the scratch + // buffer. This overwrites the entire scratch buffer and resizes to `len`. Specifying a `len` + // of zero clears the scratch buffer. + // + // This should be used before exiting a call or instantiation in order to set the return data. + ext_scratch_write(ctx, src_ptr: u32, len: u32) => { + read_sandbox_memory_into_scratch(ctx, src_ptr, len) + }, + // Deposit a contract event with the data buffer and optional list of topics. There is a limit // on the maximum number of topics specified by `max_event_topics`. // @@ -720,16 +777,11 @@ define_env!(Env, , let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; - match ctx - .gas_meter - .charge( - ctx.schedule, - RuntimeToken::DepositEvent(topics.len() as u32, data_len) - ) - { - GasMeterResult::Proceed => (), - GasMeterResult::OutOfGas => return Err(sandbox::HostError), - } + charge_gas( + ctx.gas_meter, + ctx.schedule, + RuntimeToken::DepositEvent(topics.len() as u32, data_len) + )?; ctx.ext.deposit_event(topics, event_data); Ok(()) -- GitLab From 39094c764a0bc12134d2a2ed8ab494a9ebfeba88 Mon Sep 17 00:00:00 2001 From: David Craven Date: Mon, 12 Aug 2019 17:07:11 +0200 Subject: [PATCH 142/151] Implement Deserialize for SignedBlock and Header. (#3370) * Implement Deserialize for SignedBlock. * Implement Deserialize for Header. * Deserialize number. * Deserialize number (second try). * Fix line length. * Remove ::'s. --- core/sr-primitives/src/generic/block.rs | 6 +-- core/sr-primitives/src/generic/digest.rs | 21 ++++++-- core/sr-primitives/src/generic/header.rs | 69 ++++++++++++++++-------- core/sr-primitives/src/lib.rs | 9 ++++ 4 files changed, 75 insertions(+), 30 deletions(-) diff --git a/core/sr-primitives/src/generic/block.rs b/core/sr-primitives/src/generic/block.rs index f0f3c88fe7..736ad0cbbb 100644 --- a/core/sr-primitives/src/generic/block.rs +++ b/core/sr-primitives/src/generic/block.rs @@ -20,7 +20,7 @@ use std::fmt; #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Deserialize, Serialize}; use rstd::prelude::*; use crate::codec::{Codec, Encode, Decode}; @@ -62,7 +62,7 @@ impl fmt::Display for BlockId { /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Block { @@ -97,7 +97,7 @@ where /// Abstraction over a substrate block and justification. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct SignedBlock { diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index b6d72dddf7..d2974444e2 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -17,7 +17,7 @@ //! Generic implementation of a digest. #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Deserialize, Serialize}; use rstd::prelude::*; @@ -26,7 +26,7 @@ use crate::codec::{Decode, Encode, Input, Error}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct Digest { /// A list of logs in the digest. pub logs: Vec>, @@ -102,14 +102,25 @@ pub enum DigestItem { } #[cfg(feature = "std")] -impl ::serde::Serialize for DigestItem { - fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { +impl serde::Serialize for DigestItem { + fn serialize(&self, seq: S) -> Result where S: serde::Serializer { self.using_encoded(|bytes| { - ::primitives::bytes::serialize(bytes, seq) + primitives::bytes::serialize(bytes, seq) }) } } +#[cfg(feature = "std")] +impl<'a, Hash: Decode> serde::Deserialize<'a> for DigestItem { + fn deserialize(de: D) -> Result where + D: serde::Deserializer<'a>, + { + let r = primitives::bytes::deserialize(de)?; + Decode::decode(&mut &r[..]) + .map_err(|e| serde::de::Error::custom(format!("Decode error: {}", e))) + } +} + /// A 'referencing view' for digest item. Does not own its contents. Used by /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index e8f40bb7b6..e9a8405fe2 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -17,7 +17,7 @@ //! Generic implementation of a block header. #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Deserialize, Serialize}; #[cfg(feature = "std")] use log::debug; use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef, Error}; @@ -26,37 +26,48 @@ use crate::traits::{ MaybeSerializeDebugButNotDeserialize }; use crate::generic::Digest; +use primitives::U256; +use core::convert::TryFrom; /// Abstraction over a block header for a substrate chain. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header, Hash: HashT> { +pub struct Header + TryFrom, Hash: HashT> { /// The parent hash. - pub parent_hash: ::Output, + pub parent_hash: Hash::Output, /// The block number. - #[cfg_attr(feature = "std", serde(serialize_with = "serialize_number"))] + #[cfg_attr(feature = "std", serde( + serialize_with = "serialize_number", + deserialize_with = "deserialize_number"))] pub number: Number, /// The state trie merkle root - pub state_root: ::Output, + pub state_root: Hash::Output, /// The merkle root of the extrinsics. - pub extrinsics_root: ::Output, + pub extrinsics_root: Hash::Output, /// A chain-specific digest of data useful for light clients or referencing auxiliary data. - pub digest: Digest<::Output>, + pub digest: Digest, } #[cfg(feature = "std")] -pub fn serialize_number>(val: &T, s: S) -> Result where S: ::serde::Serializer { - use primitives::uint::U256; - let v: u128 = (*val).into(); - let lower = U256::from(v as u64); - let upper = U256::from(v.rotate_left(64) as u64) << 64; - ::serde::Serialize::serialize(&(upper + lower), s) +pub fn serialize_number + TryFrom>( + val: &T, s: S, +) -> Result where S: serde::Serializer { + let u256: U256 = (*val).into(); + serde::Serialize::serialize(&u256, s) +} + +#[cfg(feature = "std")] +pub fn deserialize_number<'a, D, T: Copy + Into + TryFrom>( + d: D, +) -> Result where D: serde::Deserializer<'a> { + let u256: U256 = serde::Deserialize::deserialize(d)?; + TryFrom::try_from(u256).map_err(|_| serde::de::Error::custom("Try from failed")) } impl Decode for Header where - Number: HasCompact + Copy + Into, + Number: HasCompact + Copy + Into + TryFrom, Hash: HashT, Hash::Output: Decode, { @@ -72,7 +83,7 @@ impl Decode for Header where } impl Encode for Header where - Number: HasCompact + Copy + Into, + Number: HasCompact + Copy + Into + TryFrom, Hash: HashT, Hash::Output: Encode, { @@ -86,15 +97,17 @@ impl Encode for Header where } impl codec::EncodeLike for Header where - Number: HasCompact + Copy + Into, + Number: HasCompact + Copy + Into + TryFrom, Hash: HashT, Hash::Output: Encode, {} impl traits::Header for Header where - Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + MaybeDisplay + SimpleArithmetic + Codec + Copy + Into, + Number: Member + MaybeSerializeDebug + rstd::hash::Hash + MaybeDisplay + + SimpleArithmetic + Codec + Copy + Into + TryFrom, Hash: HashT, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, + Hash::Output: Default + rstd::hash::Hash + Copy + Member + + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, { type Number = Number; type Hash = ::Output; @@ -141,9 +154,9 @@ impl traits::Header for Header where } impl Header where - Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + Into, + Number: Member + rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + Into + TryFrom, Hash: HashT, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, + Hash::Output: Default + rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, { /// Convenience helper for computing the hash of the header without having /// to import the trait. @@ -161,7 +174,7 @@ mod tests { fn serialize(num: u128) -> String { let mut v = vec![]; { - let mut ser = ::serde_json::Serializer::new(::std::io::Cursor::new(&mut v)); + let mut ser = serde_json::Serializer::new(std::io::Cursor::new(&mut v)); serialize_number(&num, &mut ser).unwrap(); } String::from_utf8(v).unwrap() @@ -173,4 +186,16 @@ mod tests { assert_eq!(serialize(u64::max_value() as u128 + 1), "\"0x10000000000000000\"".to_owned()); } + #[test] + fn should_deserialize_number() { + fn deserialize(num: &str) -> u128 { + let mut der = serde_json::Deserializer::new(serde_json::de::StrRead::new(num)); + deserialize_number(&mut der).unwrap() + } + + assert_eq!(deserialize("\"0x0\""), 0); + assert_eq!(deserialize("\"0x1\""), 1); + assert_eq!(deserialize("\"0xffffffffffffffff\""), u64::max_value() as u128); + assert_eq!(deserialize("\"0x10000000000000000\""), u64::max_value() as u128 + 1); + } } diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 9246cd3ff6..636a97ce92 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -824,6 +824,15 @@ impl ::serde::Serialize for OpaqueExtrinsic { } } +#[cfg(feature = "std")] +impl<'a> ::serde::Deserialize<'a> for OpaqueExtrinsic { + fn deserialize(de: D) -> Result where D: ::serde::Deserializer<'a> { + let r = ::primitives::bytes::deserialize(de)?; + Decode::decode(&mut &r[..]) + .map_err(|e| ::serde::de::Error::custom(format!("Decode error: {}", e))) + } +} + impl traits::Extrinsic for OpaqueExtrinsic { type Call = (); -- GitLab From fdfdbbb91337275225a880967aff8dd8b020d305 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 12 Aug 2019 17:23:09 +0200 Subject: [PATCH 143/151] Remark is trivial and doesn't deserve such a big weight (#3372) --- srml/system/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 684af7c6b8..1d17ef2b1c 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -239,7 +239,7 @@ decl_module! { } /// Make some on-chain remark. - #[weight = SimpleDispatchInfo::FixedNormal(1_000_000)] + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] fn remark(origin, _remark: Vec) { ensure_signed(origin)?; } -- GitLab From dc35cabddd4a9b8ff2c2e5714f05a6fe894b9b3f Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 12 Aug 2019 17:24:12 +0200 Subject: [PATCH 144/151] Forcing can be on or off. --- node/cli/src/chain_spec.rs | 2 ++ node/executor/src/lib.rs | 1 + node/runtime/src/lib.rs | 4 +-- srml/staking/src/lib.rs | 62 ++++++++++++++++++++++++++------------ srml/staking/src/mock.rs | 1 + srml/staking/src/tests.rs | 4 +-- 6 files changed, 50 insertions(+), 24 deletions(-) diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index c14a2709c1..acedb5c14b 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -141,6 +141,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { @@ -268,6 +269,7 @@ pub fn testnet_genesis( (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index a7dcb879d3..c2e442fd58 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -378,6 +378,7 @@ mod tests { offline_slash: Perbill::zero(), offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], + .. Default::default() }), contracts: Some(ContractsConfig { current_schedule: Default::default(), diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c4c4ca3f8f..e47a6d8df7 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 139, - impl_version: 139, + spec_version: 140, + impl_version: 140, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 0d2ba102d1..5a04ae5c5e 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -555,6 +555,22 @@ pub trait Trait: system::Trait { type SessionInterface: self::SessionInterface; } +/// Mode of era-forcing. +#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum Forcing { + /// Not forcing anything - just let whatever happen. + NotForcing, + /// Force a new era, then reset to `NotForcing` as soon as it is done. + ForceNew, + /// Avoid a new era indefinitely. + ForceNone, +} + +impl Default for Forcing { + fn default() -> Self { Forcing::NotForcing } +} + decl_storage! { trait Store for Module as Staking { @@ -625,7 +641,7 @@ decl_storage! { pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; /// True if the next session change will be a new era regardless of index. - pub ForceNewEra get(forcing_new_era): bool; + pub ForceEra get(force_era) config(): Forcing; /// A mapping from still-bonded eras to the first session index of that era. BondedEras: Vec<(EraIndex, SessionIndex)>; @@ -988,18 +1004,27 @@ decl_module! { // ----- Root calls. - /// Force there to be a new era. This also forces a new session immediately after. - /// `apply_rewards` should be true for validators to get the session reward. + /// Force there to be no new eras indefinitely. + /// + /// # + /// - No arguments. + /// # + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] + fn force_no_eras(origin) { + ensure_root(origin)?; + ForceEra::put(Forcing::ForceNone); + } + + /// Force there to be a new era at the end of the next session. After this, it will be + /// reset to normal (non-forced) behaviour. /// /// # - /// - Independent of the arguments. - /// - Triggers the Phragmen election. Expensive but not user-controlled. - /// - Depends on state: `O(|edges| * |validators|)`. + /// - No arguments. /// # #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn force_new_era(origin) { ensure_root(origin)?; - Self::apply_force_new_era() + ForceEra::put(Forcing::ForceNew); } /// Set the offline slash grace period. @@ -1129,16 +1154,17 @@ impl Module { fn new_session(session_index: SessionIndex) -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> { - if ForceNewEra::take() || session_index % T::SessionsPerEra::get() == 0 { - let validators = T::SessionInterface::validators(); - let prior = validators.into_iter() - .map(|v| { let e = Self::stakers(&v); (v, e) }) - .collect(); - - Self::new_era(session_index).map(move |new| (new, prior)) - } else { - None + match ForceEra::get() { + Forcing::ForceNew => ForceEra::kill(), + Forcing::NotForcing if session_index % T::SessionsPerEra::get() == 0 => (), + _ => return None, } + let validators = T::SessionInterface::validators(); + let prior = validators.into_iter() + .map(|v| { let e = Self::stakers(&v); (v, e) }) + .collect(); + + Self::new_era(session_index).map(move |new| (new, prior)) } /// The era has changed - enact new staking set. @@ -1335,10 +1361,6 @@ impl Module { } } - fn apply_force_new_era() { - ForceNewEra::put(true); - } - /// Remove all associated data of a stash account from the staking system. /// /// This is called : diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 2459eda4e4..d8233e5f45 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -310,6 +310,7 @@ impl ExtBuilder { offline_slash: Perbill::from_percent(5), offline_slash_grace: 0, invulnerables: vec![], + .. Default::default() }.assimilate_storage(&mut storage); let _ = session::GenesisConfig:: { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index cf0ef31526..1e81787f33 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -108,7 +108,7 @@ fn no_offline_should_work() { assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 1); // New era is not being forced - assert!(!Staking::forcing_new_era()); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -163,7 +163,7 @@ fn invulnerability_should_work() { assert!(>::exists(&11)); // New era not being forced // NOTE: new era is always forced once slashing happens -> new validators need to be chosen. - assert!(!Staking::forcing_new_era()); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } -- GitLab From 677aeca0173acc8a3cdb2f97db56180d0247a894 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 12 Aug 2019 17:25:34 +0200 Subject: [PATCH 145/151] Revert "Forcing can be on or off." This reverts commit dc35cabddd4a9b8ff2c2e5714f05a6fe894b9b3f. --- node/cli/src/chain_spec.rs | 2 -- node/executor/src/lib.rs | 1 - node/runtime/src/lib.rs | 4 +-- srml/staking/src/lib.rs | 62 ++++++++++++-------------------------- srml/staking/src/mock.rs | 1 - srml/staking/src/tests.rs | 4 +-- 6 files changed, 24 insertions(+), 50 deletions(-) diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index acedb5c14b..c14a2709c1 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -141,7 +141,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig { (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { @@ -269,7 +268,6 @@ pub fn testnet_genesis( (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index c2e442fd58..a7dcb879d3 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -378,7 +378,6 @@ mod tests { offline_slash: Perbill::zero(), offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], - .. Default::default() }), contracts: Some(ContractsConfig { current_schedule: Default::default(), diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index e47a6d8df7..c4c4ca3f8f 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 140, - impl_version: 140, + spec_version: 139, + impl_version: 139, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 5a04ae5c5e..0d2ba102d1 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -555,22 +555,6 @@ pub trait Trait: system::Trait { type SessionInterface: self::SessionInterface; } -/// Mode of era-forcing. -#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub enum Forcing { - /// Not forcing anything - just let whatever happen. - NotForcing, - /// Force a new era, then reset to `NotForcing` as soon as it is done. - ForceNew, - /// Avoid a new era indefinitely. - ForceNone, -} - -impl Default for Forcing { - fn default() -> Self { Forcing::NotForcing } -} - decl_storage! { trait Store for Module as Staking { @@ -641,7 +625,7 @@ decl_storage! { pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; /// True if the next session change will be a new era regardless of index. - pub ForceEra get(force_era) config(): Forcing; + pub ForceNewEra get(forcing_new_era): bool; /// A mapping from still-bonded eras to the first session index of that era. BondedEras: Vec<(EraIndex, SessionIndex)>; @@ -1004,27 +988,18 @@ decl_module! { // ----- Root calls. - /// Force there to be no new eras indefinitely. - /// - /// # - /// - No arguments. - /// # - #[weight = SimpleDispatchInfo::FixedOperational(10_000)] - fn force_no_eras(origin) { - ensure_root(origin)?; - ForceEra::put(Forcing::ForceNone); - } - - /// Force there to be a new era at the end of the next session. After this, it will be - /// reset to normal (non-forced) behaviour. + /// Force there to be a new era. This also forces a new session immediately after. + /// `apply_rewards` should be true for validators to get the session reward. /// /// # - /// - No arguments. + /// - Independent of the arguments. + /// - Triggers the Phragmen election. Expensive but not user-controlled. + /// - Depends on state: `O(|edges| * |validators|)`. /// # #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn force_new_era(origin) { ensure_root(origin)?; - ForceEra::put(Forcing::ForceNew); + Self::apply_force_new_era() } /// Set the offline slash grace period. @@ -1154,17 +1129,16 @@ impl Module { fn new_session(session_index: SessionIndex) -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> { - match ForceEra::get() { - Forcing::ForceNew => ForceEra::kill(), - Forcing::NotForcing if session_index % T::SessionsPerEra::get() == 0 => (), - _ => return None, - } - let validators = T::SessionInterface::validators(); - let prior = validators.into_iter() - .map(|v| { let e = Self::stakers(&v); (v, e) }) - .collect(); + if ForceNewEra::take() || session_index % T::SessionsPerEra::get() == 0 { + let validators = T::SessionInterface::validators(); + let prior = validators.into_iter() + .map(|v| { let e = Self::stakers(&v); (v, e) }) + .collect(); - Self::new_era(session_index).map(move |new| (new, prior)) + Self::new_era(session_index).map(move |new| (new, prior)) + } else { + None + } } /// The era has changed - enact new staking set. @@ -1361,6 +1335,10 @@ impl Module { } } + fn apply_force_new_era() { + ForceNewEra::put(true); + } + /// Remove all associated data of a stash account from the staking system. /// /// This is called : diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index d8233e5f45..2459eda4e4 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -310,7 +310,6 @@ impl ExtBuilder { offline_slash: Perbill::from_percent(5), offline_slash_grace: 0, invulnerables: vec![], - .. Default::default() }.assimilate_storage(&mut storage); let _ = session::GenesisConfig:: { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index 1e81787f33..cf0ef31526 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -108,7 +108,7 @@ fn no_offline_should_work() { assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 1); // New era is not being forced - assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(!Staking::forcing_new_era()); }); } @@ -163,7 +163,7 @@ fn invulnerability_should_work() { assert!(>::exists(&11)); // New era not being forced // NOTE: new era is always forced once slashing happens -> new validators need to be chosen. - assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(!Staking::forcing_new_era()); }); } -- GitLab From c683432714d4299ace6d31e8fc46477acf163a9d Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 12 Aug 2019 18:14:16 +0200 Subject: [PATCH 146/151] Era change can be forced on and forced off (#3374) * Forcing can be on or off. * Add a testcase. --- node/cli/src/chain_spec.rs | 2 ++ node/executor/src/lib.rs | 1 + node/runtime/src/lib.rs | 4 +-- srml/staking/src/lib.rs | 62 ++++++++++++++++++++++++++------------ srml/staking/src/mock.rs | 1 + srml/staking/src/tests.rs | 41 +++++++++++++++++++++++-- 6 files changed, 87 insertions(+), 24 deletions(-) diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index c14a2709c1..acedb5c14b 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -141,6 +141,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { @@ -268,6 +269,7 @@ pub fn testnet_genesis( (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index a7dcb879d3..c2e442fd58 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -378,6 +378,7 @@ mod tests { offline_slash: Perbill::zero(), offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], + .. Default::default() }), contracts: Some(ContractsConfig { current_schedule: Default::default(), diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c4c4ca3f8f..e47a6d8df7 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 139, - impl_version: 139, + spec_version: 140, + impl_version: 140, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 0d2ba102d1..5a04ae5c5e 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -555,6 +555,22 @@ pub trait Trait: system::Trait { type SessionInterface: self::SessionInterface; } +/// Mode of era-forcing. +#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum Forcing { + /// Not forcing anything - just let whatever happen. + NotForcing, + /// Force a new era, then reset to `NotForcing` as soon as it is done. + ForceNew, + /// Avoid a new era indefinitely. + ForceNone, +} + +impl Default for Forcing { + fn default() -> Self { Forcing::NotForcing } +} + decl_storage! { trait Store for Module as Staking { @@ -625,7 +641,7 @@ decl_storage! { pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; /// True if the next session change will be a new era regardless of index. - pub ForceNewEra get(forcing_new_era): bool; + pub ForceEra get(force_era) config(): Forcing; /// A mapping from still-bonded eras to the first session index of that era. BondedEras: Vec<(EraIndex, SessionIndex)>; @@ -988,18 +1004,27 @@ decl_module! { // ----- Root calls. - /// Force there to be a new era. This also forces a new session immediately after. - /// `apply_rewards` should be true for validators to get the session reward. + /// Force there to be no new eras indefinitely. + /// + /// # + /// - No arguments. + /// # + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] + fn force_no_eras(origin) { + ensure_root(origin)?; + ForceEra::put(Forcing::ForceNone); + } + + /// Force there to be a new era at the end of the next session. After this, it will be + /// reset to normal (non-forced) behaviour. /// /// # - /// - Independent of the arguments. - /// - Triggers the Phragmen election. Expensive but not user-controlled. - /// - Depends on state: `O(|edges| * |validators|)`. + /// - No arguments. /// # #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn force_new_era(origin) { ensure_root(origin)?; - Self::apply_force_new_era() + ForceEra::put(Forcing::ForceNew); } /// Set the offline slash grace period. @@ -1129,16 +1154,17 @@ impl Module { fn new_session(session_index: SessionIndex) -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> { - if ForceNewEra::take() || session_index % T::SessionsPerEra::get() == 0 { - let validators = T::SessionInterface::validators(); - let prior = validators.into_iter() - .map(|v| { let e = Self::stakers(&v); (v, e) }) - .collect(); - - Self::new_era(session_index).map(move |new| (new, prior)) - } else { - None + match ForceEra::get() { + Forcing::ForceNew => ForceEra::kill(), + Forcing::NotForcing if session_index % T::SessionsPerEra::get() == 0 => (), + _ => return None, } + let validators = T::SessionInterface::validators(); + let prior = validators.into_iter() + .map(|v| { let e = Self::stakers(&v); (v, e) }) + .collect(); + + Self::new_era(session_index).map(move |new| (new, prior)) } /// The era has changed - enact new staking set. @@ -1335,10 +1361,6 @@ impl Module { } } - fn apply_force_new_era() { - ForceNewEra::put(true); - } - /// Remove all associated data of a stash account from the staking system. /// /// This is called : diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 2459eda4e4..d8233e5f45 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -310,6 +310,7 @@ impl ExtBuilder { offline_slash: Perbill::from_percent(5), offline_slash_grace: 0, invulnerables: vec![], + .. Default::default() }.assimilate_storage(&mut storage); let _ = session::GenesisConfig:: { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index cf0ef31526..de473dd990 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -108,7 +108,7 @@ fn no_offline_should_work() { assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 1); // New era is not being forced - assert!(!Staking::forcing_new_era()); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -163,7 +163,7 @@ fn invulnerability_should_work() { assert!(>::exists(&11)); // New era not being forced // NOTE: new era is always forced once slashing happens -> new validators need to be chosen. - assert!(!Staking::forcing_new_era()); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -884,6 +884,43 @@ fn session_and_eras_work() { }); } +#[test] +fn forcing_new_era_works() { + with_externalities(&mut ExtBuilder::default().build(),|| { + // normal flow of session. + assert_eq!(Staking::current_era(), 0); + start_session(0); + assert_eq!(Staking::current_era(), 0); + start_session(1); + assert_eq!(Staking::current_era(), 0); + start_session(2); + assert_eq!(Staking::current_era(), 1); + + // no era change. + ForceEra::put(Forcing::ForceNone); + start_session(3); + assert_eq!(Staking::current_era(), 1); + start_session(4); + assert_eq!(Staking::current_era(), 1); + start_session(5); + assert_eq!(Staking::current_era(), 1); + start_session(6); + assert_eq!(Staking::current_era(), 1); + + // back to normal + ForceEra::put(Forcing::NotForcing); + start_session(7); + assert_eq!(Staking::current_era(), 1); + start_session(8); + assert_eq!(Staking::current_era(), 2); + + // forceful change + ForceEra::put(Forcing::ForceNew); + start_session(9); + assert_eq!(Staking::current_era(), 3); + }); +} + #[test] fn cannot_transfer_staked_balance() { // Tests that a stash account cannot transfer funds -- GitLab From d2510760cd4f4c1d83988dab3ec8e29781edba50 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Mon, 12 Aug 2019 19:16:48 +0200 Subject: [PATCH 147/151] Add code owners file (#3371) * Add code owners file. * Update CODEOWNERS * Update CODEOWNERS --- CODEOWNERS | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000000..2106b2a59e --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,15 @@ +# Lists some code owners +# +# For details about syntax, see: +# https://help.github.com/en/articles/about-code-owners +# But here are some important notes: +# +# - Glob syntax is git-like, e.g. `/core` means the core directory in the root, unlike `core` which +# can be everywhere. +# - Multiple owners are supported. +# - Either handle (e.g, @pepyakin) or email can be used. Keep in mind, that handles might work better because they +# are more recognizable on GitHub, you can use them for mentioning unlike an email. +# - The latest matching rule, if multiple, takes precedence. + +/srml/contracts/ @pepyakin +/core/executor/ @pepyakin -- GitLab From 103384540e77ca70c4346bcf12bdb1d964bfdca0 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 12 Aug 2019 19:23:35 +0200 Subject: [PATCH 148/151] subkey network default works (#3375) --- subkey/src/main.rs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 5b16bde28d..fde301b44f 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -41,7 +41,11 @@ trait Crypto { } fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() } fn public_from_pair(pair: &Self::Pair) -> Vec { pair.public().as_ref().to_owned() } - fn print_from_uri(uri: &str, password: Option<&str>) where ::Public: Sized + Ss58Codec + AsRef<[u8]> { + fn print_from_uri( + uri: &str, + password: Option<&str>, + network_override: Option, + ) where ::Public: Sized + Ss58Codec + AsRef<[u8]> { if let Ok((pair, seed)) = Self::Pair::from_phrase(uri, password) { println!("Secret phrase `{}` is account:\n Secret seed: 0x{}\n Public key (hex): 0x{}\n Address (SS58): {}", uri, @@ -56,9 +60,10 @@ trait Crypto { Self::ss58_from_pair(&pair) ); } else if let Ok((public, v)) = ::Public::from_string_with_version(uri) { + let v = network_override.unwrap_or(v); println!("Public Key URI `{}` is account:\n Network ID/version: {}\n Public key (hex): 0x{}\n Address (SS58): {}", uri, - String::from(Ss58AddressFormat::from(v)), + String::from(v), HexDisplay::from(&public.as_ref()), public.to_ss58check_with_version(v) ); @@ -100,11 +105,12 @@ fn execute(matches: clap::ArgMatches) where ) }; let password = matches.value_of("password"); - let maybe_network = matches.value_of("network"); + let maybe_network: Option = matches.value_of("network") + .map(|network| network.try_into() + .expect("Invalid network name: must be polkadot/substrate/kusama") + ); if let Some(network) = maybe_network { - let v = network.try_into() - .expect("Invalid network name: must be polkadot/substrate/kusama"); - set_default_ss58_version(v); + set_default_ss58_version(network); } match matches.subcommand() { ("generate", Some(matches)) => { @@ -115,17 +121,21 @@ fn execute(matches: clap::ArgMatches) where .expect("Invalid number of words given for phrase: must be 12/15/18/21/24") ).unwrap_or(MnemonicType::Words12); let mnemonic = Mnemonic::new(words, Language::English); - C::print_from_uri(mnemonic.phrase(), password); + C::print_from_uri(mnemonic.phrase(), password, maybe_network); } ("inspect", Some(matches)) => { let uri = matches.value_of("uri") .expect("URI parameter is required; thus it can't be None; qed"); - C::print_from_uri(uri, password); + C::print_from_uri(uri, password, maybe_network); } ("vanity", Some(matches)) => { let desired: String = matches.value_of("pattern").map(str::to_string).unwrap_or_default(); let result = vanity::generate_key::(&desired).expect("Key generation failed"); - C::print_from_uri(&format!("0x{}", HexDisplay::from(&result.seed.as_ref())), None); + C::print_from_uri( + &format!("0x{}", HexDisplay::from(&result.seed.as_ref())), + None, + maybe_network + ); } ("sign", Some(matches)) => { let suri = matches.value_of("suri") -- GitLab From 138bcf0de985e21802a1f086452977d0c49088ee Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 12 Aug 2019 19:23:59 +0200 Subject: [PATCH 149/151] core/network: Surface peerset's `set_priority_group` in NetworkService (#3376) `PeerSetHandle.set_priority_group` allows modifying a priority group by group identifier. With this commit the function can be accessed through `NetworkService`. This is need in order for a validator to connect to as many other validators as configured without reserving a specific connection slot for them. --- core/network/src/config.rs | 9 +++++++-- core/network/src/service.rs | 22 ++++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 6cabb1217b..46bb8aeff4 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -163,7 +163,8 @@ impl ProtocolId { } } -/// Parses a string address and returns the component, if valid. +/// Parses a string address and splits it into Multiaddress and PeerId, if +/// valid. /// /// # Example /// @@ -177,8 +178,12 @@ impl ProtocolId { /// ``` /// pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { - let mut addr: Multiaddr = addr_str.parse()?; + let addr: Multiaddr = addr_str.parse()?; + parse_addr(addr) +} +/// Splits a Multiaddress into a Multiaddress and PeerId. +pub fn parse_addr(mut addr: Multiaddr)-> Result<(PeerId, Multiaddr), ParseErr> { let who = match addr.pop() { Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) .map_err(|_| ParseErr::InvalidPeerId)?, diff --git a/core/network/src/service.rs b/core/network/src/service.rs index eed5de85ed..d5ba8db7ae 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -25,7 +25,7 @@ //! The methods of the [`NetworkService`] are implemented by sending a message over a channel, //! which is then processed by [`NetworkWorker::poll`]. -use std::{collections::HashMap, fs, marker::PhantomData, io, path::Path}; +use std::{collections::{HashMap, HashSet}, fs, marker::PhantomData, io, path::Path}; use std::sync::{Arc, atomic::{AtomicBool, AtomicUsize, Ordering}}; use consensus::import_queue::{ImportQueue, Link}; @@ -40,7 +40,7 @@ use parking_lot::Mutex; use peerset::PeersetHandle; use sr_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; -use crate::{behaviour::{Behaviour, BehaviourOut}, config::parse_str_addr}; +use crate::{behaviour::{Behaviour, BehaviourOut}, config::{parse_str_addr, parse_addr}}; use crate::{NetworkState, NetworkStateNotConnectedPeer, NetworkStatePeer}; use crate::{transport, config::NodeKeyConfig, config::NonReservedPeerMode}; use crate::config::{Params, TransportConfig}; @@ -497,6 +497,24 @@ impl, H: ExHashT> NetworkServic Ok(()) } + /// Modify a peerset priority group. + pub fn set_priority_group(&self, group_id: String, peers: HashSet) -> Result<(), String> { + let peers = peers.into_iter().map(|p| { + parse_addr(p).map_err(|e| format!("{:?}", e)) + }).collect::, String>>()?; + + let peer_ids = peers.iter().map(|(peer_id, _addr)| peer_id.clone()).collect(); + self.peerset.set_priority_group(group_id, peer_ids); + + for (peer_id, addr) in peers.into_iter() { + let _ = self + .to_worker + .unbounded_send(ServerToWorkerMsg::AddKnownAddress(peer_id, addr)); + } + + Ok(()) + } + /// Returns the number of peers we're connected to. pub fn num_connected(&self) -> usize { self.num_connected.load(Ordering::Relaxed) -- GitLab From 4557acf6d74cd9bf730bcbfcbca89d02961829e5 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Tue, 13 Aug 2019 09:19:54 +0200 Subject: [PATCH 150/151] More robust state pinning (#3355) * Better state pinning * Fixed pinning race * Update core/state-db/src/noncanonical.rs Co-Authored-By: Robert Habermeier --- core/client/db/src/lib.rs | 5 +- core/state-db/src/lib.rs | 65 +++++++++-------- core/state-db/src/noncanonical.rs | 115 ++++++++++++++++++++---------- 3 files changed, 115 insertions(+), 70 deletions(-) diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 967dcffc86..927359ecdf 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -92,9 +92,6 @@ pub struct RefTrackingState { impl RefTrackingState { fn new(state: DbState, storage: Arc>, parent_hash: Option) -> RefTrackingState { - if let Some(hash) = &parent_hash { - storage.state_db.pin(hash); - } RefTrackingState { state, parent_hash, @@ -1401,7 +1398,7 @@ impl client::backend::Backend for Backend whe match self.blockchain.header(block) { Ok(Some(ref hdr)) => { let hash = hdr.hash(); - if !self.storage.state_db.is_pruned(&hash, (*hdr.number()).saturated_into::()) { + if let Ok(()) = self.storage.state_db.pin(&hash) { let root = H256::from_slice(hdr.state_root().as_ref()); let db_state = DbState::new(self.storage.clone(), root); let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash.clone())); diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 43820529d4..81772e554b 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -36,7 +36,7 @@ mod pruning; use std::fmt; use parking_lot::RwLock; use codec::Codec; -use std::collections::{VecDeque, HashMap, hash_map::Entry}; +use std::collections::{HashMap, hash_map::Entry}; use noncanonical::NonCanonicalOverlay; use pruning::RefWindow; use log::trace; @@ -77,8 +77,12 @@ pub enum Error { InvalidBlockNumber, /// Trying to insert block with unknown parent. InvalidParent, - /// Canonicalization would discard pinned state. - DiscardingPinned, +} + +/// Pinning error type. +pub enum PinError { + /// Trying to pin invalid block. + InvalidBlock, } impl From for Error { @@ -95,7 +99,6 @@ impl fmt::Debug for Error { Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), - Error::DiscardingPinned => write!(f, "Trying to discard pinned state"), } } } @@ -173,7 +176,6 @@ fn to_meta_key(suffix: &[u8], data: &S) -> Vec { struct StateDbSync { mode: PruningMode, non_canonical: NonCanonicalOverlay, - canonicalization_queue: VecDeque, pruning: Option>, pinned: HashMap, } @@ -195,7 +197,6 @@ impl StateDbSync { non_canonical, pruning, pinned: Default::default(), - canonicalization_queue: Default::default(), }) } @@ -220,26 +221,16 @@ impl StateDbSync { if self.mode == PruningMode::ArchiveAll { return Ok(commit) } - self.canonicalization_queue.push_back(hash.clone()); - while let Some(hash) = self.canonicalization_queue.front().cloned() { - if self.pinned.contains_key(&hash) { - break; - } - match self.non_canonical.canonicalize(&hash, &self.pinned, &mut commit) { - Ok(()) => { - self.canonicalization_queue.pop_front(); - if self.mode == PruningMode::ArchiveCanonical { - commit.data.deleted.clear(); - } - } - Err(Error::DiscardingPinned) => { - break; + match self.non_canonical.canonicalize(&hash, &mut commit) { + Ok(()) => { + if self.mode == PruningMode::ArchiveCanonical { + commit.data.deleted.clear(); } - Err(e) => return Err(e), - }; - if let Some(ref mut pruning) = self.pruning { - pruning.note_canonical(&hash, &mut commit); } + Err(e) => return Err(e), + }; + if let Some(ref mut pruning) = self.pruning { + pruning.note_canonical(&hash, &mut commit); } self.prune(&mut commit); Ok(commit) @@ -296,12 +287,25 @@ impl StateDbSync { } } - pub fn pin(&mut self, hash: &BlockHash) { - let refs = self.pinned.entry(hash.clone()).or_default(); - if *refs == 0 { - trace!(target: "state-db", "Pinned block: {:?}", hash); + pub fn pin(&mut self, hash: &BlockHash) -> Result<(), PinError> { + match self.mode { + PruningMode::ArchiveAll => Ok(()), + PruningMode::ArchiveCanonical | PruningMode::Constrained(_) => { + if self.non_canonical.have_block(hash) || + self.pruning.as_ref().map_or(false, |pruning| pruning.have_block(hash)) + { + let refs = self.pinned.entry(hash.clone()).or_default(); + if *refs == 0 { + trace!(target: "state-db", "Pinned block: {:?}", hash); + self.non_canonical.pin(hash); + } + *refs += 1; + Ok(()) + } else { + Err(PinError::InvalidBlock) + } + } } - *refs += 1 } pub fn unpin(&mut self, hash: &BlockHash) { @@ -311,6 +315,7 @@ impl StateDbSync { if *entry.get() == 0 { trace!(target: "state-db", "Unpinned block: {:?}", hash); entry.remove(); + self.non_canonical.unpin(hash); } else { trace!(target: "state-db", "Releasing reference for {:?}", hash); } @@ -375,7 +380,7 @@ impl StateDb { } /// Prevents pruning of specified block and its descendants. - pub fn pin(&self, hash: &BlockHash) { + pub fn pin(&self, hash: &BlockHash) -> Result<(), PinError> { self.db.write().pin(hash) } diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index 1017b8a211..58715715cc 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -37,6 +37,7 @@ pub struct NonCanonicalOverlay { pending_canonicalizations: Vec, pending_insertions: Vec, values: HashMap, //ref counted + pinned: HashMap>, //would be deleted but kept around because block is pinned } #[derive(Encode, Decode)] @@ -67,14 +68,21 @@ fn insert_values(values: &mut HashMap, inserted: } } -fn discard_values(values: &mut HashMap, inserted: Vec) { +fn discard_values( + values: &mut HashMap, + inserted: Vec, + mut into: Option<&mut HashMap>, +) { for k in inserted { match values.entry(k) { Entry::Occupied(mut e) => { let (ref mut counter, _) = e.get_mut(); *counter -= 1; if *counter == 0 { - e.remove(); + let (key, (_, value)) = e.remove_entry(); + if let Some(ref mut into) = into { + into.insert(key, value); + } } }, Entry::Vacant(_) => { @@ -89,8 +97,9 @@ fn discard_descendants( mut values: &mut HashMap, index: usize, parents: &mut HashMap, + pinned: &mut HashMap>, hash: &BlockHash, - ) { +) { let mut discarded = Vec::new(); if let Some(level) = levels.get_mut(index) { *level = level.drain(..).filter_map(|overlay| { @@ -98,7 +107,7 @@ fn discard_descendants( if parent == *hash { parents.remove(&overlay.hash); discarded.push(overlay.hash); - discard_values(&mut values, overlay.inserted); + discard_values(&mut values, overlay.inserted, pinned.get_mut(hash)); None } else { Some(overlay) @@ -106,7 +115,7 @@ fn discard_descendants( }).collect(); } for hash in discarded { - discard_descendants(levels, values, index + 1, parents, &hash); + discard_descendants(levels, values, index + 1, parents, pinned, &hash); } } @@ -166,6 +175,7 @@ impl NonCanonicalOverlay { parents, pending_canonicalizations: Default::default(), pending_insertions: Default::default(), + pinned: Default::default(), values: values, }) } @@ -278,7 +288,6 @@ impl NonCanonicalOverlay { pub fn canonicalize( &mut self, hash: &BlockHash, - pinned: &HashMap, commit: &mut CommitSet, ) -> Result<(), Error> { trace!(target: "state-db", "Canonicalizing {:?}", hash); @@ -303,13 +312,6 @@ impl NonCanonicalOverlay { discarded_blocks.push(overlay.hash.clone()); } - for hash in discarded_blocks.into_iter() { - if pinned.contains_key(&hash) { - trace!(target: "state-db", "Refusing to discard pinned state {:?}", hash); - return Err(Error::DiscardingPinned) - } - } - // get the one we need to canonicalize let overlay = &level[index]; commit.data.inserted.extend(overlay.inserted.iter() @@ -339,9 +341,16 @@ impl NonCanonicalOverlay { for (i, overlay) in level.into_iter().enumerate() { self.parents.remove(&overlay.hash); if i != index { - discard_descendants(&mut self.levels, &mut self.values, 0, &mut self.parents, &overlay.hash); + discard_descendants( + &mut self.levels, + &mut self.values, + 0, + &mut self.parents, + &mut self.pinned, + &overlay.hash, + ); } - discard_values(&mut self.values, overlay.inserted); + discard_values(&mut self.values, overlay.inserted, self.pinned.get_mut(&overlay.hash)); } } if let Some(hash) = last { @@ -355,6 +364,11 @@ impl NonCanonicalOverlay { if let Some((_, value)) = self.values.get(&key) { return Some(value.clone()); } + for pinned in self.pinned.values() { + if let Some(value) = pinned.get(&key) { + return Some(value.clone()); + } + } None } @@ -371,7 +385,7 @@ impl NonCanonicalOverlay { for overlay in level.into_iter() { commit.meta.deleted.push(overlay.journal_key); self.parents.remove(&overlay.hash); - discard_values(&mut self.values, overlay.inserted); + discard_values(&mut self.values, overlay.inserted, None); } commit }) @@ -388,7 +402,7 @@ impl NonCanonicalOverlay { .expect("Hash is added in insert"); let overlay = self.levels[level_index].pop().expect("Empty levels are not allowed in self.levels"); - discard_values(&mut self.values, overlay.inserted); + discard_values(&mut self.values, overlay.inserted, None); if self.levels[level_index].is_empty() { debug_assert_eq!(level_index, self.levels.len() - 1); self.levels.pop_back(); @@ -407,11 +421,21 @@ impl NonCanonicalOverlay { self.pending_canonicalizations.clear(); self.revert_insertions(); } + + /// Pin state values in memory + pub fn pin(&mut self, hash: &BlockHash) { + self.pinned.insert(hash.clone(), HashMap::default()); + } + + /// Discard pinned state + pub fn unpin(&mut self, hash: &BlockHash) { + self.pinned.remove(hash); + } } #[cfg(test)] mod tests { - use std::{collections::HashMap, io}; + use std::io; use primitives::H256; use super::{NonCanonicalOverlay, to_journal_key}; use crate::{ChangeSet, CommitSet}; @@ -436,7 +460,7 @@ mod tests { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); let mut commit = CommitSet::default(); - overlay.canonicalize::(&H256::default(), &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&H256::default(), &mut commit).unwrap(); } #[test] @@ -481,7 +505,7 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); overlay.insert::(&h1, 1, &H256::default(), ChangeSet::default()).unwrap(); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &mut commit).unwrap(); } #[test] @@ -497,7 +521,7 @@ mod tests { assert_eq!(insertion.meta.deleted.len(), 0); db.commit(&insertion); let mut finalization = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut finalization).unwrap(); + overlay.canonicalize::(&h1, &mut finalization).unwrap(); assert_eq!(finalization.data.inserted.len(), changeset.inserted.len()); assert_eq!(finalization.data.deleted.len(), changeset.deleted.len()); assert_eq!(finalization.meta.inserted.len(), 1); @@ -531,7 +555,7 @@ mod tests { db.commit(&overlay.insert::(&h1, 10, &H256::default(), make_changeset(&[3, 4], &[2])).unwrap()); db.commit(&overlay.insert::(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap()); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h1, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -558,7 +582,7 @@ mod tests { assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h1, &mut commit).unwrap(); db.commit(&commit); assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); @@ -569,7 +593,7 @@ mod tests { assert!(!contains(&overlay, 5)); assert!(contains(&overlay, 7)); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); @@ -588,7 +612,7 @@ mod tests { db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); assert!(contains(&overlay, 1)); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1, &mut commit).unwrap(); db.commit(&commit); assert!(contains(&overlay, 1)); overlay.apply_pending(); @@ -607,8 +631,8 @@ mod tests { db.commit(&overlay.insert::(&h2, 2, &h1, changeset.clone()).unwrap()); overlay.apply_pending(); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); - overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h1, &mut commit).unwrap(); + overlay.canonicalize::(&h2, &mut commit).unwrap(); db.commit(&commit); db.commit(&overlay.insert::(&h3, 3, &h2, changeset.clone()).unwrap()); overlay.apply_pending(); @@ -679,7 +703,7 @@ mod tests { // canonicalize 1. 2 and all its children should be discarded let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 2); @@ -698,14 +722,9 @@ mod tests { assert!(db.get_meta(&to_journal_key(2, 2)).unwrap().is_none()); assert!(db.get_meta(&to_journal_key(2, 3)).unwrap().is_none()); - // check that discarding pinned state produces an error. - let mut commit = CommitSet::default(); - let pinned = vec![(h_1_1_1, 1)].into_iter().collect(); - assert!(overlay.canonicalize::(&h_1_2, &pinned, &mut commit).is_err()); - // canonicalize 1_2. 1_1 and all its children should be discarded let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1_2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1_2, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -722,7 +741,7 @@ mod tests { // canonicalize 1_2_2 let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1_2_2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1_2_2, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); @@ -777,5 +796,29 @@ mod tests { assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); } -} + #[test] + fn keeps_pinned() { + let mut db = make_db(&[]); + + // - 1 - 1_1 + // \ 1_2 + + let (h_1, c_1) = (H256::random(), make_changeset(&[1], &[])); + let (h_2, c_2) = (H256::random(), make_changeset(&[2], &[])); + + let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); + db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); + db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); + + overlay.pin(&h_1); + + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_2, &mut commit).unwrap(); + db.commit(&commit); + overlay.apply_pending(); + assert!(contains(&overlay, 1)); + overlay.unpin(&h_1); + assert!(!contains(&overlay, 1)); + } +} -- GitLab From 6fbca29c341254433c8d56db8473ae1f7004f6a3 Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Tue, 13 Aug 2019 11:44:00 +0200 Subject: [PATCH 151/151] Add transaction pool to Aura and Babe import queue (#3225) * Add transaction pool to babe import queue * Add transaction pool to Babe check header * Fix tests * Add tx pool to Aura import_queue * Fix tests, node-template * Add comments regarding unused _transaction_pool * Make tx pool optional in check_header --- core/consensus/aura/src/lib.rs | 26 ++++++++++++++++++-------- core/consensus/babe/src/lib.rs | 27 ++++++++++++++++++--------- core/consensus/babe/src/tests.rs | 3 ++- core/service/src/chain_ops.rs | 3 ++- core/service/src/components.rs | 6 +++++- core/service/src/lib.rs | 26 +++++++++++++++----------- node-template/src/service.rs | 13 ++++++++++--- node/cli/src/service.rs | 19 ++++++++++++------- 8 files changed, 82 insertions(+), 41 deletions(-) diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index fa5b0533b6..74799837c4 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -390,18 +390,21 @@ fn find_pre_digest(header: &B::Header) -> Result( +// FIXME #1018 needs misbehavior types. The `transaction_pool` parameter will be +// used to submit such misbehavior reports. +fn check_header( client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId

], + _transaction_pool: Option<&T>, ) -> Result)>, String> where DigestItemFor: CompatibleDigestItem

, P::Signature: Decode, C: client::backend::AuxStore, P::Public: Encode + Decode + PartialEq + Clone, + T: Send + Sync + 'static, { let seal = match header.digest_mut().pop() { Some(x) => x, @@ -451,13 +454,14 @@ fn check_header( } /// A verifier for Aura blocks. -pub struct AuraVerifier { +pub struct AuraVerifier { client: Arc, phantom: PhantomData

, inherent_data_providers: inherents::InherentDataProviders, + transaction_pool: Option>, } -impl AuraVerifier +impl AuraVerifier where P: Send + Sync + 'static { fn check_inherents( @@ -510,13 +514,14 @@ impl AuraVerifier } #[forbid(deprecated)] -impl Verifier for AuraVerifier where +impl Verifier for AuraVerifier where C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache + BlockOf, C::Api: BlockBuilderApi + AuraApi>, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + 'static, P::Signature: Encode + Decode, + T: Send + Sync + 'static, { fn verify( &mut self, @@ -536,12 +541,13 @@ impl Verifier for AuraVerifier where // we add one to allow for some small drift. // FIXME #1019 in the future, alter this queue to allow deferring of // headers - let checked_header = check_header::( + let checked_header = check_header::( &self.client, slot_now + 1, header, hash, &authorities[..], + self.transaction_pool.as_ref().map(|x| &**x), )?; match checked_header { CheckedHeader::Checked(pre_header, (slot_num, seal)) => { @@ -680,13 +686,14 @@ fn register_aura_inherent_data_provider( } /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue( +pub fn import_queue( slot_duration: SlotDuration, block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, client: Arc, inherent_data_providers: InherentDataProviders, + transaction_pool: Option>, ) -> Result, consensus_common::Error> where B: BlockT, C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore, @@ -695,6 +702,7 @@ pub fn import_queue( P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, P::Signature: Encode + Decode, + T: Send + Sync + 'static, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; initialize_authorities_cache(&*client)?; @@ -703,6 +711,7 @@ pub fn import_queue( client: client.clone(), inherent_data_providers, phantom: PhantomData, + transaction_pool, }; Ok(BasicQueue::new( verifier, @@ -773,7 +782,7 @@ mod tests { impl TestNetFactory for AuraTestNet { type Specialization = DummySpecialization; - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -800,6 +809,7 @@ mod tests { AuraVerifier { client, inherent_data_providers, + transaction_pool: Default::default(), phantom: Default::default(), } }, diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index ae484de5b6..e46594dd1e 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -463,8 +463,9 @@ fn find_next_epoch_digest(header: &B::Header) -> Result /// unsigned. This is required for security and must not be changed. /// /// This digest item will always return `Some` when used with `as_babe_pre_digest`. -// FIXME #1018 needs misbehavior types -fn check_header( +// FIXME #1018 needs misbehavior types. The `transaction_pool` parameter will be +// used to submit such misbehavior reports. +fn check_header( client: &C, slot_now: u64, mut header: B::Header, @@ -473,8 +474,10 @@ fn check_header( randomness: [u8; 32], epoch_index: u64, c: (u64, u64), -) -> Result, DigestItemFor)>, String> - where DigestItemFor: CompatibleDigestItem, + _transaction_pool: Option<&T>, +) -> Result, DigestItemFor)>, String> where + DigestItemFor: CompatibleDigestItem, + T: Send + Sync + 'static, { trace!(target: "babe", "Checking header"); let seal = match header.digest_mut().pop() { @@ -548,14 +551,15 @@ fn check_header( pub struct BabeLink(Arc, Vec<(Instant, u64)>)>>); /// A verifier for Babe blocks. -pub struct BabeVerifier { +pub struct BabeVerifier { api: Arc, inherent_data_providers: inherents::InherentDataProviders, config: Config, time_source: BabeLink, + transaction_pool: Option>, } -impl BabeVerifier { +impl BabeVerifier { fn check_inherents( &self, block: B, @@ -625,9 +629,10 @@ fn median_algorithm( } } -impl Verifier for BabeVerifier where +impl Verifier for BabeVerifier where C: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, C::Api: BlockBuilderApi + BabeApi, + T: Send + Sync + 'static, { fn verify( &mut self, @@ -662,7 +667,7 @@ impl Verifier for BabeVerifier where // We add one to allow for some small drift. // FIXME #1019 in the future, alter this queue to allow deferring of headers - let checked_header = check_header::( + let checked_header = check_header::( &self.api, slot_now + 1, header, @@ -671,6 +676,7 @@ impl Verifier for BabeVerifier where randomness, epoch_index, self.config.c(), + self.transaction_pool.as_ref().map(|x| &**x), )?; match checked_header { @@ -1129,7 +1135,7 @@ impl BlockImport for BabeBlockImport, I, RA, PRA>( +pub fn import_queue, I, RA, PRA, T>( config: Config, block_import: I, justification_import: Option>, @@ -1137,6 +1143,7 @@ pub fn import_queue, I, RA, PRA>( client: Arc>, api: Arc, inherent_data_providers: InherentDataProviders, + transaction_pool: Option>, ) -> ClientResult<( BabeImportQueue, BabeLink, @@ -1150,6 +1157,7 @@ pub fn import_queue, I, RA, PRA>( RA: Send + Sync + 'static, PRA: ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore + 'static, PRA::Api: BlockBuilderApi + BabeApi, + T: Send + Sync + 'static, { register_babe_inherent_data_provider(&inherent_data_providers, config.get())?; initialize_authorities_cache(&*api)?; @@ -1159,6 +1167,7 @@ pub fn import_queue, I, RA, PRA>( inherent_data_providers, time_source: Default::default(), config, + transaction_pool, }; #[allow(deprecated)] diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs index eaa4fbe099..01e0acb964 100644 --- a/core/consensus/babe/src/tests.rs +++ b/core/consensus/babe/src/tests.rs @@ -88,7 +88,7 @@ type TestHeader = ::Header; type TestExtrinsic = ::Extrinsic; pub struct TestVerifier { - inner: BabeVerifier, + inner: BabeVerifier, mutator: Mutator, } @@ -143,6 +143,7 @@ impl TestNetFactory for BabeTestNet { inherent_data_providers, config, time_source: Default::default(), + transaction_pool : Default::default(), }, mutator: MUTATOR.with(|s| s.borrow().clone()), } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index c977b265bb..c801b81186 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -146,7 +146,8 @@ pub fn import_blocks( let (mut queue, _) = components::FullComponents::::build_import_queue( &mut config, client.clone(), - select_chain + select_chain, + None, )?; let (exit_send, exit_recv) = std::sync::mpsc::channel(); diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 3c566b5974..b88abd4a98 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -381,6 +381,7 @@ pub trait ServiceFactory: 'static + Sized { config: &mut FactoryFullConfiguration, _client: Arc>, _select_chain: Self::SelectChain, + _transaction_pool: Option>>, ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { @@ -454,6 +455,7 @@ pub trait Components: Sized + 'static { config: &mut FactoryFullConfiguration, client: Arc>, select_chain: Option, + _transaction_pool: Option>>, ) -> Result<(Self::ImportQueue, Option>>), error::Error>; /// Finality proof provider for serving network requests. @@ -572,10 +574,11 @@ impl Components for FullComponents { config: &mut FactoryFullConfiguration, client: Arc>, select_chain: Option, + transaction_pool: Option>>, ) -> Result<(Self::ImportQueue, Option>>), error::Error> { let select_chain = select_chain .ok_or(error::Error::SelectChainRequired)?; - Factory::build_full_import_queue(config, client, select_chain) + Factory::build_full_import_queue(config, client, select_chain, transaction_pool) .map(|queue| (queue, None)) } @@ -695,6 +698,7 @@ impl Components for LightComponents { config: &mut FactoryFullConfiguration, client: Arc>, _select_chain: Option, + _transaction_pool: Option>>, ) -> Result<(Self::ImportQueue, Option>>), error::Error> { Factory::build_light_import_queue(config, client) .map(|(queue, builder)| (queue, Some(builder))) diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 2b604fbc70..dc34a48853 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -173,10 +173,21 @@ impl Service { let (client, on_demand) = Components::build_client(&config, executor, Some(keystore.clone()))?; let select_chain = Components::build_select_chain(&mut config, client.clone())?; + + let transaction_pool = Arc::new( + Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? + ); + let transaction_pool_adapter = Arc::new(TransactionPoolAdapter { + imports_external_transactions: !config.roles.is_light(), + pool: transaction_pool.clone(), + client: client.clone(), + }); + let (import_queue, finality_proof_request_builder) = Components::build_import_queue( &mut config, client.clone(), select_chain.clone(), + Some(transaction_pool.clone()), )?; let import_queue = Box::new(import_queue); let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; @@ -197,14 +208,6 @@ impl Service { ); let network_protocol = ::build_network_protocol(&config)?; - let transaction_pool = Arc::new( - Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? - ); - let transaction_pool_adapter = Arc::new(TransactionPoolAdapter { - imports_external_transactions: !config.roles.is_light(), - pool: transaction_pool.clone(), - client: client.clone(), - }); let protocol_id = { let protocol_id_full = match config.chain_spec.protocol_id() { @@ -971,7 +974,7 @@ where /// LightService = LightComponents /// { |config| >::new(config) }, /// FullImportQueue = BasicQueue -/// { |_, client, _| Ok(BasicQueue::new(MyVerifier, Box::new(client), None, None)) }, +/// { |_, client, _, _| Ok(BasicQueue::new(MyVerifier, Box::new(client), None, None)) }, /// LightImportQueue = BasicQueue /// { |_, client| { /// let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; @@ -1064,9 +1067,10 @@ macro_rules! construct_service_factory { fn build_full_import_queue( config: &mut $crate::FactoryFullConfiguration, client: $crate::Arc<$crate::FullClient>, - select_chain: Self::SelectChain + select_chain: Self::SelectChain, + transaction_pool: Option>>, ) -> $crate::Result { - ( $( $full_import_queue_init )* ) (config, client, select_chain) + ( $( $full_import_queue_init )* ) (config, client, select_chain, transaction_pool) } fn build_light_import_queue( diff --git a/node-template/src/service.rs b/node-template/src/service.rs index e0dba17bbf..7f2c80c48b 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -95,14 +95,20 @@ construct_service_factory! { FullImportQueue = AuraImportQueue< Self::Block, > - { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { - import_queue::<_, _, aura_primitives::sr25519::AuthorityPair>( + { | + config: &mut FactoryFullConfiguration, + client: Arc>, + _select_chain: Self::SelectChain, + transaction_pool: Option>>, + | { + import_queue::<_, _, aura_primitives::sr25519::AuthorityPair, _>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, None, client, config.custom.inherent_data_providers.clone(), + transaction_pool, ).map_err(Into::into) } }, @@ -111,13 +117,14 @@ construct_service_factory! { > { |config: &mut FactoryFullConfiguration, client: Arc>| { let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; - import_queue::<_, _, AuraAuthorityPair>( + import_queue::<_, _, AuraAuthorityPair, TransactionPool>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, None, client, config.custom.inherent_data_providers.clone(), + None, ).map(|q| (q, fprb)).map_err(Into::into) } }, diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 0a041e94d3..90c76eda84 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -209,12 +209,15 @@ construct_service_factory! { }, LightService = LightComponents { |config| >::new(config) }, - FullImportQueue = BabeImportQueue { - | - config: &mut FactoryFullConfiguration, - client: Arc>, - select_chain: Self::SelectChain - | { + FullImportQueue = BabeImportQueue + { + | + config: &mut FactoryFullConfiguration, + client: Arc>, + select_chain: Self::SelectChain, + transaction_pool: Option>>, + | + { let (block_import, link_half) = grandpa::block_import::<_, _, _, RuntimeApi, FullClient, _>( client.clone(), client.clone(), select_chain @@ -229,6 +232,7 @@ construct_service_factory! { client.clone(), client, config.custom.inherent_data_providers.clone(), + transaction_pool, )?; config.custom.import_setup = Some((babe_block_import.clone(), link_half, babe_link)); @@ -252,7 +256,7 @@ construct_service_factory! { finality_proof_import.create_finality_proof_request_builder(); // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. - let (import_queue, ..) = import_queue( + let (import_queue, ..) = import_queue::<_, _, _, _, _, _, TransactionPool>( Config::get_or_compute(&*client)?, block_import, None, @@ -260,6 +264,7 @@ construct_service_factory! { client.clone(), client, config.custom.inherent_data_providers.clone(), + None, )?; Ok((import_queue, finality_proof_request_builder)) -- GitLab